[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