1 /*
2 * Copyright © 2019 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 */
22
23 /**
24 * @file brw_debug_recompiles.c
25 */
26
27 #include <stdio.h>
28
29 #include "brw_compiler.h"
30
31 static bool
key_debug(const struct brw_compiler * c,void * log,const char * name,int a,int b)32 key_debug(const struct brw_compiler *c, void *log,
33 const char *name, int a, int b)
34 {
35 if (a != b) {
36 c->shader_perf_log(log, " %s %d->%d\n", name, a, b);
37 return true;
38 }
39 return false;
40 }
41
42 static bool
key_debug_float(const struct brw_compiler * c,void * log,const char * name,float a,float b)43 key_debug_float(const struct brw_compiler *c, void *log,
44 const char *name, float a, float b)
45 {
46 if (a != b) {
47 c->shader_perf_log(log, " %s %f->%f\n", name, a, b);
48 return true;
49 }
50 return false;
51 }
52
53 #define check(name, field) \
54 key_debug(c, log, name, old_key->field, key->field)
55 #define check_float(name, field) \
56 key_debug_float(c, log, name, old_key->field, key->field)
57
58 static bool
debug_sampler_recompile(const struct brw_compiler * c,void * log,const struct brw_sampler_prog_key_data * old_key,const struct brw_sampler_prog_key_data * key)59 debug_sampler_recompile(const struct brw_compiler *c, void *log,
60 const struct brw_sampler_prog_key_data *old_key,
61 const struct brw_sampler_prog_key_data *key)
62 {
63 bool found = false;
64
65 found |= check("gather channel quirk", gather_channel_quirk_mask);
66 found |= check("compressed multisample layout",
67 compressed_multisample_layout_mask);
68 found |= check("16x msaa", msaa_16);
69 found |= check("y_uv image bound", y_uv_image_mask);
70 found |= check("y_u_v image bound", y_u_v_image_mask);
71 found |= check("yx_xuxv image bound", yx_xuxv_image_mask);
72 found |= check("xy_uxvx image bound", xy_uxvx_image_mask);
73 found |= check("ayuv image bound", ayuv_image_mask);
74 found |= check("xyuv image bound", xyuv_image_mask);
75
76 for (unsigned i = 0; i < MAX_SAMPLERS; i++) {
77 found |= check("EXT_texture_swizzle or DEPTH_TEXTURE_MODE", swizzles[i]);
78 found |= check("textureGather workarounds", gen6_gather_wa[i]);
79 found |= check_float("scale factor", scale_factors[i]);
80 }
81
82 for (unsigned i = 0; i < 3; i++) {
83 found |= check("GL_CLAMP enabled on any texture unit", gl_clamp_mask[i]);
84 }
85
86 return found;
87 }
88
89 static bool
debug_base_recompile(const struct brw_compiler * c,void * log,const struct brw_base_prog_key * old_key,const struct brw_base_prog_key * key)90 debug_base_recompile(const struct brw_compiler *c, void *log,
91 const struct brw_base_prog_key *old_key,
92 const struct brw_base_prog_key *key)
93 {
94 return debug_sampler_recompile(c, log, &old_key->tex, &key->tex);
95 }
96
97 static void
debug_vs_recompile(const struct brw_compiler * c,void * log,const struct brw_vs_prog_key * old_key,const struct brw_vs_prog_key * key)98 debug_vs_recompile(const struct brw_compiler *c, void *log,
99 const struct brw_vs_prog_key *old_key,
100 const struct brw_vs_prog_key *key)
101 {
102 bool found = debug_base_recompile(c, log, &old_key->base, &key->base);
103
104 for (unsigned i = 0; i < VERT_ATTRIB_MAX; i++) {
105 found |= check("vertex attrib w/a flags", gl_attrib_wa_flags[i]);
106 }
107
108 found |= check("legacy user clipping", nr_userclip_plane_consts);
109 found |= check("copy edgeflag", copy_edgeflag);
110 found |= check("pointcoord replace", point_coord_replace);
111 found |= check("vertex color clamping", clamp_vertex_color);
112
113 if (!found) {
114 c->shader_perf_log(log, " something else\n");
115 }
116 }
117
118 static void
debug_tcs_recompile(const struct brw_compiler * c,void * log,const struct brw_tcs_prog_key * old_key,const struct brw_tcs_prog_key * key)119 debug_tcs_recompile(const struct brw_compiler *c, void *log,
120 const struct brw_tcs_prog_key *old_key,
121 const struct brw_tcs_prog_key *key)
122 {
123 bool found = debug_base_recompile(c, log, &old_key->base, &key->base);
124
125 found |= check("input vertices", input_vertices);
126 found |= check("outputs written", outputs_written);
127 found |= check("patch outputs written", patch_outputs_written);
128 found |= check("tes primitive mode", tes_primitive_mode);
129 found |= check("quads and equal_spacing workaround", quads_workaround);
130
131 if (!found) {
132 c->shader_perf_log(log, " something else\n");
133 }
134 }
135
136 static void
debug_tes_recompile(const struct brw_compiler * c,void * log,const struct brw_tes_prog_key * old_key,const struct brw_tes_prog_key * key)137 debug_tes_recompile(const struct brw_compiler *c, void *log,
138 const struct brw_tes_prog_key *old_key,
139 const struct brw_tes_prog_key *key)
140 {
141 bool found = debug_base_recompile(c, log, &old_key->base, &key->base);
142
143 found |= check("inputs read", inputs_read);
144 found |= check("patch inputs read", patch_inputs_read);
145
146 if (!found) {
147 c->shader_perf_log(log, " something else\n");
148 }
149 }
150
151 static void
debug_gs_recompile(const struct brw_compiler * c,void * log,const struct brw_gs_prog_key * old_key,const struct brw_gs_prog_key * key)152 debug_gs_recompile(const struct brw_compiler *c, void *log,
153 const struct brw_gs_prog_key *old_key,
154 const struct brw_gs_prog_key *key)
155 {
156 bool found = debug_base_recompile(c, log, &old_key->base, &key->base);
157
158 if (!found) {
159 c->shader_perf_log(log, " something else\n");
160 }
161 }
162
163 static void
debug_fs_recompile(const struct brw_compiler * c,void * log,const struct brw_wm_prog_key * old_key,const struct brw_wm_prog_key * key)164 debug_fs_recompile(const struct brw_compiler *c, void *log,
165 const struct brw_wm_prog_key *old_key,
166 const struct brw_wm_prog_key *key)
167 {
168 bool found = false;
169
170 found |= check("alphatest, computed depth, depth test, or depth write",
171 iz_lookup);
172 found |= check("depth statistics", stats_wm);
173 found |= check("flat shading", flat_shade);
174 found |= check("number of color buffers", nr_color_regions);
175 found |= check("MRT alpha test", alpha_test_replicate_alpha);
176 found |= check("alpha to coverage", alpha_to_coverage);
177 found |= check("fragment color clamping", clamp_fragment_color);
178 found |= check("per-sample interpolation", persample_interp);
179 found |= check("multisampled FBO", multisample_fbo);
180 found |= check("frag coord adds sample pos", frag_coord_adds_sample_pos);
181 found |= check("line smoothing", line_aa);
182 found |= check("high quality derivatives", high_quality_derivatives);
183 found |= check("force dual color blending", force_dual_color_blend);
184 found |= check("coherent fb fetch", coherent_fb_fetch);
185
186 found |= check("input slots valid", input_slots_valid);
187 found |= check("mrt alpha test function", alpha_test_func);
188 found |= check("mrt alpha test reference value", alpha_test_ref);
189
190 found |= debug_base_recompile(c, log, &old_key->base, &key->base);
191
192 if (!found) {
193 c->shader_perf_log(log, " something else\n");
194 }
195 }
196
197 static void
debug_cs_recompile(const struct brw_compiler * c,void * log,const struct brw_cs_prog_key * old_key,const struct brw_cs_prog_key * key)198 debug_cs_recompile(const struct brw_compiler *c, void *log,
199 const struct brw_cs_prog_key *old_key,
200 const struct brw_cs_prog_key *key)
201 {
202 bool found = debug_base_recompile(c, log, &old_key->base, &key->base);
203
204 if (!found) {
205 c->shader_perf_log(log, " something else\n");
206 }
207 }
208
209 void
brw_debug_key_recompile(const struct brw_compiler * c,void * log,gl_shader_stage stage,const struct brw_base_prog_key * old_key,const struct brw_base_prog_key * key)210 brw_debug_key_recompile(const struct brw_compiler *c, void *log,
211 gl_shader_stage stage,
212 const struct brw_base_prog_key *old_key,
213 const struct brw_base_prog_key *key)
214 {
215 if (!old_key) {
216 c->shader_perf_log(log, " No previous compile found...\n");
217 return;
218 }
219
220 switch (stage) {
221 case MESA_SHADER_VERTEX:
222 debug_vs_recompile(c, log, (const struct brw_vs_prog_key *)old_key,
223 (const struct brw_vs_prog_key *)key);
224 break;
225 case MESA_SHADER_TESS_CTRL:
226 debug_tcs_recompile(c, log, (const struct brw_tcs_prog_key *)old_key,
227 (const struct brw_tcs_prog_key *)key);
228 break;
229 case MESA_SHADER_TESS_EVAL:
230 debug_tes_recompile(c, log, (const struct brw_tes_prog_key *)old_key,
231 (const struct brw_tes_prog_key *)key);
232 break;
233 case MESA_SHADER_GEOMETRY:
234 debug_gs_recompile(c, log, (const struct brw_gs_prog_key *)old_key,
235 (const struct brw_gs_prog_key *)key);
236 break;
237 case MESA_SHADER_FRAGMENT:
238 debug_fs_recompile(c, log, (const struct brw_wm_prog_key *)old_key,
239 (const struct brw_wm_prog_key *)key);
240 break;
241 case MESA_SHADER_COMPUTE:
242 debug_cs_recompile(c, log, (const struct brw_cs_prog_key *)old_key,
243 (const struct brw_cs_prog_key *)key);
244 break;
245 default:
246 break;
247 }
248 }
249