[PATCH v2 1/5] wined3d: Save pixel and vertex shader resource views in stateblocks.
Józef Kucia
jkucia at codeweavers.com
Wed Apr 5 08:38:03 CDT 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Version 2: Properly adjust bitields size.
---
dlls/wined3d/device.c | 8 +++++++
dlls/wined3d/stateblock.c | 54 ++++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 9 ++++---
3 files changed, 68 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 11a56f2..59a245a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2208,6 +2208,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 4acb94f..38e038b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3129,6 +3129,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 : 4; /* MAX_VERTEX_SAMPLERS, 4 */
DWORD textures : 20; /* MAX_COMBINED_SAMPLERS, 20 */
DWORD indices : 1;
DWORD material : 1;
@@ -3137,17 +3139,18 @@ struct wined3d_saved_states
DWORD pixelShader : 1;
DWORD vertexShader : 1;
DWORD scissorRect : 1;
- DWORD padding : 5;
+ DWORD padding : 17;
};
-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
More information about the wine-patches
mailing list