i915: Texture instructions use r/t/oC/oD register as texture coordinate.
authorXiang, Haihao <haihao.xiang@intel.com>
Mon, 13 Oct 2008 05:04:04 +0000 (13:04 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Mon, 13 Oct 2008 05:04:04 +0000 (13:04 +0800)
Fix http://bugs.freedesktop.org/show_bug.cgi?id=16287.

src/mesa/drivers/dri/i915/i915_program.c

index 350da5e16978415f620dc2eda3008d45c4654559..e87700f8e0aaa71159dfa8a5ddae613a8c46d249 100644 (file)
@@ -245,6 +245,19 @@ GLuint i915_emit_texld( struct i915_fragment_program *p,
        */
       assert(GET_UREG_TYPE(coord) != REG_TYPE_U);
 
+      if ((GET_UREG_TYPE(coord) != REG_TYPE_R) &&
+          (GET_UREG_TYPE(coord) != REG_TYPE_OC) &&
+          (GET_UREG_TYPE(coord) != REG_TYPE_OD) &&
+          (GET_UREG_TYPE(coord) != REG_TYPE_T)) {
+          GLuint  tmpCoord = get_free_rreg(p, live_regs);
+          
+          if (tmpCoord == UREG_BAD) 
+              return 0;
+
+          i915_emit_arith(p, A0_MOV, tmpCoord, A0_DEST_CHANNEL_ALL, 0, coord, 0, 0);
+          coord = tmpCoord;
+      }
+
       /* Output register being oC or oD defines a phase boundary */
       if (GET_UREG_TYPE(dest) == REG_TYPE_OC ||
          GET_UREG_TYPE(dest) == REG_TYPE_OD)