=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Introduce wined3d_unordered_access_view.
Alexandre Julliard
julliard at winehq.org
Fri Jun 24 08:33:45 CDT 2016
Module: wine
Branch: master
Commit: 2f47a73c37e1549100e3dd69a6e567d0b58f5314
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f47a73c37e1549100e3dd69a6e567d0b58f5314
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Jun 24 11:46:02 2016 +0200
wined3d: Introduce wined3d_unordered_access_view.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/view.c | 106 +++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/wined3d.spec | 5 ++
dlls/wined3d/wined3d_private.h | 11 +++++
include/wine/wined3d.h | 28 +++++++++++
4 files changed, 150 insertions(+)
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index e9e62d1..e39f6f8 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -415,3 +415,109 @@ void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view
texture = wined3d_texture_from_resource(view->resource);
wined3d_texture_bind(texture, context, FALSE);
}
+
+ULONG CDECL wined3d_unordered_access_view_incref(struct wined3d_unordered_access_view *view)
+{
+ ULONG refcount = InterlockedIncrement(&view->refcount);
+
+ TRACE("%p increasing refcount to %u.\n", view, refcount);
+
+ return refcount;
+}
+
+static void wined3d_unordered_access_view_destroy_object(void *object)
+{
+ HeapFree(GetProcessHeap(), 0, object);
+}
+
+ULONG CDECL wined3d_unordered_access_view_decref(struct wined3d_unordered_access_view *view)
+{
+ ULONG refcount = InterlockedDecrement(&view->refcount);
+
+ TRACE("%p decreasing refcount to %u.\n", view, refcount);
+
+ if (!refcount)
+ {
+ struct wined3d_device *device = view->resource->device;
+
+ /* 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_resource_decref(view->resource);
+ wined3d_cs_emit_destroy_object(device->cs, wined3d_unordered_access_view_destroy_object, view);
+ }
+
+ return refcount;
+}
+
+void * CDECL wined3d_unordered_access_view_get_parent(const struct wined3d_unordered_access_view *view)
+{
+ TRACE("view %p.\n", view);
+
+ return view->parent;
+}
+
+static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_access_view *view,
+ const struct wined3d_unordered_access_view_desc *desc, struct wined3d_resource *resource,
+ void *parent, const struct wined3d_parent_ops *parent_ops)
+{
+ const struct wined3d_gl_info *gl_info = &resource->device->adapter->gl_info;
+
+ view->refcount = 1;
+ view->parent = parent;
+ view->parent_ops = parent_ops;
+
+ view->format = wined3d_get_format(gl_info, desc->format_id);
+
+ if (wined3d_format_is_typeless(view->format))
+ {
+ WARN("Trying to create view for typeless format %s.\n", debug_d3dformat(view->format->id));
+ return E_INVALIDARG;
+ }
+
+ if (resource->type != WINED3D_RTYPE_BUFFER)
+ {
+ struct wined3d_texture *texture = texture_from_resource(resource);
+ unsigned int depth_or_layer_count;
+
+ if (resource->type == WINED3D_RTYPE_TEXTURE_3D)
+ depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx);
+ else
+ depth_or_layer_count = texture->layer_count;
+
+ if (desc->u.texture.level_idx >= texture->level_count
+ || desc->u.texture.layer_idx >= depth_or_layer_count
+ || !desc->u.texture.layer_count
+ || desc->u.texture.layer_count > depth_or_layer_count - desc->u.texture.layer_idx)
+ return E_INVALIDARG;
+ }
+ wined3d_resource_incref(view->resource = resource);
+
+ return WINED3D_OK;
+}
+
+HRESULT CDECL wined3d_unordered_access_view_create(const struct wined3d_unordered_access_view_desc *desc,
+ struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops,
+ struct wined3d_unordered_access_view **view)
+{
+ struct wined3d_unordered_access_view *object;
+ HRESULT hr;
+
+ TRACE("desc %p, resource %p, parent %p, parent_ops %p, view %p.\n",
+ desc, resource, parent, parent_ops, view);
+
+ if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+ return E_OUTOFMEMORY;
+
+ if (FAILED(hr = wined3d_unordered_access_view_init(object, desc, resource, parent, parent_ops)))
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ WARN("Failed to initialise view, hr %#x.\n", hr);
+ return hr;
+ }
+
+ TRACE("Created unordered access view %p.\n", object);
+ *view = object;
+
+ return WINED3D_OK;
+}
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 8d1d8dc..87fdb81 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -267,6 +267,11 @@
@ cdecl wined3d_texture_update_desc(ptr long long long long long ptr long)
@ cdecl wined3d_texture_update_overlay(ptr long ptr ptr long ptr long)
+@ cdecl wined3d_unordered_access_view_create(ptr ptr ptr ptr ptr)
+@ cdecl wined3d_unordered_access_view_decref(ptr)
+@ cdecl wined3d_unordered_access_view_get_parent(ptr)
+@ cdecl wined3d_unordered_access_view_incref(ptr)
+
@ cdecl wined3d_vertex_declaration_create(ptr ptr long ptr ptr ptr)
@ cdecl wined3d_vertex_declaration_create_from_fvf(ptr long ptr ptr ptr)
@ cdecl wined3d_vertex_declaration_decref(ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8fb6f4d..b82ec3d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3145,6 +3145,17 @@ struct wined3d_shader_resource_view
void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view,
struct wined3d_context *context) DECLSPEC_HIDDEN;
+struct wined3d_unordered_access_view
+{
+ LONG refcount;
+
+ struct wined3d_resource *resource;
+ void *parent;
+ const struct wined3d_parent_ops *parent_ops;
+
+ const struct wined3d_format *format;
+};
+
struct wined3d_swapchain_ops
{
void (*swapchain_present)(struct wined3d_swapchain *swapchain,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index da102c6..1c0a61b 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1970,6 +1970,26 @@ struct wined3d_shader_resource_view_desc
} u;
};
+struct wined3d_unordered_access_view_desc
+{
+ enum wined3d_format_id format_id;
+ unsigned int flags;
+ union
+ {
+ struct
+ {
+ unsigned int start_idx;
+ unsigned int count;
+ } buffer;
+ struct
+ {
+ unsigned int level_idx;
+ unsigned int layer_idx;
+ unsigned int layer_count;
+ } texture;
+ } u;
+};
+
struct wined3d_output_desc
{
WCHAR device_name[CCHDEVICENAME];
@@ -1997,6 +2017,7 @@ struct wined3d_shader_resource_view;
struct wined3d_stateblock;
struct wined3d_swapchain;
struct wined3d_texture;
+struct wined3d_unordered_access_view;
struct wined3d_vertex_declaration;
struct wined3d_device_parent
@@ -2533,6 +2554,13 @@ HRESULT __cdecl wined3d_texture_update_overlay(struct wined3d_texture *texture,
const RECT *src_rect, struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
const RECT *dst_rect, DWORD flags);
+HRESULT __cdecl wined3d_unordered_access_view_create(const struct wined3d_unordered_access_view_desc *desc,
+ struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops,
+ struct wined3d_unordered_access_view **view);
+ULONG __cdecl wined3d_unordered_access_view_decref(struct wined3d_unordered_access_view *view);
+void * __cdecl wined3d_unordered_access_view_get_parent(const struct wined3d_unordered_access_view *view);
+ULONG __cdecl wined3d_unordered_access_view_incref(struct wined3d_unordered_access_view *view);
+
HRESULT __cdecl wined3d_vertex_declaration_create(struct wined3d_device *device,
const struct wined3d_vertex_element *elements, UINT element_count, void *parent,
const struct wined3d_parent_ops *parent_ops, struct wined3d_vertex_declaration **declaration);
More information about the wine-cvs
mailing list