Alexandre Julliard : Revert "wined3d: Simplify the get_write_mask and get_swizzle functions."

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 2 06:46:01 CST 2007


Module: wine
Branch: master
Commit: d46d7d13abc33e7be555062e51d55def527ea06c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d46d7d13abc33e7be555062e51d55def527ea06c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jan  2 13:21:47 2007 +0100

Revert "wined3d: Simplify the get_write_mask and get_swizzle functions."

This reverts commit a9f658f6a68fbe53bcf30ab0329e5ff91451bf30.

---

 dlls/wined3d/arb_program_shader.c |   38 ++++++++++++++++++++++++++----------
 dlls/wined3d/glsl_shader.c        |   38 ++++++++++++++++++++++++++----------
 2 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e0d10a6..a8e4c9a 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -209,11 +209,14 @@ static const char * const shift_tab[] =
 static void shader_arb_get_write_mask(const DWORD param, char *write_mask) {
     char *ptr = write_mask;
 
-    *ptr++ = '.';
-    if (param & WINED3DSP_WRITEMASK_0) *ptr++ = 'x';
-    if (param & WINED3DSP_WRITEMASK_1) *ptr++ = 'y';
-    if (param & WINED3DSP_WRITEMASK_2) *ptr++ = 'z';
-    if (param & WINED3DSP_WRITEMASK_3) *ptr++ = 'w';
+    if ((param & WINED3DSP_WRITEMASK_ALL) != WINED3DSP_WRITEMASK_ALL) {
+        *ptr++ = '.';
+        if (param & WINED3DSP_WRITEMASK_0) *ptr++ = 'x';
+        if (param & WINED3DSP_WRITEMASK_1) *ptr++ = 'y';
+        if (param & WINED3DSP_WRITEMASK_2) *ptr++ = 'z';
+        if (param & WINED3DSP_WRITEMASK_3) *ptr++ = 'w';
+    }
+
     *ptr = '\0';
 }
 
@@ -223,15 +226,28 @@ static void shader_arb_get_swizzle(const
      * and z components. */
     const char *swizzle_chars = fixup ? "zyxw" : "xyzw";
     char *ptr = swizzle_str;
-    DWORD swizzle = (param & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT;
-    size_t i = 0;
 
-    *ptr++ = '.';
     /* swizzle bits fields: wwzzyyxx */
-    for (i = 0; i < 4; ++i) {
-        *ptr++ = swizzle_chars[swizzle & 0x3];
-        swizzle >>= 2;
+    DWORD swizzle = (param & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT;
+    DWORD swizzle_x = swizzle & 0x03;
+    DWORD swizzle_y = (swizzle >> 2) & 0x03;
+    DWORD swizzle_z = (swizzle >> 4) & 0x03;
+    DWORD swizzle_w = (swizzle >> 6) & 0x03;
+
+    /* If the swizzle is the default swizzle (ie, "xyzw"), we don't need to
+     * generate a swizzle string. Unless we need to our own swizzling. */
+    if ((WINED3DSP_NOSWIZZLE >> WINED3DSP_SWIZZLE_SHIFT) != swizzle || fixup) {
+        *ptr++ = '.';
+        if (swizzle_x == swizzle_y && swizzle_x == swizzle_z && swizzle_x == swizzle_w) {
+            *ptr++ = swizzle_chars[swizzle_x];
+        } else {
+            *ptr++ = swizzle_chars[swizzle_x];
+            *ptr++ = swizzle_chars[swizzle_y];
+            *ptr++ = swizzle_chars[swizzle_z];
+            *ptr++ = swizzle_chars[swizzle_w];
+        }
     }
+
     *ptr = '\0';
 }
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 03d5dd3..4aed644 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -722,11 +722,14 @@ static void shader_glsl_get_register_nam
 static void shader_glsl_get_write_mask(const DWORD param, char *write_mask) {
     char *ptr = write_mask;
 
-    *ptr++ = '.';
-    if (param & WINED3DSP_WRITEMASK_0) *ptr++ = 'x';
-    if (param & WINED3DSP_WRITEMASK_1) *ptr++ = 'y';
-    if (param & WINED3DSP_WRITEMASK_2) *ptr++ = 'z';
-    if (param & WINED3DSP_WRITEMASK_3) *ptr++ = 'w';
+    if ((param & WINED3DSP_WRITEMASK_ALL) != WINED3DSP_WRITEMASK_ALL) {
+        *ptr++ = '.';
+        if (param & WINED3DSP_WRITEMASK_0) *ptr++ = 'x';
+        if (param & WINED3DSP_WRITEMASK_1) *ptr++ = 'y';
+        if (param & WINED3DSP_WRITEMASK_2) *ptr++ = 'z';
+        if (param & WINED3DSP_WRITEMASK_3) *ptr++ = 'w';
+    }
+
     *ptr = '\0';
 }
 
@@ -736,15 +739,28 @@ static void shader_glsl_get_swizzle(cons
      * and z components. */
     const char *swizzle_chars = fixup ? "zyxw" : "xyzw";
     char *ptr = swizzle_str;
-    DWORD swizzle = (param & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT;
-    size_t i = 0;
 
-    *ptr++ = '.';
     /* swizzle bits fields: wwzzyyxx */
-    for (i = 0; i < 4; ++i) {
-        *ptr++ = swizzle_chars[swizzle & 0x3];
-        swizzle >>= 2;
+    DWORD swizzle = (param & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT;
+    DWORD swizzle_x = swizzle & 0x03;
+    DWORD swizzle_y = (swizzle >> 2) & 0x03;
+    DWORD swizzle_z = (swizzle >> 4) & 0x03;
+    DWORD swizzle_w = (swizzle >> 6) & 0x03;
+
+    /* If the swizzle is the default swizzle (ie, "xyzw"), we don't need to
+     * generate a swizzle string. Unless we need to our own swizzling. */
+    if ((WINED3DSP_NOSWIZZLE >> WINED3DSP_SWIZZLE_SHIFT) != swizzle || fixup) {
+        *ptr++ = '.';
+        if (swizzle_x == swizzle_y && swizzle_x == swizzle_z && swizzle_x == swizzle_w) {
+            *ptr++ = swizzle_chars[swizzle_x];
+        } else {
+            *ptr++ = swizzle_chars[swizzle_x];
+            *ptr++ = swizzle_chars[swizzle_y];
+            *ptr++ = swizzle_chars[swizzle_z];
+            *ptr++ = swizzle_chars[swizzle_w];
+        }
     }
+
     *ptr = '\0';
 }
 




More information about the wine-cvs mailing list