Henri Verbeet : wined3d: Make the "texcoord" shader_reg_maps member a bitmap.

Alexandre Julliard julliard at winehq.org
Tue Aug 11 10:47:25 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Aug 11 09:42:15 2009 +0200

wined3d: Make the "texcoord" shader_reg_maps member a bitmap.

---

 dlls/wined3d/arb_program_shader.c |   12 +++++++-----
 dlls/wined3d/baseshader.c         |    2 +-
 dlls/wined3d/glsl_shader.c        |   15 ++++++---------
 dlls/wined3d/wined3d_private.h    |    2 +-
 4 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 991fe69..08ca52f 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -615,6 +615,7 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
     char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
     unsigned max_constantsF;
     const local_constant *lconst;
+    DWORD map;
 
     /* In pixel shaders, all private constants are program local, we don't need anything
      * from program.env. Thus we can advertise the full set of constants in pixel shaders.
@@ -668,10 +669,11 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
             shader_addline(buffer, "ADDRESS A%d;\n", i);
     }
 
-    if(pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3) {
-        for(i = 0; i < This->baseShader.limits.texcoord; i++) {
-            if (reg_maps->texcoord[i] && pshader)
-                shader_addline(buffer,"TEMP T%u;\n", i);
+    if (pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3)
+    {
+        for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
+        {
+            if (map & 1) shader_addline(buffer, "TEMP T%u;\n", i);
         }
     }
 
@@ -3923,7 +3925,7 @@ static void find_clip_texcoord(IWineD3DPixelShaderImpl *ps)
     {
         for(i = GL_LIMITS(texture_stages); i > 0; i--)
         {
-            if(!ps->baseShader.reg_maps.texcoord[i - 1])
+            if (!(ps->baseShader.reg_maps.texcoord & (1 << (i - 1))))
             {
                 shader_priv->clipplane_emulation = i;
                 return;
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index ec05dd9..1669c7c 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -257,7 +257,7 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh
     switch (reg->type)
     {
         case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord[reg->idx] = 1;
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
             else reg_maps->address[reg->idx] = 1;
             break;
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 0737c35..3fd92fd 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -814,6 +814,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     const struct wined3d_gl_info *gl_info = context->gl_info;
     unsigned int i, extra_constants_needed = 0;
     const local_constant *lconst;
+    DWORD map;
 
     /* There are some minor differences between pixel and vertex shaders */
     char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
@@ -1009,9 +1010,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     }
 
     /* Declare texture coordinate temporaries and initialize them */
-    for (i = 0; i < This->baseShader.limits.texcoord; i++) {
-        if (reg_maps->texcoord[i]) 
-            shader_addline(buffer, "vec4 T%u = gl_TexCoord[%u];\n", i, i);
+    for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
+    {
+        if (map & 1) shader_addline(buffer, "vec4 T%u = gl_TexCoord[%u];\n", i, i);
     }
 
     /* Declare input register varyings. Only pixel shader, vertex shaders have that declared in the
@@ -1045,13 +1046,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     /* Declare attributes */
     if (reg_maps->shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
     {
-        WORD map = reg_maps->input_registers;
-
-        for (i = 0; map; map >>= 1, ++i)
+        for (i = 0, map = reg_maps->input_registers; map; map >>= 1, ++i)
         {
-            if (!(map & 1)) continue;
-
-            shader_addline(buffer, "attribute vec4 attrib%i;\n", i);
+            if (map & 1) shader_addline(buffer, "attribute vec4 attrib%i;\n", i);
         }
     }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8b67086..f95adcb 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -628,7 +628,7 @@ struct wined3d_shader_version
 typedef struct shader_reg_maps
 {
     struct wined3d_shader_version shader_version;
-    char texcoord[MAX_REG_TEXCRD];          /* pixel < 3.0 */
+    BYTE texcoord;                          /* MAX_REG_TEXCRD, 8 */
     char temporary[MAX_REG_TEMP];           /* pixel, vertex */
     char address[MAX_REG_ADDR];             /* vertex */
     char labels[MAX_LABELS];                /* pixel, vertex */




More information about the wine-cvs mailing list