The eventual goal for the HLSL FFP pipeline is to set the shader to an internally constructed wined3d_shader object early, so that all the existing backend logic that works with real shaders can be reused.
Specifically, we want to construct this shader before e.g. context_gl_load_shader_resources() and context_update_stream_info(), both functions which currently execute before applying state tables but which operate on the currently bound shaders. In fact, because the HLSL FFP pipeline is intended to be backend-agnostic, the goal is to construct the replacement shaders from within wined3d_cs_exec_draw().
This means that the "invalidate the FFP shader" flag—for which we simply reuse STATE_SHADER—needs to be set earlier, specifically before the draw call is submitted to the CS. Hence we do it from wined3d_device_apply_stateblock().
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/cs.c | 5 ++++- dlls/wined3d/ffp_gl.c | 1 - dlls/wined3d/glsl_shader.c | 2 -- dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/utils.c | 2 -- dlls/wined3d/wined3d_private.h | 5 +---- 6 files changed, 5 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index d35c33f678c..3e6c292547f 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1035,7 +1035,10 @@ static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) if ((geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY]) && !geometry_shader->function) device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY)); if (state->primitive_type == WINED3D_PT_POINTLIST || op->primitive_type == WINED3D_PT_POINTLIST) - device_invalidate_state(cs->c.device, STATE_POINT_ENABLE); + { + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX)); + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); + } state->primitive_type = op->primitive_type; for (i = 0; i < device->context_count; ++i) device->contexts[i]->update_primitive_type = 1; diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 84ae038f176..1e5a5982f21 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1710,7 +1710,6 @@ static void validate_state_table(struct wined3d_state_entry *state_table) STATE_RASTERIZER, STATE_BASEVERTEXINDEX, STATE_FRAMEBUFFER, - STATE_POINT_ENABLE, STATE_BLEND, STATE_BLEND_FACTOR, STATE_DEPTH_STENCIL, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 11036e33f6e..19d2590763a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -12025,7 +12025,6 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_pointsprite_w }, WINED3D_GL_LEGACY_CONTEXT }, {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), glsl_vertex_pointsprite_core}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSIZE_MAX), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, glsl_vertex_pipe_shader}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_vertex_pipe_shademode}, WINED3D_GLSL_130 }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_vertex_pipe_nop }, WINED3D_GL_EXT_NONE }, {0 /* Terminate */, {0, NULL }, WINED3D_GL_EXT_NONE }, @@ -12368,7 +12367,6 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {STATE_TEXTURESTAGE(5,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(6,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(7,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, - {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, glsl_fragment_pipe_shader }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_fragment_pipe_shademode }, WINED3D_GLSL_130 }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), state_shademode }, WINED3D_GL_EXT_NONE }, {0 /* Terminate */, {0, 0 }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index c533ca2798a..1999b35a290 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1256,7 +1256,6 @@ static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_state {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), state_nop}}, - {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, state_nop}}, {0}, /* Terminate */ };
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 0eda0acc4e9..d045b4e346c 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5377,8 +5377,6 @@ const char *debug_d3dstate(uint32_t state) return "STATE_BASEVERTEXINDEX"; if (STATE_IS_FRAMEBUFFER(state)) return "STATE_FRAMEBUFFER"; - if (STATE_IS_POINT_ENABLE(state)) - return "STATE_POINT_ENABLE"; if (STATE_IS_STREAM_OUTPUT(state)) return "STATE_STREAM_OUTPUT"; if (STATE_IS_BLEND(state)) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index eff2400fd8f..a194377b8c6 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1769,10 +1769,7 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state #define STATE_FRAMEBUFFER (STATE_BASEVERTEXINDEX + 1) #define STATE_IS_FRAMEBUFFER(a) ((a) == STATE_FRAMEBUFFER)
-#define STATE_POINT_ENABLE (STATE_FRAMEBUFFER + 1) -#define STATE_IS_POINT_ENABLE(a) ((a) == STATE_POINT_ENABLE) - -#define STATE_STREAM_OUTPUT (STATE_POINT_ENABLE + 1) +#define STATE_STREAM_OUTPUT (STATE_FRAMEBUFFER + 1) #define STATE_IS_STREAM_OUTPUT(a) ((a) == STATE_STREAM_OUTPUT)
#define STATE_BLEND (STATE_STREAM_OUTPUT + 1)
From: Elizabeth Figura zfigura@codeweavers.com
The eventual goal for the HLSL FFP pipeline is to set the shader to an internally constructed wined3d_shader object early, so that all the existing backend logic that works with real shaders can be reused.
Specifically, we want to construct this shader before e.g. context_gl_load_shader_resources() and context_update_stream_info(), both functions which currently execute before applying state tables but which operate on the currently bound shaders. In fact, because the HLSL FFP pipeline is intended to be backend-agnostic, the goal is to construct the replacement shaders from within wined3d_cs_exec_draw().
This means that the "invalidate the FFP shader" flag—for which we simply reuse STATE_SHADER—needs to be set earlier, specifically before the draw call is submitted to the CS. Hence we do it from wined3d_device_apply_stateblock(). --- dlls/wined3d/cs.c | 11 ++---- dlls/wined3d/glsl_shader.c | 73 +------------------------------------- dlls/wined3d/stateblock.c | 20 +++++++++++ 3 files changed, 24 insertions(+), 80 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 3e6c292547f..fb3a10914cc 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1541,10 +1541,8 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) if (!prev && op->bind_index < d3d_info->ffp_fragment_caps.max_blend_stages) { /* The source arguments for color and alpha ops have different - * meanings when a NULL texture is bound, so the COLOR_OP and - * ALPHA_OP have to be dirtified. */ - device_invalidate_state(cs->c.device, STATE_TEXTURESTAGE(op->bind_index, WINED3D_TSS_COLOR_OP)); - device_invalidate_state(cs->c.device, STATE_TEXTURESTAGE(op->bind_index, WINED3D_TSS_ALPHA_OP)); + * meanings when a NULL texture is bound. */ + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); }
if (!op->bind_index && texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT) @@ -1561,10 +1559,7 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) if (op->shader_type == WINED3D_SHADER_TYPE_PIXEL) { if (!op->view && op->bind_index < d3d_info->ffp_fragment_caps.max_blend_stages) - { - device_invalidate_state(cs->c.device, STATE_TEXTURESTAGE(op->bind_index, WINED3D_TSS_COLOR_OP)); - device_invalidate_state(cs->c.device, STATE_TEXTURESTAGE(op->bind_index, WINED3D_TSS_ALPHA_OP)); - } + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL));
if (!op->bind_index && prev_texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT) old_use_color_key = TRUE; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 19d2590763a..4ee13709126 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -12212,6 +12212,7 @@ static void glsl_fragment_pipe_vs(struct wined3d_context *context, static void glsl_fragment_pipe_tex_transform(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { + /* Because of args->tex_transform. */ context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; }
@@ -12268,78 +12269,6 @@ 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_TEXTURESTAGE(0, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(0, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(1, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(2, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(3, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(4, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(5, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(6, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_COLOR_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_OP), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG1), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG2), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_ALPHA_ARG0), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_TEXTURESTAGE(7, WINED3D_TSS_RESULT_ARG), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, 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 }, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 9fde09b0ff1..3caa318ce8a 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -64,6 +64,7 @@ struct wined3d_saved_states uint32_t texture_matrices : 1; uint32_t modelview_matrices : 1; uint32_t point_scale : 1; + uint32_t ffp_ps_settings : 1; };
struct stage_state @@ -1645,6 +1646,19 @@ void CDECL wined3d_stateblock_set_texture_stage_state(struct wined3d_stateblock case WINED3D_TSS_TEXCOORD_INDEX: case WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS: stateblock->changed.texture_matrices = 1; + stateblock->changed.ffp_ps_settings = 1; + break; + + case WINED3D_TSS_ALPHA_ARG0: + case WINED3D_TSS_ALPHA_ARG1: + case WINED3D_TSS_ALPHA_ARG2: + case WINED3D_TSS_ALPHA_OP: + case WINED3D_TSS_COLOR_ARG0: + case WINED3D_TSS_COLOR_ARG1: + case WINED3D_TSS_COLOR_ARG2: + case WINED3D_TSS_COLOR_OP: + case WINED3D_TSS_RESULT_ARG: + stateblock->changed.ffp_ps_settings = 1; break;
default: @@ -3626,6 +3640,12 @@ 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->ffp_ps_settings && !state->ps) + { + /* Force invalidation of the pixel shader. */ + wined3d_device_context_emit_set_shader(context, WINED3D_SHADER_TYPE_PIXEL, NULL); + } + assert(list_empty(&stateblock->changed.changed_lights)); memset(&stateblock->changed, 0, sizeof(stateblock->changed)); list_init(&stateblock->changed.changed_lights);
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/cs.c | 6 +++--- dlls/wined3d/ffp_gl.c | 3 +-- dlls/wined3d/glsl_shader.c | 1 - dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/stateblock.c | 4 ++++ 5 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index fb3a10914cc..063c5035290 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1569,7 +1569,7 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) device_invalidate_state(cs->c.device, STATE_GRAPHICS_SHADER_RESOURCE_BINDING);
if (new_use_color_key != old_use_color_key) - device_invalidate_state(cs->c.device, STATE_RENDER(WINED3D_RS_COLORKEYENABLE)); + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); }
void wined3d_device_context_emit_set_texture(struct wined3d_device_context *context, @@ -1945,7 +1945,7 @@ static void wined3d_cs_exec_set_color_key(struct wined3d_cs *cs, const void *dat if (texture == wined3d_state_get_ffp_texture(&cs->state, 0)) { if (!(texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT)) - device_invalidate_state(cs->c.device, STATE_RENDER(WINED3D_RS_COLORKEYENABLE)); + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); }
texture->async.src_blt_color_key = op->color_key; @@ -1973,7 +1973,7 @@ static void wined3d_cs_exec_set_color_key(struct wined3d_cs *cs, const void *dat case WINED3D_CKEY_SRC_BLT: if (texture == wined3d_state_get_ffp_texture(&cs->state, 0) && texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT) - device_invalidate_state(cs->c.device, STATE_RENDER(WINED3D_RS_COLORKEYENABLE)); + device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL));
texture->async.color_key_flags &= ~WINED3D_CKEY_SRC_BLT; break; diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 1e5a5982f21..2cfe3954b32 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1670,8 +1670,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) { 16, 23}, { 27, 27}, { 30, 33}, - { 39, 40}, - { 42, 47}, + { 39, 47}, { 49, 135}, {138, 139}, {144, 144}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 4ee13709126..3cece1eedbc 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -12276,7 +12276,6 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {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_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), glsl_fragment_pipe_fog }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGTABLEMODE), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 1999b35a290..ea77254c330 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1252,7 +1252,6 @@ static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_state {STATE_RENDER(WINED3D_RS_FOGSTART), {STATE_RENDER(WINED3D_RS_FOGSTART), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGEND), {STATE_RENDER(WINED3D_RS_FOGEND), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGDENSITY), {STATE_RENDER(WINED3D_RS_FOGDENSITY), state_nop}}, - {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), state_nop}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 3caa318ce8a..b0c2775080a 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1594,6 +1594,10 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb stateblock->changed.point_scale = 1; break;
+ case WINED3D_RS_COLORKEYENABLE: + stateblock->changed.ffp_ps_settings = 1; + break; + default: break; }
From: Elizabeth Figura zfigura@codeweavers.com
If the texture changes in a meaningful way, that is. --- dlls/wined3d/cs.c | 29 ------------------------- dlls/wined3d/stateblock.c | 45 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 31 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 063c5035290..9b1dd56e6fa 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1522,54 +1522,25 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) const struct wined3d_d3d_info *d3d_info = &cs->c.device->adapter->d3d_info; const struct wined3d_cs_set_texture *op = data; struct wined3d_shader_resource_view *prev; - BOOL old_use_color_key = FALSE, new_use_color_key = FALSE;
prev = cs->state.shader_resource_view[op->shader_type][op->bind_index]; cs->state.shader_resource_view[op->shader_type][op->bind_index] = op->view;
if (op->view) { - struct wined3d_texture *texture = texture_from_resource(op->view->resource); - ++op->view->resource->bind_count;
if (op->shader_type == WINED3D_SHADER_TYPE_PIXEL) { if (texture_binding_might_invalidate_ps(op->view, prev, d3d_info)) device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); - - if (!prev && op->bind_index < d3d_info->ffp_fragment_caps.max_blend_stages) - { - /* The source arguments for color and alpha ops have different - * meanings when a NULL texture is bound. */ - device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); - } - - if (!op->bind_index && texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT) - new_use_color_key = TRUE; } }
if (prev) - { - struct wined3d_texture *prev_texture = texture_from_resource(prev->resource); - --prev->resource->bind_count;
- if (op->shader_type == WINED3D_SHADER_TYPE_PIXEL) - { - if (!op->view && op->bind_index < d3d_info->ffp_fragment_caps.max_blend_stages) - device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); - - if (!op->bind_index && prev_texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT) - old_use_color_key = TRUE; - } - } - device_invalidate_state(cs->c.device, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); - - if (new_use_color_key != old_use_color_key) - device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); }
void wined3d_device_context_emit_set_texture(struct wined3d_device_context *context, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index b0c2775080a..f6b01afd016 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1670,9 +1670,47 @@ void CDECL wined3d_stateblock_set_texture_stage_state(struct wined3d_stateblock } }
+static bool texture_binding_might_invalidate_fs_settings(const struct wined3d_stateblock *stateblock, + const struct wined3d_texture *texture, const struct wined3d_texture *prev, unsigned int stage) +{ + const struct wined3d_d3d_info *d3d_info = &stateblock->device->adapter->d3d_info; + const struct wined3d_format *old_format, *new_format; + unsigned int old_usage, new_usage; + + /* The source arguments for color and alpha ops have different meanings when + * a NULL texture is bound. */ + if (!texture) + return !!prev; + if (!prev) + return true; + + old_usage = prev->resource.usage; + new_usage = texture->resource.usage; + if (texture->resource.type != prev->resource.type + || ((old_usage & WINED3DUSAGE_LEGACY_CUBEMAP) != (new_usage & WINED3DUSAGE_LEGACY_CUBEMAP))) + return true; + + if (!stage && stateblock->stateblock_state.rs[WINED3D_RS_COLORKEYENABLE] + && (texture->color_key_flags & WINED3D_CKEY_SRC_BLT)) + return true; + + old_format = prev->resource.format; + new_format = texture->resource.format; + + if (is_same_fixup(old_format->color_fixup, new_format->color_fixup)) + return false; + + if (can_use_texture_swizzle(d3d_info, new_format) && can_use_texture_swizzle(d3d_info, old_format)) + return false; + + return true; +} + void CDECL wined3d_stateblock_set_texture(struct wined3d_stateblock *stateblock, UINT stage, struct wined3d_texture *texture) { + struct wined3d_texture *prev = stateblock->stateblock_state.textures[stage]; + TRACE("stateblock %p, stage %u, texture %p.\n", stateblock, stage, texture);
if (stage >= ARRAY_SIZE(stateblock->stateblock_state.textures)) @@ -1683,10 +1721,13 @@ void CDECL wined3d_stateblock_set_texture(struct wined3d_stateblock *stateblock,
if (texture) wined3d_texture_incref(texture); - if (stateblock->stateblock_state.textures[stage]) - wined3d_texture_decref(stateblock->stateblock_state.textures[stage]); + if (prev) + wined3d_texture_decref(prev); stateblock->stateblock_state.textures[stage] = texture; stateblock->changed.textures |= 1u << stage; + + if (texture_binding_might_invalidate_fs_settings(stateblock, texture, prev, stage)) + stateblock->changed.ffp_ps_settings = 1; }
void CDECL wined3d_stateblock_set_transform(struct wined3d_stateblock *stateblock,
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/ffp_gl.c | 2 +- dlls/wined3d/glsl_shader.c | 1 - dlls/wined3d/shader_spirv.c | 1 - dlls/wined3d/stateblock.c | 11 +++++++++++ 4 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index 2cfe3954b32..f97005680d7 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1673,7 +1673,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) { 39, 47}, { 49, 135}, {138, 139}, - {144, 144}, + {143, 144}, {149, 150}, {153, 153}, {157, 160}, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 3cece1eedbc..396c77b3dfd 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -12012,7 +12012,6 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_LIGHTING), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_COLORVERTEX), {STATE_RENDER(WINED3D_RS_COLORVERTEX), glsl_vertex_pipe_shader}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_LOCALVIEWER), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_DIFFUSEMATERIALSOURCE), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SPECULARMATERIALSOURCE), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_AMBIENTMATERIALSOURCE), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index ea77254c330..b3edb6729af 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1162,7 +1162,6 @@ static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states[ {STATE_RENDER(WINED3D_RS_LIGHTING), {STATE_RENDER(WINED3D_RS_LIGHTING), state_nop}}, {STATE_RENDER(WINED3D_RS_COLORVERTEX), {STATE_RENDER(WINED3D_RS_COLORVERTEX), state_nop}}, {STATE_RENDER(WINED3D_RS_LOCALVIEWER), {STATE_RENDER(WINED3D_RS_LOCALVIEWER), state_nop}}, - {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), state_nop}}, {STATE_RENDER(WINED3D_RS_DIFFUSEMATERIALSOURCE), {STATE_RENDER(WINED3D_RS_DIFFUSEMATERIALSOURCE), state_nop}}, {STATE_RENDER(WINED3D_RS_SPECULARMATERIALSOURCE), {STATE_RENDER(WINED3D_RS_SPECULARMATERIALSOURCE), state_nop}}, {STATE_RENDER(WINED3D_RS_AMBIENTMATERIALSOURCE), {STATE_RENDER(WINED3D_RS_AMBIENTMATERIALSOURCE), state_nop}}, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index f6b01afd016..925ee2e8c71 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -64,6 +64,7 @@ struct wined3d_saved_states uint32_t texture_matrices : 1; uint32_t modelview_matrices : 1; uint32_t point_scale : 1; + uint32_t ffp_vs_settings : 1; uint32_t ffp_ps_settings : 1; };
@@ -1594,6 +1595,10 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb stateblock->changed.point_scale = 1; break;
+ case WINED3D_RS_NORMALIZENORMALS: + stateblock->changed.ffp_vs_settings = 1; + break; + case WINED3D_RS_COLORKEYENABLE: stateblock->changed.ffp_ps_settings = 1; break; @@ -3685,6 +3690,12 @@ 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->ffp_vs_settings && !state->vs) + { + /* Force invalidation of the vertex shader. */ + wined3d_device_context_emit_set_shader(context, WINED3D_SHADER_TYPE_VERTEX, NULL); + } + if (changed->ffp_ps_settings && !state->ps) { /* Force invalidation of the pixel shader. */
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 full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147602
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: dlls/wined3d/glsl_shader.c:12025 error: patch failed: dlls/wined3d/cs.c:1541 error: patch failed: dlls/wined3d/glsl_shader.c:12212 error: patch failed: dlls/wined3d/stateblock.c:64 error: patch failed: dlls/wined3d/stateblock.c:1594 error: patch failed: dlls/wined3d/cs.c:1522 error: patch failed: dlls/wined3d/ffp_gl.c:1673 error: patch failed: dlls/wined3d/stateblock.c:64 Task: Patch failed to apply
=== debian11b (build log) ===
error: patch failed: dlls/wined3d/glsl_shader.c:12025 error: patch failed: dlls/wined3d/cs.c:1541 error: patch failed: dlls/wined3d/glsl_shader.c:12212 error: patch failed: dlls/wined3d/stateblock.c:64 error: patch failed: dlls/wined3d/stateblock.c:1594 error: patch failed: dlls/wined3d/cs.c:1522 error: patch failed: dlls/wined3d/ffp_gl.c:1673 error: patch failed: dlls/wined3d/stateblock.c:64 Task: Patch failed to apply
The eventual goal for the HLSL FFP pipeline is to set the shader to an internally constructed wined3d_shader object early, so that all the existing backend logic that works with real shaders can be reused.
Specifically, we want to construct this shader before e.g. context_gl_load_shader_resources() and context_update_stream_info(), both functions which currently execute before applying state tables but which operate on the currently bound shaders. In fact, because the HLSL FFP pipeline is intended to be backend-agnostic, the goal is to construct the replacement shaders from within wined3d_cs_exec_draw().
If we've given up on fixed-function hardware, as we seem to have, is there any reason we shouldn't just construct fixed-function shaders in wined3d_device_apply_stateblock(), and avoid having to worry about fixed-function at all in core wined3d?
If we've given up on fixed-function hardware, as we seem to have, is there any reason we shouldn't just construct fixed-function shaders in wined3d_device_apply_stateblock(), and avoid having to worry about fixed-function at all in core wined3d?
I considered that, but shader compilation is a relatively heavy operation, and I wasn't sure that it would be a good idea to have it on that side of the CS. Maybe that's not something we need to worry about?
Not that it'd be hard to shift things appropriately.
If we've given up on fixed-function hardware, as we seem to have, is there any reason we shouldn't just construct fixed-function shaders in wined3d_device_apply_stateblock(), and avoid having to worry about fixed-function at all in core wined3d?
I considered that, but shader compilation is a relatively heavy operation, and I wasn't sure that it would be a good idea to have it on that side of the CS. Maybe that's not something we need to worry about?
I think there are different ways to structure things, but one option would be to create a wined3d_shader with "source_type" set to VKD3D_SHADER_SOURCE_HLSL, and then let the shader_precompile() from wined3d_shader_init_object() turn that into GLSL or SPIR-V. More generally, I don't think creating fixed-function shaders in wined3d_device_apply_stateblock() is necessarily incompatible with doing shader compilation on the CS thread or some other thread. But yes, ultimately we could get there incrementally, if desired.
I think there are different ways to structure things, but one option would be to create a wined3d_shader with "source_type" set to VKD3D_SHADER_SOURCE_HLSL, and then let the shader_precompile() from wined3d_shader_init_object() turn that into GLSL or SPIR-V. More generally, I don't think creating fixed-function shaders in wined3d_device_apply_stateblock() is necessarily incompatible with doing shader compilation on the CS thread or some other thread. But yes, ultimately we could get there incrementally, if desired.
That'd work. I was also concerned about HLSL generation, but then again I think we could even go one step further along the same lines, and instead of even writing HLSL from the client side, just write the wined3d_ffp_vs_settings struct, and let precompile() turn that into HLSL and then into the final format.
That's probably prettier than what I have right now; I'll look into restructuring it accordingly.
Either way though I think it's orthogonal to this patch series. The goal here is to (piecemeal) move state invalidation out of the state table and into wined3d_device_apply_stateblock(), which we need in any case—it's fundamental to the goal of getting the "legacy" states out of core wined3d.
This merge request was approved by Jan Sikorski.