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