1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef I915_FPC_H
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define I915_FPC_H
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_context.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_reg.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define I915_PROGRAM_SIZE 192
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Use those indices for pos/face routing, must be >= num of inputs */
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define I915_SEMANTIC_POS  100
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define I915_SEMANTIC_FACE 101
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Program translation state
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_fp_compile {
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_fragment_shader *shader;  /* the shader we're compiling */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean used_constants[I915_MAX_CONSTANT];
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** maps TGSI immediate index to constant slot */
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint num_immediates;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint immediates_map[I915_MAX_CONSTANT];
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float immediates[I915_MAX_CONSTANT][4];
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean first_instruction;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint declarations[I915_PROGRAM_SIZE];
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint program[I915_PROGRAM_SIZE];
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *csr;            /**< Cursor, points into program. */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *decl;           /**< Cursor, points into declarations. */
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint decl_s;          /**< flags for which s regs need to be decl'd */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint decl_t;          /**< flags for which t regs need to be decl'd */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint temp_flag;       /**< Tracks temporary regs which are in use */
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint utemp_flag;      /**< Tracks TYPE_U temporary regs which are in use */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint register_phases[16];
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint nr_tex_indirect;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint nr_tex_insn;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint nr_alu_insn;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint nr_decl_insn;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean error;      /**< Set if i915_program_error() is called */
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint NumNativeInstructions;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint NumNativeAluInstructions;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint NumNativeTexInstructions;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint NumNativeTexIndirections;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Having zero and one in here makes the definition of swizzle a lot
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * easier.
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_TYPE_SHIFT               29
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_NR_SHIFT                 24
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_X_NEGATE_SHIFT   23
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_X_SHIFT          20
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_Y_NEGATE_SHIFT   19
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_Y_SHIFT          16
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_Z_NEGATE_SHIFT   15
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_Z_SHIFT          12
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_W_NEGATE_SHIFT   11
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_W_SHIFT          8
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_ZERO_NEGATE_MBZ  5
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_ZERO_SHIFT       4
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_ONE_NEGATE_MBZ   1
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_CHANNEL_ONE_SHIFT        0
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_BAD          0xffffffff    /* not a valid ureg */
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define X    SRC_X
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Y    SRC_Y
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Z    SRC_Z
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define W    SRC_W
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ZERO SRC_ZERO
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ONE  SRC_ONE
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Construct a ureg:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG( type, nr ) (((type)<< UREG_TYPE_SHIFT) |		\
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  ((nr)  << UREG_NR_SHIFT) |		\
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (X     << UREG_CHANNEL_X_SHIFT) |	\
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (Y     << UREG_CHANNEL_Y_SHIFT) |	\
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (Z     << UREG_CHANNEL_Z_SHIFT) |	\
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (W     << UREG_CHANNEL_W_SHIFT) |	\
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (ZERO  << UREG_CHANNEL_ZERO_SHIFT) |	\
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (ONE   << UREG_CHANNEL_ONE_SHIFT))
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_CHANNEL_SRC( reg, channel ) ((reg<<(channel*4)) & (0xf<<20))
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CHANNEL_SRC( src, channel ) (src>>(channel*4))
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_UREG_TYPE(reg) (((reg)>>UREG_TYPE_SHIFT)&REG_TYPE_MASK)
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_UREG_NR(reg)   (((reg)>>UREG_NR_SHIFT)&REG_NR_MASK)
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_XYZW_CHANNEL_MASK 0x00ffff00
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* One neat thing about the UREG representation:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswizzle(int reg, uint x, uint y, uint z, uint w)
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(x <= SRC_ONE);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(y <= SRC_ONE);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(z <= SRC_ONE);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(w <= SRC_ONE);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ((reg & ~UREG_XYZW_CHANNEL_MASK) |
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           CHANNEL_SRC(GET_CHANNEL_SRC(reg, x), 0) |
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           CHANNEL_SRC(GET_CHANNEL_SRC(reg, y), 1) |
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           CHANNEL_SRC(GET_CHANNEL_SRC(reg, z), 2) |
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           CHANNEL_SRC(GET_CHANNEL_SRC(reg, w), 3));
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define A0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT)
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define D0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define A0_SRC0( reg ) (((reg)&UREG_MASK)>>UREG_A0_SRC0_SHIFT_LEFT)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define A1_SRC0( reg ) (((reg)&UREG_MASK)<<UREG_A1_SRC0_SHIFT_RIGHT)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define A1_SRC1( reg ) (((reg)&UREG_MASK)>>UREG_A1_SRC1_SHIFT_LEFT)
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define A2_SRC1( reg ) (((reg)&UREG_MASK)<<UREG_A2_SRC1_SHIFT_RIGHT)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define A2_SRC2( reg ) (((reg)&UREG_MASK)>>UREG_A2_SRC2_SHIFT_LEFT)
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* These are special, and don't have swizzle/negate bits.
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T0_SAMPLER( reg )     (GET_UREG_NR(reg)<<T0_SAMPLER_NR_SHIFT)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define T1_ADDRESS_REG( reg ) ((GET_UREG_NR(reg)<<T1_ADDRESS_REG_NR_SHIFT) | \
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       (GET_UREG_TYPE(reg)<<T1_ADDRESS_REG_TYPE_SHIFT))
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Macros for translating UREG's into the various register fields used
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * by the I915 programmable unit.
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_A0_DEST_SHIFT_LEFT  (UREG_TYPE_SHIFT - A0_DEST_TYPE_SHIFT)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_A0_SRC0_SHIFT_LEFT  (UREG_TYPE_SHIFT - A0_SRC0_TYPE_SHIFT)
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_A1_SRC0_SHIFT_RIGHT (A1_SRC0_CHANNEL_W_SHIFT - UREG_CHANNEL_W_SHIFT)
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_A1_SRC1_SHIFT_LEFT  (UREG_TYPE_SHIFT - A1_SRC1_TYPE_SHIFT)
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_A2_SRC1_SHIFT_RIGHT (A2_SRC1_CHANNEL_W_SHIFT - UREG_CHANNEL_W_SHIFT)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_A2_SRC2_SHIFT_LEFT  (UREG_TYPE_SHIFT - A2_SRC2_TYPE_SHIFT)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_MASK         0xffffff00
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UREG_TYPE_NR_MASK ((REG_TYPE_MASK << UREG_TYPE_SHIFT) | \
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  			   (REG_NR_MASK << UREG_NR_SHIFT))
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Public interface for the compiler
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_translate_fragment_program( struct i915_context *i915,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct i915_fragment_shader *fs);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_get_temp(struct i915_fp_compile *p);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_get_utemp(struct i915_fp_compile *p);
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void i915_release_utemps(struct i915_fp_compile *p);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_texld(struct i915_fp_compile *p,
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint dest,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint destmask,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint sampler,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint coord,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint op,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint num_coord);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_arith(struct i915_fp_compile *p,
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint op,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint dest,
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint mask,
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint saturate,
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              uint src0, uint src1, uint src2);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_decl(struct i915_fp_compile *p,
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             uint type, uint nr, uint d0_flags);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_const1f(struct i915_fp_compile *p, float c0);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_const2f(struct i915_fp_compile *p,
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                float c0, float c1);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_const4fv(struct i915_fp_compile *p,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 const float * c);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern uint i915_emit_const4f(struct i915_fp_compile *p,
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                float c0, float c1,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                float c2, float c3);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * i915_fpc_translate.c
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_program_error(struct i915_fp_compile *p, const char *msg, ...);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*======================================================================
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * i915_fpc_optimize.c
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_src_register
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned File        : 4;  /* TGSI_FILE_ */
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Indirect    : 1;  /* BOOL */
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Dimension   : 1;  /* BOOL */
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int      Index       : 16; /* SINT */
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned SwizzleX    : 3;  /* TGSI_SWIZZLE_ */
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned SwizzleY    : 3;  /* TGSI_SWIZZLE_ */
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned SwizzleZ    : 3;  /* TGSI_SWIZZLE_ */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned SwizzleW    : 3;  /* TGSI_SWIZZLE_ */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Absolute    : 1;    /* BOOL */
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Negate      : 1;    /* BOOL */
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Additional swizzle supported in i915 */
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TGSI_SWIZZLE_ZERO 4
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TGSI_SWIZZLE_ONE 5
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_dst_register
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned File        : 4;  /* TGSI_FILE_ */
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned WriteMask   : 4;  /* TGSI_WRITEMASK_ */
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Indirect    : 1;  /* BOOL */
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Dimension   : 1;  /* BOOL */
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int      Index       : 16; /* SINT */
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned Padding     : 6;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_full_dst_register
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_dst_register               Register;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_src_register               Indirect;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_dimension                  Dimension;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_src_register               DimIndirect;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_full_src_register
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_src_register         Register;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_src_register         Indirect;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_dimension            Dimension;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_src_register         DimIndirect;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_full_instruction
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_instruction             Instruction;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_instruction_predicate   Predicate;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_instruction_label       Label;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_instruction_texture     Texture;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_full_dst_register       Dst[1];
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_full_src_register       Src[3];
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunion i915_full_token
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_token             Token;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_declaration  FullDeclaration;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_immediate    FullImmediate;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_full_instruction  FullInstruction;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_property     FullProperty;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_token_list
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union i915_full_token*     Tokens;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned                   NumTokens;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct i915_token_list* i915_optimize(const struct tgsi_token *tokens);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void i915_optimize_free(struct i915_token_list* tokens);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
328