Henri Verbeet : wined3d: Unify sampler binding points.

Alexandre Julliard julliard at winehq.org
Thu Oct 10 13:26:51 CDT 2013


Module: wine
Branch: master
Commit: 392a65fe09ac92cf9d6491b3100819defa0c9d60
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=392a65fe09ac92cf9d6491b3100819defa0c9d60

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Oct  9 22:57:47 2013 +0200

wined3d: Unify sampler binding points.

---

 dlls/wined3d/device.c          |   54 ++++++++++++----------------------------
 dlls/wined3d/stateblock.c      |   30 ++++-----------------
 dlls/wined3d/wined3d_private.h |    5 +---
 3 files changed, 23 insertions(+), 66 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 55c54f0..93aef9f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2144,20 +2144,19 @@ struct wined3d_buffer * CDECL wined3d_device_get_vs_cb(const struct wined3d_devi
     return device->state.cb[WINED3D_SHADER_TYPE_VERTEX][idx];
 }
 
-void CDECL wined3d_device_set_vs_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler)
+static void wined3d_device_set_sampler(struct wined3d_device *device,
+        enum wined3d_shader_type type, UINT idx, struct wined3d_sampler *sampler)
 {
     struct wined3d_sampler *prev;
 
-    TRACE("device %p, idx %u, sampler %p.\n", device, idx, sampler);
-
     if (idx >= MAX_SAMPLER_OBJECTS)
     {
         WARN("Invalid sampler index %u.\n", idx);
         return;
     }
 
-    prev = device->update_state->vs_sampler[idx];
-    device->update_state->vs_sampler[idx] = sampler;
+    prev = device->update_state->sampler[type][idx];
+    device->update_state->sampler[type][idx] = sampler;
 
     if (sampler)
         wined3d_sampler_incref(sampler);
@@ -2165,6 +2164,13 @@ void CDECL wined3d_device_set_vs_sampler(struct wined3d_device *device, UINT idx
         wined3d_sampler_decref(prev);
 }
 
+void CDECL wined3d_device_set_vs_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler)
+{
+    TRACE("device %p, idx %u, sampler %p.\n", device, idx, sampler);
+
+    wined3d_device_set_sampler(device, WINED3D_SHADER_TYPE_VERTEX, idx, sampler);
+}
+
 struct wined3d_sampler * CDECL wined3d_device_get_vs_sampler(const struct wined3d_device *device, UINT idx)
 {
     TRACE("device %p, idx %u.\n", device, idx);
@@ -2175,7 +2181,7 @@ struct wined3d_sampler * CDECL wined3d_device_get_vs_sampler(const struct wined3
         return NULL;
     }
 
-    return device->state.vs_sampler[idx];
+    return device->state.sampler[WINED3D_SHADER_TYPE_VERTEX][idx];
 }
 
 static void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask)
@@ -2382,23 +2388,9 @@ struct wined3d_buffer * CDECL wined3d_device_get_ps_cb(const struct wined3d_devi
 
 void CDECL wined3d_device_set_ps_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler)
 {
-    struct wined3d_sampler *prev;
-
     TRACE("device %p, idx %u, sampler %p.\n", device, idx, sampler);
 
-    if (idx >= MAX_SAMPLER_OBJECTS)
-    {
-        WARN("Invalid sampler index %u.\n", idx);
-        return;
-    }
-
-    prev = device->update_state->ps_sampler[idx];
-    device->update_state->ps_sampler[idx] = sampler;
-
-    if (sampler)
-        wined3d_sampler_incref(sampler);
-    if (prev)
-        wined3d_sampler_decref(prev);
+    wined3d_device_set_sampler(device, WINED3D_SHADER_TYPE_PIXEL, idx, sampler);
 }
 
 struct wined3d_sampler * CDECL wined3d_device_get_ps_sampler(const struct wined3d_device *device, UINT idx)
@@ -2411,7 +2403,7 @@ struct wined3d_sampler * CDECL wined3d_device_get_ps_sampler(const struct wined3
         return NULL;
     }
 
-    return device->state.ps_sampler[idx];
+    return device->state.sampler[WINED3D_SHADER_TYPE_PIXEL][idx];
 }
 
 HRESULT CDECL wined3d_device_set_ps_consts_b(struct wined3d_device *device,
@@ -2603,23 +2595,9 @@ struct wined3d_buffer * CDECL wined3d_device_get_gs_cb(const struct wined3d_devi
 
 void CDECL wined3d_device_set_gs_sampler(struct wined3d_device *device, UINT idx, struct wined3d_sampler *sampler)
 {
-    struct wined3d_sampler *prev;
-
     TRACE("device %p, idx %u, sampler %p.\n", device, idx, sampler);
 
-    if (idx >= MAX_SAMPLER_OBJECTS)
-    {
-        WARN("Invalid sampler index %u.\n", idx);
-        return;
-    }
-
-    prev = device->update_state->gs_sampler[idx];
-    device->update_state->gs_sampler[idx] = sampler;
-
-    if (sampler)
-        wined3d_sampler_incref(sampler);
-    if (prev)
-        wined3d_sampler_decref(prev);
+    wined3d_device_set_sampler(device, WINED3D_SHADER_TYPE_GEOMETRY, idx, sampler);
 }
 
 struct wined3d_sampler * CDECL wined3d_device_get_gs_sampler(const struct wined3d_device *device, UINT idx)
@@ -2632,7 +2610,7 @@ struct wined3d_sampler * CDECL wined3d_device_get_gs_sampler(const struct wined3
         return NULL;
     }
 
-    return device->state.gs_sampler[idx];
+    return device->state.sampler[WINED3D_SHADER_TYPE_GEOMETRY][idx];
 }
 
 /* Context activation is done by the caller. */
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index d88d51d..f991362 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -520,32 +520,14 @@ void state_unbind_resources(struct wined3d_state *state)
                 wined3d_buffer_decref(buffer);
             }
         }
-    }
-
-    for (i = 0; i < MAX_SAMPLER_OBJECTS; ++i)
-    {
-        if ((sampler = state->vs_sampler[i]))
-        {
-            state->vs_sampler[i] = NULL;
-            wined3d_sampler_decref(sampler);
-        }
-    }
-
-    for (i = 0; i < MAX_SAMPLER_OBJECTS; ++i)
-    {
-        if ((sampler = state->gs_sampler[i]))
-        {
-            state->gs_sampler[i] = NULL;
-            wined3d_sampler_decref(sampler);
-        }
-    }
 
-    for (i = 0; i < MAX_SAMPLER_OBJECTS; ++i)
-    {
-        if ((sampler = state->ps_sampler[i]))
+        for (j = 0; j < MAX_SAMPLER_OBJECTS; ++j)
         {
-            state->ps_sampler[i] = NULL;
-            wined3d_sampler_decref(sampler);
+            if ((sampler = state->sampler[i][j]))
+            {
+                state->sampler[i][j] = NULL;
+                wined3d_sampler_decref(sampler);
+            }
         }
     }
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 11c1864..bfd9995 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1819,15 +1819,12 @@ struct wined3d_state
 
     struct wined3d_shader *shader[WINED3D_SHADER_TYPE_COUNT];
     struct wined3d_buffer *cb[WINED3D_SHADER_TYPE_COUNT][MAX_CONSTANT_BUFFERS];
+    struct wined3d_sampler *sampler[WINED3D_SHADER_TYPE_COUNT][MAX_SAMPLER_OBJECTS];
 
-    struct wined3d_sampler *vs_sampler[MAX_SAMPLER_OBJECTS];
     BOOL vs_consts_b[MAX_CONST_B];
     INT vs_consts_i[MAX_CONST_I * 4];
     float *vs_consts_f;
 
-    struct wined3d_sampler *gs_sampler[MAX_SAMPLER_OBJECTS];
-
-    struct wined3d_sampler *ps_sampler[MAX_SAMPLER_OBJECTS];
     BOOL ps_consts_b[MAX_CONST_B];
     INT ps_consts_i[MAX_CONST_I * 4];
     float *ps_consts_f;




More information about the wine-cvs mailing list