From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/context_gl.c | 2 +- dlls/wined3d/ffp_gl.c | 3 +-- dlls/wined3d/glsl_shader.c | 30 +----------------------------- dlls/wined3d/shader.c | 4 +--- dlls/wined3d/shader_spirv.c | 2 -- dlls/wined3d/stateblock.c | 5 +++++ dlls/wined3d/utils.c | 4 +--- dlls/wined3d/wined3d_private.h | 1 + 8 files changed, 11 insertions(+), 40 deletions(-)
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index 8443952cff8..69f0bc4e786 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -3192,7 +3192,7 @@ void wined3d_context_gl_apply_blit_state(struct wined3d_context_gl *context_gl, if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]) { gl_info->gl_ops.gl.p_glDisable(GL_ALPHA_TEST); - context_invalidate_state(context, STATE_RENDER(WINED3D_RS_ALPHATESTENABLE)); + context_invalidate_state(context, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); } gl_info->gl_ops.gl.p_glDisable(GL_BLEND); gl_info->gl_ops.gl.p_glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index a0411214733..c04499e553e 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1560,8 +1560,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) rs_holes[] = { { 1, 8}, - { 11, 14}, - { 16, 24}, + { 11, 25}, { 27, 27}, { 30, 34}, { 36, 40}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index f906d7caa82..ba0314a6bae 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -12110,7 +12110,7 @@ static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context_gl *contex GLfloat ref; GLint func;
- if ((func = wined3d_gl_compare_func(state->render_states[WINED3D_RS_ALPHAFUNC]))) + if ((func = wined3d_gl_compare_func(state->extra_ps_args.alpha_func))) { if ((buffer = context_gl->c.device->push_constants[WINED3D_PUSH_CONSTANTS_PS_FFP])) ref = (constants = wined3d_buffer_load_sysmem(buffer, &context_gl->c))->alpha_test_ref; @@ -12121,36 +12121,11 @@ static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context_gl *contex } }
-static void glsl_fragment_pipe_core_alpha_test(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; -} - -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 = context_gl->gl_info; - - if (state->render_states[WINED3D_RS_ALPHATESTENABLE]) - { - gl_info->gl_ops.gl.p_glEnable(GL_ALPHA_TEST); - checkGLcall("glEnable(GL_ALPHA_TEST)"); - } - else - { - gl_info->gl_ops.gl.p_glDisable(GL_ALPHA_TEST); - checkGLcall("glDisable(GL_ALPHA_TEST)"); - } -} - static const struct wined3d_state_entry_template glsl_fragment_pipe_state_template[] = { {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_ALPHATESTENABLE), NULL }, 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_SRGBWRITEENABLE), {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), state_srgbwrite }, ARB_FRAMEBUFFER_SRGB}, {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, @@ -12270,10 +12245,7 @@ static void shader_glsl_update_legacy_states(struct wined3d_context_gl *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); diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 6d4e07ed82e..6c198f9d23b 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -3115,9 +3115,7 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3 if (d3d_info->ffp_alpha_test) args->alpha_test_func = WINED3D_CMP_ALWAYS - 1; else - args->alpha_test_func = (state->render_states[WINED3D_RS_ALPHATESTENABLE] - ? wined3d_sanitize_cmp_func(state->render_states[WINED3D_RS_ALPHAFUNC]) - : WINED3D_CMP_ALWAYS) - 1; + args->alpha_test_func = state->extra_ps_args.alpha_func - 1;
if (d3d_info->emulated_flatshading) args->flatshading = state->extra_ps_args.flat_shading; diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 93fbdbf864e..5f01bb3ea03 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1283,8 +1283,6 @@ static void spirv_fragment_pipe_vk_fp_free_context_data(struct wined3d_context *
static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_states[] = { - {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), state_nop}}, - {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHAFUNC), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), state_nop}}, {0}, /* Terminate */ diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index a586d102fb7..c4f0ae1fed0 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1708,6 +1708,8 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb stateblock->changed.fog_constants = 1; break;
+ case WINED3D_RS_ALPHAFUNC: + case WINED3D_RS_ALPHATESTENABLE: case WINED3D_RS_POINTSPRITEENABLE: case WINED3D_RS_SHADEMODE: stateblock->changed.extra_ps_args = 1; @@ -3217,6 +3219,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, case WINED3D_RS_FOGEND: case WINED3D_RS_FOGSTART: case WINED3D_RS_POINTSPRITEENABLE: + case WINED3D_RS_ALPHAFUNC: + case WINED3D_RS_ALPHATESTENABLE: break;
case WINED3D_RS_ANTIALIAS: @@ -3965,6 +3969,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, args.flat_shading = state->rs[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT; args.fog_enable = state->rs[WINED3D_RS_FOGENABLE]; args.fog_mode = state->rs[WINED3D_RS_FOGTABLEMODE]; + args.alpha_func = state->rs[WINED3D_RS_ALPHATESTENABLE] ? state->rs[WINED3D_RS_ALPHAFUNC] : WINED3D_CMP_ALWAYS; wined3d_device_context_emit_set_extra_ps_args(context, &args); }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index fd0715a004f..33b30b1d0bd 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6455,9 +6455,7 @@ void wined3d_ffp_get_fs_settings(const struct wined3d_state *state, if (d3d_info->ffp_alpha_test) settings->alpha_test_func = WINED3D_CMP_ALWAYS - 1; else - settings->alpha_test_func = (state->render_states[WINED3D_RS_ALPHATESTENABLE] - ? wined3d_sanitize_cmp_func(state->render_states[WINED3D_RS_ALPHAFUNC]) - : WINED3D_CMP_ALWAYS) - 1; + settings->alpha_test_func = state->extra_ps_args.alpha_func - 1;
if (d3d_info->emulated_flatshading) settings->flatshading = state->extra_ps_args.flat_shading; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f9674643983..d9f8c939194 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2879,6 +2879,7 @@ struct wined3d_extra_ps_args bool flat_shading; bool fog_enable; enum wined3d_fog_mode fog_mode; + enum wined3d_cmp_func alpha_func; };
struct wined3d_blend_state