[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