13af1f3b9220733f5e3a76fe38fbc397974678234Brian/************************************************************************** 23af1f3b9220733f5e3a76fe38fbc397974678234Brian * 33af1f3b9220733f5e3a76fe38fbc397974678234Brian * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 43af1f3b9220733f5e3a76fe38fbc397974678234Brian * All Rights Reserved. 53af1f3b9220733f5e3a76fe38fbc397974678234Brian * 63af1f3b9220733f5e3a76fe38fbc397974678234Brian * Permission is hereby granted, free of charge, to any person obtaining a 73af1f3b9220733f5e3a76fe38fbc397974678234Brian * copy of this software and associated documentation files (the 83af1f3b9220733f5e3a76fe38fbc397974678234Brian * "Software"), to deal in the Software without restriction, including 93af1f3b9220733f5e3a76fe38fbc397974678234Brian * without limitation the rights to use, copy, modify, merge, publish, 103af1f3b9220733f5e3a76fe38fbc397974678234Brian * distribute, sub license, and/or sell copies of the Software, and to 113af1f3b9220733f5e3a76fe38fbc397974678234Brian * permit persons to whom the Software is furnished to do so, subject to 123af1f3b9220733f5e3a76fe38fbc397974678234Brian * the following conditions: 133af1f3b9220733f5e3a76fe38fbc397974678234Brian * 143af1f3b9220733f5e3a76fe38fbc397974678234Brian * The above copyright notice and this permission notice (including the 153af1f3b9220733f5e3a76fe38fbc397974678234Brian * next paragraph) shall be included in all copies or substantial portions 163af1f3b9220733f5e3a76fe38fbc397974678234Brian * of the Software. 173af1f3b9220733f5e3a76fe38fbc397974678234Brian * 183af1f3b9220733f5e3a76fe38fbc397974678234Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 193af1f3b9220733f5e3a76fe38fbc397974678234Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 203af1f3b9220733f5e3a76fe38fbc397974678234Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 213af1f3b9220733f5e3a76fe38fbc397974678234Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 223af1f3b9220733f5e3a76fe38fbc397974678234Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 233af1f3b9220733f5e3a76fe38fbc397974678234Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 243af1f3b9220733f5e3a76fe38fbc397974678234Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 253af1f3b9220733f5e3a76fe38fbc397974678234Brian * 263af1f3b9220733f5e3a76fe38fbc397974678234Brian **************************************************************************/ 273af1f3b9220733f5e3a76fe38fbc397974678234Brian 283af1f3b9220733f5e3a76fe38fbc397974678234Brian 293af1f3b9220733f5e3a76fe38fbc397974678234Brian#ifndef I915_FPC_H 303af1f3b9220733f5e3a76fe38fbc397974678234Brian#define I915_FPC_H 313af1f3b9220733f5e3a76fe38fbc397974678234Brian 323af1f3b9220733f5e3a76fe38fbc397974678234Brian 333af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "i915_context.h" 343af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "i915_reg.h" 353af1f3b9220733f5e3a76fe38fbc397974678234Brian 362bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin#include "pipe/p_shader_tokens.h" 373af1f3b9220733f5e3a76fe38fbc397974678234Brian 382bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin#include "tgsi/tgsi_parse.h" 393af1f3b9220733f5e3a76fe38fbc397974678234Brian 40642d11da207e9becfa26a9e038db1c7520ec2aeeStéphane Marchesin#define I915_PROGRAM_SIZE 192 413af1f3b9220733f5e3a76fe38fbc397974678234Brian 423d9000393b0c2e53f35e5a093ea6781f849230d1Stéphane Marchesin/* Use those indices for pos/face routing, must be >= num of inputs */ 433d9000393b0c2e53f35e5a093ea6781f849230d1Stéphane Marchesin#define I915_SEMANTIC_POS 100 443d9000393b0c2e53f35e5a093ea6781f849230d1Stéphane Marchesin#define I915_SEMANTIC_FACE 101 453af1f3b9220733f5e3a76fe38fbc397974678234Brian 463af1f3b9220733f5e3a76fe38fbc397974678234Brian 470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/** 480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Program translation state 493af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 503af1f3b9220733f5e3a76fe38fbc397974678234Brianstruct i915_fp_compile { 51c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *shader; /* the shader we're compiling */ 523af1f3b9220733f5e3a76fe38fbc397974678234Brian 53c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian boolean used_constants[I915_MAX_CONSTANT]; 54c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 55c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian /** maps TGSI immediate index to constant slot */ 56c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint num_immediates; 57c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian uint immediates_map[I915_MAX_CONSTANT]; 58c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian float immediates[I915_MAX_CONSTANT][4]; 59c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian 60c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian boolean first_instruction; 61d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian 623af1f3b9220733f5e3a76fe38fbc397974678234Brian uint declarations[I915_PROGRAM_SIZE]; 633af1f3b9220733f5e3a76fe38fbc397974678234Brian uint program[I915_PROGRAM_SIZE]; 643af1f3b9220733f5e3a76fe38fbc397974678234Brian 65399077d760b4c98ab38d48d17f2480114e70dfc6Brian uint *csr; /**< Cursor, points into program. */ 663af1f3b9220733f5e3a76fe38fbc397974678234Brian 67399077d760b4c98ab38d48d17f2480114e70dfc6Brian uint *decl; /**< Cursor, points into declarations. */ 683af1f3b9220733f5e3a76fe38fbc397974678234Brian 69399077d760b4c98ab38d48d17f2480114e70dfc6Brian uint decl_s; /**< flags for which s regs need to be decl'd */ 70399077d760b4c98ab38d48d17f2480114e70dfc6Brian uint decl_t; /**< flags for which t regs need to be decl'd */ 713af1f3b9220733f5e3a76fe38fbc397974678234Brian 72399077d760b4c98ab38d48d17f2480114e70dfc6Brian uint temp_flag; /**< Tracks temporary regs which are in use */ 73399077d760b4c98ab38d48d17f2480114e70dfc6Brian uint utemp_flag; /**< Tracks TYPE_U temporary regs which are in use */ 743af1f3b9220733f5e3a76fe38fbc397974678234Brian 755d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin uint register_phases[16]; 763af1f3b9220733f5e3a76fe38fbc397974678234Brian uint nr_tex_indirect; 773af1f3b9220733f5e3a76fe38fbc397974678234Brian uint nr_tex_insn; 783af1f3b9220733f5e3a76fe38fbc397974678234Brian uint nr_alu_insn; 793af1f3b9220733f5e3a76fe38fbc397974678234Brian uint nr_decl_insn; 803af1f3b9220733f5e3a76fe38fbc397974678234Brian 810d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian boolean error; /**< Set if i915_program_error() is called */ 820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian uint NumNativeInstructions; 830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian uint NumNativeAluInstructions; 840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian uint NumNativeTexInstructions; 850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian uint NumNativeTexIndirections; 863af1f3b9220733f5e3a76fe38fbc397974678234Brian}; 873af1f3b9220733f5e3a76fe38fbc397974678234Brian 883af1f3b9220733f5e3a76fe38fbc397974678234Brian 893af1f3b9220733f5e3a76fe38fbc397974678234Brian/* Having zero and one in here makes the definition of swizzle a lot 903af1f3b9220733f5e3a76fe38fbc397974678234Brian * easier. 913af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 923af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_TYPE_SHIFT 29 933af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_NR_SHIFT 24 943af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_X_NEGATE_SHIFT 23 953af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_X_SHIFT 20 963af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_Y_NEGATE_SHIFT 19 973af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_Y_SHIFT 16 983af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_Z_NEGATE_SHIFT 15 993af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_Z_SHIFT 12 1003af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_W_NEGATE_SHIFT 11 1013af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_W_SHIFT 8 1023af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_ZERO_NEGATE_MBZ 5 1033af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_ZERO_SHIFT 4 1043af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_ONE_NEGATE_MBZ 1 1053af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_CHANNEL_ONE_SHIFT 0 1063af1f3b9220733f5e3a76fe38fbc397974678234Brian 1073af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_BAD 0xffffffff /* not a valid ureg */ 1083af1f3b9220733f5e3a76fe38fbc397974678234Brian 1093af1f3b9220733f5e3a76fe38fbc397974678234Brian#define X SRC_X 1103af1f3b9220733f5e3a76fe38fbc397974678234Brian#define Y SRC_Y 1113af1f3b9220733f5e3a76fe38fbc397974678234Brian#define Z SRC_Z 1123af1f3b9220733f5e3a76fe38fbc397974678234Brian#define W SRC_W 1133af1f3b9220733f5e3a76fe38fbc397974678234Brian#define ZERO SRC_ZERO 1143af1f3b9220733f5e3a76fe38fbc397974678234Brian#define ONE SRC_ONE 1153af1f3b9220733f5e3a76fe38fbc397974678234Brian 1163af1f3b9220733f5e3a76fe38fbc397974678234Brian/* Construct a ureg: 1173af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1183af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG( type, nr ) (((type)<< UREG_TYPE_SHIFT) | \ 1193af1f3b9220733f5e3a76fe38fbc397974678234Brian ((nr) << UREG_NR_SHIFT) | \ 1203af1f3b9220733f5e3a76fe38fbc397974678234Brian (X << UREG_CHANNEL_X_SHIFT) | \ 1213af1f3b9220733f5e3a76fe38fbc397974678234Brian (Y << UREG_CHANNEL_Y_SHIFT) | \ 1223af1f3b9220733f5e3a76fe38fbc397974678234Brian (Z << UREG_CHANNEL_Z_SHIFT) | \ 1233af1f3b9220733f5e3a76fe38fbc397974678234Brian (W << UREG_CHANNEL_W_SHIFT) | \ 1243af1f3b9220733f5e3a76fe38fbc397974678234Brian (ZERO << UREG_CHANNEL_ZERO_SHIFT) | \ 1253af1f3b9220733f5e3a76fe38fbc397974678234Brian (ONE << UREG_CHANNEL_ONE_SHIFT)) 1263af1f3b9220733f5e3a76fe38fbc397974678234Brian 1273af1f3b9220733f5e3a76fe38fbc397974678234Brian#define GET_CHANNEL_SRC( reg, channel ) ((reg<<(channel*4)) & (0xf<<20)) 1283af1f3b9220733f5e3a76fe38fbc397974678234Brian#define CHANNEL_SRC( src, channel ) (src>>(channel*4)) 1293af1f3b9220733f5e3a76fe38fbc397974678234Brian 1303af1f3b9220733f5e3a76fe38fbc397974678234Brian#define GET_UREG_TYPE(reg) (((reg)>>UREG_TYPE_SHIFT)®_TYPE_MASK) 1313af1f3b9220733f5e3a76fe38fbc397974678234Brian#define GET_UREG_NR(reg) (((reg)>>UREG_NR_SHIFT)®_NR_MASK) 1323af1f3b9220733f5e3a76fe38fbc397974678234Brian 1333af1f3b9220733f5e3a76fe38fbc397974678234Brian 1343af1f3b9220733f5e3a76fe38fbc397974678234Brian 1353af1f3b9220733f5e3a76fe38fbc397974678234Brian#define UREG_XYZW_CHANNEL_MASK 0x00ffff00 1363af1f3b9220733f5e3a76fe38fbc397974678234Brian 1373af1f3b9220733f5e3a76fe38fbc397974678234Brian/* One neat thing about the UREG representation: 1383af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 1393af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic INLINE int 140ace2b98dd3511ea6959980a2ae2ee90fa7c28748Brianswizzle(int reg, uint x, uint y, uint z, uint w) 1413af1f3b9220733f5e3a76fe38fbc397974678234Brian{ 142ace2b98dd3511ea6959980a2ae2ee90fa7c28748Brian assert(x <= SRC_ONE); 143ace2b98dd3511ea6959980a2ae2ee90fa7c28748Brian assert(y <= SRC_ONE); 144ace2b98dd3511ea6959980a2ae2ee90fa7c28748Brian assert(z <= SRC_ONE); 145ace2b98dd3511ea6959980a2ae2ee90fa7c28748Brian assert(w <= SRC_ONE); 1463af1f3b9220733f5e3a76fe38fbc397974678234Brian return ((reg & ~UREG_XYZW_CHANNEL_MASK) | 1473af1f3b9220733f5e3a76fe38fbc397974678234Brian CHANNEL_SRC(GET_CHANNEL_SRC(reg, x), 0) | 1483af1f3b9220733f5e3a76fe38fbc397974678234Brian CHANNEL_SRC(GET_CHANNEL_SRC(reg, y), 1) | 1493af1f3b9220733f5e3a76fe38fbc397974678234Brian CHANNEL_SRC(GET_CHANNEL_SRC(reg, z), 2) | 1503af1f3b9220733f5e3a76fe38fbc397974678234Brian CHANNEL_SRC(GET_CHANNEL_SRC(reg, w), 3)); 1513af1f3b9220733f5e3a76fe38fbc397974678234Brian} 1523af1f3b9220733f5e3a76fe38fbc397974678234Brian 1533af1f3b9220733f5e3a76fe38fbc397974678234Brian 1544dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define A0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT) 1554dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define D0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT) 1564dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define T0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT) 1574dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define A0_SRC0( reg ) (((reg)&UREG_MASK)>>UREG_A0_SRC0_SHIFT_LEFT) 1584dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define A1_SRC0( reg ) (((reg)&UREG_MASK)<<UREG_A1_SRC0_SHIFT_RIGHT) 1594dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define A1_SRC1( reg ) (((reg)&UREG_MASK)>>UREG_A1_SRC1_SHIFT_LEFT) 1604dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define A2_SRC1( reg ) (((reg)&UREG_MASK)<<UREG_A2_SRC1_SHIFT_RIGHT) 1614dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define A2_SRC2( reg ) (((reg)&UREG_MASK)>>UREG_A2_SRC2_SHIFT_LEFT) 1624dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1634dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin/* These are special, and don't have swizzle/negate bits. 1644dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin */ 1654dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define T0_SAMPLER( reg ) (GET_UREG_NR(reg)<<T0_SAMPLER_NR_SHIFT) 1664dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define T1_ADDRESS_REG( reg ) ((GET_UREG_NR(reg)<<T1_ADDRESS_REG_NR_SHIFT) | \ 1674dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin (GET_UREG_TYPE(reg)<<T1_ADDRESS_REG_TYPE_SHIFT)) 1684dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1694dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1704dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin/* Macros for translating UREG's into the various register fields used 1714dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin * by the I915 programmable unit. 1724dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin */ 1734dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_A0_DEST_SHIFT_LEFT (UREG_TYPE_SHIFT - A0_DEST_TYPE_SHIFT) 1744dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_A0_SRC0_SHIFT_LEFT (UREG_TYPE_SHIFT - A0_SRC0_TYPE_SHIFT) 1754dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_A1_SRC0_SHIFT_RIGHT (A1_SRC0_CHANNEL_W_SHIFT - UREG_CHANNEL_W_SHIFT) 1764dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_A1_SRC1_SHIFT_LEFT (UREG_TYPE_SHIFT - A1_SRC1_TYPE_SHIFT) 1774dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_A2_SRC1_SHIFT_RIGHT (A2_SRC1_CHANNEL_W_SHIFT - UREG_CHANNEL_W_SHIFT) 1784dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_A2_SRC2_SHIFT_LEFT (UREG_TYPE_SHIFT - A2_SRC2_TYPE_SHIFT) 1794dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1804dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_MASK 0xffffff00 1814dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin#define UREG_TYPE_NR_MASK ((REG_TYPE_MASK << UREG_TYPE_SHIFT) | \ 1824dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin (REG_NR_MASK << UREG_NR_SHIFT)) 1834dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1844dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1854dc0425261fbd62e38eb5fac7f88e88d50d0cc7bStéphane Marchesin 1860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/*********************************************************************** 1880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian * Public interface for the compiler 1890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian */ 190c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrianextern void 191c74900ee5d80c7c2b7cbe4ed87395526a742a13eBriani915_translate_fragment_program( struct i915_context *i915, 192c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian struct i915_fragment_shader *fs); 1930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian 1963af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_get_temp(struct i915_fp_compile *p); 1973af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_get_utemp(struct i915_fp_compile *p); 1983af1f3b9220733f5e3a76fe38fbc397974678234Brianextern void i915_release_utemps(struct i915_fp_compile *p); 1993af1f3b9220733f5e3a76fe38fbc397974678234Brian 2003af1f3b9220733f5e3a76fe38fbc397974678234Brian 2013af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_texld(struct i915_fp_compile *p, 2023af1f3b9220733f5e3a76fe38fbc397974678234Brian uint dest, 2033af1f3b9220733f5e3a76fe38fbc397974678234Brian uint destmask, 204e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin uint sampler, 205e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin uint coord, 206e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin uint op, 207e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin uint num_coord); 2083af1f3b9220733f5e3a76fe38fbc397974678234Brian 2093af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_arith(struct i915_fp_compile *p, 2103af1f3b9220733f5e3a76fe38fbc397974678234Brian uint op, 2113af1f3b9220733f5e3a76fe38fbc397974678234Brian uint dest, 2123af1f3b9220733f5e3a76fe38fbc397974678234Brian uint mask, 2133af1f3b9220733f5e3a76fe38fbc397974678234Brian uint saturate, 2143af1f3b9220733f5e3a76fe38fbc397974678234Brian uint src0, uint src1, uint src2); 2153af1f3b9220733f5e3a76fe38fbc397974678234Brian 2163af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_decl(struct i915_fp_compile *p, 2173af1f3b9220733f5e3a76fe38fbc397974678234Brian uint type, uint nr, uint d0_flags); 2183af1f3b9220733f5e3a76fe38fbc397974678234Brian 2193af1f3b9220733f5e3a76fe38fbc397974678234Brian 2203af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_const1f(struct i915_fp_compile *p, float c0); 2213af1f3b9220733f5e3a76fe38fbc397974678234Brian 2223af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_const2f(struct i915_fp_compile *p, 2233af1f3b9220733f5e3a76fe38fbc397974678234Brian float c0, float c1); 2243af1f3b9220733f5e3a76fe38fbc397974678234Brian 2253af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_const4fv(struct i915_fp_compile *p, 2263af1f3b9220733f5e3a76fe38fbc397974678234Brian const float * c); 2273af1f3b9220733f5e3a76fe38fbc397974678234Brian 2283af1f3b9220733f5e3a76fe38fbc397974678234Brianextern uint i915_emit_const4f(struct i915_fp_compile *p, 2293af1f3b9220733f5e3a76fe38fbc397974678234Brian float c0, float c1, 2303af1f3b9220733f5e3a76fe38fbc397974678234Brian float c2, float c3); 2313af1f3b9220733f5e3a76fe38fbc397974678234Brian 2323af1f3b9220733f5e3a76fe38fbc397974678234Brian 2333af1f3b9220733f5e3a76fe38fbc397974678234Brian/*====================================================================== 2343af1f3b9220733f5e3a76fe38fbc397974678234Brian * i915_fpc_translate.c 2353af1f3b9220733f5e3a76fe38fbc397974678234Brian */ 2363af1f3b9220733f5e3a76fe38fbc397974678234Brian 2373af1f3b9220733f5e3a76fe38fbc397974678234Brianextern void 238af60ebc4eedcfec2090e1ddd7630137948c26866José Fonsecai915_program_error(struct i915_fp_compile *p, const char *msg, ...); 2393af1f3b9220733f5e3a76fe38fbc397974678234Brian 2403af1f3b9220733f5e3a76fe38fbc397974678234Brian 2412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/*====================================================================== 2422bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin * i915_fpc_optimize.c 2432bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin */ 2442bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2452bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2462bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstruct i915_src_register 2472bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 2482bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned File : 4; /* TGSI_FILE_ */ 2492bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Indirect : 1; /* BOOL */ 2502bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Dimension : 1; /* BOOL */ 2512bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin int Index : 16; /* SINT */ 2522bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned SwizzleX : 3; /* TGSI_SWIZZLE_ */ 2532bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned SwizzleY : 3; /* TGSI_SWIZZLE_ */ 2542bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned SwizzleZ : 3; /* TGSI_SWIZZLE_ */ 2552bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned SwizzleW : 3; /* TGSI_SWIZZLE_ */ 2562bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Absolute : 1; /* BOOL */ 2572bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Negate : 1; /* BOOL */ 2582bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 2592bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/* Additional swizzle supported in i915 */ 2612bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin#define TGSI_SWIZZLE_ZERO 4 2622bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin#define TGSI_SWIZZLE_ONE 5 2632bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2642bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstruct i915_dst_register 2652bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 2662bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned File : 4; /* TGSI_FILE_ */ 2672bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned WriteMask : 4; /* TGSI_WRITEMASK_ */ 2682bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Indirect : 1; /* BOOL */ 2692bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Dimension : 1; /* BOOL */ 2702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin int Index : 16; /* SINT */ 2712bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned Padding : 6; 2722bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 2732bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2742bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2752bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstruct i915_full_dst_register 2762bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 2772bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_dst_register Register; 2782bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/* 2792bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_src_register Indirect; 2802bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_dimension Dimension; 2812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_src_register DimIndirect; 2822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin*/ 2832bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 2842bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2852bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstruct i915_full_src_register 2862bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 2872bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_src_register Register; 2882bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/* 2892bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_src_register Indirect; 2902bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_dimension Dimension; 2912bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_src_register DimIndirect; 2922bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin*/ 2932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 2942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 2952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstruct i915_full_instruction 2962bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 2972bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_instruction Instruction; 2982bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin/* 2992bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_instruction_predicate Predicate; 3002bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_instruction_label Label; 3012bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin*/ 3022bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_instruction_texture Texture; 3032bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_full_dst_register Dst[1]; 3042bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_full_src_register Src[3]; 3052bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 3062bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 3072bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 3082bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinunion i915_full_token 3092bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 3102bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_token Token; 3112bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_full_declaration FullDeclaration; 3122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_full_immediate FullImmediate; 3132bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct i915_full_instruction FullInstruction; 3142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin struct tgsi_full_property FullProperty; 3152bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 3162bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 3172bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstruct i915_token_list 3182bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin{ 3192bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin union i915_full_token* Tokens; 3202bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin unsigned NumTokens; 3212bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin}; 3222bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 3232bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinextern struct i915_token_list* i915_optimize(const struct tgsi_token *tokens); 3242bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 3252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinextern void i915_optimize_free(struct i915_token_list* tokens); 3262bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin 3273af1f3b9220733f5e3a76fe38fbc397974678234Brian#endif 328