From: Józef Kucia Subject: [PATCH 4/7] wined3d: Save pixel and vertex shader resource views in stateblocks. Message-Id: <20170324161448.4503-4-jkucia@codeweavers.com> Date: Fri, 24 Mar 2017 17:14:45 +0100 In-Reply-To: <20170324161448.4503-1-jkucia@codeweavers.com> References: <20170324161448.4503-1-jkucia@codeweavers.com> Signed-off-by: Józef Kucia --- "pixel_shader_resource_views" and "vertex_shader_resource_views" bitfields are meant to replace the "textures" bitfield --- dlls/wined3d/device.c | 8 +++++++ dlls/wined3d/stateblock.c | 54 ++++++++++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d_private.h | 7 ++++-- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 556d555..6069b5b 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2219,6 +2219,14 @@ static void wined3d_device_set_shader_resource_view(struct wined3d_device *devic if (view == prev) return; + if (device->recording) + { + if (type == WINED3D_SHADER_TYPE_PIXEL && idx < MAX_FRAGMENT_SAMPLERS) + device->recording->changed.pixel_shader_resource_views |= 1u << idx; + else if (type == WINED3D_SHADER_TYPE_VERTEX && idx < MAX_VERTEX_SAMPLERS) + device->recording->changed.vertex_shader_resource_views |= 1u << idx; + } + if (view) wined3d_shader_resource_view_incref(view); device->update_state->shader_resource_view[type][idx] = view; diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index b197052..6999a5a 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -913,6 +913,41 @@ void CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock) stateblock->state.textures[i] = src_state->textures[i]; } + map = stateblock->changed.pixel_shader_resource_views; + for (i = 0; map; map >>= 1, ++i) + { + if (!(map & 1)) + continue; + + TRACE("Updating pixel resource view %u to %p (was %p).\n", + i, src_state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i], + stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]); + + if (src_state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]) + wined3d_shader_resource_view_incref(src_state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]); + if (stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]) + wined3d_shader_resource_view_decref(stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]); + stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i] + = src_state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]; + } + map = stateblock->changed.vertex_shader_resource_views; + for (i = 0; map; map >>= 1, ++i) + { + if (!(map & 1)) + continue; + + TRACE("Updating vertex resource view %u to %p (was %p).\n", + i, src_state->shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i], + stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]); + + if (src_state->shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]) + wined3d_shader_resource_view_incref(src_state->shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]); + if (stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]) + wined3d_shader_resource_view_decref(stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]); + stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i] + = src_state->shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]; + } + for (i = 0; i < stateblock->num_contained_sampler_states; ++i) { DWORD stage = stateblock->contained_sampler_states[i].stage; @@ -1088,6 +1123,25 @@ void CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock) wined3d_device_set_texture(device, stage, stateblock->state.textures[i]); } + map = stateblock->changed.pixel_shader_resource_views; + for (i = 0; map; map >>= 1, ++i) + { + if (!(map & 1)) + continue; + + wined3d_device_set_ps_resource_view(device, i, + stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]); + } + map = stateblock->changed.vertex_shader_resource_views; + for (i = 0; map; map >>= 1, ++i) + { + if (!(map & 1)) + continue; + + wined3d_device_set_vs_resource_view(device, i, + stateblock->state.shader_resource_view[WINED3D_SHADER_TYPE_VERTEX][i]); + } + map = stateblock->changed.clipplane; for (i = 0; map; map >>= 1, ++i) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f154db3..3457121 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3132,6 +3132,8 @@ struct wined3d_saved_states WORD vertexShaderConstantsB; /* WINED3D_MAX_CONSTS_B, 16 */ WORD vertexShaderConstantsI; /* WINED3D_MAX_CONSTS_I, 16 */ BOOL vs_consts_f[WINED3D_MAX_VS_CONSTS_F]; + DWORD pixel_shader_resource_views : 16; /* MAX_FRAGMENT_SAMPLERS, 16 */ + DWORD vertex_shader_resource_views : 16; /* MAX_VERTEX_SAMPLERS, 4 */ DWORD textures : 20; /* MAX_COMBINED_SAMPLERS, 20 */ DWORD indices : 1; DWORD material : 1; @@ -3143,14 +3145,15 @@ struct wined3d_saved_states DWORD padding : 5; }; -struct StageState { +struct StageState +{ DWORD stage; DWORD state; }; struct wined3d_stateblock { - LONG ref; /* Note: Ref counting not required */ + LONG ref; struct wined3d_device *device; /* Array indicating whether things have been set or changed */ -- 2.10.2