gallium: remove redundant pipe_context::fence_signalled
[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* r300_get_device_vendor(struct pipe_screen* pscreen)
51 {
52 return "ATI";
53 }
54
55 static const char* chip_families[] = {
56 "unknown",
57 "ATI R300",
58 "ATI R350",
59 "ATI RV350",
60 "ATI RV370",
61 "ATI RV380",
62 "ATI RS400",
63 "ATI RC410",
64 "ATI RS480",
65 "ATI R420",
66 "ATI R423",
67 "ATI R430",
68 "ATI R480",
69 "ATI R481",
70 "ATI RV410",
71 "ATI RS600",
72 "ATI RS690",
73 "ATI RS740",
74 "ATI RV515",
75 "ATI R520",
76 "ATI RV530",
77 "ATI R580",
78 "ATI RV560",
79 "ATI RV570"
80 };
81
82 static const char* r300_get_name(struct pipe_screen* pscreen)
83 {
84 struct r300_screen* r300screen = r300_screen(pscreen);
85
86 return chip_families[r300screen->caps.family];
87 }
88
89 static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
90 {
91 struct r300_screen* r300screen = r300_screen(pscreen);
92 boolean is_r500 = r300screen->caps.is_r500;
93
94 switch (param) {
95 /* Supported features (boolean caps). */
96 case PIPE_CAP_NPOT_TEXTURES:
97 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
98 case PIPE_CAP_TWO_SIDED_STENCIL:
99 case PIPE_CAP_ANISOTROPIC_FILTER:
100 case PIPE_CAP_POINT_SPRITE:
101 case PIPE_CAP_OCCLUSION_QUERY:
102 case PIPE_CAP_TEXTURE_SHADOW_MAP:
103 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
104 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
105 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
106 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
107 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
108 case PIPE_CAP_CONDITIONAL_RENDER:
109 case PIPE_CAP_TEXTURE_BARRIER:
110 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
111 case PIPE_CAP_USER_INDEX_BUFFERS:
112 case PIPE_CAP_USER_CONSTANT_BUFFERS:
113 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
114 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
115 case PIPE_CAP_CLIP_HALFZ:
116 return 1;
117
118 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
119 return R300_BUFFER_ALIGNMENT;
120
121 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
122 return 16;
123
124 case PIPE_CAP_GLSL_FEATURE_LEVEL:
125 return 120;
126
127 /* r300 cannot do swizzling of compressed textures. Supported otherwise. */
128 case PIPE_CAP_TEXTURE_SWIZZLE:
129 return util_format_s3tc_enabled ? r300screen->caps.dxtc_swizzle : 1;
130
131 /* We don't support color clamping on r500, so that we can use color
132 * intepolators for generic varyings. */
133 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
134 return !is_r500;
135
136 /* Supported on r500 only. */
137 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
138 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
139 case PIPE_CAP_SM3:
140 return is_r500 ? 1 : 0;
141
142 /* Unsupported features. */
143 case PIPE_CAP_QUERY_TIME_ELAPSED:
144 case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
145 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
146 case PIPE_CAP_INDEP_BLEND_ENABLE:
147 case PIPE_CAP_INDEP_BLEND_FUNC:
148 case PIPE_CAP_DEPTH_CLIP_DISABLE:
149 case PIPE_CAP_SHADER_STENCIL_EXPORT:
150 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
151 case PIPE_CAP_TGSI_INSTANCEID:
152 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
153 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
154 case PIPE_CAP_SEAMLESS_CUBE_MAP:
155 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
156 case PIPE_CAP_MIN_TEXEL_OFFSET:
157 case PIPE_CAP_MAX_TEXEL_OFFSET:
158 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
159 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
160 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
161 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
162 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
163 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
164 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
165 case PIPE_CAP_MAX_VERTEX_STREAMS:
166 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
167 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
168 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
169 case PIPE_CAP_COMPUTE:
170 case PIPE_CAP_START_INSTANCE:
171 case PIPE_CAP_QUERY_TIMESTAMP:
172 case PIPE_CAP_TEXTURE_MULTISAMPLE:
173 case PIPE_CAP_CUBE_MAP_ARRAY:
174 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
175 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
176 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
177 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
178 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
179 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
180 case PIPE_CAP_TEXTURE_GATHER_SM5:
181 case PIPE_CAP_TEXTURE_QUERY_LOD:
182 case PIPE_CAP_FAKE_SW_MSAA:
183 case PIPE_CAP_SAMPLE_SHADING:
184 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
185 case PIPE_CAP_DRAW_INDIRECT:
186 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
187 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
188 case PIPE_CAP_SAMPLER_VIEW_TARGET:
189 case PIPE_CAP_VERTEXID_NOBASE:
190 case PIPE_CAP_POLYGON_OFFSET_CLAMP:
191 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
192 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
193 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
194 return 0;
195
196 /* SWTCL-only features. */
197 case PIPE_CAP_PRIMITIVE_RESTART:
198 case PIPE_CAP_USER_VERTEX_BUFFERS:
199 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
200 return !r300screen->caps.has_tcl;
201
202 /* HWTCL-only features / limitations. */
203 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
204 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
205 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
206 return r300screen->caps.has_tcl;
207 case PIPE_CAP_TGSI_TEXCOORD:
208 return 0;
209
210 /* Texturing. */
211 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
212 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
213 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
214 /* 13 == 4096, 12 == 2048 */
215 return is_r500 ? 13 : 12;
216
217 /* Render targets. */
218 case PIPE_CAP_MAX_RENDER_TARGETS:
219 return 4;
220 case PIPE_CAP_ENDIANNESS:
221 return PIPE_ENDIAN_LITTLE;
222
223 case PIPE_CAP_MAX_VIEWPORTS:
224 return 1;
225
226 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
227 return 2048;
228
229 case PIPE_CAP_VENDOR_ID:
230 return 0x1002;
231 case PIPE_CAP_DEVICE_ID:
232 return r300screen->info.pci_id;
233 case PIPE_CAP_ACCELERATED:
234 return 1;
235 case PIPE_CAP_VIDEO_MEMORY:
236 return r300screen->info.vram_size >> 20;
237 case PIPE_CAP_UMA:
238 return 0;
239 }
240 return 0;
241 }
242
243 static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum pipe_shader_cap param)
244 {
245 struct r300_screen* r300screen = r300_screen(pscreen);
246 boolean is_r400 = r300screen->caps.is_r400;
247 boolean is_r500 = r300screen->caps.is_r500;
248
249 switch (shader) {
250 case PIPE_SHADER_FRAGMENT:
251 switch (param)
252 {
253 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
254 return is_r500 || is_r400 ? 512 : 96;
255 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
256 return is_r500 || is_r400 ? 512 : 64;
257 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
258 return is_r500 || is_r400 ? 512 : 32;
259 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
260 return is_r500 ? 511 : 4;
261 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
262 return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
263 /* Fragment shader limits. */
264 case PIPE_SHADER_CAP_MAX_INPUTS:
265 /* 2 colors + 8 texcoords are always supported
266 * (minus fog and wpos).
267 *
268 * R500 has the ability to turn 3rd and 4th color into
269 * additional texcoords but there is no two-sided color
270 * selection then. However the facing bit can be used instead. */
271 return 10;
272 case PIPE_SHADER_CAP_MAX_OUTPUTS:
273 return 4;
274 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
275 return (is_r500 ? 256 : 32) * sizeof(float[4]);
276 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
277 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
278 return 1;
279 case PIPE_SHADER_CAP_MAX_TEMPS:
280 return is_r500 ? 128 : is_r400 ? 64 : 32;
281 case PIPE_SHADER_CAP_MAX_PREDS:
282 return 0; /* unused */
283 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
284 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
285 return r300screen->caps.num_tex_units;
286 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
287 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
288 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
289 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
290 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
291 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
292 case PIPE_SHADER_CAP_SUBROUTINES:
293 case PIPE_SHADER_CAP_INTEGERS:
294 case PIPE_SHADER_CAP_DOUBLES:
295 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
296 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
297 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
298 return 0;
299 case PIPE_SHADER_CAP_PREFERRED_IR:
300 return PIPE_SHADER_IR_TGSI;
301 }
302 break;
303 case PIPE_SHADER_VERTEX:
304 switch (param)
305 {
306 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
307 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
308 case PIPE_SHADER_CAP_SUBROUTINES:
309 return 0;
310 default:;
311 }
312
313 if (!r300screen->caps.has_tcl) {
314 return draw_get_shader_param(shader, param);
315 }
316
317 switch (param)
318 {
319 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
320 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
321 return is_r500 ? 1024 : 256;
322 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
323 return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
324 case PIPE_SHADER_CAP_MAX_INPUTS:
325 return 16;
326 case PIPE_SHADER_CAP_MAX_OUTPUTS:
327 return 10;
328 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
329 return 256 * sizeof(float[4]);
330 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
331 return 1;
332 case PIPE_SHADER_CAP_MAX_TEMPS:
333 return 32;
334 case PIPE_SHADER_CAP_MAX_PREDS:
335 return 0; /* unused */
336 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
337 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
338 return 1;
339 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
340 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
341 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
342 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
343 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
344 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
345 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
346 case PIPE_SHADER_CAP_SUBROUTINES:
347 case PIPE_SHADER_CAP_INTEGERS:
348 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
349 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
350 case PIPE_SHADER_CAP_DOUBLES:
351 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
352 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
353 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
354 return 0;
355 case PIPE_SHADER_CAP_PREFERRED_IR:
356 return PIPE_SHADER_IR_TGSI;
357 }
358 break;
359 }
360 return 0;
361 }
362
363 static float r300_get_paramf(struct pipe_screen* pscreen,
364 enum pipe_capf param)
365 {
366 struct r300_screen* r300screen = r300_screen(pscreen);
367
368 switch (param) {
369 case PIPE_CAPF_MAX_LINE_WIDTH:
370 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
371 case PIPE_CAPF_MAX_POINT_WIDTH:
372 case PIPE_CAPF_MAX_POINT_WIDTH_AA:
373 /* The maximum dimensions of the colorbuffer are our practical
374 * rendering limits. 2048 pixels should be enough for anybody. */
375 if (r300screen->caps.is_r500) {
376 return 4096.0f;
377 } else if (r300screen->caps.is_r400) {
378 return 4021.0f;
379 } else {
380 return 2560.0f;
381 }
382 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
383 return 16.0f;
384 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
385 return 16.0f;
386 case PIPE_CAPF_GUARD_BAND_LEFT:
387 case PIPE_CAPF_GUARD_BAND_TOP:
388 case PIPE_CAPF_GUARD_BAND_RIGHT:
389 case PIPE_CAPF_GUARD_BAND_BOTTOM:
390 return 0.0f;
391 default:
392 debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
393 param);
394 return 0.0f;
395 }
396 }
397
398 static int r300_get_video_param(struct pipe_screen *screen,
399 enum pipe_video_profile profile,
400 enum pipe_video_entrypoint entrypoint,
401 enum pipe_video_cap param)
402 {
403 switch (param) {
404 case PIPE_VIDEO_CAP_SUPPORTED:
405 return vl_profile_supported(screen, profile, entrypoint);
406 case PIPE_VIDEO_CAP_NPOT_TEXTURES:
407 return 0;
408 case PIPE_VIDEO_CAP_MAX_WIDTH:
409 case PIPE_VIDEO_CAP_MAX_HEIGHT:
410 return vl_video_buffer_max_size(screen);
411 case PIPE_VIDEO_CAP_PREFERED_FORMAT:
412 return PIPE_FORMAT_NV12;
413 case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
414 return false;
415 case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
416 return false;
417 case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
418 return true;
419 case PIPE_VIDEO_CAP_MAX_LEVEL:
420 return vl_level_supported(screen, profile);
421 default:
422 return 0;
423 }
424 }
425
426 /**
427 * Whether the format matches:
428 * PIPE_FORMAT_?10?10?10?2_UNORM
429 */
430 static INLINE boolean
431 util_format_is_rgba1010102_variant(const struct util_format_description *desc)
432 {
433 static const unsigned size[4] = {10, 10, 10, 2};
434 unsigned chan;
435
436 if (desc->block.width != 1 ||
437 desc->block.height != 1 ||
438 desc->block.bits != 32)
439 return FALSE;
440
441 for (chan = 0; chan < 4; ++chan) {
442 if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
443 desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
444 return FALSE;
445 if (desc->channel[chan].size != size[chan])
446 return FALSE;
447 }
448
449 return TRUE;
450 }
451
452 static bool r300_is_blending_supported(struct r300_screen *rscreen,
453 enum pipe_format format)
454 {
455 int c;
456 const struct util_format_description *desc =
457 util_format_description(format);
458
459 if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
460 return false;
461
462 c = util_format_get_first_non_void_channel(format);
463
464 /* RGBA16F */
465 if (rscreen->caps.is_r500 &&
466 desc->nr_channels == 4 &&
467 desc->channel[c].size == 16 &&
468 desc->channel[c].type == UTIL_FORMAT_TYPE_FLOAT)
469 return true;
470
471 if (desc->channel[c].normalized &&
472 desc->channel[c].type == UTIL_FORMAT_TYPE_UNSIGNED &&
473 desc->channel[c].size >= 4 &&
474 desc->channel[c].size <= 10) {
475 /* RGB10_A2, RGBA8, RGB5_A1, RGBA4, RGB565 */
476 if (desc->nr_channels >= 3)
477 return true;
478
479 if (format == PIPE_FORMAT_R8G8_UNORM)
480 return true;
481
482 /* R8, I8, L8, A8 */
483 if (desc->nr_channels == 1)
484 return true;
485 }
486
487 return false;
488 }
489
490 static boolean r300_is_format_supported(struct pipe_screen* screen,
491 enum pipe_format format,
492 enum pipe_texture_target target,
493 unsigned sample_count,
494 unsigned usage)
495 {
496 uint32_t retval = 0;
497 boolean drm_2_8_0 = r300_screen(screen)->info.drm_minor >= 8;
498 boolean is_r500 = r300_screen(screen)->caps.is_r500;
499 boolean is_r400 = r300_screen(screen)->caps.is_r400;
500 boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM ||
501 format == PIPE_FORMAT_R10G10B10X2_SNORM ||
502 format == PIPE_FORMAT_B10G10R10A2_UNORM ||
503 format == PIPE_FORMAT_B10G10R10X2_UNORM ||
504 format == PIPE_FORMAT_R10SG10SB10SA2U_NORM;
505 boolean is_ati1n = format == PIPE_FORMAT_RGTC1_UNORM ||
506 format == PIPE_FORMAT_RGTC1_SNORM ||
507 format == PIPE_FORMAT_LATC1_UNORM ||
508 format == PIPE_FORMAT_LATC1_SNORM;
509 boolean is_ati2n = format == PIPE_FORMAT_RGTC2_UNORM ||
510 format == PIPE_FORMAT_RGTC2_SNORM ||
511 format == PIPE_FORMAT_LATC2_UNORM ||
512 format == PIPE_FORMAT_LATC2_SNORM;
513 boolean is_x16f_xy16f = format == PIPE_FORMAT_R16_FLOAT ||
514 format == PIPE_FORMAT_R16G16_FLOAT ||
515 format == PIPE_FORMAT_A16_FLOAT ||
516 format == PIPE_FORMAT_L16_FLOAT ||
517 format == PIPE_FORMAT_L16A16_FLOAT ||
518 format == PIPE_FORMAT_R16A16_FLOAT ||
519 format == PIPE_FORMAT_I16_FLOAT;
520 boolean is_half_float = format == PIPE_FORMAT_R16_FLOAT ||
521 format == PIPE_FORMAT_R16G16_FLOAT ||
522 format == PIPE_FORMAT_R16G16B16_FLOAT ||
523 format == PIPE_FORMAT_R16G16B16A16_FLOAT ||
524 format == PIPE_FORMAT_R16G16B16X16_FLOAT;
525 const struct util_format_description *desc;
526
527 if (!util_format_is_supported(format, usage))
528 return FALSE;
529
530 /* Check multisampling support. */
531 switch (sample_count) {
532 case 0:
533 case 1:
534 break;
535 case 2:
536 case 4:
537 case 6:
538 /* We need DRM 2.8.0. */
539 if (!drm_2_8_0) {
540 return FALSE;
541 }
542 /* No texturing and scanout. */
543 if (usage & (PIPE_BIND_SAMPLER_VIEW |
544 PIPE_BIND_DISPLAY_TARGET |
545 PIPE_BIND_SCANOUT)) {
546 return FALSE;
547 }
548
549 desc = util_format_description(format);
550
551 if (is_r500) {
552 /* Only allow depth/stencil, RGBA8, RGBA1010102, RGBA16F. */
553 if (!util_format_is_depth_or_stencil(format) &&
554 !util_format_is_rgba8_variant(desc) &&
555 !util_format_is_rgba1010102_variant(desc) &&
556 format != PIPE_FORMAT_R16G16B16A16_FLOAT &&
557 format != PIPE_FORMAT_R16G16B16X16_FLOAT) {
558 return FALSE;
559 }
560 } else {
561 /* Only allow depth/stencil, RGBA8. */
562 if (!util_format_is_depth_or_stencil(format) &&
563 !util_format_is_rgba8_variant(desc)) {
564 return FALSE;
565 }
566 }
567 break;
568 default:
569 return FALSE;
570 }
571
572 /* Check sampler format support. */
573 if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
574 /* these two are broken for an unknown reason */
575 format != PIPE_FORMAT_R8G8B8X8_SNORM &&
576 format != PIPE_FORMAT_R16G16B16X16_SNORM &&
577 /* ATI1N is r5xx-only. */
578 (is_r500 || !is_ati1n) &&
579 /* ATI2N is supported on r4xx-r5xx. */
580 (is_r400 || is_r500 || !is_ati2n) &&
581 /* R16F and RG16F texture support was added in as late as DRM 2.8.0 */
582 (drm_2_8_0 || !is_x16f_xy16f) &&
583 r300_is_sampler_format_supported(format)) {
584 retval |= PIPE_BIND_SAMPLER_VIEW;
585 }
586
587 /* Check colorbuffer format support. */
588 if ((usage & (PIPE_BIND_RENDER_TARGET |
589 PIPE_BIND_DISPLAY_TARGET |
590 PIPE_BIND_SCANOUT |
591 PIPE_BIND_SHARED |
592 PIPE_BIND_BLENDABLE)) &&
593 /* 2101010 cannot be rendered to on non-r5xx. */
594 (!is_color2101010 || (is_r500 && drm_2_8_0)) &&
595 r300_is_colorbuffer_format_supported(format)) {
596 retval |= usage &
597 (PIPE_BIND_RENDER_TARGET |
598 PIPE_BIND_DISPLAY_TARGET |
599 PIPE_BIND_SCANOUT |
600 PIPE_BIND_SHARED);
601
602 if (r300_is_blending_supported(r300_screen(screen), format)) {
603 retval |= usage & PIPE_BIND_BLENDABLE;
604 }
605 }
606
607 /* Check depth-stencil format support. */
608 if (usage & PIPE_BIND_DEPTH_STENCIL &&
609 r300_is_zs_format_supported(format)) {
610 retval |= PIPE_BIND_DEPTH_STENCIL;
611 }
612
613 /* Check vertex buffer format support. */
614 if (usage & PIPE_BIND_VERTEX_BUFFER) {
615 if (r300_screen(screen)->caps.has_tcl) {
616 /* Half float is supported on >= R400. */
617 if ((is_r400 || is_r500 || !is_half_float) &&
618 r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
619 retval |= PIPE_BIND_VERTEX_BUFFER;
620 }
621 } else {
622 /* SW TCL */
623 if (!util_format_is_pure_integer(format)) {
624 retval |= PIPE_BIND_VERTEX_BUFFER;
625 }
626 }
627 }
628
629 /* Transfers are always supported. */
630 if (usage & PIPE_BIND_TRANSFER_READ)
631 retval |= PIPE_BIND_TRANSFER_READ;
632 if (usage & PIPE_BIND_TRANSFER_WRITE)
633 retval |= PIPE_BIND_TRANSFER_WRITE;
634
635 return retval == usage;
636 }
637
638 static void r300_destroy_screen(struct pipe_screen* pscreen)
639 {
640 struct r300_screen* r300screen = r300_screen(pscreen);
641 struct radeon_winsys *rws = radeon_winsys(pscreen);
642
643 if (rws && !rws->unref(rws))
644 return;
645
646 pipe_mutex_destroy(r300screen->cmask_mutex);
647
648 if (rws)
649 rws->destroy(rws);
650
651 FREE(r300screen);
652 }
653
654 static void r300_fence_reference(struct pipe_screen *screen,
655 struct pipe_fence_handle **ptr,
656 struct pipe_fence_handle *fence)
657 {
658 struct radeon_winsys *rws = r300_screen(screen)->rws;
659
660 rws->fence_reference(ptr, fence);
661 }
662
663 static boolean r300_fence_finish(struct pipe_screen *screen,
664 struct pipe_fence_handle *fence,
665 uint64_t timeout)
666 {
667 struct radeon_winsys *rws = r300_screen(screen)->rws;
668
669 return rws->fence_wait(rws, fence, timeout);
670 }
671
672 struct pipe_screen* r300_screen_create(struct radeon_winsys *rws)
673 {
674 struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen);
675
676 if (!r300screen) {
677 FREE(r300screen);
678 return NULL;
679 }
680
681 rws->query_info(rws, &r300screen->info);
682
683 r300_init_debug(r300screen);
684 r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps);
685
686 if (SCREEN_DBG_ON(r300screen, DBG_NO_ZMASK))
687 r300screen->caps.zmask_ram = 0;
688 if (SCREEN_DBG_ON(r300screen, DBG_NO_HIZ))
689 r300screen->caps.hiz_ram = 0;
690
691 if (r300screen->info.drm_minor < 8)
692 r300screen->caps.has_us_format = FALSE;
693
694 r300screen->rws = rws;
695 r300screen->screen.destroy = r300_destroy_screen;
696 r300screen->screen.get_name = r300_get_name;
697 r300screen->screen.get_vendor = r300_get_vendor;
698 r300screen->screen.get_device_vendor = r300_get_device_vendor;
699 r300screen->screen.get_param = r300_get_param;
700 r300screen->screen.get_shader_param = r300_get_shader_param;
701 r300screen->screen.get_paramf = r300_get_paramf;
702 r300screen->screen.get_video_param = r300_get_video_param;
703 r300screen->screen.is_format_supported = r300_is_format_supported;
704 r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
705 r300screen->screen.context_create = r300_create_context;
706 r300screen->screen.fence_reference = r300_fence_reference;
707 r300screen->screen.fence_finish = r300_fence_finish;
708
709 r300_init_screen_resource_functions(r300screen);
710
711 util_format_s3tc_init();
712 pipe_mutex_init(r300screen->cmask_mutex);
713
714 return &r300screen->screen;
715 }