i965: implement GL_EXT_texture_swizzle
authorBrian Paul <brianp@vmware.com>
Wed, 28 Jan 2009 21:50:03 +0000 (14:50 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 28 Jan 2009 21:50:03 +0000 (14:50 -0700)
If the texture swizzle is not XYZW (no-op) add an extra MOV instruction
after the TEX instruction to rearrange the components.

src/mesa/drivers/dri/i965/brw_wm.c
src/mesa/drivers/dri/i965/brw_wm.h
src/mesa/drivers/dri/i965/brw_wm_fp.c
src/mesa/drivers/dri/intel/intel_extensions.c

index 1683308f44bfa98caeaa2ec0d09da1e9517d6c9a..3ee0ead9938f1218dc5d6a7f1e315b90bdffeadb 100644 (file)
@@ -242,6 +242,11 @@ static void brw_wm_populate_key( struct brw_context *brw,
            if (img->TexFormat->MesaFormat == MESA_FORMAT_YCBCR)
                key->yuvtex_swap_mask |= 1 << i;
         }
+
+         key->tex_swizzles[i] = t->_Swizzle;
+      }
+      else {
+         key->tex_swizzles[i] = SWIZZLE_NOOP;
       }
    }
 
index 388c6f761862df6aa381867d8c3f00c995fa180a..0f46a25b1a17425e642dbaf7f71056d03c8e3df3 100644 (file)
@@ -70,6 +70,8 @@ struct brw_wm_prog_key {
    GLuint yuvtex_mask:16;
    GLuint yuvtex_swap_mask:16; /* UV swaped */
 
+   GLuint tex_swizzles[BRW_MAX_TEX_UNIT];
+
    GLuint program_string_id:32;
    GLuint origin_x, origin_y;
    GLuint drawable_height;
index fdacad0053c9a63260437008ad4acf25e0294a58..6b3f51dadc0565496c657251f11fd3bc34ef6e29 100644 (file)
@@ -111,6 +111,12 @@ static struct prog_src_register src_swizzle1( struct prog_src_register reg, int
    return src_swizzle(reg, x, x, x, x);
 }
 
+static struct prog_src_register src_swizzle4( struct prog_src_register reg, uint swizzle )
+{
+   reg.Swizzle = swizzle;
+   return reg;
+}
+
 
 /***********************************************************************
  * Dest regs
@@ -751,6 +757,19 @@ static void precalc_tex( struct brw_wm_compile *c,
              src_undef());
    }
 
+   /* For GL_EXT_texture_swizzle: */
+   if (c->key.tex_swizzles[unit] != SWIZZLE_NOOP) {
+      /* swizzle the result of the TEX instruction */
+      struct prog_src_register tmpsrc = src_reg_from_dst(inst->DstReg);
+      emit_op(c, OPCODE_MOV,
+              inst->DstReg,
+              SATURATE_OFF, /* saturate already done above */
+              0, 0,   /* tex unit, target N/A */
+              src_swizzle4(tmpsrc, c->key.tex_swizzles[unit]),
+              src_undef(),
+              src_undef());
+   }
+
    if ((inst->TexSrcTarget == TEXTURE_RECT_INDEX) ||
        (inst->TexSrcTarget == TEXTURE_CUBE_INDEX))
       release_temp(c, tmpcoord);
index 23955018bf27d5f37124e4a7f2bece1958119075..8f09f8d64576111edae645df48ae6c76e3095471 100644 (file)
@@ -137,6 +137,7 @@ static const struct dri_extension brw_extensions[] = {
    { "GL_EXT_shadow_funcs",               NULL },
    { "GL_EXT_stencil_two_side",           GL_EXT_stencil_two_side_functions },
    { "GL_EXT_texture_sRGB",              NULL },
+   { "GL_EXT_texture_swizzle",           NULL },
    { "GL_EXT_vertex_array_bgra",         NULL },
    { "GL_ATI_separate_stencil",           GL_ATI_separate_stencil_functions },
    { "GL_ATI_texture_env_combine3",       NULL },