[PATCH 4/4] wined3d: Partially implement adapter_vk_clear_uav().

Henri Verbeet hverbeet at codeweavers.com
Fri Jun 5 06:49:31 CDT 2020


This is easy, and sufficient in a lot of cases. However, for a more
complete implementation, we'll want to do something more similar to
vkd3d.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/adapter_vk.c      |  5 ++-
 dlls/wined3d/view.c            | 63 ++++++++++++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |  2 ++
 3 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 586be3751a0..1e4d663dcb4 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1765,7 +1765,10 @@ static void adapter_vk_dispatch_compute(struct wined3d_device *device,
 void adapter_vk_clear_uav(struct wined3d_context *context,
         struct wined3d_unordered_access_view *view, const struct wined3d_uvec4 *clear_value)
 {
-    FIXME("context %p, view %p, clear_value %s.\n", context, view, debug_uvec4(clear_value));
+    TRACE("context %p, view %p, clear_value %s.\n", context, view, debug_uvec4(clear_value));
+
+    wined3d_unordered_access_view_vk_clear_uint(wined3d_unordered_access_view_vk(view),
+            clear_value, wined3d_context_vk(context));
 }
 
 static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 28028a76395..a690bd4ae6b 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -1478,6 +1478,69 @@ HRESULT wined3d_unordered_access_view_gl_init(struct wined3d_unordered_access_vi
     return hr;
 }
 
+void wined3d_unordered_access_view_vk_clear_uint(struct wined3d_unordered_access_view_vk *view_vk,
+        const struct wined3d_uvec4 *clear_value, struct wined3d_context_vk *context_vk)
+{
+    const struct wined3d_vk_info *vk_info;
+    const struct wined3d_format *format;
+    struct wined3d_buffer_vk *buffer_vk;
+    struct wined3d_resource *resource;
+    VkCommandBuffer vk_command_buffer;
+    VkBufferMemoryBarrier vk_barrier;
+    VkAccessFlags access_mask;
+    unsigned int offset, size;
+
+    TRACE("view_vk %p, clear_value %s, context_vk %p.\n", view_vk, debug_uvec4(clear_value), context_vk);
+
+    resource = view_vk->v.resource;
+    if (resource->type != WINED3D_RTYPE_BUFFER)
+    {
+        FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(resource->type));
+        return;
+    }
+
+    format = view_vk->v.format;
+    if (format->id != WINED3DFMT_R32_UINT && format->id != WINED3DFMT_R32_SINT)
+    {
+        FIXME("Not implemented for format %s.\n", debug_d3dformat(format->id));
+        return;
+    }
+
+    vk_info = context_vk->vk_info;
+    buffer_vk = wined3d_buffer_vk(buffer_from_resource(resource));
+    wined3d_buffer_load_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
+    wined3d_buffer_invalidate_location(&buffer_vk->b, ~WINED3D_LOCATION_BUFFER);
+
+    get_buffer_view_range(&buffer_vk->b, &view_vk->v.desc, format, &offset, &size);
+
+    if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk)))
+        return;
+    wined3d_context_vk_end_current_render_pass(context_vk);
+
+    access_mask = vk_access_mask_from_bind_flags(buffer_vk->b.resource.bind_flags);
+    vk_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
+    vk_barrier.pNext = NULL;
+    vk_barrier.srcAccessMask = access_mask;
+    vk_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+    vk_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+    vk_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+    vk_barrier.buffer = buffer_vk->bo.vk_buffer;
+    vk_barrier.offset = buffer_vk->bo.buffer_offset + offset;
+    vk_barrier.size = size;
+    VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+            VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1, &vk_barrier, 0, NULL));
+
+    VK_CALL(vkCmdFillBuffer(vk_command_buffer, buffer_vk->bo.vk_buffer,
+            buffer_vk->bo.buffer_offset + offset, size, clear_value->x));
+
+    vk_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+    vk_barrier.dstAccessMask = access_mask;
+    VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT,
+            VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 1, &vk_barrier, 0, NULL));
+
+    wined3d_context_vk_reference_bo(context_vk, &buffer_vk->bo);
+}
+
 void wined3d_unordered_access_view_vk_update(struct wined3d_unordered_access_view_vk *uav_vk,
         struct wined3d_context_vk *context_vk)
 {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 83e2566cca4..17acd4be4d5 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4993,6 +4993,8 @@ static inline struct wined3d_unordered_access_view_vk *wined3d_unordered_access_
     return CONTAINING_RECORD(view, struct wined3d_unordered_access_view_vk, v);
 }
 
+void wined3d_unordered_access_view_vk_clear_uint(struct wined3d_unordered_access_view_vk *view_vk,
+        const struct wined3d_uvec4 *clear_value, struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN;
 HRESULT wined3d_unordered_access_view_vk_init(struct wined3d_unordered_access_view_vk *view_vk,
         const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
         void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
-- 
2.20.1




More information about the wine-devel mailing list