[PATCH 2/5] wined3d: Send sampler GL initialisation through the command stream.

Henri Verbeet hverbeet at codeweavers.com
Wed Feb 15 17:58:53 CST 2017


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/buffer.c            |  2 +-
 dlls/wined3d/cs.c                | 26 ++++++++++++++++++--------
 dlls/wined3d/palette.c           |  2 +-
 dlls/wined3d/query.c             |  2 +-
 dlls/wined3d/resource.c          |  2 +-
 dlls/wined3d/sampler.c           | 25 ++++++++++++++++---------
 dlls/wined3d/shader.c            |  2 +-
 dlls/wined3d/state.c             |  2 +-
 dlls/wined3d/texture.c           |  2 +-
 dlls/wined3d/vertexdeclaration.c |  2 +-
 dlls/wined3d/view.c              |  6 +++---
 dlls/wined3d/wined3d_private.h   |  7 ++++---
 12 files changed, 49 insertions(+), 31 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index fa3e3a7..b647dfb 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -797,7 +797,7 @@ ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer)
     {
         buffer->resource.parent_ops->wined3d_object_destroyed(buffer->resource.parent);
         resource_cleanup(&buffer->resource);
-        wined3d_cs_emit_destroy_object(buffer->resource.device->cs, wined3d_buffer_destroy_object, buffer);
+        wined3d_cs_destroy_object(buffer->resource.device->cs, wined3d_buffer_destroy_object, buffer);
     }
 
     return refcount;
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 3a46a3c..55706cd 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -55,7 +55,7 @@ enum wined3d_cs_op
     WINED3D_CS_OP_SET_COLOR_KEY,
     WINED3D_CS_OP_SET_MATERIAL,
     WINED3D_CS_OP_RESET_STATE,
-    WINED3D_CS_OP_DESTROY_OBJECT,
+    WINED3D_CS_OP_CALLBACK,
     WINED3D_CS_OP_QUERY_ISSUE,
     WINED3D_CS_OP_PRELOAD_RESOURCE,
     WINED3D_CS_OP_UNLOAD_RESOURCE,
@@ -283,7 +283,7 @@ struct wined3d_cs_reset_state
     enum wined3d_cs_op opcode;
 };
 
-struct wined3d_cs_destroy_object
+struct wined3d_cs_callback
 {
     enum wined3d_cs_op opcode;
     void (*callback)(void *object);
@@ -1389,25 +1389,35 @@ void wined3d_cs_emit_reset_state(struct wined3d_cs *cs)
     cs->ops->submit(cs);
 }
 
-static void wined3d_cs_exec_destroy_object(struct wined3d_cs *cs, const void *data)
+static void wined3d_cs_exec_callback(struct wined3d_cs *cs, const void *data)
 {
-    const struct wined3d_cs_destroy_object *op = data;
+    const struct wined3d_cs_callback *op = data;
 
     op->callback(op->object);
 }
 
-void wined3d_cs_emit_destroy_object(struct wined3d_cs *cs, void (*callback)(void *object), void *object)
+static void wined3d_cs_emit_callback(struct wined3d_cs *cs, void (*callback)(void *object), void *object)
 {
-    struct wined3d_cs_destroy_object *op;
+    struct wined3d_cs_callback *op;
 
     op = cs->ops->require_space(cs, sizeof(*op));
-    op->opcode = WINED3D_CS_OP_DESTROY_OBJECT;
+    op->opcode = WINED3D_CS_OP_CALLBACK;
     op->callback = callback;
     op->object = object;
 
     cs->ops->submit(cs);
 }
 
+void wined3d_cs_destroy_object(struct wined3d_cs *cs, void (*callback)(void *object), void *object)
+{
+    wined3d_cs_emit_callback(cs, callback, object);
+}
+
+void wined3d_cs_init_object(struct wined3d_cs *cs, void (*callback)(void *object), void *object)
+{
+    wined3d_cs_emit_callback(cs, callback, object);
+}
+
 static void wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data)
 {
     const struct wined3d_cs_query_issue *op = data;
@@ -1556,7 +1566,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void
     /* WINED3D_CS_OP_SET_COLOR_KEY              */ wined3d_cs_exec_set_color_key,
     /* WINED3D_CS_OP_SET_MATERIAL               */ wined3d_cs_exec_set_material,
     /* WINED3D_CS_OP_RESET_STATE                */ wined3d_cs_exec_reset_state,
-    /* WINED3D_CS_OP_DESTROY_OBJECT             */ wined3d_cs_exec_destroy_object,
+    /* WINED3D_CS_OP_CALLBACK                   */ wined3d_cs_exec_callback,
     /* WINED3D_CS_OP_QUERY_ISSUE                */ wined3d_cs_exec_query_issue,
     /* WINED3D_CS_OP_PRELOAD_RESOURCE           */ wined3d_cs_exec_preload_resource,
     /* WINED3D_CS_OP_UNLOAD_RESOURCE            */ wined3d_cs_exec_unload_resource,
diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c
index ba9c42e..ed77604 100644
--- a/dlls/wined3d/palette.c
+++ b/dlls/wined3d/palette.c
@@ -45,7 +45,7 @@ ULONG CDECL wined3d_palette_decref(struct wined3d_palette *palette)
     TRACE("%p decreasing refcount to %u.\n", palette, refcount);
 
     if (!refcount)
-        wined3d_cs_emit_destroy_object(palette->device->cs, wined3d_palette_destroy_object, palette);
+        wined3d_cs_destroy_object(palette->device->cs, wined3d_palette_destroy_object, palette);
 
     return refcount;
 }
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index df90ce9..371f7d3 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -312,7 +312,7 @@ ULONG CDECL wined3d_query_decref(struct wined3d_query *query)
     TRACE("%p decreasing refcount to %u.\n", query, refcount);
 
     if (!refcount)
-        wined3d_cs_emit_destroy_object(query->device->cs, wined3d_query_destroy_object, query);
+        wined3d_cs_destroy_object(query->device->cs, wined3d_query_destroy_object, query);
 
     return refcount;
 }
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 611c61f..4e0f6a6 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -256,7 +256,7 @@ void resource_cleanup(struct wined3d_resource *resource)
 
     device_resource_released(resource->device, resource);
     wined3d_resource_acquire(resource);
-    wined3d_cs_emit_destroy_object(resource->device->cs, wined3d_resource_destroy_object, resource);
+    wined3d_cs_destroy_object(resource->device->cs, wined3d_resource_destroy_object, resource);
 }
 
 void resource_unload(struct wined3d_resource *resource)
diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
index 722cd24..72574db 100644
--- a/dlls/wined3d/sampler.c
+++ b/dlls/wined3d/sampler.c
@@ -54,7 +54,7 @@ ULONG CDECL wined3d_sampler_decref(struct wined3d_sampler *sampler)
     TRACE("%p decreasing refcount to %u.\n", sampler, refcount);
 
     if (!refcount)
-        wined3d_cs_emit_destroy_object(sampler->device->cs, wined3d_sampler_destroy_object, sampler);
+        wined3d_cs_destroy_object(sampler->device->cs, wined3d_sampler_destroy_object, sampler);
 
     return refcount;
 }
@@ -66,20 +66,17 @@ void * CDECL wined3d_sampler_get_parent(const struct wined3d_sampler *sampler)
     return sampler->parent;
 }
 
-static void wined3d_sampler_init(struct wined3d_sampler *sampler, struct wined3d_device *device,
-        const struct wined3d_sampler_desc *desc, void *parent)
+static void wined3d_sampler_cs_init(void *object)
 {
+    struct wined3d_sampler *sampler = object;
+    const struct wined3d_sampler_desc *desc;
     const struct wined3d_gl_info *gl_info;
     struct wined3d_context *context;
 
-    sampler->refcount = 1;
-    sampler->device = device;
-    sampler->parent = parent;
-    sampler->desc = *desc;
-
-    context = context_acquire(device, NULL, 0);
+    context = context_acquire(sampler->device, NULL, 0);
     gl_info = context->gl_info;
 
+    desc = &sampler->desc;
     GL_EXTCALL(glGenSamplers(1, &sampler->name));
     GL_EXTCALL(glSamplerParameteri(sampler->name, GL_TEXTURE_WRAP_S,
             gl_info->wrap_lookup[desc->address_u - WINED3D_TADDRESS_WRAP]));
@@ -111,6 +108,16 @@ static void wined3d_sampler_init(struct wined3d_sampler *sampler, struct wined3d
     context_release(context);
 }
 
+static void wined3d_sampler_init(struct wined3d_sampler *sampler, struct wined3d_device *device,
+        const struct wined3d_sampler_desc *desc, void *parent)
+{
+    sampler->refcount = 1;
+    sampler->device = device;
+    sampler->parent = parent;
+    sampler->desc = *desc;
+    wined3d_cs_init_object(device->cs, wined3d_sampler_cs_init, sampler);
+}
+
 HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
         void *parent, struct wined3d_sampler **sampler)
 {
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 450e791..4a31ff5 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2964,7 +2964,7 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
     if (!refcount)
     {
         shader->parent_ops->wined3d_object_destroyed(shader->parent);
-        wined3d_cs_emit_destroy_object(shader->device->cs, wined3d_shader_destroy_object, shader);
+        wined3d_cs_destroy_object(shader->device->cs, wined3d_shader_destroy_object, shader);
     }
 
     return refcount;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 7fabef1..83a6cae 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -60,7 +60,7 @@ ULONG CDECL wined3d_rasterizer_state_decref(struct wined3d_rasterizer_state *sta
     TRACE("%p decreasing refcount to %u.\n", state, refcount);
 
     if (!refcount)
-        wined3d_cs_emit_destroy_object(device->cs, wined3d_rasterizer_state_destroy_object, state);
+        wined3d_cs_destroy_object(device->cs, wined3d_rasterizer_state_destroy_object, state);
 
     return refcount;
 }
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index e77e133..e6f2c6c 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -929,7 +929,7 @@ ULONG CDECL wined3d_texture_decref(struct wined3d_texture *texture)
         wined3d_texture_sub_resources_destroyed(texture);
         texture->resource.parent_ops->wined3d_object_destroyed(texture->resource.parent);
         resource_cleanup(&texture->resource);
-        wined3d_cs_emit_destroy_object(texture->resource.device->cs, wined3d_texture_destroy_object, texture);
+        wined3d_cs_destroy_object(texture->resource.device->cs, wined3d_texture_destroy_object, texture);
     }
 
     return refcount;
diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c
index 61c82d3..4fa6d54 100644
--- a/dlls/wined3d/vertexdeclaration.c
+++ b/dlls/wined3d/vertexdeclaration.c
@@ -67,7 +67,7 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration
     if (!refcount)
     {
         declaration->parent_ops->wined3d_object_destroyed(declaration->parent);
-        wined3d_cs_emit_destroy_object(declaration->device->cs,
+        wined3d_cs_destroy_object(declaration->device->cs,
                 wined3d_vertex_declaration_destroy_object, declaration);
     }
 
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 06db44a..7919e2e 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -232,7 +232,7 @@ ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *v
         /* Call wined3d_object_destroyed() before releasing the resource,
          * since releasing the resource may end up destroying the parent. */
         view->parent_ops->wined3d_object_destroyed(view->parent);
-        wined3d_cs_emit_destroy_object(device->cs, wined3d_rendertarget_view_destroy_object, view);
+        wined3d_cs_destroy_object(device->cs, wined3d_rendertarget_view_destroy_object, view);
         wined3d_resource_decref(resource);
     }
 
@@ -462,7 +462,7 @@ ULONG CDECL wined3d_shader_resource_view_decref(struct wined3d_shader_resource_v
         /* Call wined3d_object_destroyed() before releasing the resource,
          * since releasing the resource may end up destroying the parent. */
         view->parent_ops->wined3d_object_destroyed(view->parent);
-        wined3d_cs_emit_destroy_object(device->cs, wined3d_shader_resource_view_destroy_object, view);
+        wined3d_cs_destroy_object(device->cs, wined3d_shader_resource_view_destroy_object, view);
         wined3d_resource_decref(resource);
     }
 
@@ -630,7 +630,7 @@ ULONG CDECL wined3d_unordered_access_view_decref(struct wined3d_unordered_access
         /* Call wined3d_object_destroyed() before releasing the resource,
          * since releasing the resource may end up destroying the parent. */
         view->parent_ops->wined3d_object_destroyed(view->parent);
-        wined3d_cs_emit_destroy_object(device->cs, wined3d_unordered_access_view_destroy_object, view);
+        wined3d_cs_destroy_object(device->cs, wined3d_unordered_access_view_destroy_object, view);
         wined3d_resource_decref(resource);
     }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 50b7c93..f6b42e5 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3174,11 +3174,10 @@ struct wined3d_cs
 
 struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN;
 void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
-
+void wined3d_cs_destroy_object(struct wined3d_cs *cs,
+        void (*callback)(void *object), void *object) DECLSPEC_HIDDEN;
 void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects,
         DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN;
-void wined3d_cs_emit_destroy_object(struct wined3d_cs *cs,
-        void (*callback)(void *object), void *object) DECLSPEC_HIDDEN;
 void wined3d_cs_emit_dispatch(struct wined3d_cs *cs,
         unsigned int group_count_x, unsigned int group_count_y, unsigned int group_count_z) DECLSPEC_HIDDEN;
 void wined3d_cs_emit_draw(struct wined3d_cs *cs, int base_vertex_idx, unsigned int start_idx, unsigned int index_count,
@@ -3233,6 +3232,8 @@ void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs,
         struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN;
 void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) DECLSPEC_HIDDEN;
 void wined3d_cs_emit_unload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
+void wined3d_cs_init_object(struct wined3d_cs *cs,
+        void (*callback)(void *object), void *object) DECLSPEC_HIDDEN;
 HRESULT wined3d_cs_map(struct wined3d_cs *cs, struct wined3d_resource *resource, unsigned int sub_resource_idx,
         struct wined3d_map_desc *map_desc, const struct wined3d_box *box, unsigned int flags) DECLSPEC_HIDDEN;
 HRESULT wined3d_cs_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource,
-- 
2.1.4




More information about the wine-patches mailing list