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)&REG_TYPE_MASK)
1313af1f3b9220733f5e3a76fe38fbc397974678234Brian#define GET_UREG_NR(reg)   (((reg)>>UREG_NR_SHIFT)&REG_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