brw_wm_fp.c revision 9d4b98eb9eadecc17cd1cda0074b420a39e74647
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 33ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 34ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h" 35ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h" 369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_context.h" 379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_wm.h" 389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_util.h" 399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 40ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h" 41ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h" 42ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_statevars.h" 43064ae479a770bf434958d673baf6f7530f642697Brian 449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 4534da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul/** An invalid texture target */ 4634da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul#define TEX_TARGET_NONE NUM_TEXTURE_TARGETS 4734da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul 4834da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul/** An invalid texture unit */ 4934da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul#define TEX_UNIT_NONE BRW_MAX_TEX_UNIT 5034da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul 519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define FIRST_INTERNAL_TEMP MAX_NV_FRAGMENT_PROGRAM_TEMPS 529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define X 0 549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define Y 1 559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define Z 2 569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define W 3 579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic const char *wm_opcode_strings[] = { 609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "PIXELXY", 619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "DELTAXY", 629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "PIXELW", 639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "LINTERP", 649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "PINTERP", 659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "CINTERP", 669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "WPOSXY", 67699db6d842c52d0b3b98b320f8ef1104a65fa783Eric Anholt "FB_WRITE", 68699db6d842c52d0b3b98b320f8ef1104a65fa783Eric Anholt "FRONTFACING", 699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}; 709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 71e7b0ec9ae79d4ec4aba402b9124fde55d914da92Keith Whitwell#if 0 729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic const char *wm_file_strings[] = { 739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "PAYLOAD" 749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}; 75e7b0ec9ae79d4ec4aba402b9124fde55d914da92Keith Whitwell#endif 769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Source regs 809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register src_reg(GLuint file, GLuint idx) 839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register reg; 859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.File = file; 869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.Index = idx; 879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.Swizzle = SWIZZLE_NOOP; 889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.RelAddr = 0; 897db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul reg.Negate = NEGATE_NONE; 909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.Abs = 0; 91b10bb527eaf39378da25dd4ad21b1c68ceaa1e2dEric Anholt reg.HasIndex2 = 0; 92e7843363a5cb1a7e6c206e2bc79f03bd58312820Vinson Lee reg.RelAddr2 = 0; 93e7843363a5cb1a7e6c206e2bc79f03bd58312820Vinson Lee reg.Index2 = 0; 949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return reg; 959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register src_reg_from_dst(struct prog_dst_register dst) 989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return src_reg(dst.File, dst.Index); 1009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register src_undef( void ) 1039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return src_reg(PROGRAM_UNDEFINED, 0); 1059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic GLboolean src_is_undef(struct prog_src_register src) 1089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return src.File == PROGRAM_UNDEFINED; 1109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register src_swizzle( struct prog_src_register reg, int x, int y, int z, int w ) 1139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.Swizzle = MAKE_SWIZZLE4(x,y,z,w); 1159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return reg; 1169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register src_swizzle1( struct prog_src_register reg, int x ) 1199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return src_swizzle(reg, x, x, x, x); 1219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 123c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paulstatic struct prog_src_register src_swizzle4( struct prog_src_register reg, uint swizzle ) 124c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul{ 125c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul reg.Swizzle = swizzle; 126c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul return reg; 127c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul} 128c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul 1299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 1319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Dest regs 1329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 1339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_dst_register dst_reg(GLuint file, GLuint idx) 1359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register reg; 1379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.File = file; 1389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.Index = idx; 1399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.WriteMask = WRITEMASK_XYZW; 14095fa98d61a857448e690a0671b2e1e1d2873f0ecBrian Paul reg.RelAddr = 0; 14120f49252e1fe2e72bb620c26292f33d5315452a1Brian Paul reg.CondMask = COND_TR; 1429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.CondSwizzle = 0; 1439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.CondSrc = 0; 1449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return reg; 1459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_dst_register dst_mask( struct prog_dst_register reg, int mask ) 1489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt reg.WriteMask &= mask; 1509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return reg; 1519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_dst_register dst_undef( void ) 1549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return dst_reg(PROGRAM_UNDEFINED, 0); 1569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_dst_register get_temp( struct brw_wm_compile *c ) 1619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1623105bc1d885ea8ce083d2be85cbeac46d4d873a1Andrzej Trznadel int bit = _mesa_ffs( ~c->fp_temp ); 1639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (!bit) { 165298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s: out of temporaries\n", __FILE__); 1669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt exit(1); 1679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 1689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->fp_temp |= 1<<(bit-1); 1709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return dst_reg(PROGRAM_TEMPORARY, FIRST_INTERNAL_TEMP+(bit-1)); 1719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void release_temp( struct brw_wm_compile *c, struct prog_dst_register temp ) 1759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1763105bc1d885ea8ce083d2be85cbeac46d4d873a1Andrzej Trznadel c->fp_temp &= ~(1 << (temp.Index - FIRST_INTERNAL_TEMP)); 1779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 1819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Instructions 1829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 1839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_instruction *get_fp_inst(struct brw_wm_compile *c) 1859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 186cb132406ded760a622513cd1ab86bf83bb945671Eric Anholt assert(c->nr_fp_insns < BRW_WM_MAX_INSN); 187c5413839b3e99c7b162f1260142f3c175502b0ceEric Anholt memset(&c->prog_instructions[c->nr_fp_insns], 0, 188c5413839b3e99c7b162f1260142f3c175502b0ceEric Anholt sizeof(*c->prog_instructions)); 1899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return &c->prog_instructions[c->nr_fp_insns++]; 1909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_instruction *emit_insn(struct brw_wm_compile *c, 1939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst0) 1949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_instruction *inst = get_fp_inst(c); 1969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt *inst = *inst0; 1979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return inst; 1989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 1999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 200a79186e29efebed04c927d024b013435e7ff5725Brian Paulstatic struct prog_instruction * emit_tex_op(struct brw_wm_compile *c, 2019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint op, 2029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register dest, 2039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint saturate, 2049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint tex_src_unit, 2059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint tex_src_target, 206e0d907308150b4863cc4f24543e70e14207e966aBrian Paul GLuint tex_shadow, 2079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src0, 2089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src1, 2099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src2 ) 2109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 2119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_instruction *inst = get_fp_inst(c); 2129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 21334da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul assert(tex_src_unit < BRW_MAX_TEX_UNIT || 21434da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul tex_src_unit == TEX_UNIT_NONE); 21534da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul assert(tex_src_target < NUM_TEXTURE_TARGETS || 21634da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul tex_src_target == TEX_TARGET_NONE); 21734da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul 21834da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul /* update mask of which texture units are referenced by this program */ 21934da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul if (tex_src_unit != TEX_UNIT_NONE) 22034da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul c->fp->tex_units_used |= (1 << tex_src_unit); 221b7d2023cf99319c71a929c35478dff07d35df392Brian Paul 2229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt memset(inst, 0, sizeof(*inst)); 2239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->Opcode = op; 2259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->DstReg = dest; 2269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->SaturateMode = saturate; 2279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->TexSrcUnit = tex_src_unit; 2289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->TexSrcTarget = tex_src_target; 229e0d907308150b4863cc4f24543e70e14207e966aBrian Paul inst->TexShadow = tex_shadow; 2309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->SrcReg[0] = src0; 2319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->SrcReg[1] = src1; 2329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt inst->SrcReg[2] = src2; 2339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return inst; 2349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 2359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 237a79186e29efebed04c927d024b013435e7ff5725Brian Paulstatic struct prog_instruction * emit_op(struct brw_wm_compile *c, 238a79186e29efebed04c927d024b013435e7ff5725Brian Paul GLuint op, 239a79186e29efebed04c927d024b013435e7ff5725Brian Paul struct prog_dst_register dest, 240a79186e29efebed04c927d024b013435e7ff5725Brian Paul GLuint saturate, 241a79186e29efebed04c927d024b013435e7ff5725Brian Paul struct prog_src_register src0, 242a79186e29efebed04c927d024b013435e7ff5725Brian Paul struct prog_src_register src1, 243a79186e29efebed04c927d024b013435e7ff5725Brian Paul struct prog_src_register src2 ) 244a79186e29efebed04c927d024b013435e7ff5725Brian Paul{ 245a79186e29efebed04c927d024b013435e7ff5725Brian Paul return emit_tex_op(c, op, dest, saturate, 24634da6024e3097684110cd1fd4da0f25adc415cd6Brian Paul TEX_UNIT_NONE, TEX_TARGET_NONE, 0, /* unit, tgt, shadow */ 247a79186e29efebed04c927d024b013435e7ff5725Brian Paul src0, src1, src2); 248a79186e29efebed04c927d024b013435e7ff5725Brian Paul} 249a79186e29efebed04c927d024b013435e7ff5725Brian Paul 2509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 251536476f2432168fb15ac06b52c953a594ad851adEric Anholt/* Many Mesa opcodes produce the same value across all the result channels. 252536476f2432168fb15ac06b52c953a594ad851adEric Anholt * We'd rather not have to support that splatting in the opcode implementations, 253536476f2432168fb15ac06b52c953a594ad851adEric Anholt * and brw_wm_pass*.c wants to optimize them out by shuffling references around 254536476f2432168fb15ac06b52c953a594ad851adEric Anholt * anyway. We can easily get both by emitting the opcode to one channel, and 255536476f2432168fb15ac06b52c953a594ad851adEric Anholt * then MOVing it to the others, which brw_wm_pass*.c already understands. 256536476f2432168fb15ac06b52c953a594ad851adEric Anholt */ 257536476f2432168fb15ac06b52c953a594ad851adEric Anholtstatic struct prog_instruction *emit_scalar_insn(struct brw_wm_compile *c, 258536476f2432168fb15ac06b52c953a594ad851adEric Anholt const struct prog_instruction *inst0) 259536476f2432168fb15ac06b52c953a594ad851adEric Anholt{ 260536476f2432168fb15ac06b52c953a594ad851adEric Anholt struct prog_instruction *inst; 261536476f2432168fb15ac06b52c953a594ad851adEric Anholt unsigned int dst_chan; 262536476f2432168fb15ac06b52c953a594ad851adEric Anholt unsigned int other_channel_mask; 263536476f2432168fb15ac06b52c953a594ad851adEric Anholt 264536476f2432168fb15ac06b52c953a594ad851adEric Anholt if (inst0->DstReg.WriteMask == 0) 265536476f2432168fb15ac06b52c953a594ad851adEric Anholt return NULL; 266536476f2432168fb15ac06b52c953a594ad851adEric Anholt 267536476f2432168fb15ac06b52c953a594ad851adEric Anholt dst_chan = _mesa_ffs(inst0->DstReg.WriteMask) - 1; 268536476f2432168fb15ac06b52c953a594ad851adEric Anholt inst = get_fp_inst(c); 269536476f2432168fb15ac06b52c953a594ad851adEric Anholt *inst = *inst0; 270536476f2432168fb15ac06b52c953a594ad851adEric Anholt inst->DstReg.WriteMask = 1 << dst_chan; 271536476f2432168fb15ac06b52c953a594ad851adEric Anholt 272536476f2432168fb15ac06b52c953a594ad851adEric Anholt other_channel_mask = inst0->DstReg.WriteMask & ~(1 << dst_chan); 273536476f2432168fb15ac06b52c953a594ad851adEric Anholt if (other_channel_mask != 0) { 274536476f2432168fb15ac06b52c953a594ad851adEric Anholt inst = emit_op(c, 275536476f2432168fb15ac06b52c953a594ad851adEric Anholt OPCODE_MOV, 276536476f2432168fb15ac06b52c953a594ad851adEric Anholt dst_mask(inst0->DstReg, other_channel_mask), 277536476f2432168fb15ac06b52c953a594ad851adEric Anholt 0, 278536476f2432168fb15ac06b52c953a594ad851adEric Anholt src_swizzle1(src_reg_from_dst(inst0->DstReg), dst_chan), 279536476f2432168fb15ac06b52c953a594ad851adEric Anholt src_undef(), 280536476f2432168fb15ac06b52c953a594ad851adEric Anholt src_undef()); 281536476f2432168fb15ac06b52c953a594ad851adEric Anholt } 282536476f2432168fb15ac06b52c953a594ad851adEric Anholt return inst; 283536476f2432168fb15ac06b52c953a594ad851adEric Anholt} 284536476f2432168fb15ac06b52c953a594ad851adEric Anholt 2859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 2879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Special instructions for interpolation and other tasks 2889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 2899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register get_pixel_xy( struct brw_wm_compile *c ) 2919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 2929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (src_is_undef(c->pixel_xy)) { 2939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register pixel_xy = get_temp(c); 2949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register payload_r0_depth = src_reg(PROGRAM_PAYLOAD, PAYLOAD_DEPTH); 2959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 2979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* Emit the out calculations, and hold onto the results. Use 2989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * two instructions as a temporary is required. 2999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 3009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* pixel_xy.xy = PIXELXY payload[0]; 3019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 3029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 3039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_PIXELXY, 3049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(pixel_xy, WRITEMASK_XY), 305a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 3069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt payload_r0_depth, 3079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef(), 3089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 3099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->pixel_xy = src_reg_from_dst(pixel_xy); 3119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 3129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return c->pixel_xy; 3149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 3159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register get_delta_xy( struct brw_wm_compile *c ) 3179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 3189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (src_is_undef(c->delta_xy)) { 3199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register delta_xy = get_temp(c); 3209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register pixel_xy = get_pixel_xy(c); 3219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register payload_r0_depth = src_reg(PROGRAM_PAYLOAD, PAYLOAD_DEPTH); 3229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* deltas.xy = DELTAXY pixel_xy, payload[0] 3249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 3259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 3269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_DELTAXY, 3279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(delta_xy, WRITEMASK_XY), 328a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 3299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt pixel_xy, 3309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt payload_r0_depth, 3319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 3329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->delta_xy = src_reg_from_dst(delta_xy); 3349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 3359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return c->delta_xy; 3379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 3389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register get_pixel_w( struct brw_wm_compile *c ) 3409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 341ad35528944960f1619e0a9491164c848b333e6cfEric Anholt /* This is called for producing 1/w in pre-gen6 interp. for gen6, 342ad35528944960f1619e0a9491164c848b333e6cfEric Anholt * the interp opcodes don't use this argument. But to keep the 343ad35528944960f1619e0a9491164c848b333e6cfEric Anholt * nr_args = 3 expectations of pinterp happy, just stuff delta_xy 344ad35528944960f1619e0a9491164c848b333e6cfEric Anholt * into the slot. 345a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt */ 346a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt if (c->func.brw->intel.gen >= 6) 347ad35528944960f1619e0a9491164c848b333e6cfEric Anholt return c->delta_xy; 348a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt 349f1dba030564e66ca52f4ed44172681e7d2e90ad2Eric Anholt if (src_is_undef(c->pixel_w)) { 3509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register pixel_w = get_temp(c); 3519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register deltas = get_delta_xy(c); 3529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register interp_wpos = src_reg(PROGRAM_PAYLOAD, FRAG_ATTRIB_WPOS); 3539b78d9f65178648b1888f98153a2f738a281cb84Brian Paul 3549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* deltas.xyw = DELTAS2 deltas.xy, payload.interp_wpos.x 3559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 3569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 3579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_PIXELW, 3589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(pixel_w, WRITEMASK_W), 359a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 3609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt interp_wpos, 3619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt deltas, 3629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 3639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->pixel_w = src_reg_from_dst(pixel_w); 3669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 3679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return c->pixel_w; 3699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 3709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void emit_interp( struct brw_wm_compile *c, 3729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint idx ) 3739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 3749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register dst = dst_reg(PROGRAM_INPUT, idx); 3759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register interp = src_reg(PROGRAM_PAYLOAD, idx); 376a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt struct prog_src_register deltas; 377a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt 378ad35528944960f1619e0a9491164c848b333e6cfEric Anholt deltas = get_delta_xy(c); 379b013f945d8514ed827183a4cbfbc4dccc100704fEric Anholt 3809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* Need to use PINTERP on attributes which have been 3819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * multiplied by 1/W in the SF program, and LINTERP on those 3829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * which have not: 3839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 3849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt switch (idx) { 3859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case FRAG_ATTRIB_WPOS: 3869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* Have to treat wpos.xy specially: 3879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 3889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 3899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_WPOSXY, 3909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(dst, WRITEMASK_XY), 391a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 3929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt get_pixel_xy(c), 3939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef(), 3949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 3959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst = dst_mask(dst, WRITEMASK_ZW); 3979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 3989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* PROGRAM_INPUT.attr.xyzw = INTERP payload.interp[attr].x, deltas.xyw 3999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 4009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 4019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_LINTERP, 4029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst, 403a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 4049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt interp, 4059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt deltas, 406b013f945d8514ed827183a4cbfbc4dccc100704fEric Anholt src_undef()); 4079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 4089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case FRAG_ATTRIB_COL0: 4099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case FRAG_ATTRIB_COL1: 4109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (c->key.flat_shade) { 4119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 4129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_CINTERP, 4139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst, 414a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 4159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt interp, 4169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef(), 4179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 4189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 4199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt else { 420f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt /* perspective-corrected color interpolation */ 421f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt emit_op(c, 422f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt WM_PINTERP, 423f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt dst, 424f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt 0, 425f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt interp, 426f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt deltas, 427f147599ef4b0d14c25a7e0d3f9f1c9b0229bb6fcEric Anholt get_pixel_w(c)); 4289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 4299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 430411d913ccea362dbd75411266d7abb685214ee93Eric Anholt case FRAG_ATTRIB_FOGC: 431411d913ccea362dbd75411266d7abb685214ee93Eric Anholt /* Interpolate the fog coordinate */ 432411d913ccea362dbd75411266d7abb685214ee93Eric Anholt emit_op(c, 433411d913ccea362dbd75411266d7abb685214ee93Eric Anholt WM_PINTERP, 434411d913ccea362dbd75411266d7abb685214ee93Eric Anholt dst_mask(dst, WRITEMASK_X), 435411d913ccea362dbd75411266d7abb685214ee93Eric Anholt 0, 436411d913ccea362dbd75411266d7abb685214ee93Eric Anholt interp, 437411d913ccea362dbd75411266d7abb685214ee93Eric Anholt deltas, 438411d913ccea362dbd75411266d7abb685214ee93Eric Anholt get_pixel_w(c)); 439411d913ccea362dbd75411266d7abb685214ee93Eric Anholt 4409d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul emit_op(c, 4419d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul OPCODE_MOV, 4429d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul dst_mask(dst, WRITEMASK_YZW), 4439d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul 0, 4449d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul src_swizzle(interp, 4459d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul SWIZZLE_ZERO, 4469d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul SWIZZLE_ZERO, 4479d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul SWIZZLE_ZERO, 4489d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul SWIZZLE_ONE), 4499d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul src_undef(), 4509d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul src_undef()); 4519d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 4529d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul 4539d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FACE: 4549d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul emit_op(c, 4559d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul WM_FRONTFACING, 4569d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul dst_mask(dst, WRITEMASK_X), 4579d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul 0, 4589d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul src_undef(), 4599d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul src_undef(), 4609d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul src_undef()); 4619d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 4629d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul 4639d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_PNTC: 4649d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul /* XXX review/test this case */ 4659d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul emit_op(c, 4669d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul WM_PINTERP, 4679d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul dst_mask(dst, WRITEMASK_XY), 4689d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul 0, 4699d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interp, 4709d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul deltas, 4719d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul get_pixel_w(c)); 472411d913ccea362dbd75411266d7abb685214ee93Eric Anholt 473411d913ccea362dbd75411266d7abb685214ee93Eric Anholt emit_op(c, 474411d913ccea362dbd75411266d7abb685214ee93Eric Anholt OPCODE_MOV, 475411d913ccea362dbd75411266d7abb685214ee93Eric Anholt dst_mask(dst, WRITEMASK_ZW), 476411d913ccea362dbd75411266d7abb685214ee93Eric Anholt 0, 477411d913ccea362dbd75411266d7abb685214ee93Eric Anholt src_swizzle(interp, 478411d913ccea362dbd75411266d7abb685214ee93Eric Anholt SWIZZLE_ZERO, 479411d913ccea362dbd75411266d7abb685214ee93Eric Anholt SWIZZLE_ZERO, 480411d913ccea362dbd75411266d7abb685214ee93Eric Anholt SWIZZLE_ZERO, 481411d913ccea362dbd75411266d7abb685214ee93Eric Anholt SWIZZLE_ONE), 482411d913ccea362dbd75411266d7abb685214ee93Eric Anholt src_undef(), 483411d913ccea362dbd75411266d7abb685214ee93Eric Anholt src_undef()); 484411d913ccea362dbd75411266d7abb685214ee93Eric Anholt break; 4859d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul 4869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt default: 4879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 4889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WM_PINTERP, 4899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst, 490a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 4919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt interp, 4929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt deltas, 4939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt get_pixel_w(c)); 4949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 4959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 4969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 4979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->fp_interp_emitted |= 1<<idx; 4989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 4999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 5019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Hacks to extend the program parameter and constant lists. 5029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 5039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/* Add the fog parameters to the parameter list of the original 5059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * program, rather than creating a new list. Doesn't really do any 5069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * harm and it's not as if the parameter handling isn't a big hack 5079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * anyway. 5089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 509064ae479a770bf434958d673baf6f7530f642697Brianstatic struct prog_src_register search_or_add_param5(struct brw_wm_compile *c, 510064ae479a770bf434958d673baf6f7530f642697Brian GLint s0, 511064ae479a770bf434958d673baf6f7530f642697Brian GLint s1, 512064ae479a770bf434958d673baf6f7530f642697Brian GLint s2, 513064ae479a770bf434958d673baf6f7530f642697Brian GLint s3, 514064ae479a770bf434958d673baf6f7530f642697Brian GLint s4) 5159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 5169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct gl_program_parameter_list *paramList = c->fp->program.Base.Parameters; 517064ae479a770bf434958d673baf6f7530f642697Brian gl_state_index tokens[STATE_LENGTH]; 5189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint idx; 5199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tokens[0] = s0; 5209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tokens[1] = s1; 5219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tokens[2] = s2; 5229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tokens[3] = s3; 5239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tokens[4] = s4; 5249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt idx = _mesa_add_state_reference( paramList, tokens ); 5269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt return src_reg(PROGRAM_STATE_VAR, idx); 5289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 5299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic struct prog_src_register search_or_add_const4f( struct brw_wm_compile *c, 5329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLfloat s0, 5339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLfloat s1, 5349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLfloat s2, 5359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLfloat s3) 5369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 5379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct gl_program_parameter_list *paramList = c->fp->program.Base.Parameters; 538a9e97d022cb68266639eb54947517454c8ffe45eEric Anholt gl_constant_value values[4]; 5399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint idx; 540064ae479a770bf434958d673baf6f7530f642697Brian GLuint swizzle; 5415b24d69fcd6359dc959ec465c7e77b4626a27e72Eric Anholt struct prog_src_register reg; 5429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 543a9e97d022cb68266639eb54947517454c8ffe45eEric Anholt values[0].f = s0; 544a9e97d022cb68266639eb54947517454c8ffe45eEric Anholt values[1].f = s1; 545a9e97d022cb68266639eb54947517454c8ffe45eEric Anholt values[2].f = s2; 546a9e97d022cb68266639eb54947517454c8ffe45eEric Anholt values[3].f = s3; 5479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 548064ae479a770bf434958d673baf6f7530f642697Brian idx = _mesa_add_unnamed_constant( paramList, values, 4, &swizzle ); 5495b24d69fcd6359dc959ec465c7e77b4626a27e72Eric Anholt reg = src_reg(PROGRAM_STATE_VAR, idx); 5505b24d69fcd6359dc959ec465c7e77b4626a27e72Eric Anholt reg.Swizzle = swizzle; 5515b24d69fcd6359dc959ec465c7e77b4626a27e72Eric Anholt 5525b24d69fcd6359dc959ec465c7e77b4626a27e72Eric Anholt return reg; 5539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 5549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 5589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Expand various instructions here to simpler forms. 5599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 5609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void precalc_dst( struct brw_wm_compile *c, 5619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst ) 5629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 5639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src0 = inst->SrcReg[0]; 5649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src1 = inst->SrcReg[1]; 5659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register dst = inst->DstReg; 56646a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt struct prog_dst_register temp = get_temp(c); 56746a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt 5689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (dst.WriteMask & WRITEMASK_Y) { 5699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* dst.y = mul src0.y, src1.y 5709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 5719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 5729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_MUL, 57346a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt dst_mask(temp, WRITEMASK_Y), 574a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->SaturateMode, 5759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src0, 5769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src1, 5779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 5789f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 5799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (dst.WriteMask & WRITEMASK_XZ) { 581b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt struct prog_instruction *swz; 5829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint z = GET_SWZ(src0.Swizzle, Z); 5839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 5849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* dst.xz = swz src0.1zzz 5859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 586b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt swz = emit_op(c, 587b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt OPCODE_SWZ, 58846a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt dst_mask(temp, WRITEMASK_XZ), 589a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->SaturateMode, 590b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt src_swizzle(src0, SWIZZLE_ONE, z, z, z), 591b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt src_undef(), 592b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt src_undef()); 593b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt /* Avoid letting negation flag of src0 affect our 1 constant. */ 5947db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul swz->SrcReg[0].Negate &= ~NEGATE_X; 5959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 5969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (dst.WriteMask & WRITEMASK_W) { 5979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* dst.w = mov src1.w 5989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 5999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 6009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_MOV, 60146a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt dst_mask(temp, WRITEMASK_W), 602a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->SaturateMode, 6039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src1, 6049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef(), 6059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 6069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 60746a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt 60846a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt /* This will get optimized out in general, but it ensures that we 60946a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt * don't overwrite src operands in our channel-wise splitting 61046a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt * above. See piglit fp-dst-aliasing-[12]. 61146a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt */ 61246a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt emit_op(c, 61346a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt OPCODE_MOV, 61446a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt dst, 61546a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt 0, 61646a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt src_reg_from_dst(temp), 61746a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt src_undef(), 61846a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt src_undef()); 61946a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt 62046a7639174d2c55c30ec24b179cbef059fb3ca43Eric Anholt release_temp(c, temp); 6219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 6229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 6239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 6249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void precalc_lit( struct brw_wm_compile *c, 6259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst ) 6269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 6279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src0 = inst->SrcReg[0]; 6289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register dst = inst->DstReg; 629e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt 630e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt if (dst.WriteMask & WRITEMASK_YZ) { 631e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt emit_op(c, 632e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt OPCODE_LIT, 633e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt dst_mask(dst, WRITEMASK_YZ), 634e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt inst->SaturateMode, 635e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt src0, 636e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt src_undef(), 637e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt src_undef()); 638e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt } 639e3ea5bc08e32119d05bce543c07c61ce93869e60Eric Anholt 6409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (dst.WriteMask & WRITEMASK_XW) { 641b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt struct prog_instruction *swz; 642b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt 6439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* dst.xw = swz src0.1111 6449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 645b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt swz = emit_op(c, 646b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt OPCODE_SWZ, 647b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt dst_mask(dst, WRITEMASK_XW), 648a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 649b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt src_swizzle1(src0, SWIZZLE_ONE), 650b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt src_undef(), 651b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt src_undef()); 652b4cbf6983e0e6d6502c1260f60c463841ab74590Eric Anholt /* Avoid letting the negation flag of src0 affect our 1 constant. */ 6537db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul swz->SrcReg[0].Negate = NEGATE_NONE; 6549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 6559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 6569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 6579e7903e492ad842481a166484e0474dd4f3100baBrian Paul 6589e7903e492ad842481a166484e0474dd4f3100baBrian Paul/** 6599e7903e492ad842481a166484e0474dd4f3100baBrian Paul * Some TEX instructions require extra code, cube map coordinate 6609e7903e492ad842481a166484e0474dd4f3100baBrian Paul * normalization, or coordinate scaling for RECT textures, etc. 6619e7903e492ad842481a166484e0474dd4f3100baBrian Paul * This function emits those extra instructions and the TEX 6629e7903e492ad842481a166484e0474dd4f3100baBrian Paul * instruction itself. 6639e7903e492ad842481a166484e0474dd4f3100baBrian Paul */ 6649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void precalc_tex( struct brw_wm_compile *c, 6659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst ) 6669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 6679d4b98eb9eadecc17cd1cda0074b420a39e74647Eric Anholt struct brw_compile *p = &c->func; 6689d4b98eb9eadecc17cd1cda0074b420a39e74647Eric Anholt struct intel_context *intel = &p->brw->intel; 669e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell struct prog_src_register coord; 67003577f8250cc7c8cdbd6ce1e166d9c1315c15280Vinson Lee struct prog_dst_register tmpcoord = { 0 }; 6719e7903e492ad842481a166484e0474dd4f3100baBrian Paul const GLuint unit = c->fp->program.Base.SamplerUnits[inst->TexSrcUnit]; 672e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 673b7d2023cf99319c71a929c35478dff07d35df392Brian Paul assert(unit < BRW_MAX_TEX_UNIT); 674b7d2023cf99319c71a929c35478dff07d35df392Brian Paul 675175db68db59c6b917306adff98442d590df9af06Xiang, Haihao if (inst->TexSrcTarget == TEXTURE_CUBE_INDEX) { 676175db68db59c6b917306adff98442d590df9af06Xiang, Haihao struct prog_instruction *out; 677175db68db59c6b917306adff98442d590df9af06Xiang, Haihao struct prog_dst_register tmp0 = get_temp(c); 678175db68db59c6b917306adff98442d590df9af06Xiang, Haihao struct prog_src_register tmp0src = src_reg_from_dst(tmp0); 679175db68db59c6b917306adff98442d590df9af06Xiang, Haihao struct prog_dst_register tmp1 = get_temp(c); 680175db68db59c6b917306adff98442d590df9af06Xiang, Haihao struct prog_src_register tmp1src = src_reg_from_dst(tmp1); 681175db68db59c6b917306adff98442d590df9af06Xiang, Haihao struct prog_src_register src0 = inst->SrcReg[0]; 682175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 6839e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* find longest component of coord vector and normalize it */ 684175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmpcoord = get_temp(c); 685175db68db59c6b917306adff98442d590df9af06Xiang, Haihao coord = src_reg_from_dst(tmpcoord); 686175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 6879e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* tmpcoord = src0 (i.e.: coord = src0) */ 688175db68db59c6b917306adff98442d590df9af06Xiang, Haihao out = emit_op(c, OPCODE_MOV, 689175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmpcoord, 690a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 691175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src0, 692175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef(), 693175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef()); 6947db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul out->SrcReg[0].Negate = NEGATE_NONE; 695175db68db59c6b917306adff98442d590df9af06Xiang, Haihao out->SrcReg[0].Abs = 1; 696175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 6979e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* tmp0 = MAX(coord.X, coord.Y) */ 698175db68db59c6b917306adff98442d590df9af06Xiang, Haihao emit_op(c, OPCODE_MAX, 699175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmp0, 700a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 701175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_swizzle1(coord, X), 702175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_swizzle1(coord, Y), 703175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef()); 704175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 7059e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* tmp1 = MAX(tmp0, coord.Z) */ 706175db68db59c6b917306adff98442d590df9af06Xiang, Haihao emit_op(c, OPCODE_MAX, 707175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmp1, 708a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 709175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmp0src, 710175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_swizzle1(coord, Z), 711175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef()); 712175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 7139e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* tmp0 = 1 / tmp1 */ 714175db68db59c6b917306adff98442d590df9af06Xiang, Haihao emit_op(c, OPCODE_RCP, 715d64649a316858a390bafe2aa619be3cf2c98ffdeEric Anholt dst_mask(tmp0, WRITEMASK_X), 716a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 717175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmp1src, 718175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef(), 719175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef()); 720175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 7219e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* tmpCoord = src0 * tmp0 */ 722175db68db59c6b917306adff98442d590df9af06Xiang, Haihao emit_op(c, OPCODE_MUL, 723175db68db59c6b917306adff98442d590df9af06Xiang, Haihao tmpcoord, 724a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 725175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src0, 726d64649a316858a390bafe2aa619be3cf2c98ffdeEric Anholt src_swizzle1(tmp0src, SWIZZLE_X), 727175db68db59c6b917306adff98442d590df9af06Xiang, Haihao src_undef()); 728175db68db59c6b917306adff98442d590df9af06Xiang, Haihao 729175db68db59c6b917306adff98442d590df9af06Xiang, Haihao release_temp(c, tmp0); 730175db68db59c6b917306adff98442d590df9af06Xiang, Haihao release_temp(c, tmp1); 7319e7903e492ad842481a166484e0474dd4f3100baBrian Paul } 7329d4b98eb9eadecc17cd1cda0074b420a39e74647Eric Anholt else if (intel->gen < 6 && inst->TexSrcTarget == TEXTURE_RECT_INDEX) { 733e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell struct prog_src_register scale = 734064ae479a770bf434958d673baf6f7530f642697Brian search_or_add_param5( c, 735e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell STATE_INTERNAL, 736e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell STATE_TEXRECT_SCALE, 737a3024caff1c790cf9f24476926aa62198f1e7b53Xiang, Haihao unit, 738064ae479a770bf434958d673baf6f7530f642697Brian 0,0 ); 739e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 740e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell tmpcoord = get_temp(c); 741e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 742e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell /* coord.xy = MUL inst->SrcReg[0], { 1/width, 1/height } 743e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell */ 744e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell emit_op(c, 745e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell OPCODE_MUL, 746e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell tmpcoord, 747a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 748e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell inst->SrcReg[0], 749191e028de20b2f954621b652aa77b06d0e93652aEric Anholt src_swizzle(scale, 750191e028de20b2f954621b652aa77b06d0e93652aEric Anholt SWIZZLE_X, 751191e028de20b2f954621b652aa77b06d0e93652aEric Anholt SWIZZLE_Y, 752191e028de20b2f954621b652aa77b06d0e93652aEric Anholt SWIZZLE_ONE, 753191e028de20b2f954621b652aa77b06d0e93652aEric Anholt SWIZZLE_ONE), 754e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell src_undef()); 755e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 756e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell coord = src_reg_from_dst(tmpcoord); 757e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell } 758e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell else { 759e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell coord = inst->SrcReg[0]; 760e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell } 761e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 7629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* Need to emit YUV texture conversions by hand. Probably need to 7639f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * do this here - the alternative is in brw_wm_emit.c, but the 7649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * conversion requires allocating a temporary variable which we 7659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * don't have the facility to do that late in the compilation. 7669f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 7679e7903e492ad842481a166484e0474dd4f3100baBrian Paul if (c->key.yuvtex_mask & (1 << unit)) { 7689e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* convert ycbcr to RGBA */ 7699e7903e492ad842481a166484e0474dd4f3100baBrian Paul GLboolean swap_uv = c->key.yuvtex_swap_mask & (1<<unit); 7707676980d38cff417015bca8d23549d567d74228bZou Nan hai 7719f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* 7729f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt CONST C0 = { -.5, -.0625, -.5, 1.164 } 7739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt CONST C1 = { 1.596, -0.813, 2.018, -.391 } 7749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt UYV = TEX ... 7759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt UYV.xyz = ADD UYV, C0 7769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt UYV.y = MUL UYV.y, C0.w 7777676980d38cff417015bca8d23549d567d74228bZou Nan hai if (UV swaped) 7787676980d38cff417015bca8d23549d567d74228bZou Nan hai RGB.xyz = MAD UYV.zzx, C1, UYV.y 7797676980d38cff417015bca8d23549d567d74228bZou Nan hai else 7807676980d38cff417015bca8d23549d567d74228bZou Nan hai RGB.xyz = MAD UYV.xxz, C1, UYV.y 7819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt RGB.y = MAD UYV.z, C1.w, RGB.y 7829f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 7839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register dst = inst->DstReg; 7849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register tmp = get_temp(c); 7859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register tmpsrc = src_reg_from_dst(tmp); 7869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register C0 = search_or_add_const4f( c, -.5, -.0625, -.5, 1.164 ); 7879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register C1 = search_or_add_const4f( c, 1.596, -0.813, 2.018, -.391 ); 7889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 7899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* tmp = TEX ... 7909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 791a79186e29efebed04c927d024b013435e7ff5725Brian Paul emit_tex_op(c, 792a79186e29efebed04c927d024b013435e7ff5725Brian Paul OPCODE_TEX, 793a79186e29efebed04c927d024b013435e7ff5725Brian Paul tmp, 794a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->SaturateMode, 795a79186e29efebed04c927d024b013435e7ff5725Brian Paul unit, 796a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->TexSrcTarget, 797e0d907308150b4863cc4f24543e70e14207e966aBrian Paul inst->TexShadow, 798a79186e29efebed04c927d024b013435e7ff5725Brian Paul coord, 799a79186e29efebed04c927d024b013435e7ff5725Brian Paul src_undef(), 800a79186e29efebed04c927d024b013435e7ff5725Brian Paul src_undef()); 8019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* tmp.xyz = ADD TMP, C0 8039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 8049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 8059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_ADD, 8069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(tmp, WRITEMASK_XYZ), 807a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 8089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tmpsrc, 8099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt C0, 8109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 8119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* YUV.y = MUL YUV.y, C0.w 8139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 8147676980d38cff417015bca8d23549d567d74228bZou Nan hai 8159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 8169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_MUL, 8179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(tmp, WRITEMASK_Y), 818a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 8199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tmpsrc, 8209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(C0, W), 8219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 8229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8237676980d38cff417015bca8d23549d567d74228bZou Nan hai /* 8247676980d38cff417015bca8d23549d567d74228bZou Nan hai * if (UV swaped) 8257676980d38cff417015bca8d23549d567d74228bZou Nan hai * RGB.xyz = MAD YUV.zzx, C1, YUV.y 8267676980d38cff417015bca8d23549d567d74228bZou Nan hai * else 8277676980d38cff417015bca8d23549d567d74228bZou Nan hai * RGB.xyz = MAD YUV.xxz, C1, YUV.y 8289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 8297676980d38cff417015bca8d23549d567d74228bZou Nan hai 8309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 8319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_MAD, 8329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(dst, WRITEMASK_XYZ), 833a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 8347676980d38cff417015bca8d23549d567d74228bZou Nan hai swap_uv?src_swizzle(tmpsrc, Z,Z,X,X):src_swizzle(tmpsrc, X,X,Z,Z), 8359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt C1, 8369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(tmpsrc, Y)); 8379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* RGB.y = MAD YUV.z, C1.w, RGB.y 8399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 8409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 8419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_MAD, 8429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(dst, WRITEMASK_Y), 843a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 8449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(tmpsrc, Z), 8459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(C1, W), 8469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(src_reg_from_dst(dst), Y)); 847e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 848e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell release_temp(c, tmp); 8499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 8509e7903e492ad842481a166484e0474dd4f3100baBrian Paul else { 8519e7903e492ad842481a166484e0474dd4f3100baBrian Paul /* ordinary RGBA tex instruction */ 852a79186e29efebed04c927d024b013435e7ff5725Brian Paul emit_tex_op(c, 853a79186e29efebed04c927d024b013435e7ff5725Brian Paul OPCODE_TEX, 854a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->DstReg, 855a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->SaturateMode, 856a79186e29efebed04c927d024b013435e7ff5725Brian Paul unit, 857a79186e29efebed04c927d024b013435e7ff5725Brian Paul inst->TexSrcTarget, 858e0d907308150b4863cc4f24543e70e14207e966aBrian Paul inst->TexShadow, 859a79186e29efebed04c927d024b013435e7ff5725Brian Paul coord, 860a79186e29efebed04c927d024b013435e7ff5725Brian Paul src_undef(), 861a79186e29efebed04c927d024b013435e7ff5725Brian Paul src_undef()); 8629e7903e492ad842481a166484e0474dd4f3100baBrian Paul } 863e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell 864c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul /* For GL_EXT_texture_swizzle: */ 865c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul if (c->key.tex_swizzles[unit] != SWIZZLE_NOOP) { 866c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul /* swizzle the result of the TEX instruction */ 867c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul struct prog_src_register tmpsrc = src_reg_from_dst(inst->DstReg); 8683dcc48e6882385f58ec9b19a3a7d5307ef9fc976Brian Paul emit_op(c, OPCODE_SWZ, 869c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul inst->DstReg, 870c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul SATURATE_OFF, /* saturate already done above */ 871c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul src_swizzle4(tmpsrc, c->key.tex_swizzles[unit]), 872c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul src_undef(), 873c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul src_undef()); 874c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul } 875c0d3b7679aa90e1a0dca2db152205efaec088b90Brian Paul 87628c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger if ((inst->TexSrcTarget == TEXTURE_RECT_INDEX) || 87728c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger (inst->TexSrcTarget == TEXTURE_CUBE_INDEX)) 878e38114a5e4492684333251eb22bc60ee1038de55Keith Whitwell release_temp(c, tmpcoord); 8799f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 8809f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8826b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul/** 8836b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul * Check if the given TXP instruction really needs the divide-by-W step. 8846b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul */ 8859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic GLboolean projtex( struct brw_wm_compile *c, 8869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst ) 8879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 8886b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul const struct prog_src_register src = inst->SrcReg[0]; 8896b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul GLboolean retVal; 8906b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul 8916b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul assert(inst->Opcode == OPCODE_TXP); 8929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 8939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* Only try to detect the simplest cases. Could detect (later) 8949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * cases where we are trying to emit code like RCP {1.0}, MUL x, 8959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * {1.0}, and so on. 8969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * 8979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * More complex cases than this typically only arise from 8989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * user-provided fragment programs anyway: 8999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 9009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (inst->TexSrcTarget == TEXTURE_CUBE_INDEX) 9016b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul retVal = GL_FALSE; /* ut2004 gun rendering !?! */ 9029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt else if (src.File == PROGRAM_INPUT && 9039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GET_SWZ(src.Swizzle, W) == W && 9046b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul (c->key.proj_attrib_mask & (1 << src.Index)) == 0) 9056b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul retVal = GL_FALSE; 9069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt else 9076b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul retVal = GL_TRUE; 9086b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul 9096b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul return retVal; 9109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 9119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9136b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul/** 9146b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul * Emit code for TXP. 9156b917d0b1787280f976c2f0d1ead0e5d7587a3e9Brian Paul */ 9169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void precalc_txp( struct brw_wm_compile *c, 9179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst ) 9189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 9199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register src0 = inst->SrcReg[0]; 9209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (projtex(c, inst)) { 9229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_dst_register tmp = get_temp(c); 9239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_instruction tmp_inst; 9249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* tmp0.w = RCP inst.arg[0][3] 9269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 9279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 9289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_RCP, 9299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(tmp, WRITEMASK_W), 930a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 9319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(src0, GET_SWZ(src0.Swizzle, W)), 9329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef(), 9339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 9349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* tmp0.xyz = MUL inst.arg[0], tmp0.wwww 9369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 9379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_op(c, 9389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OPCODE_MUL, 9399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt dst_mask(tmp, WRITEMASK_XYZ), 940a79186e29efebed04c927d024b013435e7ff5725Brian Paul 0, 9419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src0, 9429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_swizzle1(src_reg_from_dst(tmp), W), 9439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt src_undef()); 9449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* dst = precalc(TEX tmp0) 9469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 9479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tmp_inst = *inst; 9489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt tmp_inst.SrcReg[0] = src_reg_from_dst(tmp); 9499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt precalc_tex(c, &tmp_inst); 9509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt release_temp(c, tmp); 9529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 9539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt else 9549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt { 9559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* dst = precalc(TEX src0) 9569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 9579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt precalc_tex(c, inst); 9589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 9599f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 9609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 963cfa927766ab610a9a76730d337d77008d876ebbdEric Anholtstatic void emit_render_target_writes( struct brw_wm_compile *c ) 9649f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 9659f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_src_register payload_r0_depth = src_reg(PROGRAM_PAYLOAD, PAYLOAD_DEPTH); 9668d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul struct prog_src_register outdepth = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_DEPTH); 967f68f94c2bc950405d4c91a1e5582a35ff4b15bdfBrian Paul struct prog_src_register outcolor; 968fcb7cb9e72ecac7c165a3a6ed7a033e2e6793a26Zou Nan hai GLuint i; 969fcb7cb9e72ecac7c165a3a6ed7a033e2e6793a26Zou Nan hai 97079bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt struct prog_instruction *inst = NULL; 971fcb7cb9e72ecac7c165a3a6ed7a033e2e6793a26Zou Nan hai 9728ae7e7749b708fc5a46180d3de2503ba7e2ab1f3Brian Paul /* The inst->Aux field is used for FB write target and the EOT marker */ 973fcb7cb9e72ecac7c165a3a6ed7a033e2e6793a26Zou Nan hai 97479bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt for (i = 0; i < c->key.nr_color_regions; i++) { 97579bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt if (c->fp->program.Base.OutputsWritten & (1 << FRAG_RESULT_COLOR)) { 97679bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_COLOR); 97779bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt } else { 97879bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i); 9799b78d9f65178648b1888f98153a2f738a281cb84Brian Paul } 98079bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt inst = emit_op(c, WM_FB_WRITE, dst_mask(dst_undef(), 0), 98179bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt 0, outcolor, payload_r0_depth, outdepth); 98279bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt inst->Aux = INST_AUX_TARGET(i); 983f68f94c2bc950405d4c91a1e5582a35ff4b15bdfBrian Paul } 984f68f94c2bc950405d4c91a1e5582a35ff4b15bdfBrian Paul 98579bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt /* Mark the last FB write as final, or emit a dummy write if we had 98679bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt * no render targets bound. 98779bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt */ 98879bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt if (c->key.nr_color_regions != 0) { 98979bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt inst->Aux |= INST_AUX_EOT; 99079bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt } else { 99179bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt inst = emit_op(c, WM_FB_WRITE, dst_mask(dst_undef(), 0), 99279bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt 0, src_reg(PROGRAM_OUTPUT, FRAG_RESULT_COLOR), 99379bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt payload_r0_depth, outdepth); 99479bde19ef9e13d5db30d0516d9e7eae6a3a8d32aEric Anholt inst->Aux = INST_AUX_TARGET(0) | INST_AUX_EOT; 995fcb7cb9e72ecac7c165a3a6ed7a033e2e6793a26Zou Nan hai } 9969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 9979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 9999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10009f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*********************************************************************** 10029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * Emit INTERP instructions ahead of first use of each attrib. 10039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 10049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic void validate_src_regs( struct brw_wm_compile *c, 10069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst ) 10079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 10089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint nr_args = brw_wm_nr_args( inst->Opcode ); 10099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint i; 10109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt for (i = 0; i < nr_args; i++) { 10129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (inst->SrcReg[i].File == PROGRAM_INPUT) { 10139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint idx = inst->SrcReg[i].Index; 10149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt if (!(c->fp_interp_emitted & (1<<idx))) { 10159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt emit_interp(c, idx); 10169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 10179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 10189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 10199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 10209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1021cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwellstatic void print_insns( const struct prog_instruction *insn, 1022cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell GLuint nr ) 1023cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell{ 1024cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell GLuint i; 1025cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell for (i = 0; i < nr; i++, insn++) { 1026298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%3d: ", i); 1027cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell if (insn->Opcode < MAX_OPCODE) 102872fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_fprint_instruction_opt(stdout, insn, 0, PROG_PRINT_DEBUG, NULL); 1029cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell else if (insn->Opcode < MAX_WM_OPCODE) { 1030cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell GLuint idx = insn->Opcode - MAX_OPCODE; 1031cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell 103272fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_fprint_alu_instruction(stdout, insn, wm_opcode_strings[idx], 103372fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt 3, PROG_PRINT_DEBUG, NULL); 1034cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell } 1035cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell else 1036298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("965 Opcode %d\n", insn->Opcode); 1037cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell } 1038cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell} 1039cb54c056a6d46d03bfa0c4927f5ac8843feab8cdKeith Whitwell 10402f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul 10412f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul/** 10422f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul * Initial pass for fragment program code generation. 10432f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul * This function is used by both the GLSL and non-GLSL paths. 10442f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul */ 10459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtvoid brw_wm_pass_fp( struct brw_wm_compile *c ) 10469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{ 1047a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt struct intel_context *intel = &c->func.brw->intel; 10489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct brw_fragment_program *fp = c->fp; 10499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt GLuint insn; 10509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1051bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt if (unlikely(INTEL_DEBUG & DEBUG_WM)) { 1052298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("pre-fp:\n"); 105372fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_fprint_program_opt(stdout, &fp->program.Base, PROG_PRINT_DEBUG, 105472fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt GL_TRUE); 1055298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("\n"); 10569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 10579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10589f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->pixel_xy = src_undef(); 1059a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt if (intel->gen >= 6) { 1060a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt /* The interpolation deltas come in as the perspective pixel 1061a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt * location barycentric params. 1062a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt */ 1063a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt c->delta_xy = src_reg(PROGRAM_PAYLOAD, PAYLOAD_DEPTH); 1064a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt } else { 1065a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt c->delta_xy = src_undef(); 1066a66e9a4d86d227b65874c43fbf9e299c7a26389fEric Anholt } 10679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->pixel_w = src_undef(); 10689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt c->nr_fp_insns = 0; 1069b2b220e6225fdd673ea7b9fdda00e98423263fc3Brian Paul c->fp->tex_units_used = 0x0; 10709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10712f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul /* Emit preamble instructions. This is where special instructions such as 10722f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul * WM_CINTERP, WM_LINTERP, WM_PINTERP and WM_WPOSXY are emitted to 10732f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul * compute shader inputs from varying vars. 10749f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 10759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt for (insn = 0; insn < fp->program.Base.NumInstructions; insn++) { 10769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt const struct prog_instruction *inst = &fp->program.Base.Instructions[insn]; 10777936c614abc165270852bc5e7e316747a9cacdfbZou Nan hai validate_src_regs(c, inst); 10787936c614abc165270852bc5e7e316747a9cacdfbZou Nan hai } 10792f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul 10802f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul /* Loop over all instructions doing assorted simplifications and 10812f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul * transformations. 10822f78d4a2cd009d8d6a5f470d5738586b7f89f3d9Brian Paul */ 10837936c614abc165270852bc5e7e316747a9cacdfbZou Nan hai for (insn = 0; insn < fp->program.Base.NumInstructions; insn++) { 10847936c614abc165270852bc5e7e316747a9cacdfbZou Nan hai const struct prog_instruction *inst = &fp->program.Base.Instructions[insn]; 10859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt struct prog_instruction *out; 10869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* Check for INPUT values, emit INTERP instructions where 10889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * necessary: 10899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 10909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt switch (inst->Opcode) { 10929f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_SWZ: 10939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out = emit_insn(c, inst); 10949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->Opcode = OPCODE_MOV; 10959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 10969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 10979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_ABS: 10989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out = emit_insn(c, inst); 10999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->Opcode = OPCODE_MOV; 11007db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul out->SrcReg[0].Negate = NEGATE_NONE; 11019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->SrcReg[0].Abs = 1; 11029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 11049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_SUB: 11059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out = emit_insn(c, inst); 11069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->Opcode = OPCODE_ADD; 11077db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul out->SrcReg[1].Negate ^= NEGATE_XYZW; 11089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 11109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_SCS: 11119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out = emit_insn(c, inst); 11129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* This should probably be done in the parser. 11139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 11149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->DstReg.WriteMask &= WRITEMASK_XY; 11159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 11179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_DST: 11189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt precalc_dst(c, inst); 11199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 11219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_LIT: 11229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt precalc_lit(c, inst); 11239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 112428c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger 1125fa0d5a2c5bfb6109d365a6f0b9bee53dfee50325Eric Anholt case OPCODE_RSQ: 1126fa0d5a2c5bfb6109d365a6f0b9bee53dfee50325Eric Anholt out = emit_scalar_insn(c, inst); 1127fa0d5a2c5bfb6109d365a6f0b9bee53dfee50325Eric Anholt out->SrcReg[0].Abs = GL_TRUE; 1128fa0d5a2c5bfb6109d365a6f0b9bee53dfee50325Eric Anholt break; 1129fa0d5a2c5bfb6109d365a6f0b9bee53dfee50325Eric Anholt 113028c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger case OPCODE_TEX: 113128c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger precalc_tex(c, inst); 113228c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger break; 113328c28f72fd9ed192467a3cf913b344951d0bc805Roland Scheidegger 11349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_TXP: 11359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt precalc_txp(c, inst); 11369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1138c20a1736566d301f38cc1271284b1fde9adb2741Xiang, Haihao case OPCODE_TXB: 1139c20a1736566d301f38cc1271284b1fde9adb2741Xiang, Haihao out = emit_insn(c, inst); 1140c20a1736566d301f38cc1271284b1fde9adb2741Xiang, Haihao out->TexSrcUnit = fp->program.Base.SamplerUnits[inst->TexSrcUnit]; 1141b7d2023cf99319c71a929c35478dff07d35df392Brian Paul assert(out->TexSrcUnit < BRW_MAX_TEX_UNIT); 1142c20a1736566d301f38cc1271284b1fde9adb2741Xiang, Haihao break; 1143c20a1736566d301f38cc1271284b1fde9adb2741Xiang, Haihao 11449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_XPD: 11459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out = emit_insn(c, inst); 11469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* This should probably be done in the parser. 11479f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 11489f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->DstReg.WriteMask &= WRITEMASK_XYZ; 11499f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11509f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 11519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_KIL: 11529f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out = emit_insn(c, inst); 11539f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /* This should probably be done in the parser. 11549f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */ 11559f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt out->DstReg.WriteMask = 0; 11569f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11579f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_END: 1158cfa927766ab610a9a76730d337d77008d876ebbdEric Anholt emit_render_target_writes(c); 1159d19d0596daf004b56d80f78fa1a329b43c2ebf94Zou Nan hai break; 11609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt case OPCODE_PRINT: 11619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11629f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt default: 1163536476f2432168fb15ac06b52c953a594ad851adEric Anholt if (brw_wm_is_scalar_result(inst->Opcode)) 1164536476f2432168fb15ac06b52c953a594ad851adEric Anholt emit_scalar_insn(c, inst); 1165536476f2432168fb15ac06b52c953a594ad851adEric Anholt else 1166536476f2432168fb15ac06b52c953a594ad851adEric Anholt emit_insn(c, inst); 11679f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt break; 11689f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 11699f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 11709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1171bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt if (unlikely(INTEL_DEBUG & DEBUG_WM)) { 1172298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("pass_fp:\n"); 11739b78d9f65178648b1888f98153a2f738a281cb84Brian Paul print_insns( c->prog_instructions, c->nr_fp_insns ); 1174298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("\n"); 11759f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt } 11769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} 11779f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt 1178