1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  * Authors:
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_wm.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/formats.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/samplerobj.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/prog_parameter.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glsl/ralloc.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Return number of src args for given instruction */
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint brw_wm_nr_args( GLuint opcode )
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (opcode) {
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_FRONTFACING:
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_PIXELXY:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_CINTERP:
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_WPOSXY:
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_DELTAXY:
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_LINTERP:
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_PIXELW:
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 2;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_FB_WRITE:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case WM_PINTERP:
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 3;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(opcode < MAX_OPCODE);
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_num_inst_src_regs(opcode);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint brw_wm_is_scalar_result( GLuint opcode )
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (opcode) {
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_COS:
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_EX2:
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_LG2:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_POW:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_RCP:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_RSQ:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_SIN:
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_DP2:
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_DP3:
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_DP4:
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_DPH:
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OPCODE_DST:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do GPU code generation for non-GLSL shader.  non-GLSL shaders have
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * no flow control instructions so we can more readily do SSA-style
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * optimizations.
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_wm_non_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Augment fragment program.  Add instructions for pre- and
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * post-fragment-program tasks such as interpolation and fogging.
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_wm_pass_fp(c);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Translate to intermediate representation.  Build register usage
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * chains.
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_wm_pass0(c);
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Dead code removal.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_wm_pass1(c);
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Register allocation.
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Divide by two because we operate on 16 pixels at a time and require
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * two GRF entries for each logical shader register.
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->grf_limit = BRW_WM_MAX_GRF / 2;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_wm_pass2(c);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* how many general-purpose registers are used */
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->prog_data.reg_blocks = brw_register_blocks(c->max_wm_grf);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit GEN4 code.
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_wm_emit(c);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return a bitfield where bit n is set if barycentric interpolation mode n
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (see enum brw_wm_barycentric_interp_mode) is needed by the fragment shader.
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_compute_barycentric_interp_modes(struct brw_context *brw,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     bool shade_model_flat,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     const struct gl_fragment_program *fprog)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned barycentric_interp_modes = 0;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int attr;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Loop through all fragment shader inputs to figure out what interpolation
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * modes are in use, and set the appropriate bits in
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * barycentric_interp_modes.
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attr = 0; attr < FRAG_ATTRIB_MAX; ++attr) {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enum glsl_interp_qualifier interp_qualifier =
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fprog->InterpQualifier[attr];
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool is_centroid = fprog->IsCentroid & BITFIELD64_BIT(attr);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool is_gl_Color = attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Ignore unused inputs. */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!(fprog->Base.InputsRead & BITFIELD64_BIT(attr)))
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Ignore WPOS and FACE, because they don't require interpolation. */
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (attr == FRAG_ATTRIB_WPOS || attr == FRAG_ATTRIB_FACE)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Determine the set (or sets) of barycentric coordinates needed to
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * interpolate this variable.  Note that when
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * brw->needs_unlit_centroid_workaround is set, centroid interpolation
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * uses PIXEL interpolation for unlit pixels and CENTROID interpolation
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * for lit pixels, so we need both sets of barycentric coordinates.
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (interp_qualifier == INTERP_QUALIFIER_NOPERSPECTIVE) {
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (is_centroid) {
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            barycentric_interp_modes |=
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               1 << BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!is_centroid || brw->needs_unlit_centroid_workaround) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            barycentric_interp_modes |=
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (interp_qualifier == INTERP_QUALIFIER_SMOOTH ||
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 (!(shade_model_flat && is_gl_Color) &&
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  interp_qualifier == INTERP_QUALIFIER_NONE)) {
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (is_centroid) {
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            barycentric_interp_modes |=
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               1 << BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!is_centroid || brw->needs_unlit_centroid_workaround) {
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            barycentric_interp_modes |=
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               1 << BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return barycentric_interp_modes;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_wm_payload_setup(struct brw_context *brw,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct brw_wm_compile *c)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool uses_depth = (c->fp->program.Base.InputsRead &
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      (1 << FRAG_ATTRIB_WPOS)) != 0;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned barycentric_interp_modes = c->prog_data.barycentric_interp_modes;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen >= 6) {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R0-1: masks, pixel X/Y coordinates. */
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->nr_payload_regs = 2;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R2: only for 32-pixel dispatch.*/
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R3-26: barycentric interpolation coordinates.  These appear in the
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * same order that they appear in the brw_wm_barycentric_interp_mode
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * enum.  Each set of coordinates occupies 2 registers if dispatch width
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * == 8 and 4 registers if dispatch width == 16.  Coordinates only
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * appear if they were enabled using the "Barycentric Interpolation
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Mode" bits in WM_STATE.
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < BRW_WM_BARYCENTRIC_INTERP_MODE_COUNT; ++i) {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (barycentric_interp_modes & (1 << i)) {
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            c->barycentric_coord_reg[i] = c->nr_payload_regs;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            c->nr_payload_regs += 2;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (c->dispatch_width == 16) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               c->nr_payload_regs += 2;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R27: interpolated depth if uses source depth */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (uses_depth) {
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->source_depth_reg = c->nr_payload_regs;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->nr_payload_regs++;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (c->dispatch_width == 16) {
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* R28: interpolated depth if not 8-wide. */
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c->nr_payload_regs++;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R29: interpolated W set if GEN6_WM_USES_SOURCE_W.
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (uses_depth) {
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->source_w_reg = c->nr_payload_regs;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->nr_payload_regs++;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (c->dispatch_width == 16) {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* R30: interpolated W if not 8-wide. */
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    c->nr_payload_regs++;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R31: MSAA position offsets. */
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R32-: bary for 32-pixel. */
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* R58-59: interp W for 32-pixel. */
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c->fp->program.Base.OutputsWritten &
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->source_depth_to_render_target = true;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->computes_depth = true;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_wm_lookup_iz(intel, c);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Mesa program -> GPU code generation goes through this function.
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Depending on the instructions used (i.e. flow control instructions)
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we'll use one of two code generators.
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool do_wm_prog(struct brw_context *brw,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct gl_shader_program *prog,
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct brw_fragment_program *fp,
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct brw_wm_prog_key *key)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_compile *c;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint *program;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint program_size;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c = brw->wm.compile_data;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c == NULL) {
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw->wm.compile_data = rzalloc(NULL, struct brw_wm_compile);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c = brw->wm.compile_data;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c == NULL) {
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Ouch - big out of memory problem.  Can't continue
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * without triggering a segfault, no way to signal,
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * so just return.
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *instruction = c->instruction;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *prog_instructions = c->prog_instructions;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *vreg = c->vreg;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *refs = c->refs;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(c, 0, sizeof(*brw->wm.compile_data));
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->instruction = instruction;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->prog_instructions = prog_instructions;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->vreg = vreg;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->refs = refs;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(&c->key, key, sizeof(*key));
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->fp = fp;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->env_param = brw->intel.ctx.FragmentProgram.Parameters;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_init_compile(brw, &c->func, c);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->prog_data.barycentric_interp_modes =
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_compute_barycentric_interp_modes(brw, c->key.flat_shade,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           &fp->program);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog && prog->_LinkedShaders[MESA_SHADER_FRAGMENT]) {
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!brw_wm_fs_emit(brw, c, prog))
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return false;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!c->instruction) {
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->instruction = rzalloc_array(c, struct brw_wm_instruction, BRW_WM_MAX_INSN);
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->prog_instructions = rzalloc_array(c, struct prog_instruction, BRW_WM_MAX_INSN);
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->vreg = rzalloc_array(c, struct brw_wm_value, BRW_WM_MAX_VREG);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 c->refs = rzalloc_array(c, struct brw_wm_ref, BRW_WM_MAX_REF);
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Fallback for fixed function and ARB_fp shaders. */
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->dispatch_width = 16;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_wm_payload_setup(brw, c);
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_wm_non_glsl_emit(brw, c);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->prog_data.dispatch_width = 16;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Scratch space is used for register spilling */
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->last_scratch) {
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      perf_debug("Fragment shader triggered register spilling.  "
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 "Try reducing the number of live scalar values to "
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 "improve performance.\n");
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->prog_data.total_scratch = brw_get_scratch_size(c->last_scratch);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_get_scratch_bo(intel, &brw->wm.scratch_bo,
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 c->prog_data.total_scratch * brw->max_wm_threads);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(INTEL_DEBUG & DEBUG_WM))
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "\n");
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* get the program
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   program = brw_get_program(&c->func, &program_size);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_upload_cache(&brw->cache, BRW_WM_PROG,
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    &c->key, sizeof(c->key),
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    program, program_size,
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    &c->prog_data, sizeof(c->prog_data),
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    &brw->wm.prog_offset, &brw->wm.prog_data);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgkey_debug(const char *name, int a, int b)
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (a != b) {
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      perf_debug("  %s %d->%d\n", name, a, b);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return true;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_debug_recompile_sampler_key(const struct brw_sampler_prog_key_data *old_key,
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const struct brw_sampler_prog_key_data *key)
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool found = false;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int i = 0; i < MAX_SAMPLERS; i++) {
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      found |= key_debug("EXT_texture_swizzle or DEPTH_TEXTURE_MODE",
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         old_key->swizzles[i], key->swizzles[i]);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("GL_CLAMP enabled on any texture unit's 1st coordinate",
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      old_key->gl_clamp_mask[0], key->gl_clamp_mask[0]);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("GL_CLAMP enabled on any texture unit's 2nd coordinate",
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      old_key->gl_clamp_mask[1], key->gl_clamp_mask[1]);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("GL_CLAMP enabled on any texture unit's 3rd coordinate",
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      old_key->gl_clamp_mask[2], key->gl_clamp_mask[2]);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("GL_MESA_ycbcr texturing\n",
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      old_key->yuvtex_mask, key->yuvtex_mask);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("GL_MESA_ycbcr UV swapping\n",
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      old_key->yuvtex_swap_mask, key->yuvtex_swap_mask);
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return found;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_wm_debug_recompile(struct brw_context *brw,
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct gl_shader_program *prog,
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct brw_wm_prog_key *key)
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_cache_item *c = NULL;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct brw_wm_prog_key *old_key = NULL;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool found = false;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   perf_debug("Recompiling fragment shader for program %d\n", prog->Name);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int i = 0; i < brw->cache.size; i++) {
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = brw->cache.items[i]; c; c = c->next) {
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (c->cache_id == BRW_WM_PROG) {
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            old_key = c->key;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (old_key->program_string_id == key->program_string_id)
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c)
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!c) {
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      perf_debug("  Didn't find previous compile in the shader cache for "
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 "debug\n");
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("alphatest, computed depth, depth test, or depth write",
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      old_key->iz_lookup, key->iz_lookup);
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("depth statistics", old_key->stats_wm, key->stats_wm);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("flat shading", old_key->flat_shade, key->flat_shade);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("number of color buffers", old_key->nr_color_regions, key->nr_color_regions);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("rendering to FBO", old_key->render_to_fbo, key->render_to_fbo);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("fragment color clamping", old_key->clamp_fragment_color, key->clamp_fragment_color);
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("line smoothing", old_key->line_aa, key->line_aa);
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("proj_attrib_mask", old_key->proj_attrib_mask, key->proj_attrib_mask);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("renderbuffer height", old_key->drawable_height, key->drawable_height);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= key_debug("vertex shader outputs", old_key->vp_outputs_written, key->vp_outputs_written);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   found |= brw_debug_recompile_sampler_key(&old_key->tex, &key->tex);
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!found) {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      perf_debug("  Something else\n");
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_populate_sampler_prog_key_data(struct gl_context *ctx,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   const struct gl_program *prog,
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   struct brw_sampler_prog_key_data *key)
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = intel_context(ctx);
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int s = 0; s < MAX_SAMPLERS; s++) {
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->swizzles[s] = SWIZZLE_NOOP;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!(prog->SamplersUsed & (1 << s)))
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 continue;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int unit_id = prog->SamplerUnits[s];
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct gl_texture_unit *unit = &ctx->Texture.Unit[unit_id];
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unit->_ReallyEnabled && unit->_Current->Target != GL_TEXTURE_BUFFER) {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 const struct gl_texture_object *t = unit->_Current;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit_id);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const bool alpha_depth = t->DepthMode == GL_ALPHA &&
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            (img->_BaseFormat == GL_DEPTH_COMPONENT ||
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             img->_BaseFormat == GL_DEPTH_STENCIL);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Haswell handles texture swizzling as surface format overrides
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * (except for GL_ALPHA); all other platforms need MOVs in the shader.
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!intel->is_haswell || alpha_depth)
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            key->swizzles[s] = brw_get_texture_swizzle(t);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (img->InternalFormat == GL_YCBCR_MESA) {
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    key->yuvtex_mask |= 1 << s;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (img->TexFormat == MESA_FORMAT_YCBCR)
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		key->yuvtex_swap_mask |= 1 << s;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (sampler->MinFilter != GL_NEAREST &&
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     sampler->MagFilter != GL_NEAREST) {
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (sampler->WrapS == GL_CLAMP)
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       key->gl_clamp_mask[0] |= 1 << s;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (sampler->WrapT == GL_CLAMP)
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       key->gl_clamp_mask[1] |= 1 << s;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (sampler->WrapR == GL_CLAMP)
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       key->gl_clamp_mask[2] |= 1 << s;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_wm_populate_key( struct brw_context *brw,
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct brw_wm_prog_key *key )
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &brw->intel.ctx;
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_FRAGMENT_PROGRAM */
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct brw_fragment_program *fp =
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (struct brw_fragment_program *)brw->fragment_program;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_program *prog = (struct gl_program *) brw->fragment_program;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint lookup = 0;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint line_aa;
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool program_uses_dfdy = fp->program.UsesDFdy;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(key, 0, sizeof(*key));
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Build the index for table lookup
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen < 6) {
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* _NEW_COLOR */
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fp->program.UsesKill || ctx->Color.AlphaEnabled)
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 lookup |= IZ_PS_KILL_ALPHATEST_BIT;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH))
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 lookup |= IZ_PS_COMPUTES_DEPTH_BIT;
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* _NEW_DEPTH */
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Depth.Test)
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 lookup |= IZ_DEPTH_TEST_ENABLE_BIT;
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Depth.Test && ctx->Depth.Mask) /* ?? */
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 lookup |= IZ_DEPTH_WRITE_ENABLE_BIT;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* _NEW_STENCIL */
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil._Enabled) {
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 lookup |= IZ_STENCIL_TEST_ENABLE_BIT;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Stencil.WriteMask[0] ||
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     ctx->Stencil.WriteMask[ctx->Stencil._BackFace])
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    lookup |= IZ_STENCIL_WRITE_ENABLE_BIT;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->iz_lookup = lookup;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   line_aa = AA_NEVER;
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_LINE, _NEW_POLYGON, BRW_NEW_REDUCED_PRIMITIVE */
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Line.SmoothFlag) {
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (brw->intel.reduced_primitive == GL_LINES) {
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 line_aa = AA_ALWAYS;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (brw->intel.reduced_primitive == GL_TRIANGLES) {
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (ctx->Polygon.FrontMode == GL_LINE) {
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    line_aa = AA_SOMETIMES;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (ctx->Polygon.BackMode == GL_LINE ||
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(ctx->Polygon.CullFlag &&
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 ctx->Polygon.CullFaceMode == GL_BACK))
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       line_aa = AA_ALWAYS;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else if (ctx->Polygon.BackMode == GL_LINE) {
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    line_aa = AA_SOMETIMES;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if ((ctx->Polygon.CullFlag &&
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 ctx->Polygon.CullFaceMode == GL_FRONT))
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       line_aa = AA_ALWAYS;
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->line_aa = line_aa;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen < 6)
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->stats_wm = brw->intel.stats_wm;
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* BRW_NEW_WM_INPUT_DIMENSIONS */
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Only set this for fixed function.  The optimization it enables isn't
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * useful for programs using shaders.
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Shader.CurrentFragmentProgram)
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->proj_attrib_mask = 0xffffffff;
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->proj_attrib_mask = brw->wm.input_size_masks[4-1];
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_LIGHT */
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->flat_shade = (ctx->Light.ShadeModel == GL_FLAT);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_FRAG_CLAMP | _NEW_BUFFERS */
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->clamp_fragment_color = ctx->Color._ClampFragmentColor;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_TEXTURE */
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_populate_sampler_prog_key_data(ctx, prog, &key->tex);
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_BUFFERS */
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Include the draw buffer origin and height so that we can calculate
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * fragment position values relative to the bottom left of the drawable,
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * from the incoming screen origin relative position we get as part of our
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * payload.
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This is only needed for the WM_WPOSXY opcode when the fragment program
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * uses the gl_FragCoord input.
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * We could avoid recompiling by including this as a constant referenced by
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * our program, but if we were to do that it would also be nice to handle
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * getting that constant updated at batchbuffer submit time (when we
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * hold the lock and know where the buffer really is) rather than at emit
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * time when we don't hold the lock and are just guessing.  We could also
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * just avoid using this as key data if the program doesn't use
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * fragment.position.
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * For DRI2 the origin_x/y will always be (0,0) but we still need the
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * drawable height in order to invert the Y axis.
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fp->program.Base.InputsRead & FRAG_BIT_WPOS) {
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->drawable_height = ctx->DrawBuffer->Height;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((fp->program.Base.InputsRead & FRAG_BIT_WPOS) || program_uses_dfdy) {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* _NEW_BUFFERS */
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers;
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /* _NEW_MULTISAMPLE */
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->sample_alpha_to_coverage = ctx->Multisample.SampleAlphaToCoverage;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* CACHE_NEW_VS_PROG */
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen < 6)
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->vp_outputs_written = brw->vs.prog_data->outputs_written;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The unique fragment program ID */
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->program_string_id = fp->id;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_wm_prog(struct brw_context *brw)
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_context *intel = &brw->intel;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_prog_key key;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_fragment_program *fp = (struct brw_fragment_program *)
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw->fragment_program;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_wm_populate_key(brw, &key);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!brw_search_cache(&brw->cache, BRW_WM_PROG,
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 &key, sizeof(key),
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 &brw->wm.prog_offset, &brw->wm.prog_data)) {
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bool success = do_wm_prog(brw, ctx->Shader._CurrentFragmentProgram, fp,
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				&key);
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (void) success;
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(success);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_wm_prog = {
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .dirty = {
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .mesa  = (_NEW_COLOR |
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_DEPTH |
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_STENCIL |
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_POLYGON |
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_LINE |
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_LIGHT |
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_FRAG_CLAMP |
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_BUFFERS |
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_TEXTURE |
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_NEW_MULTISAMPLE),
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .brw   = (BRW_NEW_FRAGMENT_PROGRAM |
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		BRW_NEW_WM_INPUT_DIMENSIONS |
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		BRW_NEW_REDUCED_PRIMITIVE),
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      .cache = CACHE_NEW_VS_PROG,
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   .emit = brw_upload_wm_prog
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661