• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "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"
29 #include "util/os_time.h"
30 #include "vl/vl_decoder.h"
31 #include "vl/vl_video_buffer.h"
32 
33 #include "r300_context.h"
34 #include "r300_texture.h"
35 #include "r300_screen_buffer.h"
36 #include "r300_state_inlines.h"
37 #include "r300_public.h"
38 
39 #include "draw/draw_context.h"
40 
41 /* Return the identifier behind whom the brave coders responsible for this
42  * amalgamation of code, sweat, and duct tape, routinely obscure their names.
43  *
44  * ...I should have just put "Corbin Simpson", but I'm not that cool.
45  *
46  * (Or egotistical. Yet.) */
r300_get_vendor(struct pipe_screen * pscreen)47 static const char* r300_get_vendor(struct pipe_screen* pscreen)
48 {
49     return "X.Org R300 Project";
50 }
51 
r300_get_device_vendor(struct pipe_screen * pscreen)52 static const char* r300_get_device_vendor(struct pipe_screen* pscreen)
53 {
54     return "ATI";
55 }
56 
57 static const char* chip_families[] = {
58     "unknown",
59     "ATI R300",
60     "ATI R350",
61     "ATI RV350",
62     "ATI RV370",
63     "ATI RV380",
64     "ATI RS400",
65     "ATI RC410",
66     "ATI RS480",
67     "ATI R420",
68     "ATI R423",
69     "ATI R430",
70     "ATI R480",
71     "ATI R481",
72     "ATI RV410",
73     "ATI RS600",
74     "ATI RS690",
75     "ATI RS740",
76     "ATI RV515",
77     "ATI R520",
78     "ATI RV530",
79     "ATI R580",
80     "ATI RV560",
81     "ATI RV570"
82 };
83 
r300_get_family_name(struct r300_screen * r300screen)84 static const char* r300_get_family_name(struct r300_screen* r300screen)
85 {
86     return chip_families[r300screen->caps.family];
87 }
88 
r300_get_name(struct pipe_screen * pscreen)89 static const char* r300_get_name(struct pipe_screen* pscreen)
90 {
91     struct r300_screen* r300screen = r300_screen(pscreen);
92 
93     return r300_get_family_name(r300screen);
94 }
95 
r300_disk_cache_create(struct r300_screen * r300screen)96 static void r300_disk_cache_create(struct r300_screen* r300screen)
97 {
98     struct mesa_sha1 ctx;
99     unsigned char sha1[20];
100     char cache_id[20 * 2 + 1];
101 
102     _mesa_sha1_init(&ctx);
103     if (!disk_cache_get_function_identifier(r300_disk_cache_create,
104                                             &ctx))
105         return;
106 
107     _mesa_sha1_final(&ctx, sha1);
108     disk_cache_format_hex_id(cache_id, sha1, 20 * 2);
109 
110     r300screen->disk_shader_cache =
111                     disk_cache_create(r300_get_family_name(r300screen),
112                                       cache_id,
113                                       r300screen->debug);
114 }
115 
r300_get_disk_shader_cache(struct pipe_screen * pscreen)116 static struct disk_cache* r300_get_disk_shader_cache(struct pipe_screen* pscreen)
117 {
118 	struct r300_screen* r300screen = r300_screen(pscreen);
119 	return r300screen->disk_shader_cache;
120 }
121 
r300_get_param(struct pipe_screen * pscreen,enum pipe_cap param)122 static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
123 {
124     struct r300_screen* r300screen = r300_screen(pscreen);
125     boolean is_r500 = r300screen->caps.is_r500;
126 
127     switch (param) {
128         /* Supported features (boolean caps). */
129         case PIPE_CAP_NPOT_TEXTURES:
130         case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
131         case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
132         case PIPE_CAP_ANISOTROPIC_FILTER:
133         case PIPE_CAP_POINT_SPRITE:
134         case PIPE_CAP_OCCLUSION_QUERY:
135         case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
136         case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
137         case PIPE_CAP_BLEND_EQUATION_SEPARATE:
138         case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
139         case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT:
140         case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
141         case PIPE_CAP_CONDITIONAL_RENDER:
142         case PIPE_CAP_TEXTURE_BARRIER:
143         case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
144         case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
145         case PIPE_CAP_CLIP_HALFZ:
146         case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
147         case PIPE_CAP_LEGACY_MATH_RULES:
148             return 1;
149 
150         case PIPE_CAP_TEXTURE_TRANSFER_MODES:
151             return PIPE_TEXTURE_TRANSFER_BLIT;
152 
153         case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
154             return R300_BUFFER_ALIGNMENT;
155 
156         case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
157             return 16;
158 
159         case PIPE_CAP_GLSL_FEATURE_LEVEL:
160         case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
161             return 120;
162 
163         /* r300 cannot do swizzling of compressed textures. Supported otherwise. */
164         case PIPE_CAP_TEXTURE_SWIZZLE:
165             return r300screen->caps.dxtc_swizzle;
166 
167         /* We don't support color clamping on r500, so that we can use color
168          * interpolators for generic varyings. */
169         case PIPE_CAP_VERTEX_COLOR_CLAMPED:
170             return !is_r500;
171 
172         /* Supported on r500 only. */
173         case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
174         case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
175         case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
176         case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
177             return is_r500 ? 1 : 0;
178 
179         case PIPE_CAP_SHAREABLE_SHADERS:
180             return 0;
181 
182         case PIPE_CAP_MAX_GS_INVOCATIONS:
183             return 32;
184        case PIPE_CAP_MAX_SHADER_BUFFER_SIZE_UINT:
185             return 1 << 27;
186 
187         /* SWTCL-only features. */
188         case PIPE_CAP_PRIMITIVE_RESTART:
189         case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
190         case PIPE_CAP_USER_VERTEX_BUFFERS:
191         case PIPE_CAP_VS_WINDOW_SPACE_POSITION:
192             return !r300screen->caps.has_tcl;
193 
194         /* HWTCL-only features / limitations. */
195         case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
196         case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
197         case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
198             return r300screen->caps.has_tcl;
199 
200         /* Texturing. */
201         case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
202             return is_r500 ? 4096 : 2048;
203         case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
204         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
205             /* 13 == 4096, 12 == 2048 */
206             return is_r500 ? 13 : 12;
207 
208         /* Render targets. */
209         case PIPE_CAP_MAX_RENDER_TARGETS:
210             return 4;
211         case PIPE_CAP_ENDIANNESS:
212             return PIPE_ENDIAN_LITTLE;
213 
214         case PIPE_CAP_MAX_VIEWPORTS:
215             return 1;
216 
217         case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
218             return 2048;
219 
220         case PIPE_CAP_MAX_VARYINGS:
221             return 10;
222 
223 	case PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF:
224 	    return 0;
225 
226         case PIPE_CAP_VENDOR_ID:
227                 return 0x1002;
228         case PIPE_CAP_DEVICE_ID:
229                 return r300screen->info.pci_id;
230         case PIPE_CAP_ACCELERATED:
231                 return 1;
232         case PIPE_CAP_VIDEO_MEMORY:
233                 return r300screen->info.vram_size_kb >> 10;
234         case PIPE_CAP_UMA:
235                 return 0;
236         case PIPE_CAP_PCI_GROUP:
237             return r300screen->info.pci_domain;
238         case PIPE_CAP_PCI_BUS:
239             return r300screen->info.pci_bus;
240         case PIPE_CAP_PCI_DEVICE:
241             return r300screen->info.pci_dev;
242         case PIPE_CAP_PCI_FUNCTION:
243             return r300screen->info.pci_func;
244         default:
245             return u_pipe_screen_get_param_defaults(pscreen, param);
246     }
247 }
248 
r300_get_shader_param(struct pipe_screen * pscreen,enum pipe_shader_type shader,enum pipe_shader_cap param)249 static int r300_get_shader_param(struct pipe_screen *pscreen,
250                                  enum pipe_shader_type shader,
251                                  enum pipe_shader_cap param)
252 {
253    struct r300_screen* r300screen = r300_screen(pscreen);
254    boolean is_r400 = r300screen->caps.is_r400;
255    boolean is_r500 = r300screen->caps.is_r500;
256 
257    switch (param) {
258     case PIPE_SHADER_CAP_PREFERRED_IR:
259         return (r300screen->debug & DBG_USE_TGSI) ? PIPE_SHADER_IR_TGSI : PIPE_SHADER_IR_NIR;
260     case PIPE_SHADER_CAP_SUPPORTED_IRS:
261         return (1 << PIPE_SHADER_IR_NIR) | (1 << PIPE_SHADER_IR_TGSI);
262     default:
263         break;
264     }
265 
266    switch (shader) {
267     case PIPE_SHADER_FRAGMENT:
268         switch (param)
269         {
270         case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
271             return is_r500 || is_r400 ? 512 : 96;
272         case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
273             return is_r500 || is_r400 ? 512 : 64;
274         case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
275             return is_r500 || is_r400 ? 512 : 32;
276         case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
277             return is_r500 ? 511 : 4;
278         case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
279             return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
280             /* Fragment shader limits. */
281         case PIPE_SHADER_CAP_MAX_INPUTS:
282             /* 2 colors + 8 texcoords are always supported
283              * (minus fog and wpos).
284              *
285              * R500 has the ability to turn 3rd and 4th color into
286              * additional texcoords but there is no two-sided color
287              * selection then. However the facing bit can be used instead. */
288             return 10;
289         case PIPE_SHADER_CAP_MAX_OUTPUTS:
290             return 4;
291         case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
292             return (is_r500 ? 256 : 32) * sizeof(float[4]);
293         case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
294         case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
295             return 1;
296         case PIPE_SHADER_CAP_MAX_TEMPS:
297             return is_r500 ? 128 : is_r400 ? 64 : 32;
298         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
299         case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
300            return r300screen->caps.num_tex_units;
301         case PIPE_SHADER_CAP_CONT_SUPPORTED:
302         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
303         case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
304         case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
305         case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
306         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
307         case PIPE_SHADER_CAP_SUBROUTINES:
308         case PIPE_SHADER_CAP_INTEGERS:
309         case PIPE_SHADER_CAP_INT64_ATOMICS:
310         case PIPE_SHADER_CAP_FP16:
311         case PIPE_SHADER_CAP_FP16_DERIVATIVES:
312         case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
313         case PIPE_SHADER_CAP_INT16:
314         case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
315         case PIPE_SHADER_CAP_DROUND_SUPPORTED:
316         case PIPE_SHADER_CAP_DFRACEXP_DLDEXP_SUPPORTED:
317         case PIPE_SHADER_CAP_LDEXP_SUPPORTED:
318         case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
319         case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
320         case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
321         case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
322             return 0;
323         default:
324             break;
325         }
326         break;
327     case PIPE_SHADER_VERTEX:
328         switch (param)
329         {
330         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
331         case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
332         case PIPE_SHADER_CAP_SUBROUTINES:
333             return 0;
334         default:;
335         }
336 
337         if (!r300screen->caps.has_tcl) {
338             switch (param) {
339             case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
340             case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
341                 return 0;
342 
343             /* mesa/st requires that this cap is the same across stages, and the FS
344              * can't do ints.
345              */
346             case PIPE_SHADER_CAP_INTEGERS:
347                 return 0;
348 
349             /* Even if gallivm NIR can do this, we call nir_to_tgsi manually and
350              * TGSI can't.
351              */
352             case PIPE_SHADER_CAP_INT16:
353             case PIPE_SHADER_CAP_FP16:
354             case PIPE_SHADER_CAP_FP16_DERIVATIVES:
355             case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
356                 return 0;
357 
358             /* While draw could normally handle this for the VS, the NIR lowering
359              * to regs can't handle our non-native-integers, so we have to lower to
360              * if ladders.
361              */
362             case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
363                 return 0;
364             default:
365                 return draw_get_shader_param(shader, param);
366             }
367         }
368 
369         switch (param)
370         {
371         case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
372         case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
373             return is_r500 ? 1024 : 256;
374         case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
375             return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
376         case PIPE_SHADER_CAP_MAX_INPUTS:
377             return 16;
378         case PIPE_SHADER_CAP_MAX_OUTPUTS:
379             return 10;
380         case PIPE_SHADER_CAP_MAX_CONST_BUFFER0_SIZE:
381             return 256 * sizeof(float[4]);
382         case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
383             return 1;
384         case PIPE_SHADER_CAP_MAX_TEMPS:
385             return 32;
386         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
387         case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
388             return 1;
389         case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
390         case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
391         case PIPE_SHADER_CAP_CONT_SUPPORTED:
392         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
393         case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
394         case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
395         case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
396         case PIPE_SHADER_CAP_SUBROUTINES:
397         case PIPE_SHADER_CAP_INTEGERS:
398         case PIPE_SHADER_CAP_FP16:
399         case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
400         case PIPE_SHADER_CAP_FP16_DERIVATIVES:
401         case PIPE_SHADER_CAP_INT16:
402         case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
403         case PIPE_SHADER_CAP_INT64_ATOMICS:
404         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
405         case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
406         case PIPE_SHADER_CAP_DROUND_SUPPORTED:
407         case PIPE_SHADER_CAP_DFRACEXP_DLDEXP_SUPPORTED:
408         case PIPE_SHADER_CAP_LDEXP_SUPPORTED:
409         case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
410         case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
411         case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
412         case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
413             return 0;
414         default:
415             break;
416         }
417         break;
418     default:
419         ; /* nothing */
420     }
421     return 0;
422 }
423 
r300_get_paramf(struct pipe_screen * pscreen,enum pipe_capf param)424 static float r300_get_paramf(struct pipe_screen* pscreen,
425                              enum pipe_capf param)
426 {
427     struct r300_screen* r300screen = r300_screen(pscreen);
428 
429     switch (param) {
430         case PIPE_CAPF_MIN_LINE_WIDTH:
431         case PIPE_CAPF_MIN_LINE_WIDTH_AA:
432         case PIPE_CAPF_MIN_POINT_SIZE:
433         case PIPE_CAPF_MIN_POINT_SIZE_AA:
434             return 1;
435         case PIPE_CAPF_POINT_SIZE_GRANULARITY:
436         case PIPE_CAPF_LINE_WIDTH_GRANULARITY:
437             return 0.1;
438         case PIPE_CAPF_MAX_LINE_WIDTH:
439         case PIPE_CAPF_MAX_LINE_WIDTH_AA:
440         case PIPE_CAPF_MAX_POINT_SIZE:
441         case PIPE_CAPF_MAX_POINT_SIZE_AA:
442             /* The maximum dimensions of the colorbuffer are our practical
443              * rendering limits. 2048 pixels should be enough for anybody. */
444             if (r300screen->caps.is_r500) {
445                 return 4096.0f;
446             } else if (r300screen->caps.is_r400) {
447                 return 4021.0f;
448             } else {
449                 return 2560.0f;
450             }
451         case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
452             return 16.0f;
453         case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
454             return 16.0f;
455         case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
456         case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
457         case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
458             return 0.0f;
459         default:
460             debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
461                          param);
462             return 0.0f;
463     }
464 }
465 
r300_get_video_param(struct pipe_screen * screen,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint,enum pipe_video_cap param)466 static int r300_get_video_param(struct pipe_screen *screen,
467 				enum pipe_video_profile profile,
468 				enum pipe_video_entrypoint entrypoint,
469 				enum pipe_video_cap param)
470 {
471    switch (param) {
472       case PIPE_VIDEO_CAP_SUPPORTED:
473          return vl_profile_supported(screen, profile, entrypoint);
474       case PIPE_VIDEO_CAP_NPOT_TEXTURES:
475          return 0;
476       case PIPE_VIDEO_CAP_MAX_WIDTH:
477       case PIPE_VIDEO_CAP_MAX_HEIGHT:
478          return vl_video_buffer_max_size(screen);
479       case PIPE_VIDEO_CAP_PREFERED_FORMAT:
480          return PIPE_FORMAT_NV12;
481       case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
482          return false;
483       case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
484          return false;
485       case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
486          return true;
487       case PIPE_VIDEO_CAP_MAX_LEVEL:
488          return vl_level_supported(screen, profile);
489       default:
490          return 0;
491    }
492 }
493 
494 #define COMMON_NIR_OPTIONS                    \
495    .fdot_replicates = true,                   \
496    .fuse_ffma32 = true,                       \
497    .fuse_ffma64 = true,                       \
498    .lower_bitops = true,                      \
499    .lower_extract_byte = true,                \
500    .lower_extract_word = true,                \
501    .lower_fdiv = true,                        \
502    .lower_fdph = true,                        \
503    .lower_flrp32 = true,                      \
504    .lower_flrp64 = true,                      \
505    .lower_fmod = true,                        \
506    .lower_fround_even = true,                 \
507    .lower_insert_byte = true,                 \
508    .lower_insert_word = true,                 \
509    .lower_rotate = true,                      \
510    .lower_uniforms_to_ubo = true,             \
511    .lower_vector_cmp = true,                  \
512    .no_integers = true,                       \
513    .use_interpolated_input_intrinsics = true
514 
515 static const nir_shader_compiler_options r500_vs_compiler_options = {
516    COMMON_NIR_OPTIONS,
517 
518    /* Have HW loops support and 1024 max instr count, but don't unroll *too*
519     * hard.
520     */
521    .max_unroll_iterations = 32,
522 };
523 
524 static const nir_shader_compiler_options r500_fs_compiler_options = {
525    COMMON_NIR_OPTIONS,
526    .lower_fpow = true, /* POW is only in the VS */
527 
528    /* Have HW loops support and 512 max instr count, but don't unroll *too*
529     * hard.
530     */
531    .max_unroll_iterations = 32,
532 };
533 
534 static const nir_shader_compiler_options r300_vs_compiler_options = {
535    COMMON_NIR_OPTIONS,
536    .lower_fsat = true, /* No fsat in pre-r500 VS */
537    .lower_sincos = true,
538 
539    /* Note: has HW loops support, but only 256 ALU instructions. */
540    .max_unroll_iterations = 32,
541 };
542 
543 static const nir_shader_compiler_options r300_fs_compiler_options = {
544    COMMON_NIR_OPTIONS,
545    .lower_fpow = true, /* POW is only in the VS */
546    .lower_sincos = true,
547 
548     /* No HW loops support, so set it equal to ALU instr max */
549    .max_unroll_iterations = 64,
550 };
551 
552 static const void *
r300_get_compiler_options(struct pipe_screen * pscreen,enum pipe_shader_ir ir,enum pipe_shader_type shader)553 r300_get_compiler_options(struct pipe_screen *pscreen,
554                           enum pipe_shader_ir ir,
555                           enum pipe_shader_type shader)
556 {
557    struct r300_screen* r300screen = r300_screen(pscreen);
558 
559    assert(ir == PIPE_SHADER_IR_NIR);
560 
561    if (r300screen->caps.is_r500) {
562       if (shader == PIPE_SHADER_VERTEX)
563          return &r500_vs_compiler_options;
564        else
565          return &r500_fs_compiler_options;
566    } else {
567       if (shader == PIPE_SHADER_VERTEX)
568          return &r300_vs_compiler_options;
569        else
570          return &r300_fs_compiler_options;
571    }
572 }
573 
574 /**
575  * Whether the format matches:
576  *   PIPE_FORMAT_?10?10?10?2_UNORM
577  */
578 static inline boolean
util_format_is_rgba1010102_variant(const struct util_format_description * desc)579 util_format_is_rgba1010102_variant(const struct util_format_description *desc)
580 {
581    static const unsigned size[4] = {10, 10, 10, 2};
582    unsigned chan;
583 
584    if (desc->block.width != 1 ||
585        desc->block.height != 1 ||
586        desc->block.bits != 32)
587       return FALSE;
588 
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)
592          return FALSE;
593       if (desc->channel[chan].size != size[chan])
594          return FALSE;
595    }
596 
597    return TRUE;
598 }
599 
r300_is_blending_supported(struct r300_screen * rscreen,enum pipe_format format)600 static bool r300_is_blending_supported(struct r300_screen *rscreen,
601                                        enum pipe_format format)
602 {
603     int c;
604     const struct util_format_description *desc =
605         util_format_description(format);
606 
607     if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
608         return false;
609 
610     c = util_format_get_first_non_void_channel(format);
611 
612     /* RGBA16F */
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)
617         return true;
618 
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)
625             return true;
626 
627         if (format == PIPE_FORMAT_R8G8_UNORM)
628             return true;
629 
630         /* R8, I8, L8, A8 */
631         if (desc->nr_channels == 1)
632             return true;
633     }
634 
635     return false;
636 }
637 
r300_is_format_supported(struct pipe_screen * screen,enum pipe_format format,enum pipe_texture_target target,unsigned sample_count,unsigned storage_sample_count,unsigned usage)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,
643                                      unsigned usage)
644 {
645     uint32_t retval = 0;
646     boolean is_r500 = r300_screen(screen)->caps.is_r500;
647     boolean is_r400 = r300_screen(screen)->caps.is_r400;
648     boolean 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     boolean 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     boolean 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     boolean 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;
667 
668     if (MAX2(1, sample_count) != MAX2(1, storage_sample_count))
669         return false;
670 
671     /* Check multisampling support. */
672     switch (sample_count) {
673         case 0:
674         case 1:
675             break;
676         case 2:
677         case 4:
678         case 6:
679             /* No texturing and scanout. */
680             if (usage & (PIPE_BIND_SAMPLER_VIEW |
681                          PIPE_BIND_DISPLAY_TARGET |
682                          PIPE_BIND_SCANOUT)) {
683                 return false;
684             }
685 
686             desc = util_format_description(format);
687 
688             if (is_r500) {
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) {
695                     return false;
696                 }
697             } else {
698                 /* Only allow depth/stencil, RGBA8. */
699                 if (!util_format_is_depth_or_stencil(format) &&
700                     !util_format_is_rgba8_variant(desc)) {
701                     return false;
702                 }
703             }
704             break;
705         default:
706             return false;
707     }
708 
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;
720     }
721 
722     /* Check colorbuffer format support. */
723     if ((usage & (PIPE_BIND_RENDER_TARGET |
724                   PIPE_BIND_DISPLAY_TARGET |
725                   PIPE_BIND_SCANOUT |
726                   PIPE_BIND_SHARED |
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)) {
731         retval |= usage &
732             (PIPE_BIND_RENDER_TARGET |
733              PIPE_BIND_DISPLAY_TARGET |
734              PIPE_BIND_SCANOUT |
735              PIPE_BIND_SHARED);
736 
737         if (r300_is_blending_supported(r300_screen(screen), format)) {
738             retval |= usage & PIPE_BIND_BLENDABLE;
739         }
740     }
741 
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;
746     }
747 
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;
755             }
756         } else {
757             /* SW TCL */
758             if (!util_format_is_pure_integer(format)) {
759                 retval |= PIPE_BIND_VERTEX_BUFFER;
760             }
761         }
762     }
763 
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;
769     }
770 
771     return retval == usage;
772 }
773 
r300_destroy_screen(struct pipe_screen * pscreen)774 static void r300_destroy_screen(struct pipe_screen* pscreen)
775 {
776     struct r300_screen* r300screen = r300_screen(pscreen);
777     struct radeon_winsys *rws = radeon_winsys(pscreen);
778 
779     if (rws && !rws->unref(rws))
780       return;
781 
782     mtx_destroy(&r300screen->cmask_mutex);
783     slab_destroy_parent(&r300screen->pool_transfers);
784 
785     disk_cache_destroy(r300screen->disk_shader_cache);
786 
787     if (rws)
788       rws->destroy(rws);
789 
790     FREE(r300screen);
791 }
792 
r300_fence_reference(struct pipe_screen * screen,struct pipe_fence_handle ** ptr,struct pipe_fence_handle * fence)793 static void r300_fence_reference(struct pipe_screen *screen,
794                                  struct pipe_fence_handle **ptr,
795                                  struct pipe_fence_handle *fence)
796 {
797     struct radeon_winsys *rws = r300_screen(screen)->rws;
798 
799     rws->fence_reference(ptr, fence);
800 }
801 
r300_fence_finish(struct pipe_screen * screen,struct pipe_context * ctx,struct pipe_fence_handle * fence,uint64_t timeout)802 static bool r300_fence_finish(struct pipe_screen *screen,
803                               struct pipe_context *ctx,
804                               struct pipe_fence_handle *fence,
805                               uint64_t timeout)
806 {
807     struct radeon_winsys *rws = r300_screen(screen)->rws;
808 
809     return rws->fence_wait(rws, fence, timeout);
810 }
811 
r300_screen_create(struct radeon_winsys * rws,const struct pipe_screen_config * config)812 struct pipe_screen* r300_screen_create(struct radeon_winsys *rws,
813                                        const struct pipe_screen_config *config)
814 {
815     struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen);
816 
817     if (!r300screen) {
818         FREE(r300screen);
819         return NULL;
820     }
821 
822     rws->query_info(rws, &r300screen->info, false, false);
823 
824     r300_init_debug(r300screen);
825     r300_parse_chipset(r300screen->info.pci_id, &r300screen->caps);
826 
827     if (SCREEN_DBG_ON(r300screen, DBG_NO_ZMASK))
828         r300screen->caps.zmask_ram = 0;
829     if (SCREEN_DBG_ON(r300screen, DBG_NO_HIZ))
830         r300screen->caps.hiz_ram = 0;
831     if (SCREEN_DBG_ON(r300screen, DBG_NO_TCL))
832         r300screen->caps.has_tcl = FALSE;
833 
834     r300screen->rws = rws;
835     r300screen->screen.destroy = r300_destroy_screen;
836     r300screen->screen.get_name = r300_get_name;
837     r300screen->screen.get_vendor = r300_get_vendor;
838     r300screen->screen.get_compiler_options = r300_get_compiler_options;
839     r300screen->screen.get_device_vendor = r300_get_device_vendor;
840     r300screen->screen.get_disk_shader_cache = r300_get_disk_shader_cache;
841     r300screen->screen.get_param = r300_get_param;
842     r300screen->screen.get_shader_param = r300_get_shader_param;
843     r300screen->screen.get_paramf = r300_get_paramf;
844     r300screen->screen.get_video_param = r300_get_video_param;
845     r300screen->screen.is_format_supported = r300_is_format_supported;
846     r300screen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
847     r300screen->screen.context_create = r300_create_context;
848     r300screen->screen.fence_reference = r300_fence_reference;
849     r300screen->screen.fence_finish = r300_fence_finish;
850 
851     r300_init_screen_resource_functions(r300screen);
852 
853     r300_disk_cache_create(r300screen);
854 
855     slab_create_parent(&r300screen->pool_transfers, sizeof(struct pipe_transfer), 64);
856 
857     (void) mtx_init(&r300screen->cmask_mutex, mtx_plain);
858 
859     return &r300screen->screen;
860 }
861