wined3d: Handle relative addresses in the common code in shader_glsl_get_register_name().

This commit is contained in:
Henri Verbeet 2012-11-11 18:52:39 +01:00 committed by Alexandre Julliard
parent 10d46bc042
commit 0a7b32e3f0
1 changed files with 16 additions and 23 deletions

View File

@ -1378,7 +1378,12 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
const struct wined3d_shader_version *version = &reg_maps->shader_version; const struct wined3d_shader_version *version = &reg_maps->shader_version;
const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
const char *prefix = shader_glsl_get_prefix(version->type); const char *prefix = shader_glsl_get_prefix(version->type);
struct glsl_src_param rel_param0, rel_param1;
if (reg->idx[0].offset != ~0U && reg->idx[0].rel_addr)
shader_glsl_add_src_param(ins, reg->idx[0].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param0);
if (reg->idx[1].offset != ~0U && reg->idx[1].rel_addr)
shader_glsl_add_src_param(ins, reg->idx[1].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param1);
*is_color = FALSE; *is_color = FALSE;
switch (reg->type) switch (reg->type)
@ -1406,24 +1411,20 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
if (reg->idx[0].rel_addr) if (reg->idx[0].rel_addr)
{ {
struct glsl_src_param rel_param; /* Removing a + 0 would be an obvious optimization, but
* OS X doesn't see the NOP operation there. */
shader_glsl_add_src_param(ins, reg->idx[0].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
/* Removing a + 0 would be an obvious optimization, but macos doesn't see the NOP
* operation there */
if (idx) if (idx)
{ {
if (shader->u.ps.declared_in_count > in_count) if (shader->u.ps.declared_in_count > in_count)
{ {
sprintf(register_name, sprintf(register_name,
"((%s + %u) > %u ? (%s + %u) > %u ? gl_SecondaryColor : gl_Color : %s_in[%s + %u])", "((%s + %u) > %u ? (%s + %u) > %u ? gl_SecondaryColor : gl_Color : %s_in[%s + %u])",
rel_param.param_str, idx, in_count - 1, rel_param.param_str, idx, in_count, rel_param0.param_str, idx, in_count - 1, rel_param0.param_str, idx, in_count,
prefix, rel_param.param_str, idx); prefix, rel_param0.param_str, idx);
} }
else else
{ {
sprintf(register_name, "%s_in[%s + %u]", prefix, rel_param.param_str, idx); sprintf(register_name, "%s_in[%s + %u]", prefix, rel_param0.param_str, idx);
} }
} }
else else
@ -1431,12 +1432,12 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
if (shader->u.ps.declared_in_count > in_count) if (shader->u.ps.declared_in_count > in_count)
{ {
sprintf(register_name, "((%s) > %u ? (%s) > %u ? gl_SecondaryColor : gl_Color : %s_in[%s])", sprintf(register_name, "((%s) > %u ? (%s) > %u ? gl_SecondaryColor : gl_Color : %s_in[%s])",
rel_param.param_str, in_count - 1, rel_param.param_str, in_count, rel_param0.param_str, in_count - 1, rel_param0.param_str, in_count,
prefix, rel_param.param_str); prefix, rel_param0.param_str);
} }
else else
{ {
sprintf(register_name, "%s_in[%s]", prefix, rel_param.param_str); sprintf(register_name, "%s_in[%s]", prefix, rel_param0.param_str);
} }
} }
} }
@ -1462,12 +1463,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
/* Relative addressing */ /* Relative addressing */
if (reg->idx[0].rel_addr) if (reg->idx[0].rel_addr)
{ {
struct glsl_src_param rel_param;
shader_glsl_add_src_param(ins, reg->idx[0].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
if (reg->idx[0].offset) if (reg->idx[0].offset)
sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param.param_str, reg->idx[0].offset); sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param0.param_str, reg->idx[0].offset);
else else
sprintf(register_name, "%s_c[%s]", prefix, rel_param.param_str); sprintf(register_name, "%s_c[%s]", prefix, rel_param0.param_str);
} }
else else
{ {
@ -1606,16 +1605,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
case WINED3DSPR_CONSTBUFFER: case WINED3DSPR_CONSTBUFFER:
if (reg->idx[1].rel_addr) if (reg->idx[1].rel_addr)
{
struct glsl_src_param rel_param;
shader_glsl_add_src_param(ins, reg->idx[1].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
sprintf(register_name, "%s_cb%u[%s + %u]", sprintf(register_name, "%s_cb%u[%s + %u]",
prefix, reg->idx[0].offset, rel_param.param_str, reg->idx[1].offset); prefix, reg->idx[0].offset, rel_param1.param_str, reg->idx[1].offset);
}
else else
{
sprintf(register_name, "%s_cb%u[%u]", prefix, reg->idx[0].offset, reg->idx[1].offset); sprintf(register_name, "%s_cb%u[%u]", prefix, reg->idx[0].offset, reg->idx[1].offset);
}
break; break;
case WINED3DSPR_PRIMID: case WINED3DSPR_PRIMID: