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,