r300: Add some useful debugging information; remove a couple compile warnings.
[platform/upstream/mesa.git] / src / gallium / drivers / r300 / r300_screen.c
1 /*
2  * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
22
23 #include "r300_screen.h"
24
25 /* Return the identifier behind whom the brave coders responsible for this
26  * amalgamation of code, sweat, and duct tape, routinely obscure their names.
27  *
28  * ...I should have just put "Corbin Simpson", but I'm not that cool.
29  *
30  * (Or egotistical. Yet.) */
31 static const char* r300_get_vendor(struct pipe_screen* pscreen)
32 {
33     return "X.Org R300 Project";
34 }
35
36 static const char* chip_families[] = {
37     "R300",
38     "R350",
39     "R360",
40     "RV350",
41     "RV370",
42     "RV380",
43     "R420",
44     "R423",
45     "R430",
46     "R480",
47     "R481",
48     "RV410",
49     "RS400",
50     "RC410",
51     "RS480",
52     "RS482",
53     "RS690",
54     "RS740",
55     "RV515",
56     "R520",
57     "RV530",
58     "R580",
59     "RV560",
60     "RV570"
61 };
62
63 static const char* r300_get_name(struct pipe_screen* pscreen)
64 {
65     struct r300_screen* r300screen = r300_screen(pscreen);
66
67     return chip_families[r300screen->caps->family];
68 }
69
70 static int r300_get_param(struct pipe_screen* pscreen, int param)
71 {
72     struct r300_screen* r300screen = r300_screen(pscreen);
73
74     switch (param) {
75         /* XXX cases marked "IN THEORY" are possible on the hardware,
76          * but haven't been implemented yet. */
77         case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
78             /* XXX I'm told this goes up to 16 */
79             return 8;
80         case PIPE_CAP_NPOT_TEXTURES:
81             /* IN THEORY */
82             return 0;
83         case PIPE_CAP_S3TC:
84             /* IN THEORY */
85             return 0;
86         case PIPE_CAP_TWO_SIDED_STENCIL:
87             /* IN THEORY */
88             /* if (r300screen->is_r500) {
89              * return 1;
90              * } else {
91              * return 0;
92              * } */
93             return 0;
94         case PIPE_CAP_ANISOTROPIC_FILTER:
95             /* IN THEORY */
96             return 0;
97         case PIPE_CAP_POINT_SPRITE:
98             /* IN THEORY */
99             return 0;
100         case PIPE_CAP_OCCLUSION_QUERY:
101             /* IN THEORY */
102             return 0;
103         case PIPE_CAP_TEXTURE_SHADOW_MAP:
104             /* IN THEORY */
105             return 0;
106         case PIPE_CAP_GLSL:
107             /* IN THEORY */
108             return 0;
109         case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
110             if (r300screen->caps->is_r500) {
111                 /* 13 == 4096x4096 */
112                 return 13;
113             } else {
114                 /* 12 == 2048x2048 */
115                 return 12;
116             }
117         case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
118             /* So, technically, the limit is the same as above, but some math
119              * shows why this is silly. Assuming RGBA, 4cpp, we can see that
120              * 4096*4096*4096 = 64.0 GiB exactly, so it's not exactly
121              * practical. However, if at some point a game really wants this,
122              * then we can remove this limit. */
123             if (r300screen->caps->is_r500) {
124                 /* 9 == 256x256x256 */
125                 return 9;
126             } else {
127                 /* 8 == 128*128*128 */
128                 return 8;
129             }
130         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
131             if (r300screen->caps->is_r500) {
132                 /* 13 == 4096x4096 */
133                 return 13;
134             } else {
135                 /* 12 == 2048x2048 */
136                 return 12;
137             }
138         case PIPE_CAP_MAX_RENDER_TARGETS:
139             /* XXX 4 eventually */
140             return 1;
141         default:
142             debug_printf("r300: Implementation error: Bad param %d", param);
143             return 0;
144     }
145 }
146
147 static float r300_get_paramf(struct pipe_screen* pscreen, int param)
148 {
149     switch (param) {
150         case PIPE_CAP_MAX_LINE_WIDTH:
151         case PIPE_CAP_MAX_LINE_WIDTH_AA:
152             /* XXX this is the biggest thing that will fit in that register.
153             * Perhaps the actual rendering limits are less? */
154             return 10922.0f;
155         case PIPE_CAP_MAX_POINT_WIDTH:
156         case PIPE_CAP_MAX_POINT_WIDTH_AA:
157             /* XXX this is the biggest thing that will fit in that register.
158              * Perhaps the actual rendering limits are less? */
159             return 10922.0f;
160         case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
161             return 16.0f;
162         case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
163             return 16.0f;
164         default:
165             debug_printf("r300: Implementation error: Bad paramf %d", param);
166             return 0.0f;
167     }
168 }
169
170 /* XXX moar formats */
171 static boolean check_tex_2d_format(enum pipe_format format)
172 {
173     switch (format) {
174         case PIPE_FORMAT_A8R8G8B8_UNORM:
175         case PIPE_FORMAT_I8_UNORM:
176             return TRUE;
177         default:
178             debug_printf("r300: Warning: Got unknown format: %d, in %s",
179                 format, __FUNCTION__);
180             break;
181     }
182
183     return FALSE;
184 }
185
186 /* XXX moar targets */
187 static boolean r300_is_format_supported(struct pipe_screen* pscreen,
188                                         enum pipe_format format,
189                                         enum pipe_texture_target target,
190                                         unsigned tex_usage,
191                                         unsigned geom_flags)
192 {
193     switch (target) {
194         case PIPE_TEXTURE_2D:
195             return check_tex_2d_format(format);
196         default:
197             debug_printf("r300: Warning: Got unknown format target: %d",
198                 format);
199             break;
200     }
201
202     return FALSE;
203 }
204
205 static void* r300_surface_map(struct pipe_screen* screen,
206                               struct pipe_surface* surface,
207                               unsigned flags)
208 {
209     char* map = pipe_buffer_map(screen, surface->buffer, flags);
210
211     if (!map) {
212         return NULL;
213     }
214
215     return map + surface->offset;
216 }
217
218 static void r300_surface_unmap(struct pipe_screen* screen,
219                                struct pipe_surface* surface)
220 {
221     pipe_buffer_unmap(screen, surface->buffer);
222 }
223
224 static void r300_destroy_screen(struct pipe_screen* pscreen)
225 {
226     struct r300_screen* r300screen = r300_screen(pscreen);
227
228     FREE(r300screen->caps);
229     FREE(r300screen);
230 }
231
232 struct pipe_screen* r300_create_screen(struct pipe_winsys* winsys,
233                                        struct r300_winsys* r300_winsys)
234 {
235     struct r300_screen* r300screen = CALLOC_STRUCT(r300_screen);
236     struct r300_capabilities* caps = CALLOC_STRUCT(r300_capabilities);
237
238     if (!r300screen || !caps)
239         return NULL;
240
241     caps->pci_id = r300_winsys->pci_id;
242     caps->num_frag_pipes = r300_winsys->gb_pipes;
243
244     r300_parse_chipset(caps);
245
246     r300screen->caps = caps;
247     r300screen->screen.winsys = winsys;
248     r300screen->screen.destroy = r300_destroy_screen;
249     r300screen->screen.get_name = r300_get_name;
250     r300screen->screen.get_vendor = r300_get_vendor;
251     r300screen->screen.get_param = r300_get_param;
252     r300screen->screen.get_paramf = r300_get_paramf;
253     r300screen->screen.is_format_supported = r300_is_format_supported;
254     r300screen->screen.surface_map = r300_surface_map;
255     r300screen->screen.surface_unmap = r300_surface_unmap;
256
257     r300_init_screen_texture_functions(&r300screen->screen);
258
259     return &r300screen->screen;
260 }