i965/fs: Move up prog_data->uses_omask assignment up to brw_codegen_wm_prog().
[mesa.git] / src / mesa / drivers / dri / i965 / brw_wm.c
1 /*
2 Copyright (C) Intel Corp. 2006. All Rights Reserved.
3 Intel funded Tungsten Graphics to
4 develop this 3D driver.
5
6 Permission is hereby granted, free of charge, to any person obtaining
7 a copy of this software and associated documentation files (the
8 "Software"), to deal in the Software without restriction, including
9 without limitation the rights to use, copy, modify, merge, publish,
10 distribute, sublicense, and/or sell copies of the Software, and to
11 permit persons to whom the Software is furnished to do so, subject to
12 the following conditions:
13
14 The above copyright notice and this permission notice (including the
15 next paragraph) shall be included in all copies or substantial
16 portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26 **********************************************************************/
27 /*
28 * Authors:
29 * Keith Whitwell <keithw@vmware.com>
30 */
31
32 #include "brw_context.h"
33 #include "brw_wm.h"
34 #include "brw_state.h"
35 #include "main/enums.h"
36 #include "main/formats.h"
37 #include "main/fbobject.h"
38 #include "main/samplerobj.h"
39 #include "main/framebuffer.h"
40 #include "program/prog_parameter.h"
41 #include "program/program.h"
42 #include "intel_mipmap_tree.h"
43
44 #include "util/ralloc.h"
45
46 /**
47 * Return a bitfield where bit n is set if barycentric interpolation mode n
48 * (see enum brw_wm_barycentric_interp_mode) is needed by the fragment shader.
49 */
50 static unsigned
51 brw_compute_barycentric_interp_modes(struct brw_context *brw,
52 bool shade_model_flat,
53 bool persample_shading,
54 const struct gl_fragment_program *fprog)
55 {
56 unsigned barycentric_interp_modes = 0;
57 int attr;
58
59 /* Loop through all fragment shader inputs to figure out what interpolation
60 * modes are in use, and set the appropriate bits in
61 * barycentric_interp_modes.
62 */
63 for (attr = 0; attr < VARYING_SLOT_MAX; ++attr) {
64 enum glsl_interp_qualifier interp_qualifier =
65 fprog->InterpQualifier[attr];
66 bool is_centroid = (fprog->IsCentroid & BITFIELD64_BIT(attr)) &&
67 !persample_shading;
68 bool is_sample = (fprog->IsSample & BITFIELD64_BIT(attr)) ||
69 persample_shading;
70 bool is_gl_Color = attr == VARYING_SLOT_COL0 || attr == VARYING_SLOT_COL1;
71
72 /* Ignore unused inputs. */
73 if (!(fprog->Base.InputsRead & BITFIELD64_BIT(attr)))
74 continue;
75
76 /* Ignore WPOS and FACE, because they don't require interpolation. */
77 if (attr == VARYING_SLOT_POS || attr == VARYING_SLOT_FACE)
78 continue;
79
80 /* Determine the set (or sets) of barycentric coordinates needed to
81 * interpolate this variable. Note that when
82 * brw->needs_unlit_centroid_workaround is set, centroid interpolation
83 * uses PIXEL interpolation for unlit pixels and CENTROID interpolation
84 * for lit pixels, so we need both sets of barycentric coordinates.
85 */
86 if (interp_qualifier == INTERP_QUALIFIER_NOPERSPECTIVE) {
87 if (is_centroid) {
88 barycentric_interp_modes |=
89 1 << BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
90 } else if (is_sample) {
91 barycentric_interp_modes |=
92 1 << BRW_WM_NONPERSPECTIVE_SAMPLE_BARYCENTRIC;
93 }
94 if ((!is_centroid && !is_sample) ||
95 brw->needs_unlit_centroid_workaround) {
96 barycentric_interp_modes |=
97 1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
98 }
99 } else if (interp_qualifier == INTERP_QUALIFIER_SMOOTH ||
100 (!(shade_model_flat && is_gl_Color) &&
101 interp_qualifier == INTERP_QUALIFIER_NONE)) {
102 if (is_centroid) {
103 barycentric_interp_modes |=
104 1 << BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
105 } else if (is_sample) {
106 barycentric_interp_modes |=
107 1 << BRW_WM_PERSPECTIVE_SAMPLE_BARYCENTRIC;
108 }
109 if ((!is_centroid && !is_sample) ||
110 brw->needs_unlit_centroid_workaround) {
111 barycentric_interp_modes |=
112 1 << BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
113 }
114 }
115 }
116
117 return barycentric_interp_modes;
118 }
119
120 static uint8_t
121 computed_depth_mode(struct gl_fragment_program *fp)
122 {
123 if (fp->Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
124 switch (fp->FragDepthLayout) {
125 case FRAG_DEPTH_LAYOUT_NONE:
126 case FRAG_DEPTH_LAYOUT_ANY:
127 return BRW_PSCDEPTH_ON;
128 case FRAG_DEPTH_LAYOUT_GREATER:
129 return BRW_PSCDEPTH_ON_GE;
130 case FRAG_DEPTH_LAYOUT_LESS:
131 return BRW_PSCDEPTH_ON_LE;
132 case FRAG_DEPTH_LAYOUT_UNCHANGED:
133 return BRW_PSCDEPTH_OFF;
134 }
135 }
136 return BRW_PSCDEPTH_OFF;
137 }
138
139 bool
140 brw_wm_prog_data_compare(const void *in_a, const void *in_b)
141 {
142 const struct brw_wm_prog_data *a = in_a;
143 const struct brw_wm_prog_data *b = in_b;
144
145 /* Compare the base structure. */
146 if (!brw_stage_prog_data_compare(&a->base, &b->base))
147 return false;
148
149 /* Compare the rest of the structure. */
150 const unsigned offset = sizeof(struct brw_stage_prog_data);
151 if (memcmp(((char *) a) + offset, ((char *) b) + offset,
152 sizeof(struct brw_wm_prog_data) - offset))
153 return false;
154
155 return true;
156 }
157
158 /**
159 * All Mesa program -> GPU code generation goes through this function.
160 * Depending on the instructions used (i.e. flow control instructions)
161 * we'll use one of two code generators.
162 */
163 bool
164 brw_codegen_wm_prog(struct brw_context *brw,
165 struct gl_shader_program *prog,
166 struct brw_fragment_program *fp,
167 struct brw_wm_prog_key *key)
168 {
169 struct gl_context *ctx = &brw->ctx;
170 void *mem_ctx = ralloc_context(NULL);
171 struct brw_wm_prog_data prog_data;
172 const GLuint *program;
173 struct gl_shader *fs = NULL;
174 GLuint program_size;
175
176 if (prog)
177 fs = prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
178
179 memset(&prog_data, 0, sizeof(prog_data));
180 /* key->alpha_test_func means simulating alpha testing via discards,
181 * so the shader definitely kills pixels.
182 */
183 prog_data.uses_kill = fp->program.UsesKill || key->alpha_test_func;
184 prog_data.uses_omask =
185 fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK);
186 prog_data.computed_depth_mode = computed_depth_mode(&fp->program);
187
188 /* Use ALT floating point mode for ARB programs so that 0^0 == 1. */
189 if (!prog)
190 prog_data.base.use_alt_mode = true;
191
192 /* Allocate the references to the uniforms that will end up in the
193 * prog_data associated with the compiled program, and which will be freed
194 * by the state cache.
195 */
196 int param_count;
197 if (fs) {
198 param_count = fs->num_uniform_components;
199 } else {
200 param_count = fp->program.Base.Parameters->NumParameters * 4;
201 }
202 /* The backend also sometimes adds params for texture size. */
203 param_count += 2 * ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
204 prog_data.base.param =
205 rzalloc_array(NULL, const gl_constant_value *, param_count);
206 prog_data.base.pull_param =
207 rzalloc_array(NULL, const gl_constant_value *, param_count);
208 prog_data.base.nr_params = param_count;
209
210 prog_data.barycentric_interp_modes =
211 brw_compute_barycentric_interp_modes(brw, key->flat_shade,
212 key->persample_shading,
213 &fp->program);
214
215 program = brw_wm_fs_emit(brw, mem_ctx, key, &prog_data,
216 &fp->program, prog, &program_size);
217 if (program == NULL) {
218 ralloc_free(mem_ctx);
219 return false;
220 }
221
222 if (prog_data.base.total_scratch) {
223 brw_get_scratch_bo(brw, &brw->wm.base.scratch_bo,
224 prog_data.base.total_scratch * brw->max_wm_threads);
225 }
226
227 if (unlikely(INTEL_DEBUG & DEBUG_WM))
228 fprintf(stderr, "\n");
229
230 brw_upload_cache(&brw->cache, BRW_CACHE_FS_PROG,
231 key, sizeof(struct brw_wm_prog_key),
232 program, program_size,
233 &prog_data, sizeof(prog_data),
234 &brw->wm.base.prog_offset, &brw->wm.prog_data);
235
236 ralloc_free(mem_ctx);
237
238 return true;
239 }
240
241 static bool
242 key_debug(struct brw_context *brw, const char *name, int a, int b)
243 {
244 if (a != b) {
245 perf_debug(" %s %d->%d\n", name, a, b);
246 return true;
247 } else {
248 return false;
249 }
250 }
251
252 bool
253 brw_debug_recompile_sampler_key(struct brw_context *brw,
254 const struct brw_sampler_prog_key_data *old_key,
255 const struct brw_sampler_prog_key_data *key)
256 {
257 bool found = false;
258
259 for (unsigned int i = 0; i < MAX_SAMPLERS; i++) {
260 found |= key_debug(brw, "EXT_texture_swizzle or DEPTH_TEXTURE_MODE",
261 old_key->swizzles[i], key->swizzles[i]);
262 }
263 found |= key_debug(brw, "GL_CLAMP enabled on any texture unit's 1st coordinate",
264 old_key->gl_clamp_mask[0], key->gl_clamp_mask[0]);
265 found |= key_debug(brw, "GL_CLAMP enabled on any texture unit's 2nd coordinate",
266 old_key->gl_clamp_mask[1], key->gl_clamp_mask[1]);
267 found |= key_debug(brw, "GL_CLAMP enabled on any texture unit's 3rd coordinate",
268 old_key->gl_clamp_mask[2], key->gl_clamp_mask[2]);
269 found |= key_debug(brw, "gather channel quirk on any texture unit",
270 old_key->gather_channel_quirk_mask, key->gather_channel_quirk_mask);
271 found |= key_debug(brw, "compressed multisample layout",
272 old_key->compressed_multisample_layout_mask,
273 key->compressed_multisample_layout_mask);
274
275 for (unsigned int i = 0; i < MAX_SAMPLERS; i++) {
276 found |= key_debug(brw, "textureGather workarounds",
277 old_key->gen6_gather_wa[i], key->gen6_gather_wa[i]);
278 }
279
280 return found;
281 }
282
283 void
284 brw_wm_debug_recompile(struct brw_context *brw,
285 struct gl_shader_program *prog,
286 const struct brw_wm_prog_key *key)
287 {
288 struct brw_cache_item *c = NULL;
289 const struct brw_wm_prog_key *old_key = NULL;
290 bool found = false;
291
292 perf_debug("Recompiling fragment shader for program %d\n", prog->Name);
293
294 for (unsigned int i = 0; i < brw->cache.size; i++) {
295 for (c = brw->cache.items[i]; c; c = c->next) {
296 if (c->cache_id == BRW_CACHE_FS_PROG) {
297 old_key = c->key;
298
299 if (old_key->program_string_id == key->program_string_id)
300 break;
301 }
302 }
303 if (c)
304 break;
305 }
306
307 if (!c) {
308 perf_debug(" Didn't find previous compile in the shader cache for debug\n");
309 return;
310 }
311
312 found |= key_debug(brw, "alphatest, computed depth, depth test, or "
313 "depth write",
314 old_key->iz_lookup, key->iz_lookup);
315 found |= key_debug(brw, "depth statistics",
316 old_key->stats_wm, key->stats_wm);
317 found |= key_debug(brw, "flat shading",
318 old_key->flat_shade, key->flat_shade);
319 found |= key_debug(brw, "per-sample shading",
320 old_key->persample_shading, key->persample_shading);
321 found |= key_debug(brw, "per-sample shading and 2x MSAA",
322 old_key->persample_2x, key->persample_2x);
323 found |= key_debug(brw, "number of color buffers",
324 old_key->nr_color_regions, key->nr_color_regions);
325 found |= key_debug(brw, "MRT alpha test or alpha-to-coverage",
326 old_key->replicate_alpha, key->replicate_alpha);
327 found |= key_debug(brw, "rendering to FBO",
328 old_key->render_to_fbo, key->render_to_fbo);
329 found |= key_debug(brw, "fragment color clamping",
330 old_key->clamp_fragment_color, key->clamp_fragment_color);
331 found |= key_debug(brw, "line smoothing",
332 old_key->line_aa, key->line_aa);
333 found |= key_debug(brw, "renderbuffer height",
334 old_key->drawable_height, key->drawable_height);
335 found |= key_debug(brw, "input slots valid",
336 old_key->input_slots_valid, key->input_slots_valid);
337 found |= key_debug(brw, "mrt alpha test function",
338 old_key->alpha_test_func, key->alpha_test_func);
339 found |= key_debug(brw, "mrt alpha test reference value",
340 old_key->alpha_test_ref, key->alpha_test_ref);
341
342 found |= brw_debug_recompile_sampler_key(brw, &old_key->tex, &key->tex);
343
344 if (!found) {
345 perf_debug(" Something else\n");
346 }
347 }
348
349 static uint8_t
350 gen6_gather_workaround(GLenum internalformat)
351 {
352 switch (internalformat) {
353 case GL_R8I: return WA_SIGN | WA_8BIT;
354 case GL_R8UI: return WA_8BIT;
355 case GL_R16I: return WA_SIGN | WA_16BIT;
356 case GL_R16UI: return WA_16BIT;
357 /* note that even though GL_R32I and GL_R32UI have format overrides
358 * in the surface state, there is no shader w/a required */
359 default: return 0;
360 }
361 }
362
363 void
364 brw_populate_sampler_prog_key_data(struct gl_context *ctx,
365 const struct gl_program *prog,
366 unsigned sampler_count,
367 struct brw_sampler_prog_key_data *key)
368 {
369 struct brw_context *brw = brw_context(ctx);
370
371 for (int s = 0; s < sampler_count; s++) {
372 key->swizzles[s] = SWIZZLE_NOOP;
373
374 if (!(prog->SamplersUsed & (1 << s)))
375 continue;
376
377 int unit_id = prog->SamplerUnits[s];
378 const struct gl_texture_unit *unit = &ctx->Texture.Unit[unit_id];
379
380 if (unit->_Current && unit->_Current->Target != GL_TEXTURE_BUFFER) {
381 const struct gl_texture_object *t = unit->_Current;
382 const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
383 struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit_id);
384
385 const bool alpha_depth = t->DepthMode == GL_ALPHA &&
386 (img->_BaseFormat == GL_DEPTH_COMPONENT ||
387 img->_BaseFormat == GL_DEPTH_STENCIL);
388
389 /* Haswell handles texture swizzling as surface format overrides
390 * (except for GL_ALPHA); all other platforms need MOVs in the shader.
391 */
392 if (alpha_depth || (brw->gen < 8 && !brw->is_haswell))
393 key->swizzles[s] = brw_get_texture_swizzle(ctx, t);
394
395 if (brw->gen < 8 &&
396 sampler->MinFilter != GL_NEAREST &&
397 sampler->MagFilter != GL_NEAREST) {
398 if (sampler->WrapS == GL_CLAMP)
399 key->gl_clamp_mask[0] |= 1 << s;
400 if (sampler->WrapT == GL_CLAMP)
401 key->gl_clamp_mask[1] |= 1 << s;
402 if (sampler->WrapR == GL_CLAMP)
403 key->gl_clamp_mask[2] |= 1 << s;
404 }
405
406 /* gather4's channel select for green from RG32F is broken;
407 * requires a shader w/a on IVB; fixable with just SCS on HSW. */
408 if (brw->gen == 7 && !brw->is_haswell && prog->UsesGather) {
409 if (img->InternalFormat == GL_RG32F)
410 key->gather_channel_quirk_mask |= 1 << s;
411 }
412
413 /* Gen6's gather4 is broken for UINT/SINT; we treat them as
414 * UNORM/FLOAT instead and fix it in the shader.
415 */
416 if (brw->gen == 6 && prog->UsesGather) {
417 key->gen6_gather_wa[s] = gen6_gather_workaround(img->InternalFormat);
418 }
419
420 /* If this is a multisample sampler, and uses the CMS MSAA layout,
421 * then we need to emit slightly different code to first sample the
422 * MCS surface.
423 */
424 struct intel_texture_object *intel_tex =
425 intel_texture_object((struct gl_texture_object *)t);
426
427 if (brw->gen >= 7 &&
428 intel_tex->mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) {
429 key->compressed_multisample_layout_mask |= 1 << s;
430 }
431 }
432 }
433 }
434
435 static bool
436 brw_wm_state_dirty (struct brw_context *brw)
437 {
438 return brw_state_dirty(brw,
439 _NEW_BUFFERS |
440 _NEW_COLOR |
441 _NEW_DEPTH |
442 _NEW_FRAG_CLAMP |
443 _NEW_HINT |
444 _NEW_LIGHT |
445 _NEW_LINE |
446 _NEW_MULTISAMPLE |
447 _NEW_POLYGON |
448 _NEW_STENCIL |
449 _NEW_TEXTURE,
450 BRW_NEW_FRAGMENT_PROGRAM |
451 BRW_NEW_REDUCED_PRIMITIVE |
452 BRW_NEW_STATS_WM |
453 BRW_NEW_VUE_MAP_GEOM_OUT);
454 }
455
456 static void brw_wm_populate_key( struct brw_context *brw,
457 struct brw_wm_prog_key *key )
458 {
459 struct gl_context *ctx = &brw->ctx;
460 /* BRW_NEW_FRAGMENT_PROGRAM */
461 const struct brw_fragment_program *fp =
462 (struct brw_fragment_program *)brw->fragment_program;
463 const struct gl_program *prog = (struct gl_program *) brw->fragment_program;
464 GLuint lookup = 0;
465 GLuint line_aa;
466 bool program_uses_dfdy = fp->program.UsesDFdy;
467 const bool multisample_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > 1;
468
469 memset(key, 0, sizeof(*key));
470
471 /* Build the index for table lookup
472 */
473 if (brw->gen < 6) {
474 /* _NEW_COLOR */
475 if (fp->program.UsesKill || ctx->Color.AlphaEnabled)
476 lookup |= IZ_PS_KILL_ALPHATEST_BIT;
477
478 if (fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH))
479 lookup |= IZ_PS_COMPUTES_DEPTH_BIT;
480
481 /* _NEW_DEPTH */
482 if (ctx->Depth.Test)
483 lookup |= IZ_DEPTH_TEST_ENABLE_BIT;
484
485 if (ctx->Depth.Test && ctx->Depth.Mask) /* ?? */
486 lookup |= IZ_DEPTH_WRITE_ENABLE_BIT;
487
488 /* _NEW_STENCIL | _NEW_BUFFERS */
489 if (ctx->Stencil._Enabled) {
490 lookup |= IZ_STENCIL_TEST_ENABLE_BIT;
491
492 if (ctx->Stencil.WriteMask[0] ||
493 ctx->Stencil.WriteMask[ctx->Stencil._BackFace])
494 lookup |= IZ_STENCIL_WRITE_ENABLE_BIT;
495 }
496 key->iz_lookup = lookup;
497 }
498
499 line_aa = AA_NEVER;
500
501 /* _NEW_LINE, _NEW_POLYGON, BRW_NEW_REDUCED_PRIMITIVE */
502 if (ctx->Line.SmoothFlag) {
503 if (brw->reduced_primitive == GL_LINES) {
504 line_aa = AA_ALWAYS;
505 }
506 else if (brw->reduced_primitive == GL_TRIANGLES) {
507 if (ctx->Polygon.FrontMode == GL_LINE) {
508 line_aa = AA_SOMETIMES;
509
510 if (ctx->Polygon.BackMode == GL_LINE ||
511 (ctx->Polygon.CullFlag &&
512 ctx->Polygon.CullFaceMode == GL_BACK))
513 line_aa = AA_ALWAYS;
514 }
515 else if (ctx->Polygon.BackMode == GL_LINE) {
516 line_aa = AA_SOMETIMES;
517
518 if ((ctx->Polygon.CullFlag &&
519 ctx->Polygon.CullFaceMode == GL_FRONT))
520 line_aa = AA_ALWAYS;
521 }
522 }
523 }
524
525 key->line_aa = line_aa;
526
527 /* _NEW_HINT */
528 key->high_quality_derivatives =
529 ctx->Hint.FragmentShaderDerivative == GL_NICEST;
530
531 if (brw->gen < 6)
532 key->stats_wm = brw->stats_wm;
533
534 /* _NEW_LIGHT */
535 key->flat_shade = (ctx->Light.ShadeModel == GL_FLAT);
536
537 /* _NEW_FRAG_CLAMP | _NEW_BUFFERS */
538 key->clamp_fragment_color = ctx->Color._ClampFragmentColor;
539
540 /* _NEW_TEXTURE */
541 brw_populate_sampler_prog_key_data(ctx, prog, brw->wm.base.sampler_count,
542 &key->tex);
543
544 /* _NEW_BUFFERS */
545 /*
546 * Include the draw buffer origin and height so that we can calculate
547 * fragment position values relative to the bottom left of the drawable,
548 * from the incoming screen origin relative position we get as part of our
549 * payload.
550 *
551 * This is only needed for the WM_WPOSXY opcode when the fragment program
552 * uses the gl_FragCoord input.
553 *
554 * We could avoid recompiling by including this as a constant referenced by
555 * our program, but if we were to do that it would also be nice to handle
556 * getting that constant updated at batchbuffer submit time (when we
557 * hold the lock and know where the buffer really is) rather than at emit
558 * time when we don't hold the lock and are just guessing. We could also
559 * just avoid using this as key data if the program doesn't use
560 * fragment.position.
561 *
562 * For DRI2 the origin_x/y will always be (0,0) but we still need the
563 * drawable height in order to invert the Y axis.
564 */
565 if (fp->program.Base.InputsRead & VARYING_BIT_POS) {
566 key->drawable_height = _mesa_geometric_height(ctx->DrawBuffer);
567 }
568
569 if ((fp->program.Base.InputsRead & VARYING_BIT_POS) || program_uses_dfdy) {
570 key->render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
571 }
572
573 /* _NEW_BUFFERS */
574 key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers;
575
576 /* _NEW_MULTISAMPLE, _NEW_COLOR, _NEW_BUFFERS */
577 key->replicate_alpha = ctx->DrawBuffer->_NumColorDrawBuffers > 1 &&
578 (ctx->Multisample.SampleAlphaToCoverage || ctx->Color.AlphaEnabled);
579
580 /* _NEW_BUFFERS _NEW_MULTISAMPLE */
581 /* Ignore sample qualifier while computing this flag. */
582 key->persample_shading =
583 _mesa_get_min_invocations_per_fragment(ctx, &fp->program, true) > 1;
584 if (key->persample_shading)
585 key->persample_2x = _mesa_geometric_samples(ctx->DrawBuffer) == 2;
586
587 key->compute_pos_offset =
588 _mesa_get_min_invocations_per_fragment(ctx, &fp->program, false) > 1 &&
589 fp->program.Base.SystemValuesRead & SYSTEM_BIT_SAMPLE_POS;
590
591 key->compute_sample_id =
592 multisample_fbo &&
593 ctx->Multisample.Enabled &&
594 (fp->program.Base.SystemValuesRead & SYSTEM_BIT_SAMPLE_ID);
595
596 /* BRW_NEW_VUE_MAP_GEOM_OUT */
597 if (brw->gen < 6 || _mesa_bitcount_64(fp->program.Base.InputsRead &
598 BRW_FS_VARYING_INPUT_MASK) > 16)
599 key->input_slots_valid = brw->vue_map_geom_out.slots_valid;
600
601
602 /* _NEW_COLOR | _NEW_BUFFERS */
603 /* Pre-gen6, the hardware alpha test always used each render
604 * target's alpha to do alpha test, as opposed to render target 0's alpha
605 * like GL requires. Fix that by building the alpha test into the
606 * shader, and we'll skip enabling the fixed function alpha test.
607 */
608 if (brw->gen < 6 && ctx->DrawBuffer->_NumColorDrawBuffers > 1 && ctx->Color.AlphaEnabled) {
609 key->alpha_test_func = ctx->Color.AlphaFunc;
610 key->alpha_test_ref = ctx->Color.AlphaRef;
611 }
612
613 /* The unique fragment program ID */
614 key->program_string_id = fp->id;
615 }
616
617 void
618 brw_upload_wm_prog(struct brw_context *brw)
619 {
620 struct gl_context *ctx = &brw->ctx;
621 struct gl_shader_program *current = ctx->_Shader->_CurrentFragmentProgram;
622 struct brw_wm_prog_key key;
623 struct brw_fragment_program *fp = (struct brw_fragment_program *)
624 brw->fragment_program;
625
626 if (!brw_wm_state_dirty(brw))
627 return;
628
629 brw_wm_populate_key(brw, &key);
630
631 if (!brw_search_cache(&brw->cache, BRW_CACHE_FS_PROG,
632 &key, sizeof(key),
633 &brw->wm.base.prog_offset, &brw->wm.prog_data)) {
634 bool success = brw_codegen_wm_prog(brw, current, fp, &key);
635 (void) success;
636 assert(success);
637 }
638 brw->wm.base.prog_data = &brw->wm.prog_data->base;
639 }