Commit 50853e29 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

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

parent a282380f
...@@ -615,6 +615,7 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s ...@@ -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); char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
unsigned max_constantsF; unsigned max_constantsF;
const local_constant *lconst; const local_constant *lconst;
DWORD map;
/* In pixel shaders, all private constants are program local, we don't need anything /* 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. * 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 ...@@ -668,10 +669,11 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
shader_addline(buffer, "ADDRESS A%d;\n", i); shader_addline(buffer, "ADDRESS A%d;\n", i);
} }
if(pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3) { 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) for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
shader_addline(buffer,"TEMP T%u;\n", i); {
if (map & 1) shader_addline(buffer, "TEMP T%u;\n", i);
} }
} }
...@@ -3923,7 +3925,7 @@ static void find_clip_texcoord(IWineD3DPixelShaderImpl *ps) ...@@ -3923,7 +3925,7 @@ static void find_clip_texcoord(IWineD3DPixelShaderImpl *ps)
{ {
for(i = GL_LIMITS(texture_stages); i > 0; i--) 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; shader_priv->clipplane_emulation = i;
return; return;
......
...@@ -257,7 +257,7 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh ...@@ -257,7 +257,7 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh
switch (reg->type) switch (reg->type)
{ {
case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */ 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; else reg_maps->address[reg->idx] = 1;
break; break;
......
...@@ -814,6 +814,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont ...@@ -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; const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i, extra_constants_needed = 0; unsigned int i, extra_constants_needed = 0;
const local_constant *lconst; const local_constant *lconst;
DWORD map;
/* There are some minor differences between pixel and vertex shaders */ /* There are some minor differences between pixel and vertex shaders */
char pshader = shader_is_pshader_version(reg_maps->shader_version.type); 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 ...@@ -1009,9 +1010,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
} }
/* Declare texture coordinate temporaries and initialize them */ /* Declare texture coordinate temporaries and initialize them */
for (i = 0; i < This->baseShader.limits.texcoord; i++) { for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
if (reg_maps->texcoord[i]) {
shader_addline(buffer, "vec4 T%u = gl_TexCoord[%u];\n", i, 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 /* 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 ...@@ -1045,13 +1046,9 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
/* Declare attributes */ /* Declare attributes */
if (reg_maps->shader_version.type == WINED3D_SHADER_TYPE_VERTEX) if (reg_maps->shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
{ {
WORD map = reg_maps->input_registers; for (i = 0, map = reg_maps->input_registers; map; map >>= 1, ++i)
for (i = 0; map; map >>= 1, ++i)
{ {
if (!(map & 1)) continue; if (map & 1) shader_addline(buffer, "attribute vec4 attrib%i;\n", i);
shader_addline(buffer, "attribute vec4 attrib%i;\n", i);
} }
} }
......
...@@ -628,7 +628,7 @@ struct wined3d_shader_version ...@@ -628,7 +628,7 @@ struct wined3d_shader_version
typedef struct shader_reg_maps typedef struct shader_reg_maps
{ {
struct wined3d_shader_version shader_version; 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 temporary[MAX_REG_TEMP]; /* pixel, vertex */
char address[MAX_REG_ADDR]; /* vertex */ char address[MAX_REG_ADDR]; /* vertex */
char labels[MAX_LABELS]; /* pixel, vertex */ char labels[MAX_LABELS]; /* pixel, vertex */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment