brw_wm.c revision d7b24fec245f90db4b8c66f4f7c167b8f20a9b9e
19f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*
29f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Copyright (C) Intel Corp.  2006.  All Rights Reserved.
39f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
49f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt develop this 3D driver.
59f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
69f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Permission is hereby granted, free of charge, to any person obtaining
79f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt a copy of this software and associated documentation files (the
89f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "Software"), to deal in the Software without restriction, including
99f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt without limitation the rights to use, copy, modify, merge, publish,
109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt distribute, sublicense, and/or sell copies of the Software, and to
119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt permit persons to whom the Software is furnished to do so, subject to
129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt the following conditions:
139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt The above copyright notice and this permission notice (including the
159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt next paragraph) shall be included in all copies or substantial
169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt portions of the Software.
179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt **********************************************************************/
279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /*
289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  * Authors:
299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  *   Keith Whitwell <keith@tungstengraphics.com>
309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  */
319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_context.h"
349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_util.h"
359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_wm.h"
369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_state.h"
379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_hal.h"
389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "program.h"
409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "program_instruction.h"
419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "arbprogparse.h"
429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
449f344b3e7d6e23674dd4747faec253f103563b36Eric AnholtGLuint brw_wm_nr_args( GLuint opcode )
459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   switch (opcode) {
479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_PIXELXY:
499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_ABS:
509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_FLR:
519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_FRC:
529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SWZ:
539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_MOV:
549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_COS:
559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_EX2:
569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_LG2:
579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_RCP:
589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_RSQ:
599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SIN:
609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SCS:
619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_TEX:
629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_TXB:
639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_TXP:
649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_KIL:
659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_LIT:
669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_CINTERP:
679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_WPOSXY:
689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return 1;
699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_POW:
719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SUB:
729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SGE:
739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SLT:
749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_ADD:
759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_MAX:
769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_MIN:
779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_MUL:
789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_XPD:
799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DP3:
809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DP4:
819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DPH:
829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DST:
839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_LINTERP:
849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_DELTAXY:
859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_PIXELW:
869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return 2;
879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_FB_WRITE:
899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case WM_PINTERP:
909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_MAD:
919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_CMP:
929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_LRP:
939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return 3;
949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   default:
969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return 0;
979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1019f344b3e7d6e23674dd4747faec253f103563b36Eric AnholtGLuint brw_wm_is_scalar_result( GLuint opcode )
1029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   switch (opcode) {
1049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_COS:
1059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_EX2:
1069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_LG2:
1079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_POW:
1089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_RCP:
1099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_RSQ:
1109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_SIN:
1119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DP3:
1129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DP4:
1139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DPH:
1149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   case OPCODE_DST:
1159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return 1;
1169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   default:
1189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return 0;
1199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void brw_wm_pass_hal (struct brw_wm_compile *c)
1249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   static void (*hal_wm_pass) (struct brw_wm_compile *c);
1269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   static GLboolean hal_tried;
1279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (!hal_tried)
1299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   {
1309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      hal_wm_pass = brw_hal_find_symbol ("intel_hal_wm_pass");
1319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      hal_tried = 1;
1329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
1339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (hal_wm_pass)
1349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      (*hal_wm_pass) (c);
1359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void do_wm_prog( struct brw_context *brw,
1389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			struct brw_fragment_program *fp,
1399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			struct brw_wm_prog_key *key)
1409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
141d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   struct brw_wm_compile *c;
1429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   const GLuint *program;
1439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint program_size;
1449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
145d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   c = brw->wm.compile_data;
146d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   if (c == NULL) {
147d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt     brw->wm.compile_data = calloc(1, sizeof(*brw->wm.compile_data));
148d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt     c = brw->wm.compile_data;
149d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   } else {
150d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt     memset(c, 0, sizeof(*brw->wm.compile_data));
151d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   }
152d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   memcpy(&c->key, key, sizeof(*key));
1539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
154d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   c->fp = fp;
155d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   c->env_param = brw->intel.ctx.FragmentProgram.Parameters;
1569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Augment fragment program.  Add instructions for pre- and
1599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    * post-fragment-program tasks such as interpolation and fogging.
1609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
161d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_wm_pass_fp(c);
1629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Translate to intermediate representation.  Build register usage
1649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    * chains.
1659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
166d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_wm_pass0(c);
1679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Dead code removal.
1699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
170d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_wm_pass1(c);
1719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Hal optimization
1739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
174d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_wm_pass_hal (c);
1759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Register allocation.
1779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
178d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   c->grf_limit = BRW_WM_MAX_GRF/2;
1799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* This is where we start emitting gen4 code:
1819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
182d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_init_compile(&c->func);
1839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
184d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_wm_pass2(c);
1859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
186d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   c->prog_data.total_grf = c->max_wm_grf;
187d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   if (c->last_scratch) {
188d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt      c->prog_data.total_scratch =
189d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt	 c->last_scratch + 0x40;
190d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   } else {
191d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt      c->prog_data.total_scratch = 0;
192d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   }
1939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Emit GEN4 code.
1959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
196d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   brw_wm_emit(c);
1979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* get the program
1999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
200d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt   program = brw_get_program(&c->func, &program_size);
2019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /*
2039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
2049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->wm.prog_gs_offset = brw_upload_cache( &brw->cache[BRW_WM_PROG],
205d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt					      &c->key,
206d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt					      sizeof(c->key),
2079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt					      program,
2089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt					      program_size,
209d7b24fec245f90db4b8c66f4f7c167b8f20a9b9eEric Anholt					      &c->prog_data,
2109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt					      &brw->wm.prog_data );
2119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
2129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void brw_wm_populate_key( struct brw_context *brw,
2169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt				 struct brw_wm_prog_key *key )
2179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
2189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* BRW_NEW_FRAGMENT_PROGRAM */
2199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_fragment_program *fp =
2209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      (struct brw_fragment_program *)brw->fragment_program;
2219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint lookup = 0;
2229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint line_aa;
2239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint i;
2249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   memset(key, 0, sizeof(*key));
2269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Build the index for table lookup
2289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
2299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* _NEW_COLOR */
2309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (fp->program.UsesKill ||
2319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt       brw->attribs.Color->AlphaEnabled)
2329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      lookup |= IZ_PS_KILL_ALPHATEST_BIT;
2339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (fp->program.Base.OutputsWritten & (1<<FRAG_RESULT_DEPR))
2359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      lookup |= IZ_PS_COMPUTES_DEPTH_BIT;
2369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* _NEW_DEPTH */
2389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (brw->attribs.Depth->Test)
2399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      lookup |= IZ_DEPTH_TEST_ENABLE_BIT;
2409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (brw->attribs.Depth->Test &&
2429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt       brw->attribs.Depth->Mask) /* ?? */
2439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      lookup |= IZ_DEPTH_WRITE_ENABLE_BIT;
2449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* _NEW_STENCIL */
2469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (brw->attribs.Stencil->Enabled) {
2479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      lookup |= IZ_STENCIL_TEST_ENABLE_BIT;
2489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      if (brw->attribs.Stencil->WriteMask[0] ||
2509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	  (brw->attribs.Stencil->TestTwoSide && brw->attribs.Stencil->WriteMask[1]))
2519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 lookup |= IZ_STENCIL_WRITE_ENABLE_BIT;
2529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
2539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* XXX: when should this be disabled?
2559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
2569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (1)
2579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      lookup |= IZ_EARLY_DEPTH_TEST_BIT;
2589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   line_aa = AA_NEVER;
2619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* _NEW_LINE, _NEW_POLYGON, BRW_NEW_REDUCED_PRIMITIVE */
2639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (brw->attribs.Line->SmoothFlag) {
2649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      if (brw->intel.reduced_primitive == GL_LINES) {
2659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 line_aa = AA_ALWAYS;
2669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      }
2679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      else if (brw->intel.reduced_primitive == GL_TRIANGLES) {
2689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 if (brw->attribs.Polygon->FrontMode == GL_LINE) {
2699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    line_aa = AA_SOMETIMES;
2709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    if (brw->attribs.Polygon->BackMode == GL_LINE ||
2729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		(brw->attribs.Polygon->CullFlag &&
2739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		 brw->attribs.Polygon->CullFaceMode == GL_BACK))
2749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	       line_aa = AA_ALWAYS;
2759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 }
2769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 else if (brw->attribs.Polygon->BackMode == GL_LINE) {
2779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    line_aa = AA_SOMETIMES;
2789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    if ((brw->attribs.Polygon->CullFlag &&
2809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		 brw->attribs.Polygon->CullFaceMode == GL_FRONT))
2819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	       line_aa = AA_ALWAYS;
2829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 }
2839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      }
2849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
2859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw_wm_lookup_iz(line_aa,
2879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		    lookup,
2889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		    key);
2899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* BRW_NEW_WM_INPUT_DIMENSIONS */
2929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   key->projtex_mask = brw->wm.input_size_masks[4-1];
2939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* _NEW_LIGHT */
2959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   key->flat_shade = (brw->attribs.Light->ShadeModel == GL_FLAT);
2969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* _NEW_TEXTURE */
2989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
2999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      const struct gl_texture_unit *unit = &brw->attribs.Texture->Unit[i];
3009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      const struct gl_texture_object *t = unit->_Current;
3019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      if (unit->_ReallyEnabled) {
3039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 if (t->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB &&
3059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	     t->Image[0][t->BaseLevel]->_BaseFormat == GL_DEPTH_COMPONENT) {
3069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    key->shadowtex_mask |= 1<<i;
3079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 }
3089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 if (t->Image[0][t->BaseLevel]->InternalFormat == GL_YCBCR_MESA)
3109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    key->yuvtex_mask |= 1<<i;
3119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      }
3129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
3139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Extra info:
3169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
3179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   key->program_string_id = fp->id;
3189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
3209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void brw_upload_wm_prog( struct brw_context *brw )
3239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
3249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_wm_prog_key key;
3259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_fragment_program *fp = (struct brw_fragment_program *)
3269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      brw->fragment_program;
3279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw_wm_populate_key(brw, &key);
3299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* Make an early check for the key.
3319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
3329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (brw_search_cache(&brw->cache[BRW_WM_PROG],
3339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			&key, sizeof(key),
3349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			&brw->wm.prog_data,
3359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt			&brw->wm.prog_gs_offset))
3369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      return;
3379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   do_wm_prog(brw, fp, &key);
3399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
3409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
3429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/* See brw_wm.c:
3439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */
3449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtconst struct brw_tracked_state brw_wm_prog = {
3459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   .dirty = {
3469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .mesa  = (_NEW_COLOR |
3479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		_NEW_DEPTH |
3489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		_NEW_STENCIL |
3499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		_NEW_POLYGON |
3509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		_NEW_LINE |
3519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		_NEW_LIGHT |
3529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		_NEW_TEXTURE),
3539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .brw   = (BRW_NEW_FRAGMENT_PROGRAM |
3549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		BRW_NEW_WM_INPUT_DIMENSIONS |
3559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt		BRW_NEW_REDUCED_PRIMITIVE),
3569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .cache = 0
3579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   },
3589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   .update = brw_upload_wm_prog
3599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
3609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
361