r300g: don't advertize PIPE_FORMAT_B10G10R10X2_UNORM on < r500
[mesa.git] / src / gallium / drivers / r300 / r300_screen.c
1 /*
2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
3 * Copyright 2010 Marek Olšák <maraeo@gmail.com>
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * on the rights to use, copy, modify, merge, publish, distribute, sub
9 * license, and/or sell copies of the Software, and to permit persons to whom
10 * the Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22 * USE OR OTHER DEALINGS IN THE SOFTWARE. */
23
24 #include "util/u_format.h"
25 #include "util/u_format_s3tc.h"
26 #include "util/u_memory.h"
27 #include "os/os_time.h"
28 #include "vl/vl_decoder.h"
29 #include "vl/vl_video_buffer.h"
30
31 #include "r300_context.h"
32 #include "r300_texture.h"
33 #include "r300_screen_buffer.h"
34 #include "r300_state_inlines.h"
35 #include "r300_public.h"
36
37 #include "draw/draw_context.h"
38
39 /* Return the identifier behind whom the brave coders responsible for this
40 * amalgamation of code, sweat, and duct tape, routinely obscure their names.
41 *
42 * ...I should have just put "Corbin Simpson", but I'm not that cool.
43 *
44 * (Or egotistical. Yet.) */
45 static const char* r300_get_vendor(struct pipe_screen* pscreen)
46 {
47 return "X.Org R300 Project";
48 }
49
50 static const char* chip_families[] = {
51 "unknown",
52 "ATI R300",
53 "ATI R350",
54 "ATI RV350",
55 "ATI RV370",
56 "ATI RV380",
57 "ATI RS400",
58 "ATI RC410",
59 "ATI RS480",
60 "ATI R420",
61 "ATI R423",
62 "ATI R430",
63 "ATI R480",
64 "ATI R481",
65 "ATI RV410",
66 "ATI RS600",
67 "ATI RS690",
68 "ATI RS740",
69 "ATI RV515",
70 "ATI R520",
71 "ATI RV530",
72 "ATI R580",
73 "ATI RV560",
74 "ATI RV570"
75 };
76
77 static const char* r300_get_name(struct pipe_screen* pscreen)
78 {
79 struct r300_screen* r300screen = r300_screen(pscreen);
80
81 return chip_families[r300screen->caps.family];
82 }
83
84 static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
85 {
86 struct r300_screen* r300screen = r300_screen(pscreen);
87 boolean is_r500 = r300screen->caps.is_r500;
88
89 switch (param) {
90 /* Supported features (boolean caps). */
91 case PIPE_CAP_NPOT_TEXTURES:
92 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
93 case PIPE_CAP_TWO_SIDED_STENCIL:
94 case PIPE_CAP_ANISOTROPIC_FILTER:
95 case PIPE_CAP_POINT_SPRITE:
96 case PIPE_CAP_OCCLUSION_QUERY:
97 case PIPE_CAP_TEXTURE_SHADOW_MAP:
98 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
99 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
100 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
101 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
102 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
103 case PIPE_CAP_CONDITIONAL_RENDER:
104 case PIPE_CAP_TEXTURE_BARRIER:
105 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
106 case PIPE_CAP_USER_INDEX_BUFFERS:
107 case PIPE_CAP_USER_CONSTANT_BUFFERS:
108 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
109 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
110 return 1;
111
112 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
113 return R300_BUFFER_ALIGNMENT;
114
115 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
116 return 16;
117
118 case PIPE_CAP_GLSL_FEATURE_LEVEL:
119 return 120;
120
121 /* r300 cannot do swizzling of compressed textures. Supported otherwise. */
122 case PIPE_CAP_TEXTURE_SWIZZLE:
123 return util_format_s3tc_enabled ? r300screen->caps.dxtc_swizzle : 1;
124
125 /* We don't support color clamping on r500, so that we can use color
126 * intepolators for generic varyings. */
127 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
128 return !is_r500;
129
130 /* Supported on r500 only. */
131 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
132 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
133 case PIPE_CAP_SM3:
134 return is_r500 ? 1 : 0;
135
136 /* Unsupported features. */
137 case PIPE_CAP_QUERY_TIME_ELAPSED:
138 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
139 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
140 case PIPE_CAP_INDEP_BLEND_ENABLE:
141 case PIPE_CAP_INDEP_BLEND_FUNC:
142 case PIPE_CAP_DEPTH_CLIP_DISABLE:
143 case PIPE_CAP_SHADER_STENCIL_EXPORT:
144 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
145 case PIPE_CAP_TGSI_INSTANCEID:
146 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
147 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
148 case PIPE_CAP_SEAMLESS_CUBE_MAP:
149 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
150 case PIPE_CAP_MIN_TEXEL_OFFSET:
151 case PIPE_CAP_MAX_TEXEL_OFFSET:
152 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
153 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
154 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
155 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
156 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
157 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
158 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
159 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
160 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
161 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
162 case PIPE_CAP_COMPUTE:
163 case PIPE_CAP_START_INSTANCE:
164 case PIPE_CAP_QUERY_TIMESTAMP:
165 case PIPE_CAP_TEXTURE_MULTISAMPLE:
166 case PIPE_CAP_CUBE_MAP_ARRAY:
167 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
168 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
169 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
170 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
171 case PIPE_CAP_TGSI_VS_LAYER:
172 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
173 case PIPE_CAP_TEXTURE_GATHER_SM5:
174 case PIPE_CAP_TEXTURE_QUERY_LOD:
175 case PIPE_CAP_FAKE_SW_MSAA:
176 case PIPE_CAP_SAMPLE_SHADING:
177 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
178 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
179 return 0;
180
181 /* SWTCL-only features. */
182 case PIPE_CAP_PRIMITIVE_RESTART:
183 case PIPE_CAP_USER_VERTEX_BUFFERS:
184 return !r300screen->caps.has_tcl;
185
186 /* HWTCL-only features / limitations. */
187 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
188 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
189 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
190 return r300screen->caps.has_tcl;
191 case PIPE_CAP_TGSI_TEXCOORD:
192 return 0;
193
194 /* Texturing. */
195 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
196 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
197 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
198 /* 13 == 4096, 12 == 2048 */
199 return is_r500 ? 13 : 12;
200
201 /* Render targets. */
202 case PIPE_CAP_MAX_RENDER_TARGETS:
203 return 4;
204 case PIPE_CAP_ENDIANNESS:
205 return PIPE_ENDIAN_LITTLE;
206
207 case PIPE_CAP_MAX_VIEWPORTS:
208 return 1;
209 }
210 return 0;
211 }
212
213 static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum pipe_shader_cap param)
214 {
215 struct r300_screen* r300screen = r300_screen(pscreen);
216 boolean is_r400 = r300screen->caps.is_r400;
217 boolean is_r500 = r300screen->caps.is_r500;
218
219 switch (shader) {
220 case PIPE_SHADER_FRAGMENT:
221 switch (param)
222 {
223 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
224 return is_r500 || is_r400 ? 512 : 96;
225 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
226 return is_r500 || is_r400 ? 512 : 64;
227 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
228 return is_r500 || is_r400 ? 512 : 32;
229 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
230 return is_r500 ? 511 : 4;
231 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
232 return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
233 /* Fragment shader limits. */
234 case PIPE_SHADER_CAP_MAX_INPUTS:
235 /* 2 colors + 8 texcoords are always supported
236 * (minus fog and wpos).
237 *
238 * R500 has the ability to turn 3rd and 4th color into
239 * additional texcoords but there is no two-sided color
240 * selection then. However the facing bit can be used instead. */
241 return 10;
242 case PIPE_SHADER_CAP_MAX_CONSTS:
243 return is_r500 ? 256 : 32;
244 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
245 return 1;
246 case PIPE_SHADER_CAP_MAX_TEMPS:
247 return is_r500 ? 128 : is_r400 ? 64 : 32;
248 case PIPE_SHADER_CAP_MAX_PREDS:
249 return is_r500 ? 1 : 0;
250 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
251 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
252 return r300screen->caps.num_tex_units;
253 case PIPE_SHADER_CAP_MAX_ADDRS:
254 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
255 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
256 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
257 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
258 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
259 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
260 case PIPE_SHADER_CAP_SUBROUTINES:
261 case PIPE_SHADER_CAP_INTEGERS:
262 return 0;
263 case PIPE_SHADER_CAP_PREFERRED_IR:
264 return PIPE_SHADER_IR_TGSI;
265 }
266 break;
267 case PIPE_SHADER_VERTEX:
268 switch (param)
269 {
270 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
271 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
272 case PIPE_SHADER_CAP_SUBROUTINES:
273 return 0;
274 default:;
275 }
276
277 if (!r300screen->caps.has_tcl) {
278 return draw_get_shader_param(shader, param);
279 }
280
281 switch (param)
282 {
283 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
284 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
285 return is_r500 ? 1024 : 256;
286 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
287 return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
288 case PIPE_SHADER_CAP_MAX_INPUTS:
289 return 16;
290 case PIPE_SHADER_CAP_MAX_CONSTS:
291 return 256;
292 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
293 return 1;
294 case PIPE_SHADER_CAP_MAX_TEMPS:
295 return 32;
296 case PIPE_SHADER_CAP_MAX_ADDRS:
297 return 1; /* XXX guessed */
298 case PIPE_SHADER_CAP_MAX_PREDS:
299 return is_r500 ? 4 : 0; /* XXX guessed. */
300 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
301 return 1;
302 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
303 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
304 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
305 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
306 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
307 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
308 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
309 case PIPE_SHADER_CAP_SUBROUTINES:
310 case PIPE_SHADER_CAP_INTEGERS:
311 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
312 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
313 return 0;
314 case PIPE_SHADER_CAP_PREFERRED_IR:
315 return PIPE_SHADER_IR_TGSI;
316 }
317 break;
318 }
319 return 0;
320 }
321
322 static float r300_get_paramf(struct pipe_screen* pscreen,
323 enum pipe_capf param)
324 {
325 struct r300_screen* r300screen = r300_screen(pscreen);
326
327 switch (param) {
328 case PIPE_CAPF_MAX_LINE_WIDTH:
329 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
330 case PIPE_CAPF_MAX_POINT_WIDTH:
331 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
332 /* The maximum dimensions of the colorbuffer are our practical
333 * rendering limits. 2048 pixels should be enough for anybody. */
334 if (r300screen->caps.is_r500) {
335 return 4096.0f;
336 } else if (r300screen->caps.is_r400) {
337 return 4021.0f;
338 } else {
339 return 2560.0f;
340 }
341 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
342 return 16.0f;
343 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
344 return 16.0f;
345 case PIPE_CAPF_GUARD_BAND_LEFT:
346 case PIPE_CAPF_GUARD_BAND_TOP:
347 case PIPE_CAPF_GUARD_BAND_RIGHT:
348 case PIPE_CAPF_GUARD_BAND_BOTTOM:
349 /* XXX I don't know what these should be but the least we can do is
350 * silence the potential error message */
351 return 0.0f;
352 default:
353 debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
354 param);
355 return 0.0f;
356 }
357 }
358
359 static int r300_get_video_param(struct pipe_screen *screen,
360 enum pipe_video_profile profile,
361 enum pipe_video_entrypoint entrypoint,
362 enum pipe_video_cap param)
363 {
364 switch (param) {
365 case PIPE_VIDEO_CAP_SUPPORTED:
366 return vl_profile_supported(screen, profile, entrypoint);
367 case PIPE_VIDEO_CAP_NPOT_TEXTURES:
368 return 0;
369 case PIPE_VIDEO_CAP_MAX_WIDTH:
370 case PIPE_VIDEO_CAP_MAX_HEIGHT:
371 return vl_video_buffer_max_size(screen);
372 case PIPE_VIDEO_CAP_PREFERED_FORMAT:
373 return PIPE_FORMAT_NV12;
374 case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
375 return false;
376 case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
377 return false;
378 case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
379 return true;
380 case PIPE_VIDEO_CAP_MAX_LEVEL:
381 return vl_level_supported(screen, profile);
382 default:
383 return 0;
384 }
385 }
386
387 /**
388 * Whether the format matches:
389 * PIPE_FORMAT_?10?10?10?2_UNORM
390 */
391 static INLINE boolean
392 util_format_is_rgba1010102_variant(const struct util_format_description *desc)
393 {
394 static const unsigned size[4] = {10, 10, 10, 2};
395 unsigned chan;
396
397 if (desc->block.width != 1 ||
398 desc->block.height != 1 ||
399 desc->block.bits != 32)
400 return FALSE;
401
402 for (chan = 0; chan < 4; ++chan) {
403 if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
404 desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
405 return FALSE;
406 if (desc->channel[chan].size != size[chan])
407 return FALSE;
408 }
409
410 return TRUE;
411 }
412
413 static boolean r300_is_format_supported(struct pipe_screen* screen,
414 enum pipe_format format,
415 enum pipe_texture_target target,
416 unsigned sample_count,
417 unsigned usage)
418 {
419 uint32_t retval = 0;
420 boolean drm_2_8_0 = r300_screen(screen)->info.drm_minor >= 8;
421 boolean is_r500 = r300_screen(screen)->caps.is_r500;
422 boolean is_r400 = r300_screen(screen)->caps.is_r400;
423 boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM ||
424 format == PIPE_FORMAT_R10G10B10X2_SNORM ||
425 format == PIPE_FORMAT_B10G10R10A2_UNORM ||
426 format == PIPE_FORMAT_B10G10R10X2_UNORM ||
427 format == PIPE_FORMAT_R10SG10SB10SA2U_NORM;
428 boolean is_ati1n = format == PIPE_FORMAT_RGTC1_UNORM ||
429 format == PIPE_FORMAT_RGTC1_SNORM ||
430 format == PIPE_FORMAT_LATC1_UNORM ||
431 format == PIPE_FORMAT_LATC1_SNORM;
432 boolean is_ati2n = format == PIPE_FORMAT_RGTC2_UNORM ||
433 format == PIPE_FORMAT_RGTC2_SNORM ||
434 format == PIPE_FORMAT_LATC2_UNORM ||
435 format == PIPE_FORMAT_LATC2_SNORM;
436 boolean is_x16f_xy16f = format == PIPE_FORMAT_R16_FLOAT ||
437 format == PIPE_FORMAT_R16G16_FLOAT ||
438 format == PIPE_FORMAT_A16_FLOAT ||
439 format == PIPE_FORMAT_L16_FLOAT ||
440 format == PIPE_FORMAT_L16A16_FLOAT ||
441 format == PIPE_FORMAT_R16A16_FLOAT ||
442 format == PIPE_FORMAT_I16_FLOAT;
443 boolean is_half_float = format == PIPE_FORMAT_R16_FLOAT ||
444 format == PIPE_FORMAT_R16G16_FLOAT ||
445 format == PIPE_FORMAT_R16G16B16_FLOAT ||
446 format == PIPE_FORMAT_R16G16B16A16_FLOAT ||
447 format == PIPE_FORMAT_R16G16B16X16_FLOAT;
448 const struct util_format_description *desc;
449
450 if (!util_format_is_supported(format, usage))
451 return FALSE;
452
453 /* Check multisampling support. */
454 switch (sample_count) {
455 case 0:
456 case 1:
457 break;
458 case 2:
459 case 4:
460 case 6:
461 /* We need DRM 2.8.0. */
462 if (!drm_2_8_0) {
463 return FALSE;
464 }
465 /* No texturing and scanout. */
466 if (usage & (PIPE_BIND_SAMPLER_VIEW |
467 PIPE_BIND_DISPLAY_TARGET |
468 PIPE_BIND_SCANOUT)) {
469 return FALSE;
470 }
471
472 desc = util_format_description(format);
473
474 if (is_r500) {
475 /* Only allow depth/stencil, RGBA8, RGBA1010102, RGBA16F. */
476 if (!util_format_is_depth_or_stencil(format) &&
477 !util_format_is_rgba8_variant(desc) &&
478 !util_format_is_rgba1010102_variant(desc) &&
479 format != PIPE_FORMAT_R16G16B16A16_FLOAT &&
480 format != PIPE_FORMAT_R16G16B16X16_FLOAT) {
481 return FALSE;
482 }
483 } else {
484 /* Only allow depth/stencil, RGBA8. */
485 if (!util_format_is_depth_or_stencil(format) &&
486 !util_format_is_rgba8_variant(desc)) {
487 return FALSE;
488 }
489 }
490 break;
491 default:
492 return FALSE;
493 }
494
495 /* Check sampler format support. */
496 if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
497 /* these two are broken for an unknown reason */
498 format != PIPE_FORMAT_R8G8B8X8_SNORM &&
499 format != PIPE_FORMAT_R16G16B16X16_SNORM &&
500 /* ATI1N is r5xx-only. */
501 (is_r500 || !is_ati1n) &&
502 /* ATI2N is supported on r4xx-r5xx. */
503 (is_r400 || is_r500 || !is_ati2n) &&
504 /* R16F and RG16F texture support was added in as late as DRM 2.8.0 */
505 (drm_2_8_0 || !is_x16f_xy16f) &&
506 r300_is_sampler_format_supported(format)) {
507 retval |= PIPE_BIND_SAMPLER_VIEW;
508 }
509
510 /* Check colorbuffer format support. */
511 if ((usage & (PIPE_BIND_RENDER_TARGET |
512 PIPE_BIND_DISPLAY_TARGET |
513 PIPE_BIND_SCANOUT |
514 PIPE_BIND_SHARED)) &&
515 /* 2101010 cannot be rendered to on non-r5xx. */
516 (!is_color2101010 || (is_r500 && drm_2_8_0)) &&
517 r300_is_colorbuffer_format_supported(format)) {
518 retval |= usage &
519 (PIPE_BIND_RENDER_TARGET |
520 PIPE_BIND_DISPLAY_TARGET |
521 PIPE_BIND_SCANOUT |
522 PIPE_BIND_SHARED);
523 }
524
525 /* Check depth-stencil format support. */
526 if (usage & PIPE_BIND_DEPTH_STENCIL &&
527 r300_is_zs_format_supported(format)) {
528 retval |= PIPE_BIND_DEPTH_STENCIL;
529 }
530
531 /* Check vertex buffer format support. */
532 if (usage & PIPE_BIND_VERTEX_BUFFER) {
533 if (r300_screen(screen)->caps.has_tcl) {
534 /* Half float is supported on >= R400. */
535 if ((is_r400 || is_r500 || !is_half_float) &&
536 r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
537 retval |= PIPE_BIND_VERTEX_BUFFER;
538 }
539 } else {
540 /* SW TCL */
541 if (!util_format_is_pure_integer(format)) {
542 retval |= PIPE_BIND_VERTEX_BUFFER;
543 }
544 }
545 }
546
547 /* Transfers are always supported. */
548 if (usage & PIPE_BIND_TRANSFER_READ)
549 retval |= PIPE_BIND_TRANSFER_READ;
550 if (usage & PIPE_BIND_TRANSFER_WRITE)
551 retval |= PIPE_BIND_TRANSFER_WRITE;
552
553 return retval == usage;
554 }
555
556 static void r300_destroy_screen(struct pipe_screen* pscreen)
557 {
558 struct r300_screen* r300screen = r300_screen(pscreen);
559 struct radeon_winsys *rws = radeon_winsys(pscreen);
560
561 if (rws && !rws->unref(rws))
562 return;
563
564 pipe_mutex_destroy(r300screen->cmask_mutex);
565
566 if (rws)
567 rws->destroy(rws);
568
569 FREE(r300screen);
570 }
571
572 static void r300_fence_reference(struct pipe_screen *screen,
573 struct pipe_fence_handle **ptr,
574 struct pipe_fence_handle *fence)
575 {
576 struct radeon_winsys *rws = r300_screen(screen)->rws;
577
578 rws->fence_reference(ptr, fence);
579 }
580
581 static boolean r300_fence_signalled(struct pipe_screen *screen,
582 struct pipe_fence_handle *fence)
583 {
584 struct radeon_winsys *rws = r300_screen(screen)->rws;
585
586 return rws->fence_wait(rws, fence, 0);
587 }
588
589 static boolean r300_fence_finish(struct pipe_screen *screen,
590 struct pipe_fence_handle *fence,
591 uint64_t timeout)
592 {
593 struct radeon_winsys *rws = r300_screen(screen)->rws;
594
595 return rws->fence_wait(rws, fence, timeout);
596 }
597
598 struct pipe_screen* r300_screen_create(struct radeon_winsys *rws)
599 {
600 struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen);
601
602 if (!r300screen) {
603 FREE(r300screen);
604 return NULL;
605 }
606
607 rws->query_info(rws, &r300screen->info);
608
609 r300_init_debug(r300screen);
610 r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps);
611
612 if (SCREEN_DBG_ON(r300screen, DBG_NO_ZMASK))
613 r300screen->caps.zmask_ram = 0;
614 if (SCREEN_DBG_ON(r300screen, DBG_NO_HIZ))
615 r300screen->caps.hiz_ram = 0;
616
617 if (r300screen->info.drm_minor < 8)
618 r300screen->caps.has_us_format = FALSE;
619
620 r300screen->rws = rws;
621 r300screen->screen.destroy = r300_destroy_screen;
622 r300screen->screen.get_name = r300_get_name;
623 r300screen->screen.get_vendor = r300_get_vendor;
624 r300screen->screen.get_param = r300_get_param;
625 r300screen->screen.get_shader_param = r300_get_shader_param;
626 r300screen->screen.get_paramf = r300_get_paramf;
627 r300screen->screen.get_video_param = r300_get_video_param;
628 r300screen->screen.is_format_supported = r300_is_format_supported;
629 r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
630 r300screen->screen.context_create = r300_create_context;
631 r300screen->screen.fence_reference = r300_fence_reference;
632 r300screen->screen.fence_signalled = r300_fence_signalled;
633 r300screen->screen.fence_finish = r300_fence_finish;
634
635 r300_init_screen_resource_functions(r300screen);
636
637 util_format_s3tc_init();
638 pipe_mutex_init(r300screen->cmask_mutex);
639
640 return &r300screen->screen;
641 }