diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 08ca52fea89..ed3ab72c20e 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -659,9 +659,9 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s } } - for(i = 0; i < This->baseShader.limits.temporary; i++) { - if (reg_maps->temporary[i]) - shader_addline(buffer, "TEMP R%u;\n", i); + for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i) + { + if (map & 1) shader_addline(buffer, "TEMP R%u;\n", i); } for (i = 0; i < This->baseShader.limits.address; i++) { @@ -3215,21 +3215,21 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE; BOOL want_nv_prog = FALSE; struct arb_pshader_private *shader_priv = This->backend_priv; + DWORD map; char srgbtmp[4][4]; unsigned int i, found = 0; - for(i = 0; i < This->baseShader.limits.temporary; i++) { + for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i) + { + if (!(map & 1) + || (This->color0_mov && i == This->color0_reg) + || (reg_maps->shader_version.major < 2 && i == 0)) + continue; - /* Don't overwrite the color source */ - if(This->color0_mov && i == This->color0_reg) continue; - else if(reg_maps->shader_version.major < 2 && i == 0) continue; - - if(reg_maps->temporary[i]) { - sprintf(srgbtmp[found], "R%u", i); - found++; - if(found == 4) break; - } + sprintf(srgbtmp[found], "R%u", i); + ++found; + if (found == 4) break; } switch(found) { diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 1669c7c6d1f..12c5fbacec9 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -262,7 +262,7 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh break; case WINED3DSPR_TEMP: - reg_maps->temporary[reg->idx] = 1; + reg_maps->temporary |= 1 << reg->idx; break; case WINED3DSPR_INPUT: diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 3fd92fde0a3..33b723aeee3 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1038,9 +1038,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont } /* Declare temporary variables */ - for(i = 0; i < This->baseShader.limits.temporary; i++) { - if (reg_maps->temporary[i]) - shader_addline(buffer, "vec4 R%u;\n", i); + for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i) + { + if (map & 1) shader_addline(buffer, "vec4 R%u;\n", i); } /* Declare attributes */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f95adcbda61..ca792620d5c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -629,7 +629,7 @@ typedef struct shader_reg_maps { struct wined3d_shader_version shader_version; BYTE texcoord; /* MAX_REG_TEXCRD, 8 */ - char temporary[MAX_REG_TEMP]; /* pixel, vertex */ + DWORD temporary; /* MAX_REG_TEMP, 32 */ char address[MAX_REG_ADDR]; /* vertex */ char labels[MAX_LABELS]; /* pixel, vertex */ DWORD *constf; /* pixel, vertex */