From: Elizabeth Figura zfigura@codeweavers.com
That is, don't bind them when an FFP state is changed. --- dlls/wined3d/cs.c | 24 ++++++++-------------- dlls/wined3d/stateblock.c | 42 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 19 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index da903e39488..9c01a4de01c 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2143,18 +2143,17 @@ static const struct push_constant_info size_t size; unsigned int max_count; enum wined3d_shader_type shader_type; - enum vkd3d_shader_d3dbc_constant_register shader_binding; } wined3d_cs_push_constant_info[] = { - [WINED3D_PUSH_CONSTANTS_VS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_VS_CONSTS_F, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_PS_CONSTS_F, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_VS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_VS_FFP] = {1, sizeof(struct wined3d_ffp_vs_constants), WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_FFP] = {1, sizeof(struct wined3d_ffp_ps_constants), WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_VS_CONSTS_F, WINED3D_SHADER_TYPE_VERTEX}, + [WINED3D_PUSH_CONSTANTS_PS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_PS_CONSTS_F, WINED3D_SHADER_TYPE_PIXEL}, + [WINED3D_PUSH_CONSTANTS_VS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_VERTEX}, + [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_PIXEL}, + [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_VERTEX}, + [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_PIXEL}, + [WINED3D_PUSH_CONSTANTS_VS_FFP] = {1, sizeof(struct wined3d_ffp_vs_constants), WINED3D_SHADER_TYPE_VERTEX}, + [WINED3D_PUSH_CONSTANTS_PS_FFP] = {1, sizeof(struct wined3d_ffp_ps_constants), WINED3D_SHADER_TYPE_PIXEL}, };
static bool prepare_push_constant_buffer(struct wined3d_device_context *context, enum wined3d_push_constants type) @@ -2184,13 +2183,6 @@ static bool prepare_push_constant_buffer(struct wined3d_device_context *context, return false; }
- if (gpu) - { - struct wined3d_constant_buffer_state state = {.buffer = device->push_constants[type], .size = desc.byte_width}; - - wined3d_device_context_emit_set_constant_buffers(context, info->shader_type, info->shader_binding, 1, &state); - } - return true; }
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 56901326441..dc72d858bde 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3021,6 +3021,20 @@ static struct wined3d_shader *get_ffp_pixel_shader(struct wined3d_device *device return ps->shader; }
+static void bind_push_constant_buffer(struct wined3d_device *device, enum wined3d_push_constants type, + enum wined3d_shader_type shader_type, unsigned int shader_binding) +{ + struct wined3d_constant_buffer_state state; + + if (!device->adapter->d3d_info.gpu_push_constants || !device->push_constants[type]) + return; + + state.buffer = device->push_constants[type]; + state.offset = 0; + state.size = device->push_constants[type]->resource.size, + wined3d_device_context_set_constant_buffers(&device->cs->c, shader_type, shader_binding, 1, &state); +} + void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, struct wined3d_stateblock *stateblock) { @@ -3041,13 +3055,10 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
if (changed->vertexShader) { - wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_VERTEX, state->vs); /* Clip planes are affected by the view matrix, but only if not using * vertex shaders. */ changed->clipplane = wined3d_mask_from_size(WINED3D_MAX_CLIP_DISTANCES); } - if (changed->pixelShader) - wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_PIXEL, state->ps);
for (start = 0; ; start = range.offset + range.size) { @@ -3909,6 +3920,27 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, WINED3D_SHADER_CONST_FFP_PS, 0, offsetof(struct wined3d_ffp_ps_constants, color_key), &constants); }
+ if (changed->vertexShader) + { + wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_VERTEX, state->vs); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_VS_F, + WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_VS_I, + WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_VS_B, + WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER); + } + if (changed->pixelShader) + { + wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_PIXEL, state->ps); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_PS_F, + WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_PS_I, + WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_PS_B, + WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER); + } + /* XXX: We don't invalidate HLSL shaders for every field contained in * wined3d_ffp_vs_settings / ffp_frag_settings; only the ones that the HLSL * FFP pipeline cares about. The rest should eventually be removed from @@ -3922,6 +3954,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, struct wined3d_shader *shader = get_ffp_vertex_shader(device, device->cs->c.state);
wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_VERTEX, shader); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_VS_FFP, + WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER); } else { @@ -3937,6 +3971,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, struct wined3d_shader *shader = get_ffp_pixel_shader(device, device->cs->c.state);
wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_PIXEL, shader); + bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_PS_FFP, + WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER); } else {
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/shader_spirv.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 7825ee7e02c..88af5925507 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -66,9 +66,8 @@ struct shader_spirv_compile_arguments } vs; struct { - uint32_t alpha_swizzle; + struct ps_compile_args args; unsigned int sample_count; - bool dual_source_blending; } fs; } u; }; @@ -124,23 +123,17 @@ static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_argu const struct wined3d_context *context, const struct wined3d_shader *shader, const struct wined3d_state *state, unsigned int sample_count) { - struct wined3d_rendertarget_view *rtv; - unsigned int i; - memset(args, 0, sizeof(*args));
switch (shader->reg_maps.shader_version.type) { case WINED3D_SHADER_TYPE_PIXEL: - for (i = 0; i < ARRAY_SIZE(state->fb.render_targets); ++i) - { - if (!(rtv = state->fb.render_targets[i]) || rtv->format->id == WINED3DFMT_NULL) - continue; - if (rtv->format->id == WINED3DFMT_A8_UNORM && !is_identity_fixup(rtv->format->color_fixup)) - args->u.fs.alpha_swizzle |= 1u << i; - } + /* The context here doesn't have a valid stream info, but that's + * fine, because we have full_ffp_varyings. */ + find_ps_compile_args(state, shader, + state->vertex_declaration && state->vertex_declaration->position_transformed, + &args->u.fs.args, context); args->u.fs.sample_count = sample_count; - args->u.fs.dual_source_blending = state->blend_state && state->blend_state->dual_source; break;
case WINED3D_SHADER_TYPE_VERTEX: @@ -187,7 +180,7 @@ static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info
if (shader_type == WINED3D_SHADER_TYPE_PIXEL) { - unsigned int rt_alpha_swizzle = compile_args->u.fs.alpha_swizzle; + unsigned int rt_alpha_swizzle = compile_args->u.fs.args.rt_alpha_swizzle; struct vkd3d_shader_parameter *shader_parameter;
shader_parameter = &args->sample_count; @@ -196,7 +189,7 @@ static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info shader_parameter->data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; shader_parameter->u.immediate_constant.u.u32 = compile_args->u.fs.sample_count;
- args->spirv_target.dual_source_blending = compile_args->u.fs.dual_source_blending; + args->spirv_target.dual_source_blending = compile_args->u.fs.args.dual_source_blend;
args->spirv_target.parameter_count = 1; args->spirv_target.parameters = shader_parameter;
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/shader_spirv.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 88af5925507..24a5fbd87da 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -105,7 +105,7 @@ struct wined3d_shader_spirv_compile_args struct vkd3d_shader_varying_map_info varying_map; struct vkd3d_shader_spirv_target_info spirv_target; enum vkd3d_shader_spirv_extension extensions[1]; - struct vkd3d_shader_parameter sample_count; + struct vkd3d_shader_parameter parameters[2]; unsigned int ps_alpha_swizzle[WINED3D_MAX_RENDER_TARGETS]; };
@@ -158,6 +158,25 @@ static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_argu } }
+static void fill_ps_parameters(struct wined3d_shader_spirv_compile_args *vkd3d_args, + const struct shader_spirv_compile_arguments *compile_args) +{ + struct vkd3d_shader_parameter *parameters = vkd3d_args->parameters; + + parameters[0].name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT; + parameters[0].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; + parameters[0].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; + parameters[0].u.immediate_constant.u.u32 = compile_args->u.fs.sample_count; + + parameters[1].name = VKD3D_SHADER_PARAMETER_NAME_FLAT_INTERPOLATION; + parameters[1].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; + parameters[1].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; + parameters[1].u.immediate_constant.u.u32 = compile_args->u.fs.args.flatshading; + + vkd3d_args->spirv_target.parameter_count = 2; + vkd3d_args->spirv_target.parameters = vkd3d_args->parameters; +} + static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info, struct wined3d_shader_spirv_compile_args *args, struct vkd3d_shader_interface_info *vkd3d_interface, enum vkd3d_shader_spirv_environment environment, @@ -181,19 +200,11 @@ static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info if (shader_type == WINED3D_SHADER_TYPE_PIXEL) { unsigned int rt_alpha_swizzle = compile_args->u.fs.args.rt_alpha_swizzle; - struct vkd3d_shader_parameter *shader_parameter;
- shader_parameter = &args->sample_count; - shader_parameter->name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT; - shader_parameter->type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; - shader_parameter->data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; - shader_parameter->u.immediate_constant.u.u32 = compile_args->u.fs.sample_count; + fill_ps_parameters(args, compile_args);
args->spirv_target.dual_source_blending = compile_args->u.fs.args.dual_source_blend;
- args->spirv_target.parameter_count = 1; - args->spirv_target.parameters = shader_parameter; - for (i = 0; i < ARRAY_SIZE(args->ps_alpha_swizzle); ++i) { if (rt_alpha_swizzle && (1u << i)) @@ -1127,6 +1138,7 @@ static void spirv_vertex_pipe_vk_vp_disable(const struct wined3d_context *contex static void spirv_vertex_pipe_vk_vp_get_caps(const struct wined3d_adapter *adapter, struct wined3d_vertex_caps *caps) { memset(caps, 0, sizeof(*caps)); + caps->emulated_flatshading = true; }
static unsigned int spirv_vertex_pipe_vk_vp_get_emul_mask(const struct wined3d_adapter *adapter)
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index bd76e5dc27b..b3baacf741d 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -10883,12 +10883,16 @@ static void shader_glsl_update_graphics_program(struct shader_glsl_priv *priv, context_gl->c.shader_update_mask |= (1u << WINED3D_SHADER_TYPE_COMPUTE); }
+static void shader_glsl_update_legacy_states(struct wined3d_context_gl *context_gl, const struct wined3d_state *state); + static void shader_glsl_apply_draw_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state) { struct wined3d_context_gl *context_gl = wined3d_context_gl(context); struct shader_glsl_priv *priv = shader_priv;
+ shader_glsl_update_legacy_states(context_gl, state); + if (context->shader_update_mask & ~(1u << WINED3D_SHADER_TYPE_COMPUTE)) shader_glsl_update_graphics_program(priv, context_gl, state);
@@ -12162,10 +12166,10 @@ static void glsl_fragment_pipe_tex_transform(struct wined3d_context *context, context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; }
-static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) +static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context_gl *context_gl, + const struct wined3d_state *state) { - const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info; + const struct wined3d_gl_info *gl_info = context_gl->gl_info; GLint func = wined3d_gl_compare_func(state->render_states[WINED3D_RS_ALPHAFUNC]); float ref = wined3d_alpha_ref(state);
@@ -12182,10 +12186,10 @@ static void glsl_fragment_pipe_core_alpha_test(struct wined3d_context *context, context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; }
-static void glsl_fragment_pipe_alpha_test(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) +static void glsl_fragment_pipe_alpha_test(struct wined3d_context_gl *context_gl, + const struct wined3d_state *state) { - const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info; + const struct wined3d_gl_info *gl_info = context_gl->gl_info;
if (state->render_states[WINED3D_RS_ALPHATESTENABLE]) { @@ -12216,11 +12220,8 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {STATE_VDECL, {STATE_VDECL, glsl_fragment_pipe_vdecl }, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), glsl_fragment_pipe_vs }, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), glsl_fragment_pipe_shader }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHAFUNC), glsl_fragment_pipe_alpha_test_func }, WINED3D_GL_LEGACY_CONTEXT}, {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_ALPHAREF), {STATE_RENDER(WINED3D_RS_ALPHAFUNC), NULL }, WINED3D_GL_LEGACY_CONTEXT}, {STATE_RENDER(WINED3D_RS_ALPHAREF), {STATE_RENDER(WINED3D_RS_ALPHAREF), glsl_fragment_pipe_core_alpha_test_ref }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), glsl_fragment_pipe_alpha_test }, WINED3D_GL_LEGACY_CONTEXT}, {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), glsl_fragment_pipe_core_alpha_test }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), state_nop }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), glsl_fragment_pipe_fog }, WINED3D_GL_EXT_NONE }, @@ -12342,6 +12343,21 @@ const struct wined3d_fragment_pipe_ops glsl_fragment_pipe = .states = glsl_fragment_pipe_state_template, };
+static void shader_glsl_update_legacy_states(struct wined3d_context_gl *context_gl, const struct wined3d_state *state) +{ + if (!context_gl->gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]) + return; + + if (context_gl->c.shader_update_mask & (1u << WINED3D_SHADER_TYPE_PIXEL)) + { + glsl_fragment_pipe_alpha_test(context_gl, state); + glsl_fragment_pipe_alpha_test_func(context_gl, state); + } + + if (context_gl->c.constant_update_mask & WINED3D_SHADER_CONST_PS_ALPHA_TEST) + glsl_fragment_pipe_alpha_test_func(context_gl, state); +} + struct glsl_blitter_args { GLenum texture_type;
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/ffp_gl.c | 2 +- dlls/wined3d/glsl_shader.c | 17 ++++++----------- dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/stateblock.c | 10 ++++++++++ dlls/wined3d/wined3d_private.h | 8 +++----- 5 files changed, 20 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 72c30dc5faf..98363dcac14 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1597,7 +1597,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) { { 1, 8}, { 11, 14}, - { 16, 23}, + { 16, 24}, { 27, 27}, { 30, 33}, { 39, 40}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index b3baacf741d..af25e3db538 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1998,9 +1998,10 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv,
if (update_mask & WINED3D_SHADER_CONST_PS_ALPHA_TEST) { - float ref = wined3d_alpha_ref(state); + const struct wined3d_ffp_ps_constants *constants = wined3d_buffer_load_sysmem( + context_gl->c.device->push_constants[WINED3D_PUSH_CONSTANTS_PS_FFP], &context_gl->c);
- GL_EXTCALL(glUniform1f(prog->ps.alpha_test_ref_location, ref)); + GL_EXTCALL(glUniform1f(prog->ps.alpha_test_ref_location, constants->alpha_test_ref)); checkGLcall("alpha test emulation uniform"); }
@@ -12169,13 +12170,14 @@ static void glsl_fragment_pipe_tex_transform(struct wined3d_context *context, static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context_gl *context_gl, const struct wined3d_state *state) { + const struct wined3d_ffp_ps_constants *constants = wined3d_buffer_load_sysmem( + context_gl->c.device->push_constants[WINED3D_PUSH_CONSTANTS_PS_FFP], &context_gl->c); const struct wined3d_gl_info *gl_info = context_gl->gl_info; GLint func = wined3d_gl_compare_func(state->render_states[WINED3D_RS_ALPHAFUNC]); - float ref = wined3d_alpha_ref(state);
if (func) { - gl_info->gl_ops.gl.p_glAlphaFunc(func, ref); + gl_info->gl_ops.gl.p_glAlphaFunc(func, constants->alpha_test_ref); checkGLcall("glAlphaFunc"); } } @@ -12203,12 +12205,6 @@ static void glsl_fragment_pipe_alpha_test(struct wined3d_context_gl *context_gl, } }
-static void glsl_fragment_pipe_core_alpha_test_ref(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - context->constant_update_mask |= WINED3D_SHADER_CONST_PS_ALPHA_TEST; -} - static void glsl_fragment_pipe_shademode(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -12221,7 +12217,6 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), glsl_fragment_pipe_vs }, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), glsl_fragment_pipe_shader }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_ALPHAREF), {STATE_RENDER(WINED3D_RS_ALPHAREF), glsl_fragment_pipe_core_alpha_test_ref }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), glsl_fragment_pipe_core_alpha_test }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), state_nop }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), glsl_fragment_pipe_fog }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 24a5fbd87da..038c3067454 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1241,7 +1241,6 @@ static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_state { {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), state_nop}}, - {STATE_RENDER(WINED3D_RS_ALPHAREF), {STATE_RENDER(WINED3D_RS_ALPHAREF), state_nop}}, {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHAFUNC), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGCOLOR), {STATE_RENDER(WINED3D_RS_FOGCOLOR), state_nop}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index dc72d858bde..77008088f85 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3180,6 +3180,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, case WINED3D_RS_POINTSCALE_B: case WINED3D_RS_POINTSCALE_C: case WINED3D_RS_TEXTUREFACTOR: + case WINED3D_RS_ALPHAREF: break;
case WINED3D_RS_ANTIALIAS: @@ -3920,6 +3921,15 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, WINED3D_SHADER_CONST_FFP_PS, 0, offsetof(struct wined3d_ffp_ps_constants, color_key), &constants); }
+ if (wined3d_bitmap_is_set(changed->renderState, WINED3D_RS_ALPHAREF)) + { + float f = (state->rs[WINED3D_RS_ALPHAREF] & 0xff) / 255.0f; + + wined3d_device_context_push_constants(context, + WINED3D_PUSH_CONSTANTS_PS_FFP, WINED3D_SHADER_CONST_PS_ALPHA_TEST, + offsetof(struct wined3d_ffp_ps_constants, alpha_test_ref), sizeof(f), &f); + } + if (changed->vertexShader) { wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_VERTEX, state->vs); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 18cbbae0fbe..0ab36c2d94d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2815,6 +2815,9 @@ struct wined3d_ffp_ps_constants float lscale[WINED3D_MAX_FFP_TEXTURES]; float loffset[WINED3D_MAX_FFP_TEXTURES]; } bumpenv; + + /* States not used by the HLSL pipeline. */ + float alpha_test_ref; };
enum wined3d_push_constants @@ -3143,11 +3146,6 @@ void wined3d_allocator_cleanup(struct wined3d_allocator *allocator); bool wined3d_allocator_init(struct wined3d_allocator *allocator, size_t pool_count, const struct wined3d_allocator_ops *allocator_ops);
-static inline float wined3d_alpha_ref(const struct wined3d_state *state) -{ - return (state->render_states[WINED3D_RS_ALPHAREF] & 0xff) / 255.0f; -} - const char *wined3d_debug_resource_access(uint32_t access); const char *wined3d_debug_bind_flags(uint32_t bind_flags); const char *wined3d_debug_view_desc(const struct wined3d_view_desc *d,
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/shader_spirv.c | 58 ++++++++++++++++++++++++++++------ dlls/wined3d/stateblock.c | 3 ++ dlls/wined3d/wined3d_private.h | 7 ++++ 3 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 038c3067454..9a1fd1dd3fc 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -43,6 +43,8 @@ struct shader_spirv_resource_bindings
size_t binding_base[WINED3D_SHADER_TYPE_COUNT]; enum wined3d_shader_type so_stage; + + uint32_t ffp_extra_binding[2]; };
struct shader_spirv_priv @@ -104,8 +106,9 @@ struct wined3d_shader_spirv_compile_args { struct vkd3d_shader_varying_map_info varying_map; struct vkd3d_shader_spirv_target_info spirv_target; + struct vkd3d_shader_parameter_info parameter_info; enum vkd3d_shader_spirv_extension extensions[1]; - struct vkd3d_shader_parameter parameters[2]; + struct vkd3d_shader_parameter1 parameters[4]; unsigned int ps_alpha_swizzle[WINED3D_MAX_RENDER_TARGETS]; };
@@ -159,9 +162,9 @@ static void shader_spirv_compile_arguments_init(struct shader_spirv_compile_argu }
static void fill_ps_parameters(struct wined3d_shader_spirv_compile_args *vkd3d_args, - const struct shader_spirv_compile_arguments *compile_args) + const struct shader_spirv_compile_arguments *compile_args, uint32_t ffp_extra_binding) { - struct vkd3d_shader_parameter *parameters = vkd3d_args->parameters; + struct vkd3d_shader_parameter1 *parameters = vkd3d_args->parameters;
parameters[0].name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT; parameters[0].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; @@ -173,24 +176,40 @@ static void fill_ps_parameters(struct wined3d_shader_spirv_compile_args *vkd3d_a parameters[1].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; parameters[1].u.immediate_constant.u.u32 = compile_args->u.fs.args.flatshading;
- vkd3d_args->spirv_target.parameter_count = 2; - vkd3d_args->spirv_target.parameters = vkd3d_args->parameters; + parameters[2].name = VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_FUNC; + parameters[2].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; + parameters[2].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; + parameters[2].u.immediate_constant.u.u32 = compile_args->u.fs.args.alpha_test_func + 1; + + parameters[3].name = VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_REF; + parameters[3].type = VKD3D_SHADER_PARAMETER_TYPE_BUFFER; + parameters[3].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_FLOAT32; + parameters[3].u.buffer.set = 0; + parameters[3].u.buffer.binding = ffp_extra_binding; + parameters[3].u.buffer.offset = offsetof(struct wined3d_ffp_ps_constants, alpha_test_ref); + + vkd3d_args->parameter_info.parameter_count = 4; + vkd3d_args->parameter_info.parameters = vkd3d_args->parameters; }
static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info, struct wined3d_shader_spirv_compile_args *args, struct vkd3d_shader_interface_info *vkd3d_interface, enum vkd3d_shader_spirv_environment environment, enum wined3d_shader_type shader_type, enum vkd3d_shader_source_type source_type, - const struct shader_spirv_compile_arguments *compile_args) + const struct shader_spirv_compile_arguments *compile_args, + const struct shader_spirv_resource_bindings *bindings) { unsigned int i;
memset(args, 0, sizeof(*args)); args->spirv_target.type = VKD3D_SHADER_STRUCTURE_TYPE_SPIRV_TARGET_INFO; - args->spirv_target.next = vkd3d_interface; + args->spirv_target.next = &args->parameter_info; args->spirv_target.entry_point = "main"; args->spirv_target.environment = environment;
+ args->parameter_info.type = VKD3D_SHADER_STRUCTURE_TYPE_PARAMETER_INFO; + args->parameter_info.next = vkd3d_interface; + args->spirv_target.extensions = args->extensions;
if (vk_info->supported[WINED3D_VK_EXT_SHADER_STENCIL_EXPORT]) @@ -201,7 +220,7 @@ static void shader_spirv_init_compile_args(const struct wined3d_vk_info *vk_info { unsigned int rt_alpha_swizzle = compile_args->u.fs.args.rt_alpha_swizzle;
- fill_ps_parameters(args, compile_args); + fill_ps_parameters(args, compile_args, bindings->ffp_extra_binding[WINED3D_SHADER_TYPE_PIXEL]);
args->spirv_target.dual_source_blending = compile_args->u.fs.args.dual_source_blend;
@@ -275,7 +294,7 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con
shader_spirv_init_shader_interface_vk(&iface, bindings, so_desc); shader_spirv_init_compile_args(vk_info, &compile_args, &iface.vkd3d_interface, - VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0, shader_type, source_type, args); + VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_0, shader_type, source_type, args, bindings);
info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO; info.next = &compile_args.spirv_target; @@ -707,6 +726,27 @@ static bool shader_spirv_resource_bindings_init(struct shader_spirv_resource_bin return false; } } + + /* vkd3d-shader doesn't scan the uniform buffers we use for parameters. + * It can't really be reasonably modified to do so either, because + * parameters are specified in terms of the destination environment + * (SPIRV binding set and index). Add them manually here. + * + * Note that vkd3d-shader will ignore the extra binding specified in + * struct shader_spirv_resource_bindings, but we use it elsewhere. */ + + if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE) + { + if (!shader_spirv_resource_bindings_add_binding(bindings, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, WINED3D_FFP_CONSTANTS_EXTRA_REGISTER, + shader_visibility, vk_stage, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding_idx)) + return false; + if (!wined3d_shader_resource_bindings_add_binding(wined3d_bindings, shader_type, + WINED3D_SHADER_DESCRIPTOR_TYPE_CBV, WINED3D_FFP_CONSTANTS_EXTRA_REGISTER, + WINED3D_SHADER_RESOURCE_BUFFER, WINED3D_DATA_FLOAT, binding_idx)) + return false; + bindings->ffp_extra_binding[shader_type] = binding_idx; + } }
return true; diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 77008088f85..a5c047be9dd 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -3991,6 +3991,9 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, } }
+ bind_push_constant_buffer(device, WINED3D_PUSH_CONSTANTS_PS_FFP, + WINED3D_SHADER_TYPE_PIXEL, WINED3D_FFP_CONSTANTS_EXTRA_REGISTER); + assert(list_empty(&stateblock->changed.changed_lights)); memset(&stateblock->changed, 0, sizeof(stateblock->changed)); list_init(&stateblock->changed.changed_lights); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 0ab36c2d94d..24ce6425a3f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2818,8 +2818,15 @@ struct wined3d_ffp_ps_constants
/* States not used by the HLSL pipeline. */ float alpha_test_ref; + float padding[3]; /* to align to 16 bytes */ };
+/* Float/int/bool constants are bound to VKD3D_SHADER_D3DBC_*_CONSTANT_REGISTER + * which have the values 0/1/2 respectively. + * FFP uniform constants active even with shaders (e.g. alpha test ref) need to + * be additionally bound to a different slot. */ +#define WINED3D_FFP_CONSTANTS_EXTRA_REGISTER 3 + enum wined3d_push_constants { WINED3D_PUSH_CONSTANTS_VS_F,
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=151023
Your paranoid android.
=== debian11b (64 bit WoW report) ===
user32: input.c:4306: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 0000000001A700F6, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
This merge request was approved by Jan Sikorski.