2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
3 * Copyright 2010 Marek Olšák <maraeo@gmail.com>
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:
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
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. */
24 #include "compiler/nir/nir.h"
25 #include "util/format/u_format.h"
26 #include "util/format/u_format_s3tc.h"
27 #include "util/u_screen.h"
28 #include "util/u_memory.h"
30 #include "util/os_time.h"
31 #include "vl/vl_decoder.h"
32 #include "vl/vl_video_buffer.h"
34 #include "r300_context.h"
35 #include "r300_texture.h"
36 #include "r300_screen_buffer.h"
37 #include "r300_state_inlines.h"
38 #include "r300_public.h"
39 #include "compiler/r300_nir.h"
41 #include "draw/draw_context.h"
43 /* Return the identifier behind whom the brave coders responsible for this
44 * amalgamation of code, sweat, and duct tape, routinely obscure their names.
46 * ...I should have just put "Corbin Simpson", but I'm not that cool.
48 * (Or egotistical. Yet.) */
49 static const char* r300_get_vendor(struct pipe_screen* pscreen)
54 static const char* r300_get_device_vendor(struct pipe_screen* pscreen)
59 static const char* chip_families[] = {
86 static const char* r300_get_family_name(struct r300_screen* r300screen)
88 return chip_families[r300screen->caps.family];
91 static const char* r300_get_name(struct pipe_screen* pscreen)
93 struct r300_screen* r300screen = r300_screen(pscreen);
95 return r300_get_family_name(r300screen);
98 static void r300_disk_cache_create(struct r300_screen* r300screen)
100 struct mesa_sha1 ctx;
101 unsigned char sha1[20];
102 char cache_id[20 * 2 + 1];
104 _mesa_sha1_init(&ctx);
105 if (!disk_cache_get_function_identifier(r300_disk_cache_create,
109 _mesa_sha1_final(&ctx, sha1);
110 mesa_bytes_to_hex(cache_id, sha1, 20);
112 r300screen->disk_shader_cache =
113 disk_cache_create(r300_get_family_name(r300screen),
118 static struct disk_cache* r300_get_disk_shader_cache(struct pipe_screen* pscreen)
120 struct r300_screen* r300screen = r300_screen(pscreen);
121 return r300screen->disk_shader_cache;
124 static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
126 struct r300_screen* r300screen = r300_screen(pscreen);
127 bool is_r500 = r300screen->caps.is_r500;
130 /* Supported features (boolean caps). */
131 case PIPE_CAP_NPOT_TEXTURES:
132 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
133 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
134 case PIPE_CAP_ANISOTROPIC_FILTER:
135 case PIPE_CAP_OCCLUSION_QUERY:
136 case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
137 case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
138 case PIPE_CAP_BLEND_EQUATION_SEPARATE:
139 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
140 case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT:
141 case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
142 case PIPE_CAP_CONDITIONAL_RENDER:
143 case PIPE_CAP_TEXTURE_BARRIER:
144 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
145 case PIPE_CAP_CLIP_HALFZ:
146 case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
147 case PIPE_CAP_LEGACY_MATH_RULES:
148 case PIPE_CAP_TGSI_TEXCOORD:
151 case PIPE_CAP_TEXTURE_TRANSFER_MODES:
152 return PIPE_TEXTURE_TRANSFER_BLIT;
154 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
155 return R300_BUFFER_ALIGNMENT;
157 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
160 case PIPE_CAP_GLSL_FEATURE_LEVEL:
161 case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
164 /* r300 cannot do swizzling of compressed textures. Supported otherwise. */
165 case PIPE_CAP_TEXTURE_SWIZZLE:
166 return r300screen->caps.dxtc_swizzle;
168 /* We don't support color clamping on r500, so that we can use color
169 * interpolators for generic varyings. */
170 case PIPE_CAP_VERTEX_COLOR_CLAMPED:
173 /* Supported on r500 only. */
174 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
175 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
176 case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
177 case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
178 return is_r500 ? 1 : 0;
180 case PIPE_CAP_SHAREABLE_SHADERS:
183 case PIPE_CAP_MAX_GS_INVOCATIONS:
185 case PIPE_CAP_MAX_SHADER_BUFFER_SIZE_UINT:
188 /* SWTCL-only features. */
189 case PIPE_CAP_PRIMITIVE_RESTART:
190 case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
191 case PIPE_CAP_USER_VERTEX_BUFFERS:
192 case PIPE_CAP_VS_WINDOW_SPACE_POSITION:
193 return !r300screen->caps.has_tcl;
195 /* HWTCL-only features / limitations. */
196 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
197 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
198 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
199 return r300screen->caps.has_tcl;
202 case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
203 return is_r500 ? 4096 : 2048;
204 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
205 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
206 /* 13 == 4096, 12 == 2048 */
207 return is_r500 ? 13 : 12;
209 /* Render targets. */
210 case PIPE_CAP_MAX_RENDER_TARGETS:
212 case PIPE_CAP_ENDIANNESS:
213 return PIPE_ENDIAN_LITTLE;
215 case PIPE_CAP_MAX_VIEWPORTS:
218 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
221 case PIPE_CAP_MAX_VARYINGS:
224 case PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF:
227 case PIPE_CAP_VENDOR_ID:
229 case PIPE_CAP_DEVICE_ID:
230 return r300screen->info.pci_id;
231 case PIPE_CAP_ACCELERATED:
233 case PIPE_CAP_VIDEO_MEMORY:
234 return r300screen->info.vram_size_kb >> 10;
237 case PIPE_CAP_PCI_GROUP:
238 return r300screen->info.pci.domain;
239 case PIPE_CAP_PCI_BUS:
240 return r300screen->info.pci.bus;
241 case PIPE_CAP_PCI_DEVICE:
242 return r300screen->info.pci.dev;
243 case PIPE_CAP_PCI_FUNCTION:
244 return r300screen->info.pci.func;
246 return u_pipe_screen_get_param_defaults(pscreen, param);
250 static int r300_get_shader_param(struct pipe_screen *pscreen,
251 enum pipe_shader_type shader,
252 enum pipe_shader_cap param)
254 struct r300_screen* r300screen = r300_screen(pscreen);
255 bool is_r400 = r300screen->caps.is_r400;
256 bool is_r500 = r300screen->caps.is_r500;
259 case PIPE_SHADER_CAP_SUPPORTED_IRS:
260 return (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_TGSI);
266 case PIPE_SHADER_FRAGMENT:
269 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
270 return is_r500 || is_r400 ? 512 : 96;
271 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
272 return is_r500 || is_r400 ? 512 : 64;
273 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
274 return is_r500 || is_r400 ? 512 : 32;
275 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
276 return is_r500 ? 511 : 4;
277 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
278 return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
279 /* Fragment shader limits. */
280 case PIPE_SHADER_CAP_MAX_INPUTS:
281 /* 2 colors + 8 texcoords are always supported
282 * (minus fog and wpos).
284 * R500 has the ability to turn 3rd and 4th color into
285 * additional texcoords but there is no two-sided color
286 * selection then. However the facing bit can be used instead. */
288 case PIPE_SHADER_CAP_MAX_OUTPUTS:
290 case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
291 return (is_r500 ? 256 : 32) * sizeof(float[4]);
292 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
293 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
295 case PIPE_SHADER_CAP_MAX_TEMPS:
296 return is_r500 ? 128 : is_r400 ? 64 : 32;
297 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
298 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
299 return r300screen->caps.num_tex_units;
300 case PIPE_SHADER_CAP_CONT_SUPPORTED:
301 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
302 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
303 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
304 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
305 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
306 case PIPE_SHADER_CAP_SUBROUTINES:
307 case PIPE_SHADER_CAP_INTEGERS:
308 case PIPE_SHADER_CAP_INT64_ATOMICS:
309 case PIPE_SHADER_CAP_FP16:
310 case PIPE_SHADER_CAP_FP16_DERIVATIVES:
311 case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
312 case PIPE_SHADER_CAP_INT16:
313 case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
314 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
315 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
316 case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
317 case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
323 case PIPE_SHADER_VERTEX:
326 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
327 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
328 case PIPE_SHADER_CAP_SUBROUTINES:
333 if (!r300screen->caps.has_tcl) {
335 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
336 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
339 /* mesa/st requires that this cap is the same across stages, and the FS
342 case PIPE_SHADER_CAP_INTEGERS:
345 /* Even if gallivm NIR can do this, we call nir_to_tgsi manually and
348 case PIPE_SHADER_CAP_INT16:
349 case PIPE_SHADER_CAP_FP16:
350 case PIPE_SHADER_CAP_FP16_DERIVATIVES:
351 case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
354 /* While draw could normally handle this for the VS, the NIR lowering
355 * to regs can't handle our non-native-integers, so we have to lower to
358 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
361 return draw_get_shader_param(shader, param);
367 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
368 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
369 return is_r500 ? 1024 : 256;
370 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
371 return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
372 case PIPE_SHADER_CAP_MAX_INPUTS:
374 case PIPE_SHADER_CAP_MAX_OUTPUTS:
376 case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
377 return 256 * sizeof(float[4]);
378 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
380 case PIPE_SHADER_CAP_MAX_TEMPS:
382 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
383 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
385 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
386 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
387 case PIPE_SHADER_CAP_CONT_SUPPORTED:
388 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
389 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
390 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
391 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
392 case PIPE_SHADER_CAP_SUBROUTINES:
393 case PIPE_SHADER_CAP_INTEGERS:
394 case PIPE_SHADER_CAP_FP16:
395 case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
396 case PIPE_SHADER_CAP_FP16_DERIVATIVES:
397 case PIPE_SHADER_CAP_INT16:
398 case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
399 case PIPE_SHADER_CAP_INT64_ATOMICS:
400 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
401 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
402 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
403 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
404 case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
405 case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
417 static float r300_get_paramf(struct pipe_screen* pscreen,
418 enum pipe_capf param)
420 struct r300_screen* r300screen = r300_screen(pscreen);
423 case PIPE_CAPF_MIN_LINE_WIDTH:
424 case PIPE_CAPF_MIN_LINE_WIDTH_AA:
425 case PIPE_CAPF_MIN_POINT_SIZE:
426 case PIPE_CAPF_MIN_POINT_SIZE_AA:
428 case PIPE_CAPF_POINT_SIZE_GRANULARITY:
429 case PIPE_CAPF_LINE_WIDTH_GRANULARITY:
431 case PIPE_CAPF_MAX_LINE_WIDTH:
432 case PIPE_CAPF_MAX_LINE_WIDTH_AA:
433 case PIPE_CAPF_MAX_POINT_SIZE:
434 case PIPE_CAPF_MAX_POINT_SIZE_AA:
435 /* The maximum dimensions of the colorbuffer are our practical
436 * rendering limits. 2048 pixels should be enough for anybody. */
437 if (r300screen->caps.is_r500) {
439 } else if (r300screen->caps.is_r400) {
444 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
446 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
448 case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
449 case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
450 case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
453 debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
459 static int r300_get_video_param(struct pipe_screen *screen,
460 enum pipe_video_profile profile,
461 enum pipe_video_entrypoint entrypoint,
462 enum pipe_video_cap param)
465 case PIPE_VIDEO_CAP_SUPPORTED:
466 return vl_profile_supported(screen, profile, entrypoint);
467 case PIPE_VIDEO_CAP_NPOT_TEXTURES:
469 case PIPE_VIDEO_CAP_MAX_WIDTH:
470 case PIPE_VIDEO_CAP_MAX_HEIGHT:
471 return vl_video_buffer_max_size(screen);
472 case PIPE_VIDEO_CAP_PREFERED_FORMAT:
473 return PIPE_FORMAT_NV12;
474 case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
476 case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
478 case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
480 case PIPE_VIDEO_CAP_MAX_LEVEL:
481 return vl_level_supported(screen, profile);
487 #define COMMON_NIR_OPTIONS \
488 .fdot_replicates = true, \
489 .fuse_ffma32 = true, \
490 .fuse_ffma64 = true, \
491 .lower_bitops = true, \
492 .lower_extract_byte = true, \
493 .lower_extract_word = true, \
494 .lower_fceil = true, \
495 .lower_fdiv = true, \
496 .lower_fdph = true, \
497 .lower_ffloor = true, \
498 .lower_flrp32 = true, \
499 .lower_flrp64 = true, \
500 .lower_fmod = true, \
501 .lower_fsign = true, \
502 .lower_fsqrt = true, \
503 .lower_ftrunc = true, \
504 .lower_insert_byte = true, \
505 .lower_insert_word = true, \
506 .lower_rotate = true, \
507 .lower_uniforms_to_ubo = true, \
508 .lower_vector_cmp = true, \
509 .no_integers = true, \
510 .use_interpolated_input_intrinsics = true
512 static const nir_shader_compiler_options r500_vs_compiler_options = {
514 .has_fused_comp_and_csel = true,
516 /* Have HW loops support and 1024 max instr count, but don't unroll *too*
519 .max_unroll_iterations = 29,
522 static const nir_shader_compiler_options r500_fs_compiler_options = {
524 .lower_fpow = true, /* POW is only in the VS */
525 .has_fused_comp_and_csel = true,
527 /* Have HW loops support and 512 max instr count, but don't unroll *too*
530 .max_unroll_iterations = 32,
533 static const nir_shader_compiler_options r300_vs_compiler_options = {
535 .lower_fsat = true, /* No fsat in pre-r500 VS */
536 .lower_sincos = true,
538 /* Note: has HW loops support, but only 256 ALU instructions. */
539 .max_unroll_iterations = 32,
542 static const nir_shader_compiler_options r300_fs_compiler_options = {
544 .lower_fpow = true, /* POW is only in the VS */
545 .lower_sincos = true,
546 .has_fused_comp_and_csel = true,
548 /* No HW loops support, so set it equal to ALU instr max */
549 .max_unroll_iterations = 64,
553 r300_get_compiler_options(struct pipe_screen *pscreen,
554 enum pipe_shader_ir ir,
555 enum pipe_shader_type shader)
557 struct r300_screen* r300screen = r300_screen(pscreen);
559 assert(ir == PIPE_SHADER_IR_NIR);
561 if (r300screen->caps.is_r500) {
562 if (shader == PIPE_SHADER_VERTEX)
563 return &r500_vs_compiler_options;
565 return &r500_fs_compiler_options;
567 if (shader == PIPE_SHADER_VERTEX)
568 return &r300_vs_compiler_options;
570 return &r300_fs_compiler_options;
575 * Whether the format matches:
576 * PIPE_FORMAT_?10?10?10?2_UNORM
579 util_format_is_rgba1010102_variant(const struct util_format_description *desc)
581 static const unsigned size[4] = {10, 10, 10, 2};
584 if (desc->block.width != 1 ||
585 desc->block.height != 1 ||
586 desc->block.bits != 32)
589 for (chan = 0; chan < 4; ++chan) {
590 if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
591 desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
593 if (desc->channel[chan].size != size[chan])
600 static bool r300_is_blending_supported(struct r300_screen *rscreen,
601 enum pipe_format format)
604 const struct util_format_description *desc =
605 util_format_description(format);
607 if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
610 c = util_format_get_first_non_void_channel(format);
613 if (rscreen->caps.is_r500 &&
614 desc->nr_channels == 4 &&
615 desc->channel[c].size == 16 &&
616 desc->channel[c].type == UTIL_FORMAT_TYPE_FLOAT)
619 if (desc->channel[c].normalized &&
620 desc->channel[c].type == UTIL_FORMAT_TYPE_UNSIGNED &&
621 desc->channel[c].size >= 4 &&
622 desc->channel[c].size <= 10) {
623 /* RGB10_A2, RGBA8, RGB5_A1, RGBA4, RGB565 */
624 if (desc->nr_channels >= 3)
627 if (format == PIPE_FORMAT_R8G8_UNORM)
631 if (desc->nr_channels == 1)
638 static bool r300_is_format_supported(struct pipe_screen* screen,
639 enum pipe_format format,
640 enum pipe_texture_target target,
641 unsigned sample_count,
642 unsigned storage_sample_count,
646 bool is_r500 = r300_screen(screen)->caps.is_r500;
647 bool is_r400 = r300_screen(screen)->caps.is_r400;
648 bool is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM ||
649 format == PIPE_FORMAT_R10G10B10X2_SNORM ||
650 format == PIPE_FORMAT_B10G10R10A2_UNORM ||
651 format == PIPE_FORMAT_B10G10R10X2_UNORM ||
652 format == PIPE_FORMAT_R10SG10SB10SA2U_NORM;
653 bool is_ati1n = format == PIPE_FORMAT_RGTC1_UNORM ||
654 format == PIPE_FORMAT_RGTC1_SNORM ||
655 format == PIPE_FORMAT_LATC1_UNORM ||
656 format == PIPE_FORMAT_LATC1_SNORM;
657 bool is_ati2n = format == PIPE_FORMAT_RGTC2_UNORM ||
658 format == PIPE_FORMAT_RGTC2_SNORM ||
659 format == PIPE_FORMAT_LATC2_UNORM ||
660 format == PIPE_FORMAT_LATC2_SNORM;
661 bool is_half_float = format == PIPE_FORMAT_R16_FLOAT ||
662 format == PIPE_FORMAT_R16G16_FLOAT ||
663 format == PIPE_FORMAT_R16G16B16_FLOAT ||
664 format == PIPE_FORMAT_R16G16B16A16_FLOAT ||
665 format == PIPE_FORMAT_R16G16B16X16_FLOAT;
666 const struct util_format_description *desc;
668 if (MAX2(1, sample_count) != MAX2(1, storage_sample_count))
671 /* Check multisampling support. */
672 switch (sample_count) {
679 /* No texturing and scanout. */
680 if (usage & (PIPE_BIND_SAMPLER_VIEW |
681 PIPE_BIND_DISPLAY_TARGET |
682 PIPE_BIND_SCANOUT)) {
686 desc = util_format_description(format);
689 /* Only allow depth/stencil, RGBA8, RGBA1010102, RGBA16F. */
690 if (!util_format_is_depth_or_stencil(format) &&
691 !util_format_is_rgba8_variant(desc) &&
692 !util_format_is_rgba1010102_variant(desc) &&
693 format != PIPE_FORMAT_R16G16B16A16_FLOAT &&
694 format != PIPE_FORMAT_R16G16B16X16_FLOAT) {
698 /* Only allow depth/stencil, RGBA8. */
699 if (!util_format_is_depth_or_stencil(format) &&
700 !util_format_is_rgba8_variant(desc)) {
709 /* Check sampler format support. */
710 if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
711 /* these two are broken for an unknown reason */
712 format != PIPE_FORMAT_R8G8B8X8_SNORM &&
713 format != PIPE_FORMAT_R16G16B16X16_SNORM &&
714 /* ATI1N is r5xx-only. */
715 (is_r500 || !is_ati1n) &&
716 /* ATI2N is supported on r4xx-r5xx. */
717 (is_r400 || is_r500 || !is_ati2n) &&
718 r300_is_sampler_format_supported(format)) {
719 retval |= PIPE_BIND_SAMPLER_VIEW;
722 /* Check colorbuffer format support. */
723 if ((usage & (PIPE_BIND_RENDER_TARGET |
724 PIPE_BIND_DISPLAY_TARGET |
727 PIPE_BIND_BLENDABLE)) &&
728 /* 2101010 cannot be rendered to on non-r5xx. */
729 (!is_color2101010 || is_r500) &&
730 r300_is_colorbuffer_format_supported(format)) {
732 (PIPE_BIND_RENDER_TARGET |
733 PIPE_BIND_DISPLAY_TARGET |
737 if (r300_is_blending_supported(r300_screen(screen), format)) {
738 retval |= usage & PIPE_BIND_BLENDABLE;
742 /* Check depth-stencil format support. */
743 if (usage & PIPE_BIND_DEPTH_STENCIL &&
744 r300_is_zs_format_supported(format)) {
745 retval |= PIPE_BIND_DEPTH_STENCIL;
748 /* Check vertex buffer format support. */
749 if (usage & PIPE_BIND_VERTEX_BUFFER) {
750 if (r300_screen(screen)->caps.has_tcl) {
751 /* Half float is supported on >= R400. */
752 if ((is_r400 || is_r500 || !is_half_float) &&
753 r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
754 retval |= PIPE_BIND_VERTEX_BUFFER;
758 if (!util_format_is_pure_integer(format)) {
759 retval |= PIPE_BIND_VERTEX_BUFFER;
764 if (usage & PIPE_BIND_INDEX_BUFFER) {
765 if (format == PIPE_FORMAT_R8_UINT ||
766 format == PIPE_FORMAT_R16_UINT ||
767 format == PIPE_FORMAT_R32_UINT)
768 retval |= PIPE_BIND_INDEX_BUFFER;
771 return retval == usage;
774 static void r300_destroy_screen(struct pipe_screen* pscreen)
776 struct r300_screen* r300screen = r300_screen(pscreen);
777 struct radeon_winsys *rws = radeon_winsys(pscreen);
779 if (rws && !rws->unref(rws))
782 mtx_destroy(&r300screen->cmask_mutex);
783 slab_destroy_parent(&r300screen->pool_transfers);
785 disk_cache_destroy(r300screen->disk_shader_cache);
793 static void r300_fence_reference(struct pipe_screen *screen,
794 struct pipe_fence_handle **ptr,
795 struct pipe_fence_handle *fence)
797 struct radeon_winsys *rws = r300_screen(screen)->rws;
799 rws->fence_reference(ptr, fence);
802 static bool r300_fence_finish(struct pipe_screen *screen,
803 struct pipe_context *ctx,
804 struct pipe_fence_handle *fence,
807 struct radeon_winsys *rws = r300_screen(screen)->rws;
809 return rws->fence_wait(rws, fence, timeout);
812 static int r300_screen_get_fd(struct pipe_screen *screen)
814 struct radeon_winsys *rws = r300_screen(screen)->rws;
816 return rws->get_fd(rws);
819 struct pipe_screen* r300_screen_create(struct radeon_winsys *rws,
820 const struct pipe_screen_config *config)
822 struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen);
829 rws->query_info(rws, &r300screen->info);
831 r300_init_debug(r300screen);
832 r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps);
834 if (SCREEN_DBG_ON(r300screen, DBG_NO_ZMASK))
835 r300screen->caps.zmask_ram = 0;
836 if (SCREEN_DBG_ON(r300screen, DBG_NO_HIZ))
837 r300screen->caps.hiz_ram = 0;
838 if (SCREEN_DBG_ON(r300screen, DBG_NO_TCL))
839 r300screen->caps.has_tcl = false;
841 r300screen->rws = rws;
842 r300screen->screen.destroy = r300_destroy_screen;
843 r300screen->screen.get_name = r300_get_name;
844 r300screen->screen.get_vendor = r300_get_vendor;
845 r300screen->screen.get_compiler_options = r300_get_compiler_options;
846 r300screen->screen.finalize_nir = r300_finalize_nir;
847 r300screen->screen.get_device_vendor = r300_get_device_vendor;
848 r300screen->screen.get_disk_shader_cache = r300_get_disk_shader_cache;
849 r300screen->screen.get_screen_fd = r300_screen_get_fd;
850 r300screen->screen.get_param = r300_get_param;
851 r300screen->screen.get_shader_param = r300_get_shader_param;
852 r300screen->screen.get_paramf = r300_get_paramf;
853 r300screen->screen.get_video_param = r300_get_video_param;
854 r300screen->screen.is_format_supported = r300_is_format_supported;
855 r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
856 r300screen->screen.context_create = r300_create_context;
857 r300screen->screen.fence_reference = r300_fence_reference;
858 r300screen->screen.fence_finish = r300_fence_finish;
860 r300_init_screen_resource_functions(r300screen);
862 r300_disk_cache_create(r300screen);
864 slab_create_parent(&r300screen->pool_transfers, sizeof(struct pipe_transfer), 64);
866 (void) mtx_init(&r300screen->cmask_mutex, mtx_plain);
868 return &r300screen->screen;