blob: a1f056b8107561fce6d423eb7e693dd2e12ba50f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/* XXX put a copyright here */
/* I know my style's weird, get used to it */
static const char* r300_get_vendor(struct pipe_screen* pscreen) {
return "X.Org R300 Project";
}
static const char* r300_get_name(struct pipe_screen* pscreen) {
/* XXX lazy */
return "unknown";
}
static int r300_get_param(struct pipe_screen* pscreen, int param) {
switch (param) {
/* Cases marked "IN THEORY" are possible on the hardware,
* but haven't been implemented yet. */
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
/* XXX I'm told this goes up to 16 */
return 8;
case PIPE_CAP_NPOT_TEXTURES:
/* IN THEORY */
return 0;
case PIPE_CAP_S3TC:
/* IN THEORY */
return 0;
case PIPE_CAP_TWO_SIDED_STENCIL:
/* IN THEORY */
return 0;
case PIPE_CAP_ANISOTROPIC_FILTER:
/* IN THEORY */
return 0;
case PIPE_CAP_POINT_SPRITE:
/* IN THEORY */
return 0;
case PIPE_CAP_OCCLUSION_QUERY:
/* IN THEORY */
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP:
/* IN THEORY */
return 0;
case PIPE_CAP_GLSL:
/* IN THEORY */
return 0;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
/* 12 == 2048x2048
* R500 can do 4096x4096 */
return 12;
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
/* XXX educated guess */
return 8;
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
/* XXX educated guess */
return 11;
case PIPE_CAP_MAX_RENDER_TARGETS:
/* XXX 4 eventually */
return 1;
default:
return 0;
}
}
static float r300_get_paramf(struct pipe_screen* pscreen, float param) {
switch (param) {
case PIPE_CAP_MAX_LINE_WIDTH:
case PIPE_CAP_MAX_LINE_WIDTH_AA:
/* XXX look this up, lazy ass! */
return 0.0;
case PIPE_CAP_MAX_POINT_WIDTH:
case PIPE_CAP_MAX_POINT_WIDTH_AA:
/* XXX see above */
return 255.0;
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
return 16.0;
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
/* XXX again... */
return 16.0;
default:
return 0.0;
}
}
static boolean r300_is_format_supported(struct pipe_screen* pscreen,
enum pipe_format format, uint type)
{
return FALSE;
}
static r300_destroy_screen(struct pipe_screen* pscreen) {
FREE(pscreen);
}
struct pipe_screen* r300_create_screen(struct pipe_winsys* winsys, uint pci_id) {
struct r300_screen* r300screen = CALLOC_STRUCT(r300_screen);
if (!r300screen)
return NULL;
/* XXX break this into its own function? */
switch (pci_id) {
default:
debug_printf("%s: unknown PCI ID 0x%x, cannot create screen!\n",
__FUNCTION__, pci_id);
return NULL;
}
r300screen->pci_id = pci_id;
r300screen->screen.winsys = winsys;
r300screen->screen.destroy = r300_destroy_screen;
r300screen->screen.get_name = r300_get_name;
r300screen->screen.get_vendor = r300_get_vendor;
r300screen->screen.get_param = r300_get_param;
r300screen->screen.get_paramf = r300_get_paramf;
r300screen->screen.is_format_supported = r300_is_format_supported;
r300screen->screen.surface_map = r300_surface_map;
r300screen->screen.surface_unmap = r300_surface_unmap;
return &r300screen->screen;
}
|