From d46d7d13abc33e7be555062e51d55def527ea06c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 2 Jan 2007 13:21:47 +0100 Subject: [PATCH] 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 e0d10a6a16f..a8e4c9afd08 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 DWORD param, BOOL fixup, char *swizzle_ * 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 03d5dd37382..4aed644b873 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -722,11 +722,14 @@ static void shader_glsl_get_register_name( 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(const DWORD param, BOOL fixup, char *swizzle * 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'; }