15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions:
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) **************************************************************************/
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <strings.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "main/glheader.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/macros.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/enums.h"
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tnl/t_context.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "intel_batchbuffer.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "i915_reg.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "i915_context.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "i915_program.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define A0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define D0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define T0_DEST( reg ) (((reg)&UREG_TYPE_NR_MASK)>>UREG_A0_DEST_SHIFT_LEFT)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define A0_SRC0( reg ) (((reg)&UREG_MASK)>>UREG_A0_SRC0_SHIFT_LEFT)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define A1_SRC0( reg ) (((reg)&UREG_MASK)<<UREG_A1_SRC0_SHIFT_RIGHT)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define A1_SRC1( reg ) (((reg)&UREG_MASK)>>UREG_A1_SRC1_SHIFT_LEFT)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define A2_SRC1( reg ) (((reg)&UREG_MASK)<<UREG_A2_SRC1_SHIFT_RIGHT)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define A2_SRC2( reg ) (((reg)&UREG_MASK)>>UREG_A2_SRC2_SHIFT_LEFT)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/* These are special, and don't have swizzle/negate bits.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define T0_SAMPLER( reg )     (GET_UREG_NR(reg)<<T0_SAMPLER_NR_SHIFT)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define T1_ADDRESS_REG( reg ) ((GET_UREG_NR(reg)<<T1_ADDRESS_REG_NR_SHIFT) | \
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       (GET_UREG_TYPE(reg)<<T1_ADDRESS_REG_TYPE_SHIFT))
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Macros for translating UREG's into the various register fields used
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by the I915 programmable unit.
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) */
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define UREG_A0_DEST_SHIFT_LEFT  (UREG_TYPE_SHIFT - A0_DEST_TYPE_SHIFT)
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define UREG_A0_SRC0_SHIFT_LEFT  (UREG_TYPE_SHIFT - A0_SRC0_TYPE_SHIFT)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define UREG_A1_SRC0_SHIFT_RIGHT (A1_SRC0_CHANNEL_W_SHIFT - UREG_CHANNEL_W_SHIFT)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UREG_A1_SRC1_SHIFT_LEFT  (UREG_TYPE_SHIFT - A1_SRC1_TYPE_SHIFT)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UREG_A2_SRC1_SHIFT_RIGHT (A2_SRC1_CHANNEL_W_SHIFT - UREG_CHANNEL_W_SHIFT)
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define UREG_A2_SRC2_SHIFT_LEFT  (UREG_TYPE_SHIFT - A2_SRC2_TYPE_SHIFT)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UREG_MASK         0xffffff00
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UREG_TYPE_NR_MASK ((REG_TYPE_MASK << UREG_TYPE_SHIFT) | \
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  			   (REG_NR_MASK << UREG_NR_SHIFT))
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define I915_CONSTFLAG_PARAM 0x1f
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)i915_get_temp(struct i915_fragment_program *p)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   int bit = ffs(~p->temp_flag);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (!bit) {
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      fprintf(stderr, "%s: out of temporaries\n", __FILE__);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exit(1);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)   p->temp_flag |= 1 << (bit - 1);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return UREG(REG_TYPE_R, (bit - 1));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GLuint
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)i915_get_utemp(struct i915_fragment_program * p)
91c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch{
92c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   int bit = ffs(~p->utemp_flag);
93c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   if (!bit) {
94c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      fprintf(stderr, "%s: out of temporaries\n", __FILE__);
95c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      exit(1);
96c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->utemp_flag |= 1 << (bit - 1);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return UREG(REG_TYPE_U, (bit - 1));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_release_utemps(struct i915_fragment_program *p)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   p->utemp_flag = ~0x7;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)i915_emit_decl(struct i915_fragment_program *p,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               GLuint type, GLuint nr, GLuint d0_flags)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLuint reg = UREG(type, nr);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (type == REG_TYPE_T) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (p->decl_t & (1 << nr))
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return reg;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->decl_t |= (1 << nr);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   else if (type == REG_TYPE_S) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (p->decl_s & (1 << nr))
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         return reg;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->decl_s |= (1 << nr);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   else
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return reg;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *(p->decl++) = (D0_DCL | D0_DEST(reg) | d0_flags);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *(p->decl++) = D1_MBZ;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *(p->decl++) = D2_MBZ;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   assert(p->decl <= p->declarations + ARRAY_SIZE(p->declarations));
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->nr_decl_insn++;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return reg;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_emit_arith(struct i915_fragment_program * p,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                GLuint op,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GLuint dest,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GLuint mask,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                GLuint saturate, GLuint src0, GLuint src1, GLuint src2)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   GLuint c[3];
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   GLuint nr_const = 0;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   assert(GET_UREG_TYPE(dest) != REG_TYPE_CONST);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   assert(dest);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (GET_UREG_TYPE(src0) == REG_TYPE_CONST)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      c[nr_const++] = 0;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (GET_UREG_TYPE(src1) == REG_TYPE_CONST)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      c[nr_const++] = 1;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (GET_UREG_TYPE(src2) == REG_TYPE_CONST)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      c[nr_const++] = 2;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* Recursively call this function to MOV additional const values
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * into temporary registers.  Use utemp registers for this -
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * currently shouldn't be possible to run out, but keep an eye on
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * this.
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    */
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (nr_const > 1) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint s[3], first, i, old_utemp_flag;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      s[0] = src0;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      s[1] = src1;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      s[2] = src2;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      old_utemp_flag = p->utemp_flag;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      first = GET_UREG_NR(s[c[0]]);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (i = 1; i < nr_const; i++) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         if (GET_UREG_NR(s[c[i]]) != first) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GLuint tmp = i915_get_utemp(p);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            i915_emit_arith(p, A0_MOV, tmp, A0_DEST_CHANNEL_ALL, 0,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            s[c[i]], 0, 0);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            s[c[i]] = tmp;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         }
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      src0 = s[0];
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      src1 = s[1];
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      src2 = s[2];
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->utemp_flag = old_utemp_flag;   /* restore */
188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)   }
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (p->csr >= p->program + ARRAY_SIZE(p->program)) {
191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      i915_program_error(p, "Program contains too many instructions");
192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return UREG_BAD;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *(p->csr++) = (op | A0_DEST(dest) | mask | saturate | A0_SRC0(src0));
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *(p->csr++) = (A1_SRC0(src0) | A1_SRC1(src1));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *(p->csr++) = (A2_SRC1(src1) | A2_SRC2(src2));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (GET_UREG_TYPE(dest) == REG_TYPE_R)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      p->register_phases[GET_UREG_NR(dest)] = p->nr_tex_indirect;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   p->nr_alu_insn++;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return dest;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static GLuint get_free_rreg (struct i915_fragment_program *p,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             GLuint live_regs)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int bit = ffs(~live_regs);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!bit) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        i915_program_error(p, "Can't find free R reg");
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return UREG_BAD;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return UREG(REG_TYPE_R, bit - 1);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLuint i915_emit_texld( struct i915_fragment_program *p,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			GLuint live_regs,
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			GLuint dest,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			GLuint destmask,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			GLuint sampler,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			GLuint coord,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			GLuint op )
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (coord != UREG(GET_UREG_TYPE(coord), GET_UREG_NR(coord))) {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        /* With the help of the "needed registers" table created earlier, pick
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         * a register we can MOV the swizzled TC to (since TEX doesn't support
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * swizzled sources) */
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLuint swizCoord = get_free_rreg(p, live_regs);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (swizCoord == UREG_BAD)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return 0;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i915_emit_arith( p, A0_MOV, swizCoord, A0_DEST_CHANNEL_ALL, 0, coord, 0, 0 );
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        coord = swizCoord;
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   /* Don't worry about saturate as we only support texture formats
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    * that are always in the 0..1 range.
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    */
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   if (destmask != A0_DEST_CHANNEL_ALL) {
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GLuint tmp = i915_get_utemp(p);
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      i915_emit_texld( p, 0, tmp, A0_DEST_CHANNEL_ALL, sampler, coord, op );
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      i915_emit_arith( p, A0_MOV, dest, destmask, 0, tmp, 0, 0 );
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return dest;
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(GET_UREG_TYPE(dest) != REG_TYPE_CONST);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(dest == UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest)));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Can't use unsaved temps for coords, as the phase boundary would result
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * in the contents becoming undefined.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(GET_UREG_TYPE(coord) != REG_TYPE_U);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((GET_UREG_TYPE(coord) != REG_TYPE_R) &&
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (GET_UREG_TYPE(coord) != REG_TYPE_OC) &&
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (GET_UREG_TYPE(coord) != REG_TYPE_OD) &&
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (GET_UREG_TYPE(coord) != REG_TYPE_T)) {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GLuint  tmpCoord = get_free_rreg(p, live_regs);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (tmpCoord == UREG_BAD)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              return 0;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i915_emit_arith(p, A0_MOV, tmpCoord, A0_DEST_CHANNEL_ALL, 0, coord, 0, 0);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          coord = tmpCoord;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      /* Output register being oC or oD defines a phase boundary */
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (GET_UREG_TYPE(dest) == REG_TYPE_OC ||
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  GET_UREG_TYPE(dest) == REG_TYPE_OD)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 p->nr_tex_indirect++;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Reading from an r# register whose contents depend on output of the
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       * current phase defines a phase boundary.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (GET_UREG_TYPE(coord) == REG_TYPE_R &&
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  p->register_phases[GET_UREG_NR(coord)] == p->nr_tex_indirect)
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)	 p->nr_tex_indirect++;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (p->csr >= p->program + ARRAY_SIZE(p->program)) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 i915_program_error(p, "Program contains too many instructions");
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return UREG_BAD;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *(p->csr++) = (op |
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     T0_DEST( dest ) |
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     T0_SAMPLER( sampler ));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *(p->csr++) = T1_ADDRESS_REG( coord );
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *(p->csr++) = T2_MBZ;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (GET_UREG_TYPE(dest) == REG_TYPE_R)
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)	 p->register_phases[GET_UREG_NR(dest)] = p->nr_tex_indirect;
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      p->nr_tex_insn++;
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return dest;
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   }
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)GLuint
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)i915_emit_const1f(struct i915_fragment_program * p, GLfloat c0)
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   GLint reg, idx;
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   if (c0 == 0.0)
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return swizzle(UREG(REG_TYPE_R, 0), ZERO, ZERO, ZERO, ZERO);
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   if (c0 == 1.0)
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return swizzle(UREG(REG_TYPE_R, 0), ONE, ONE, ONE, ONE);
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   for (reg = 0; reg < I915_MAX_CONSTANT; reg++) {
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (p->constant_flags[reg] == I915_CONSTFLAG_PARAM)
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         continue;
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      for (idx = 0; idx < 4; idx++) {
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)         if (!(p->constant_flags[reg] & (1 << idx)) ||
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             p->constant[reg][idx] == c0) {
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            p->constant[reg][idx] = c0;
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            p->constant_flags[reg] |= 1 << idx;
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            if (reg + 1 > p->nr_constants)
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               p->nr_constants = reg + 1;
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            return swizzle(UREG(REG_TYPE_CONST, reg), idx, ZERO, ZERO, ONE);
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)         }
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   }
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   fprintf(stderr, "%s: out of constants\n", __FUNCTION__);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->error = 1;
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   return 0;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdochi915_emit_const2f(struct i915_fragment_program * p, GLfloat c0, GLfloat c1)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLint reg, idx;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c0 == 0.0)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return swizzle(i915_emit_const1f(p, c1), ZERO, X, Z, W);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c0 == 1.0)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return swizzle(i915_emit_const1f(p, c1), ONE, X, Z, W);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c1 == 0.0)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return swizzle(i915_emit_const1f(p, c0), X, ZERO, Z, W);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (c1 == 1.0)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return swizzle(i915_emit_const1f(p, c0), X, ONE, Z, W);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (reg = 0; reg < I915_MAX_CONSTANT; reg++) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (p->constant_flags[reg] == 0xf ||
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          p->constant_flags[reg] == I915_CONSTFLAG_PARAM)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         continue;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (idx = 0; idx < 3; idx++) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (!(p->constant_flags[reg] & (3 << idx))) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p->constant[reg][idx] = c0;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p->constant[reg][idx + 1] = c1;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p->constant_flags[reg] |= 3 << idx;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (reg + 1 > p->nr_constants)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               p->nr_constants = reg + 1;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return swizzle(UREG(REG_TYPE_CONST, reg), idx, idx + 1, ZERO,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ONE);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         }
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   fprintf(stderr, "%s: out of constants\n", __FUNCTION__);
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   p->error = 1;
3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   return 0;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_emit_const4f(struct i915_fragment_program * p,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GLfloat c0, GLfloat c1, GLfloat c2, GLfloat c3)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLint reg;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (reg = 0; reg < I915_MAX_CONSTANT; reg++) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (p->constant_flags[reg] == 0xf &&
37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          p->constant[reg][0] == c0 &&
37890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          p->constant[reg][1] == c1 &&
37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          p->constant[reg][2] == c2 && p->constant[reg][3] == c3) {
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)         return UREG(REG_TYPE_CONST, reg);
38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      else if (p->constant_flags[reg] == 0) {
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)         p->constant[reg][0] = c0;
38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)         p->constant[reg][1] = c1;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->constant[reg][2] = c2;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->constant[reg][3] = c3;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->constant_flags[reg] = 0xf;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (reg + 1 > p->nr_constants)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p->nr_constants = reg + 1;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return UREG(REG_TYPE_CONST, reg);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   fprintf(stderr, "%s: out of constants\n", __FUNCTION__);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->error = 1;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return 0;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLuint
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)i915_emit_const4fv(struct i915_fragment_program * p, const GLfloat * c)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return i915_emit_const4f(p, c[0], c[1], c[2], c[3]);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLuint
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_emit_param4fv(struct i915_fragment_program * p, const GLfloat * values)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   GLint reg, i;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   for (i = 0; i < p->nr_params; i++) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (p->param[i].values == values)
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         return UREG(REG_TYPE_CONST, p->param[i].reg);
415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   }
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   for (reg = 0; reg < I915_MAX_CONSTANT; reg++) {
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (p->constant_flags[reg] == 0) {
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         p->constant_flags[reg] = I915_CONSTFLAG_PARAM;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i = p->nr_params++;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->param[i].values = values;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->param[i].reg = reg;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->params_uptodate = 0;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (reg + 1 > p->nr_constants)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p->nr_constants = reg + 1;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return UREG(REG_TYPE_CONST, reg);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   }
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   fprintf(stderr, "%s: out of constants\n", __FUNCTION__);
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   p->error = 1;
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   return 0;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Warning the user about program errors seems to be quite valuable, from
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * our bug reports.  It unfortunately means piglit reporting errors
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * when we fall back to software due to an unsupportable program, though.
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_program_error(struct i915_fragment_program *p, const char *fmt, ...)
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (unlikely((INTEL_DEBUG & (DEBUG_WM | DEBUG_PERF)) != 0)) {
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      va_list args;
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fprintf(stderr, "i915_program_error: ");
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      va_start(args, fmt);
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      vfprintf(stderr, fmt, args);
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      va_end(args);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      fprintf(stderr, "\n");
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->error = 1;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_init_program(struct i915_context *i915, struct i915_fragment_program *p)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct gl_context *ctx = &i915->intel.ctx;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   p->translated = 0;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->params_uptodate = 0;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->on_hardware = 0;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->error = 0;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&p->register_phases, 0, sizeof(p->register_phases));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->nr_tex_indirect = 1;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->nr_tex_insn = 0;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->nr_alu_insn = 0;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->nr_decl_insn = 0;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->ctx = ctx;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(p->constant_flags, 0, sizeof(p->constant_flags));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
478c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   p->nr_constants = 0;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->csr = p->program;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->decl = p->declarations;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->decl_s = 0;
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   p->decl_t = 0;
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   p->temp_flag = 0xffff000;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->utemp_flag = ~0x7;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->wpos_tex = -1;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->depth_written = 0;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   p->nr_params = 0;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *(p->decl++) = _3DSTATE_PIXEL_SHADER_PROGRAM;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i915_fini_program(struct i915_fragment_program *p)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
496c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   GLuint program_size = p->csr - p->program;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLuint decl_size = p->decl - p->declarations;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i915_program_error(p, "Exceeded max nr indirect texture lookups "
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "(%d out of %d)",
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 p->nr_tex_indirect, I915_MAX_TEX_INDIRECT);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
50434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (p->nr_tex_insn > I915_MAX_TEX_INSN) {
50634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      i915_program_error(p, "Exceeded max TEX instructions (%d out of %d)",
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			 p->nr_tex_insn, I915_MAX_TEX_INSN);
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (p->nr_alu_insn > I915_MAX_ALU_INSN)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      i915_program_error(p, "Exceeded max ALU instructions (%d out of %d)",
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			 p->nr_alu_insn, I915_MAX_ALU_INSN);
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (p->nr_decl_insn > I915_MAX_DECL_INSN) {
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      i915_program_error(p, "Exceeded max DECL instructions (%d out of %d)",
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			 p->nr_decl_insn, I915_MAX_DECL_INSN);
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (p->error) {
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      p->FragProg.Base.NumNativeInstructions = 0;
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      p->FragProg.Base.NumNativeAluInstructions = 0;
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      p->FragProg.Base.NumNativeTexInstructions = 0;
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      p->FragProg.Base.NumNativeTexIndirections = 0;
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   else {
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      p->FragProg.Base.NumNativeInstructions = (p->nr_alu_insn +
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                p->nr_tex_insn +
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                p->nr_decl_insn);
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      p->FragProg.Base.NumNativeAluInstructions = p->nr_alu_insn;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->FragProg.Base.NumNativeTexInstructions = p->nr_tex_insn;
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      p->FragProg.Base.NumNativeTexIndirections = p->nr_tex_indirect;
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   }
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   p->declarations[0] |= program_size + decl_size - 2;
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
538116680a4aac90f2aa7413d9095a592090648e557Ben Murdochi915_upload_program(struct i915_context *i915,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    struct i915_fragment_program *p)
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   GLuint program_size = p->csr - p->program;
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   GLuint decl_size = p->decl - p->declarations;
5433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (p->error)
5453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* Could just go straight to the batchbuffer from here:
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    */
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (i915->state.ProgramSize != (program_size + decl_size) ||
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       memcmp(i915->state.Program + decl_size, p->program,
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              program_size * sizeof(int)) != 0) {
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      I915_STATECHANGE(i915, I915_UPLOAD_PROGRAM);
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      memcpy(i915->state.Program, p->declarations, decl_size * sizeof(int));
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      memcpy(i915->state.Program + decl_size, p->program,
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             program_size * sizeof(int));
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      i915->state.ProgramSize = decl_size + program_size;
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   }
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   /* Always seemed to get a failure if I used memcmp() to
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * shortcircuit this state upload.  Needs further investigation?
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    */
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (p->nr_constants) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint nr = p->nr_constants;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      I915_ACTIVESTATE(i915, I915_UPLOAD_CONSTANTS, 1);
566f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      I915_STATECHANGE(i915, I915_UPLOAD_CONSTANTS);
567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      i915->state.Constant[0] = _3DSTATE_PIXEL_SHADER_CONSTANTS | ((nr) * 4);
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      i915->state.Constant[1] = (1 << (nr - 1)) | ((1 << (nr - 1)) - 1);
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      memcpy(&i915->state.Constant[2], p->constant, 4 * sizeof(int) * (nr));
572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      i915->state.ConstantSize = 2 + (nr) * 4;
573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (0) {
575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         GLuint i;
576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         for (i = 0; i < nr; i++) {
577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            fprintf(stderr, "const[%d]: %f %f %f %f\n", i,
578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    p->constant[i][0],
579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    p->constant[i][1], p->constant[i][2], p->constant[i][3]);
580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         }
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   else {
584e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      I915_ACTIVESTATE(i915, I915_UPLOAD_CONSTANTS, 0);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   p->on_hardware = 1;
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)