forked from Mirrors/wine-wine
wined3d: Fix relative addressing for SM4+ vertex shader inputs.
Relative addressing doesn't necessarily work for SM3. Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>oldstable
parent
8cb937f719
commit
72ecfb0ae4
|
@ -12339,7 +12339,6 @@ static void test_vs_input_relative_addressing(void)
|
||||||
ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, index, 0, 0);
|
ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, index, 0, 0);
|
||||||
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, white);
|
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, white);
|
||||||
draw_quad(&test_context);
|
draw_quad(&test_context);
|
||||||
todo_wine_if(i > 0)
|
|
||||||
check_texture_color(test_context.backbuffer, colors[i], 1);
|
check_texture_color(test_context.backbuffer, colors[i], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2854,10 +2854,18 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
|
||||||
struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
|
struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
|
||||||
|
|
||||||
if (reg->idx[0].rel_addr)
|
if (reg->idx[0].rel_addr)
|
||||||
FIXME("VS3+ input registers relative addressing.\n");
|
FIXME("VS3 input registers relative addressing.\n");
|
||||||
if (priv->cur_vs_args->swizzle_map & (1u << reg->idx[0].offset))
|
if (priv->cur_vs_args->swizzle_map & (1u << reg->idx[0].offset))
|
||||||
*is_color = TRUE;
|
*is_color = TRUE;
|
||||||
|
if (reg->idx[0].rel_addr)
|
||||||
|
{
|
||||||
|
sprintf(register_name, "%s_in[%s + %u]",
|
||||||
|
prefix, rel_param0.param_str, reg->idx[0].offset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
sprintf(register_name, "%s_in%u", prefix, reg->idx[0].offset);
|
sprintf(register_name, "%s_in%u", prefix, reg->idx[0].offset);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7850,7 +7858,17 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
|
||||||
|
|
||||||
shader_addline(buffer, "void main()\n{\n");
|
shader_addline(buffer, "void main()\n{\n");
|
||||||
|
|
||||||
/* Base Shader Body */
|
if (reg_maps->input_rel_addressing)
|
||||||
|
{
|
||||||
|
unsigned int highest_input_register = wined3d_log2i(reg_maps->input_registers);
|
||||||
|
shader_addline(buffer, "vec4 vs_in[%u];\n", highest_input_register + 1);
|
||||||
|
for (i = 0; i < shader->input_signature.element_count; ++i)
|
||||||
|
{
|
||||||
|
const struct wined3d_shader_signature_element *e = &shader->input_signature.elements[i];
|
||||||
|
shader_addline(buffer, "vs_in[%u] = vs_in%u;\n", e->register_idx, e->register_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (FAILED(shader_generate_code(shader, buffer, reg_maps, &priv_ctx, NULL, NULL)))
|
if (FAILED(shader_generate_code(shader, buffer, reg_maps, &priv_ctx, NULL, NULL)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -709,6 +709,8 @@ static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct w
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WINED3DSPR_INPUT:
|
case WINED3DSPR_INPUT:
|
||||||
|
if (reg->idx[0].rel_addr)
|
||||||
|
reg_maps->input_rel_addressing = 1;
|
||||||
if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
|
if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
|
||||||
{
|
{
|
||||||
/* If relative addressing is used, we must assume that all
|
/* If relative addressing is used, we must assume that all
|
||||||
|
@ -721,7 +723,9 @@ static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct w
|
||||||
shader->u.ps.input_reg_used |= 1u << reg->idx[0].offset;
|
shader->u.ps.input_reg_used |= 1u << reg->idx[0].offset;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
reg_maps->input_registers |= 1u << reg->idx[0].offset;
|
reg_maps->input_registers |= 1u << reg->idx[0].offset;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WINED3DSPR_RASTOUT:
|
case WINED3DSPR_RASTOUT:
|
||||||
|
|
|
@ -1024,7 +1024,8 @@ struct wined3d_shader_reg_maps
|
||||||
DWORD usespow : 1;
|
DWORD usespow : 1;
|
||||||
DWORD point_size : 1;
|
DWORD point_size : 1;
|
||||||
DWORD vocp : 1;
|
DWORD vocp : 1;
|
||||||
DWORD padding : 17;
|
DWORD input_rel_addressing : 1;
|
||||||
|
DWORD padding : 16;
|
||||||
|
|
||||||
DWORD rt_mask; /* Used render targets, 32 max. */
|
DWORD rt_mask; /* Used render targets, 32 max. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue