On 10 September 2012 14:15, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


Haswell supports EXT_texture_swizzle and legacy DEPTH_TEXTURE_MODE<br>
swizzling by setting SURFACE_STATE entries.  This means we don't have to<br>
bake the swizzle settings into the shader code by emitting MOV<br>
instructions, and thus don't have to recompile shaders whenever the<br>
swizzles change.<br>
<br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_wm.c                |  4 +-<br>
 src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 65 +++++++++++++++++++++--<br>
 2 files changed, 64 insertions(+), 5 deletions(-)<br>
<br>
This actually regresses two piglit tests which set DEPTH_TEXTURE_MODE to<br>
GL_ALPHA and use GLSL 1.30+ style (float return type) shadow sampling.<br>
That's fixed in the next patch; I kept it separate because I felt it was<br>
easier to review this way.<br></blockquote><div><br>I'm ok with that.  Would you mind moving this note into the body of the commit message so that in case someone stumbles on this temporary regression during a git bisect, they will know what's going on?<br>


 </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c<br>
index d991300..55fb14a 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_wm.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_wm.c<br>
@@ -491,6 +491,8 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,<br>
                                   const struct gl_program *prog,<br>
                                   struct brw_sampler_prog_key_data *key)<br>
 {<br>
+   struct intel_context *intel = intel_context(ctx);<br>
+<br>
    for (int s = 0; s < MAX_SAMPLERS; s++) {<br>
       key->swizzles[s] = SWIZZLE_NOOP;<br>
<br>
@@ -509,7 +511,7 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,<br>
       /* Handle EXT_texture_swizzle and DEPTH_TEXTURE_MODE swizzling for<br>
        * hardware that doesn't natively support it.<br>
        */<br>
-      if (true) {<br>
+      if (!intel->is_haswell) {<br>
         int swizzles[SWIZZLE_NIL + 1] = {<br>
            SWIZZLE_X,<br>
            SWIZZLE_Y,<br>
diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c<br>
index 97ae0e2..5e71260 100644<br>
--- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c<br>
+++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c<br>
@@ -35,6 +35,32 @@<br>
 #include "brw_defines.h"<br>
 #include "brw_wm.h"<br>
<br>
+/**<br>
+ * Convert an EXT_texture_swizzle enum (i.e. GL_RED) to one of the Gen7.5+<br>
+ * "Shader Channel Select" enumerations (i.e. HSW_SCS_RED)<br>
+ */<br>
+static unsigned<br>
+swizzle_to_scs(GLenum swizzle)<br>
+{<br>
+   switch (swizzle) {<br>
+   case GL_RED:<br>
+      return HSW_SCS_RED;<br>
+   case GL_GREEN:<br>
+      return HSW_SCS_GREEN;<br>
+   case GL_BLUE:<br>
+      return HSW_SCS_BLUE;<br>
+   case GL_ALPHA:<br>
+      return HSW_SCS_ALPHA;<br>
+   case GL_ZERO:<br>
+      return HSW_SCS_ZERO;<br>
+   case GL_ONE:<br>
+      return HSW_SCS_ONE;<br>
+   }<br>
+<br>
+   assert(!"Should not get here: invalid swizzle mode");<br>
+   return HSW_SCS_ZERO;<br>
+}<br>
+<br>
 void<br>
 gen7_set_surface_tiling(struct gen7_surface_state *surf, uint32_t tiling)<br>
 {<br>
@@ -343,10 +369,41 @@ gen7_update_texture_surface(struct gl_context *ctx,<br>
     */<br>
<br>
    if (brw->intel.is_haswell) {<br>
-      surf->ss7.shader_channel_select_r = HSW_SCS_RED;<br>
-      surf->ss7.shader_channel_select_g = HSW_SCS_GREEN;<br>
-      surf->ss7.shader_channel_select_b = HSW_SCS_BLUE;<br>
-      surf->ss7.shader_channel_select_a = HSW_SCS_ALPHA;<br>
+      if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT ||<br>
+          firstImage->_BaseFormat == GL_DEPTH_STENCIL) {<br>
+         /* Handle legacy DEPTH_TEXTURE_MODE swizzling. */<br>
+         switch (tObj->DepthMode) {<br>
+         case GL_ALPHA:<br>
+            surf->ss7.shader_channel_select_r = HSW_SCS_ZERO;<br>
+            surf->ss7.shader_channel_select_g = HSW_SCS_ZERO;<br>
+            surf->ss7.shader_channel_select_b = HSW_SCS_ZERO;<br>
+            surf->ss7.shader_channel_select_a = HSW_SCS_RED;<br>
+            break;<br>
+         case GL_LUMINANCE:<br>
+            surf->ss7.shader_channel_select_r = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_g = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_b = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_a = HSW_SCS_ONE;<br>
+            break;<br>
+         case GL_INTENSITY:<br>
+            surf->ss7.shader_channel_select_r = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_g = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_b = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_a = HSW_SCS_RED;<br>
+            break;<br>
+         case GL_RED:<br>
+            surf->ss7.shader_channel_select_r = HSW_SCS_RED;<br>
+            surf->ss7.shader_channel_select_g = HSW_SCS_ZERO;<br>
+            surf->ss7.shader_channel_select_b = HSW_SCS_ZERO;<br>
+            surf->ss7.shader_channel_select_a = HSW_SCS_ONE;<br>
+            break;<br>
+         }<br>
+      } else {<br>
+         surf->ss7.shader_channel_select_r = swizzle_to_scs(tObj->Swizzle[0]);<br>
+         surf->ss7.shader_channel_select_g = swizzle_to_scs(tObj->Swizzle[1]);<br>
+         surf->ss7.shader_channel_select_b = swizzle_to_scs(tObj->Swizzle[2]);<br>
+         surf->ss7.shader_channel_select_a = swizzle_to_scs(tObj->Swizzle[3]);<br>
+      }<br></blockquote><div><br>I'm bothered by the duplication in logic between this code and the code that sets up the swizles array in brw_populate_sampler_prog_key_data().  I'm also bothered by the fact that this code refers to gl_texture_object::Swizzle, whereas the code in brw_populate_sampler_prog_key_data() uses gl_texture_object::_Swizzle.  Can we refactor the common logic into a single function that we can call from both places?<br>
<br>Also, in our discussion in person, it sounded like you suspected this code would be broken for the combination of EXT_texture_swizzle and depth textures.<br>

 </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    }<br>
<br>
    /* Emit relocation to surface contents */<br>
<span><font color="#888888">--<br>
1.7.11.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br>