Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2020
- 87 participants
- 2158 messages
Re: [PATCH 5/5] d3dcompiler: Set the x-dimension for struct types.
by Zebediah Figura
On 4/30/20 8:11 AM, Matteo Bruni wrote:
> On Thu, Apr 30, 2020 at 4:55 AM Zebediah Figura <z.figura12(a)gmail.com> wrote:
>>
>> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
>> ---
>> dlls/d3dcompiler_43/hlsl.y | 11 ++++++++++-
>> dlls/d3dcompiler_43/tests/hlsl_d3d9.c | 6 +++---
>> 2 files changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
>> index a33ea588ccf..9ef0b130d3d 100644
>> --- a/dlls/d3dcompiler_43/hlsl.y
>> +++ b/dlls/d3dcompiler_43/hlsl.y
>> @@ -839,6 +839,13 @@ static struct list *gen_struct_fields(struct hlsl_type *type, DWORD modifiers, s
>> return list;
>> }
>>
>> +static DWORD get_array_size(const struct hlsl_type *type)
>> +{
>> + if (type->type == HLSL_CLASS_ARRAY)
>> + return get_array_size(type->e.array.type) * type->e.array.elements_count;
>
> Are arrays of arrays supported in HLSL?
>
Yes, and they get written into the constant table as a single array.
That does deserve a test, of course...
April 30, 2020
[PATCH 5/5] wined3d: Create Vulkan buffer views for unordered access view counters.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 31 ++++++++++++++++---
dlls/wined3d/view.c | 54 +++++++++++++++++++++++++++++-----
dlls/wined3d/wined3d_private.h | 3 ++
3 files changed, 77 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index a0f503edbe5..bd943a65afb 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1218,6 +1218,8 @@ struct wined3d_view_vk_destroy_ctx
struct wined3d_device_vk *device_vk;
VkBufferView *vk_buffer_view;
VkImageView *vk_image_view;
+ struct wined3d_bo_vk *vk_counter_bo;
+ VkBufferView *vk_counter_view;
uint64_t *command_buffer_id;
void *object;
struct wined3d_view_vk_destroy_ctx *free;
@@ -1260,6 +1262,21 @@ static void wined3d_view_vk_destroy_object(void *object)
TRACE("Destroyed image view 0x%s.\n", wine_dbgstr_longlong(*ctx->vk_image_view));
}
}
+ if (ctx->vk_counter_bo && ctx->vk_counter_bo->vk_buffer)
+ wined3d_context_vk_destroy_bo(wined3d_context_vk(context), ctx->vk_counter_bo);
+ if (ctx->vk_counter_view)
+ {
+ if (context)
+ {
+ wined3d_context_vk_destroy_buffer_view(wined3d_context_vk(context),
+ *ctx->vk_counter_view, *ctx->command_buffer_id);
+ }
+ else
+ {
+ VK_CALL(vkDestroyBufferView(device_vk->vk_device, *ctx->vk_counter_view, NULL));
+ TRACE("Destroyed counter buffer view 0x%s.\n", wine_dbgstr_longlong(*ctx->vk_counter_view));
+ }
+ }
if (context)
context_release(context);
@@ -1269,7 +1286,8 @@ static void wined3d_view_vk_destroy_object(void *object)
}
static void wined3d_view_vk_destroy(struct wined3d_device *device, VkBufferView *vk_buffer_view,
- VkImageView *vk_image_view, uint64_t *command_buffer_id, void *view_vk)
+ VkImageView *vk_image_view, struct wined3d_bo_vk *vk_counter_bo,
+ VkBufferView *vk_counter_view, uint64_t *command_buffer_id, void *view_vk)
{
struct wined3d_view_vk_destroy_ctx *ctx, c;
@@ -1278,6 +1296,8 @@ static void wined3d_view_vk_destroy(struct wined3d_device *device, VkBufferView
ctx->device_vk = wined3d_device_vk(device);
ctx->vk_buffer_view = vk_buffer_view;
ctx->vk_image_view = vk_image_view;
+ ctx->vk_counter_bo = vk_counter_bo;
+ ctx->vk_counter_view = vk_counter_view;
ctx->command_buffer_id = command_buffer_id;
ctx->object = view_vk;
ctx->free = ctx != &c ? ctx : NULL;
@@ -1302,7 +1322,8 @@ static void adapter_vk_destroy_rendertarget_view(struct wined3d_rendertarget_vie
if (swapchain_count)
wined3d_device_incref(device);
wined3d_rendertarget_view_cleanup(&view_vk->v);
- wined3d_view_vk_destroy(device, NULL, &view_vk->vk_image_view, &view_vk->command_buffer_id, view_vk);
+ wined3d_view_vk_destroy(device, NULL, &view_vk->vk_image_view,
+ NULL, NULL, &view_vk->command_buffer_id, view_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
@@ -1355,7 +1376,8 @@ static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resour
else
vk_image_view = &view_vk->u.vk_image_info.imageView;
wined3d_shader_resource_view_cleanup(&srv_vk->v);
- wined3d_view_vk_destroy(device, vk_buffer_view, vk_image_view, &view_vk->command_buffer_id, srv_vk);
+ wined3d_view_vk_destroy(device, vk_buffer_view, vk_image_view,
+ NULL, NULL, &view_vk->command_buffer_id, srv_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
@@ -1408,7 +1430,8 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
else
vk_image_view = &view_vk->u.vk_image_info.imageView;
wined3d_unordered_access_view_cleanup(&uav_vk->v);
- wined3d_view_vk_destroy(device, vk_buffer_view, vk_image_view, &view_vk->command_buffer_id, uav_vk);
+ wined3d_view_vk_destroy(device, vk_buffer_view, vk_image_view, &uav_vk->counter_bo,
+ &uav_vk->vk_counter_view, &view_vk->command_buffer_id, uav_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index d87a94023d2..e7f77f58cd5 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -1459,13 +1459,16 @@ static void wined3d_unordered_access_view_vk_cs_init(void *object)
struct wined3d_view_vk *view_vk = &uav_vk->view_vk;
struct wined3d_view_desc *desc = &uav_vk->v.desc;
const struct wined3d_format_vk *format_vk;
+ const struct wined3d_vk_info *vk_info;
struct wined3d_texture_vk *texture_vk;
struct wined3d_context_vk *context_vk;
struct wined3d_device_vk *device_vk;
+ VkBufferViewCreateInfo create_info;
struct wined3d_resource *resource;
VkBufferView vk_buffer_view;
uint32_t default_flags = 0;
VkImageView vk_image_view;
+ VkResult vr;
resource = uav_vk->v.resource;
device_vk = wined3d_device_vk(resource->device);
@@ -1474,16 +1477,53 @@ static void wined3d_unordered_access_view_vk_cs_init(void *object)
if (resource->type == WINED3D_RTYPE_BUFFER)
{
context_vk = wined3d_context_vk(context_acquire(&device_vk->d, NULL, 0));
- vk_buffer_view = wined3d_view_vk_create_buffer_view(context_vk,
- desc, wined3d_buffer_vk(buffer_from_resource(resource)), format_vk);
- context_release(&context_vk->c);
+ vk_info = context_vk->vk_info;
- if (!vk_buffer_view)
- return;
+ if ((vk_buffer_view = wined3d_view_vk_create_buffer_view(context_vk,
+ desc, wined3d_buffer_vk(buffer_from_resource(resource)), format_vk)))
+ {
+ TRACE("Created buffer view 0x%s.\n", wine_dbgstr_longlong(vk_buffer_view));
- TRACE("Created buffer view 0x%s.\n", wine_dbgstr_longlong(vk_buffer_view));
+ uav_vk->view_vk.u.vk_buffer_view = vk_buffer_view;
+ }
+
+ if (desc->flags & (WINED3D_VIEW_BUFFER_COUNTER | WINED3D_VIEW_BUFFER_APPEND))
+ {
+ if (!wined3d_context_vk_create_bo(context_vk, sizeof(uint32_t), VK_BUFFER_USAGE_TRANSFER_SRC_BIT
+ | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &uav_vk->counter_bo))
+ {
+ ERR("Failed to create counter bo.\n");
+ context_release(&context_vk->c);
- uav_vk->view_vk.u.vk_buffer_view = vk_buffer_view;
+ return;
+ }
+
+ VK_CALL(vkCmdFillBuffer(wined3d_context_vk_get_command_buffer(context_vk),
+ uav_vk->counter_bo.vk_buffer, uav_vk->counter_bo.buffer_offset, sizeof(uint32_t), 0));
+ wined3d_context_vk_reference_bo(context_vk, &uav_vk->counter_bo);
+
+ create_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
+ create_info.pNext = NULL;
+ create_info.flags = 0;
+ create_info.buffer = uav_vk->counter_bo.vk_buffer;
+ create_info.format = VK_FORMAT_R32_UINT;
+ create_info.offset = uav_vk->counter_bo.buffer_offset;
+ create_info.range = sizeof(uint32_t);
+ if ((vr = VK_CALL(vkCreateBufferView(device_vk->vk_device,
+ &create_info, NULL, &uav_vk->vk_counter_view))) < 0)
+ {
+ ERR("Failed to create counter buffer view, vr %s.\n", wined3d_debug_vkresult(vr));
+ }
+ else
+ {
+ TRACE("Created counter buffer view 0x%s.\n", wine_dbgstr_longlong(uav_vk->vk_counter_view));
+
+ uav_vk->v.counter_bo = (uintptr_t)&uav_vk->counter_bo;
+ }
+ }
+
+ context_release(&context_vk->c);
return;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a65a33ad256..2409728f270 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4671,6 +4671,9 @@ struct wined3d_unordered_access_view_vk
{
struct wined3d_unordered_access_view v;
struct wined3d_view_vk view_vk;
+
+ VkBufferView vk_counter_view;
+ struct wined3d_bo_vk counter_bo;
};
static inline struct wined3d_unordered_access_view_vk *wined3d_unordered_access_view_vk(
--
2.20.1
April 30, 2020
[PATCH 4/5] wined3d: Create Vulkan buffer views for unordered access views.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 7 +++++--
dlls/wined3d/view.c | 14 +++++++++++++-
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 5a5b51da501..a0f503edbe5 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1392,6 +1392,7 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
struct wined3d_device *device = uav_vk->v.resource->device;
unsigned int swapchain_count = device->swapchain_count;
struct wined3d_view_vk *view_vk = &uav_vk->view_vk;
+ VkBufferView *vk_buffer_view = NULL;
VkImageView *vk_image_view = NULL;
TRACE("uav_vk %p.\n", uav_vk);
@@ -1402,10 +1403,12 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
* the refcount on a device that's in the process of being destroyed. */
if (swapchain_count)
wined3d_device_incref(device);
- if (uav_vk->v.resource->type != WINED3D_RTYPE_BUFFER)
+ if (uav_vk->v.resource->type == WINED3D_RTYPE_BUFFER)
+ vk_buffer_view = &view_vk->u.vk_buffer_view;
+ else
vk_image_view = &view_vk->u.vk_image_info.imageView;
wined3d_unordered_access_view_cleanup(&uav_vk->v);
- wined3d_view_vk_destroy(device, NULL, vk_image_view, &view_vk->command_buffer_id, uav_vk);
+ wined3d_view_vk_destroy(device, vk_buffer_view, vk_image_view, &view_vk->command_buffer_id, uav_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 1e9a2052ecf..d87a94023d2 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -1463,6 +1463,7 @@ static void wined3d_unordered_access_view_vk_cs_init(void *object)
struct wined3d_context_vk *context_vk;
struct wined3d_device_vk *device_vk;
struct wined3d_resource *resource;
+ VkBufferView vk_buffer_view;
uint32_t default_flags = 0;
VkImageView vk_image_view;
@@ -1472,7 +1473,18 @@ static void wined3d_unordered_access_view_vk_cs_init(void *object)
if (resource->type == WINED3D_RTYPE_BUFFER)
{
- FIXME("Buffer views not implemented.\n");
+ context_vk = wined3d_context_vk(context_acquire(&device_vk->d, NULL, 0));
+ vk_buffer_view = wined3d_view_vk_create_buffer_view(context_vk,
+ desc, wined3d_buffer_vk(buffer_from_resource(resource)), format_vk);
+ context_release(&context_vk->c);
+
+ if (!vk_buffer_view)
+ return;
+
+ TRACE("Created buffer view 0x%s.\n", wine_dbgstr_longlong(vk_buffer_view));
+
+ uav_vk->view_vk.u.vk_buffer_view = vk_buffer_view;
+
return;
}
--
2.20.1
April 30, 2020
[PATCH 3/5] wined3d: Create Vulkan image views for unordered access views.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 14 +++++---
dlls/wined3d/view.c | 64 +++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 4f00a5a575e..5a5b51da501 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1388,11 +1388,13 @@ static HRESULT adapter_vk_create_unordered_access_view(const struct wined3d_view
static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_access_view *view)
{
- struct wined3d_unordered_access_view_vk *view_vk = wined3d_unordered_access_view_vk(view);
- struct wined3d_device *device = view_vk->v.resource->device;
+ struct wined3d_unordered_access_view_vk *uav_vk = wined3d_unordered_access_view_vk(view);
+ struct wined3d_device *device = uav_vk->v.resource->device;
unsigned int swapchain_count = device->swapchain_count;
+ struct wined3d_view_vk *view_vk = &uav_vk->view_vk;
+ VkImageView *vk_image_view = NULL;
- TRACE("view_vk %p.\n", view_vk);
+ TRACE("uav_vk %p.\n", uav_vk);
/* Take a reference to the device, in case releasing the view's resource
* would cause the device to be destroyed. However, swapchain resources
@@ -1400,8 +1402,10 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
* the refcount on a device that's in the process of being destroyed. */
if (swapchain_count)
wined3d_device_incref(device);
- wined3d_unordered_access_view_cleanup(&view_vk->v);
- wined3d_cs_destroy_object(device->cs, heap_free, view_vk);
+ if (uav_vk->v.resource->type != WINED3D_RTYPE_BUFFER)
+ vk_image_view = &view_vk->u.vk_image_info.imageView;
+ wined3d_unordered_access_view_cleanup(&uav_vk->v);
+ wined3d_view_vk_destroy(device, NULL, vk_image_view, &view_vk->command_buffer_id, uav_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 572fdbd620a..1e9a2052ecf 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -1453,14 +1453,76 @@ HRESULT wined3d_unordered_access_view_gl_init(struct wined3d_unordered_access_vi
return hr;
}
+static void wined3d_unordered_access_view_vk_cs_init(void *object)
+{
+ struct wined3d_unordered_access_view_vk *uav_vk = object;
+ struct wined3d_view_vk *view_vk = &uav_vk->view_vk;
+ struct wined3d_view_desc *desc = &uav_vk->v.desc;
+ const struct wined3d_format_vk *format_vk;
+ struct wined3d_texture_vk *texture_vk;
+ struct wined3d_context_vk *context_vk;
+ struct wined3d_device_vk *device_vk;
+ struct wined3d_resource *resource;
+ uint32_t default_flags = 0;
+ VkImageView vk_image_view;
+
+ resource = uav_vk->v.resource;
+ device_vk = wined3d_device_vk(resource->device);
+ format_vk = wined3d_format_vk(uav_vk->v.format);
+
+ if (resource->type == WINED3D_RTYPE_BUFFER)
+ {
+ FIXME("Buffer views not implemented.\n");
+ return;
+ }
+
+ texture_vk = wined3d_texture_vk(texture_from_resource(resource));
+
+ if (texture_vk->t.layer_count > 1)
+ default_flags |= WINED3D_VIEW_TEXTURE_ARRAY;
+
+ if (resource->format->id == format_vk->f.id && desc->flags == default_flags
+ && !desc->u.texture.level_idx && desc->u.texture.level_count == texture_vk->t.level_count
+ && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture_vk->t.layer_count
+ && !(resource->bind_flags & WINED3D_BIND_DEPTH_STENCIL) && resource->type != WINED3D_RTYPE_TEXTURE_3D)
+ {
+ TRACE("Creating identity unordered access view.\n");
+ return;
+ }
+
+ if (texture_vk->t.swapchain && texture_vk->t.swapchain->state.desc.backbuffer_count > 1)
+ FIXME("Swapchain unordered access views not supported.\n");
+
+ context_vk = wined3d_context_vk(context_acquire(&device_vk->d, NULL, 0));
+ vk_image_view = wined3d_view_vk_create_texture_view(context_vk, desc,
+ texture_vk, format_vk, format_vk->f.color_fixup, false);
+ context_release(&context_vk->c);
+
+ if (!vk_image_view)
+ return;
+
+ TRACE("Created image view 0x%s.\n", wine_dbgstr_longlong(vk_image_view));
+
+ view_vk->u.vk_image_info.imageView = vk_image_view;
+ view_vk->u.vk_image_info.sampler = VK_NULL_HANDLE;
+ view_vk->u.vk_image_info.imageLayout = texture_vk->layout;
+}
+
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)
{
+ HRESULT hr;
+
TRACE("view_vk %p, desc %s, resource %p, parent %p, parent_ops %p.\n",
view_vk, wined3d_debug_view_desc(desc, resource), resource, parent, parent_ops);
- return wined3d_unordered_access_view_init(&view_vk->v, desc, resource, parent, parent_ops);
+ if (FAILED(hr = wined3d_unordered_access_view_init(&view_vk->v, desc, resource, parent, parent_ops)))
+ return hr;
+
+ wined3d_cs_init_object(resource->device->cs, wined3d_unordered_access_view_vk_cs_init, view_vk);
+
+ return hr;
}
HRESULT CDECL wined3d_unordered_access_view_create(const struct wined3d_view_desc *desc,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f46690a3518..a65a33ad256 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4670,6 +4670,7 @@ HRESULT wined3d_unordered_access_view_gl_init(struct wined3d_unordered_access_vi
struct wined3d_unordered_access_view_vk
{
struct wined3d_unordered_access_view v;
+ struct wined3d_view_vk view_vk;
};
static inline struct wined3d_unordered_access_view_vk *wined3d_unordered_access_view_vk(
--
2.20.1
April 30, 2020
[PATCH 2/5] wined3d: Create Vulkan buffer views for shader resource views.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 43 +++++++++++++++++++++-------
dlls/wined3d/buffer.c | 2 +-
dlls/wined3d/context_vk.c | 30 ++++++++++++++++++++
dlls/wined3d/view.c | 52 +++++++++++++++++++++++++++++++---
dlls/wined3d/wined3d_private.h | 16 +++++++++--
5 files changed, 125 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 7958204bb82..4f00a5a575e 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1216,6 +1216,7 @@ static HRESULT adapter_vk_create_rendertarget_view(const struct wined3d_view_des
struct wined3d_view_vk_destroy_ctx
{
struct wined3d_device_vk *device_vk;
+ VkBufferView *vk_buffer_view;
VkImageView *vk_image_view;
uint64_t *command_buffer_id;
void *object;
@@ -1227,32 +1228,47 @@ static void wined3d_view_vk_destroy_object(void *object)
struct wined3d_view_vk_destroy_ctx *ctx = object;
const struct wined3d_vk_info *vk_info;
struct wined3d_device_vk *device_vk;
+ struct wined3d_context *context;
device_vk = ctx->device_vk;
vk_info = &wined3d_adapter_vk(device_vk->d.adapter)->vk_info;
+ context = context_acquire(&device_vk->d, NULL, 0);
- if (ctx->vk_image_view)
+ if (ctx->vk_buffer_view)
{
- struct wined3d_context *context;
-
- if (!(context = context_acquire(&device_vk->d, NULL, 0)))
+ if (context)
{
- VK_CALL(vkDestroyImageView(device_vk->vk_device, *ctx->vk_image_view, NULL));
- TRACE("Destroyed image view 0x%s.\n", wine_dbgstr_longlong(*ctx->vk_image_view));
+ wined3d_context_vk_destroy_buffer_view(wined3d_context_vk(context),
+ *ctx->vk_buffer_view, *ctx->command_buffer_id);
}
else
+ {
+ VK_CALL(vkDestroyBufferView(device_vk->vk_device, *ctx->vk_buffer_view, NULL));
+ TRACE("Destroyed buffer view 0x%s.\n", wine_dbgstr_longlong(*ctx->vk_buffer_view));
+ }
+ }
+ if (ctx->vk_image_view)
+ {
+ if (context)
{
wined3d_context_vk_destroy_image_view(wined3d_context_vk(context),
*ctx->vk_image_view, *ctx->command_buffer_id);
- context_release(context);
+ }
+ else
+ {
+ VK_CALL(vkDestroyImageView(device_vk->vk_device, *ctx->vk_image_view, NULL));
+ TRACE("Destroyed image view 0x%s.\n", wine_dbgstr_longlong(*ctx->vk_image_view));
}
}
+ if (context)
+ context_release(context);
+
heap_free(ctx->object);
heap_free(ctx->free);
}
-static void wined3d_view_vk_destroy(struct wined3d_device *device,
+static void wined3d_view_vk_destroy(struct wined3d_device *device, VkBufferView *vk_buffer_view,
VkImageView *vk_image_view, uint64_t *command_buffer_id, void *view_vk)
{
struct wined3d_view_vk_destroy_ctx *ctx, c;
@@ -1260,6 +1276,7 @@ static void wined3d_view_vk_destroy(struct wined3d_device *device,
if (!(ctx = heap_alloc(sizeof(*ctx))))
ctx = &c;
ctx->device_vk = wined3d_device_vk(device);
+ ctx->vk_buffer_view = vk_buffer_view;
ctx->vk_image_view = vk_image_view;
ctx->command_buffer_id = command_buffer_id;
ctx->object = view_vk;
@@ -1285,7 +1302,7 @@ static void adapter_vk_destroy_rendertarget_view(struct wined3d_rendertarget_vie
if (swapchain_count)
wined3d_device_incref(device);
wined3d_rendertarget_view_cleanup(&view_vk->v);
- wined3d_view_vk_destroy(device, &view_vk->vk_image_view, &view_vk->command_buffer_id, view_vk);
+ wined3d_view_vk_destroy(device, NULL, &view_vk->vk_image_view, &view_vk->command_buffer_id, view_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
@@ -1322,6 +1339,8 @@ static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resour
struct wined3d_device *device = srv_vk->v.resource->device;
unsigned int swapchain_count = device->swapchain_count;
struct wined3d_view_vk *view_vk = &srv_vk->view_vk;
+ VkBufferView *vk_buffer_view = NULL;
+ VkImageView *vk_image_view = NULL;
TRACE("srv_vk %p.\n", srv_vk);
@@ -1331,8 +1350,12 @@ static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resour
* the refcount on a device that's in the process of being destroyed. */
if (swapchain_count)
wined3d_device_incref(device);
+ if (srv_vk->v.resource->type == WINED3D_RTYPE_BUFFER)
+ vk_buffer_view = &view_vk->u.vk_buffer_view;
+ else
+ vk_image_view = &view_vk->u.vk_image_info.imageView;
wined3d_shader_resource_view_cleanup(&srv_vk->v);
- wined3d_view_vk_destroy(device, &view_vk->vk_image_info.imageView, &view_vk->command_buffer_id, srv_vk);
+ wined3d_view_vk_destroy(device, vk_buffer_view, vk_image_view, &view_vk->command_buffer_id, srv_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 703a8aee70e..4d1db98b884 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -598,7 +598,7 @@ static void buffer_conversion_upload(struct wined3d_buffer *buffer, struct wined
heap_free(data);
}
-static BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer,
+BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer,
struct wined3d_context *context, unsigned int location)
{
return buffer->buffer_ops->buffer_prepare_location(buffer, context, location);
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index e8fcc391782..35b2b7eb7c7 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -469,6 +469,31 @@ void wined3d_context_vk_destroy_image(struct wined3d_context_vk *context_vk,
o->command_buffer_id = command_buffer_id;
}
+void wined3d_context_vk_destroy_buffer_view(struct wined3d_context_vk *context_vk,
+ VkBufferView vk_view, uint64_t command_buffer_id)
+{
+ struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
+ const struct wined3d_vk_info *vk_info = context_vk->vk_info;
+ struct wined3d_retired_object_vk *o;
+
+ if (context_vk->completed_command_buffer_id > command_buffer_id)
+ {
+ VK_CALL(vkDestroyBufferView(device_vk->vk_device, vk_view, NULL));
+ TRACE("Destroyed buffer view 0x%s.\n", wine_dbgstr_longlong(vk_view));
+ return;
+ }
+
+ if (!(o = wined3d_context_vk_get_retired_object_vk(context_vk)))
+ {
+ ERR("Leaking buffer view 0x%s.\n", wine_dbgstr_longlong(vk_view));
+ return;
+ }
+
+ o->type = WINED3D_RETIRED_BUFFER_VIEW_VK;
+ o->u.vk_buffer_view = vk_view;
+ o->command_buffer_id = command_buffer_id;
+}
+
void wined3d_context_vk_destroy_image_view(struct wined3d_context_vk *context_vk,
VkImageView vk_view, uint64_t command_buffer_id)
{
@@ -592,6 +617,11 @@ static void wined3d_context_vk_cleanup_resources(struct wined3d_context_vk *cont
TRACE("Destroyed image 0x%s.\n", wine_dbgstr_longlong(o->u.vk_image));
break;
+ case WINED3D_RETIRED_BUFFER_VIEW_VK:
+ VK_CALL(vkDestroyBufferView(device_vk->vk_device, o->u.vk_buffer_view, NULL));
+ TRACE("Destroyed buffer view 0x%s.\n", wine_dbgstr_longlong(o->u.vk_buffer_view));
+ break;
+
case WINED3D_RETIRED_IMAGE_VIEW_VK:
VK_CALL(vkDestroyImageView(device_vk->vk_device, o->u.vk_image_view, NULL));
TRACE("Destroyed image view 0x%s.\n", wine_dbgstr_longlong(o->u.vk_image_view));
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index f131f77f555..572fdbd620a 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -653,6 +653,38 @@ VkImageViewType vk_image_view_type_from_wined3d(enum wined3d_resource_type type,
}
}
+static VkBufferView wined3d_view_vk_create_buffer_view(struct wined3d_context_vk *context_vk,
+ const struct wined3d_view_desc *desc, struct wined3d_buffer_vk *buffer_vk,
+ const struct wined3d_format_vk *view_format_vk)
+{
+ const struct wined3d_vk_info *vk_info = context_vk->vk_info;
+ VkBufferViewCreateInfo create_info;
+ struct wined3d_device_vk *device_vk;
+ VkBufferView vk_buffer_view;
+ unsigned int offset, size;
+ VkResult vr;
+
+ get_buffer_view_range(&buffer_vk->b, desc, &view_format_vk->f, &offset, &size);
+ wined3d_buffer_prepare_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
+
+ create_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
+ create_info.pNext = NULL;
+ create_info.flags = 0;
+ create_info.buffer = buffer_vk->bo.vk_buffer;
+ create_info.format = view_format_vk->vk_format;
+ create_info.offset = buffer_vk->bo.buffer_offset + offset;
+ create_info.range = size;
+
+ device_vk = wined3d_device_vk(buffer_vk->b.resource.device);
+ if ((vr = VK_CALL(vkCreateBufferView(device_vk->vk_device, &create_info, NULL, &vk_buffer_view))) < 0)
+ {
+ ERR("Failed to create buffer view, vr %s.\n", wined3d_debug_vkresult(vr));
+ return VK_NULL_HANDLE;
+ }
+
+ return vk_buffer_view;
+}
+
static VkImageView wined3d_view_vk_create_texture_view(struct wined3d_context_vk *context_vk,
const struct wined3d_view_desc *desc, struct wined3d_texture_vk *texture_vk,
const struct wined3d_format_vk *view_format_vk, struct color_fixup_desc fixup, bool srv)
@@ -987,6 +1019,7 @@ static void wined3d_shader_resource_view_vk_cs_init(void *object)
const struct wined3d_format *format;
struct wined3d_resource *resource;
struct wined3d_context *context;
+ VkBufferView vk_buffer_view;
uint32_t default_flags = 0;
VkImageView vk_image_view;
@@ -995,7 +1028,18 @@ static void wined3d_shader_resource_view_vk_cs_init(void *object)
if (resource->type == WINED3D_RTYPE_BUFFER)
{
- FIXME("Buffer views not implemented.\n");
+ context = context_acquire(resource->device, NULL, 0);
+ vk_buffer_view = wined3d_view_vk_create_buffer_view(wined3d_context_vk(context),
+ desc, wined3d_buffer_vk(buffer_from_resource(resource)), wined3d_format_vk(format));
+ context_release(context);
+
+ if (!vk_buffer_view)
+ return;
+
+ TRACE("Created buffer view 0x%s.\n", wine_dbgstr_longlong(vk_buffer_view));
+
+ srv_vk->view_vk.u.vk_buffer_view = vk_buffer_view;
+
return;
}
@@ -1026,9 +1070,9 @@ static void wined3d_shader_resource_view_vk_cs_init(void *object)
TRACE("Created image view 0x%s.\n", wine_dbgstr_longlong(vk_image_view));
- srv_vk->view_vk.vk_image_info.imageView = vk_image_view;
- srv_vk->view_vk.vk_image_info.sampler = VK_NULL_HANDLE;
- srv_vk->view_vk.vk_image_info.imageLayout = texture_vk->layout;
+ srv_vk->view_vk.u.vk_image_info.imageView = vk_image_view;
+ srv_vk->view_vk.u.vk_image_info.sampler = VK_NULL_HANDLE;
+ srv_vk->view_vk.u.vk_image_info.imageLayout = texture_vk->layout;
}
HRESULT wined3d_shader_resource_view_vk_init(struct wined3d_shader_resource_view_vk *view_vk,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a15b4826e2e..f46690a3518 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2230,6 +2230,7 @@ enum wined3d_retired_object_type_vk
WINED3D_RETIRED_BO_SLAB_SLICE_VK,
WINED3D_RETIRED_BUFFER_VK,
WINED3D_RETIRED_IMAGE_VK,
+ WINED3D_RETIRED_BUFFER_VIEW_VK,
WINED3D_RETIRED_IMAGE_VIEW_VK,
};
@@ -2249,6 +2250,7 @@ struct wined3d_retired_object_vk
} slice;
VkBuffer vk_buffer;
VkImage vk_image;
+ VkBufferView vk_buffer_view;
VkImageView vk_image_view;
} u;
uint64_t command_buffer_id;
@@ -2322,6 +2324,8 @@ void wined3d_context_vk_destroy_allocator_block(struct wined3d_context_vk *conte
struct wined3d_allocator_block *block, uint64_t command_buffer_id) DECLSPEC_HIDDEN;
void wined3d_context_vk_destroy_bo(struct wined3d_context_vk *context_vk,
const struct wined3d_bo_vk *bo) DECLSPEC_HIDDEN;
+void wined3d_context_vk_destroy_buffer_view(struct wined3d_context_vk *context_vk,
+ VkBufferView vk_view, uint64_t command_buffer_id) DECLSPEC_HIDDEN;
void wined3d_context_vk_destroy_framebuffer(struct wined3d_context_vk *context_vk,
VkFramebuffer vk_framebuffer, uint64_t command_buffer_id) DECLSPEC_HIDDEN;
void wined3d_context_vk_destroy_image(struct wined3d_context_vk *context_vk,
@@ -4434,6 +4438,8 @@ static inline struct wined3d_buffer *buffer_from_resource(struct wined3d_resourc
}
void wined3d_buffer_cleanup(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN;
+void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset,
+ struct wined3d_buffer *src_buffer, unsigned int src_offset, unsigned int size) DECLSPEC_HIDDEN;
DWORD wined3d_buffer_get_memory(struct wined3d_buffer *buffer,
struct wined3d_bo_address *data, DWORD locations) DECLSPEC_HIDDEN;
void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD location) DECLSPEC_HIDDEN;
@@ -4442,8 +4448,8 @@ void wined3d_buffer_load(struct wined3d_buffer *buffer, struct wined3d_context *
BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
BYTE *wined3d_buffer_load_sysmem(struct wined3d_buffer *buffer, struct wined3d_context *context) DECLSPEC_HIDDEN;
-void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset,
- struct wined3d_buffer *src_buffer, unsigned int src_offset, unsigned int size) DECLSPEC_HIDDEN;
+BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer,
+ struct wined3d_context *context, unsigned int location) DECLSPEC_HIDDEN;
void wined3d_buffer_upload_data(struct wined3d_buffer *buffer, struct wined3d_context *context,
const struct wined3d_box *box, const void *data) DECLSPEC_HIDDEN;
@@ -4596,7 +4602,11 @@ HRESULT wined3d_shader_resource_view_gl_init(struct wined3d_shader_resource_view
struct wined3d_view_vk
{
- VkDescriptorImageInfo vk_image_info;
+ union
+ {
+ VkBufferView vk_buffer_view;
+ VkDescriptorImageInfo vk_image_info;
+ } u;
uint64_t command_buffer_id;
};
--
2.20.1
April 30, 2020
[PATCH 1/5] wined3d: Create Vulkan image views for shader resource views.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 11 +-
dlls/wined3d/texture.c | 18 +++
dlls/wined3d/utils.c | 1 +
dlls/wined3d/view.c | 204 ++++++++++++++++++++++++++-------
dlls/wined3d/wined3d_private.h | 8 ++
5 files changed, 194 insertions(+), 48 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index f9b3e4721a2..7958204bb82 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1318,11 +1318,12 @@ static HRESULT adapter_vk_create_shader_resource_view(const struct wined3d_view_
static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resource_view *view)
{
- struct wined3d_shader_resource_view_vk *view_vk = wined3d_shader_resource_view_vk(view);
- struct wined3d_device *device = view_vk->v.resource->device;
+ struct wined3d_shader_resource_view_vk *srv_vk = wined3d_shader_resource_view_vk(view);
+ struct wined3d_device *device = srv_vk->v.resource->device;
unsigned int swapchain_count = device->swapchain_count;
+ struct wined3d_view_vk *view_vk = &srv_vk->view_vk;
- TRACE("view_vk %p.\n", view_vk);
+ TRACE("srv_vk %p.\n", srv_vk);
/* Take a reference to the device, in case releasing the view's resource
* would cause the device to be destroyed. However, swapchain resources
@@ -1330,8 +1331,8 @@ static void adapter_vk_destroy_shader_resource_view(struct wined3d_shader_resour
* the refcount on a device that's in the process of being destroyed. */
if (swapchain_count)
wined3d_device_incref(device);
- wined3d_shader_resource_view_cleanup(&view_vk->v);
- wined3d_cs_destroy_object(device->cs, heap_free, view_vk);
+ wined3d_shader_resource_view_cleanup(&srv_vk->v);
+ wined3d_view_vk_destroy(device, &view_vk->vk_image_info.imageView, &view_vk->command_buffer_id, srv_vk);
if (swapchain_count)
wined3d_device_decref(device);
}
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 4f55abb5e2b..b8b90c95c5e 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -4484,6 +4484,24 @@ HRESULT wined3d_texture_no3d_init(struct wined3d_texture *texture_no3d, struct w
flags, device, parent, parent_ops, &texture_no3d[1], &wined3d_texture_no3d_ops);
}
+void wined3d_vk_swizzle_from_color_fixup(VkComponentMapping *mapping, struct color_fixup_desc fixup)
+{
+ static const VkComponentSwizzle swizzle_source[] =
+ {
+ VK_COMPONENT_SWIZZLE_ZERO, /* CHANNEL_SOURCE_ZERO */
+ VK_COMPONENT_SWIZZLE_ONE, /* CHANNEL_SOURCE_ONE */
+ VK_COMPONENT_SWIZZLE_R, /* CHANNEL_SOURCE_X */
+ VK_COMPONENT_SWIZZLE_G, /* CHANNEL_SOURCE_Y */
+ VK_COMPONENT_SWIZZLE_B, /* CHANNEL_SOURCE_Z */
+ VK_COMPONENT_SWIZZLE_A, /* CHANNEL_SOURCE_W */
+ };
+
+ mapping->r = swizzle_source[fixup.x_source];
+ mapping->g = swizzle_source[fixup.y_source];
+ mapping->b = swizzle_source[fixup.z_source];
+ mapping->a = swizzle_source[fixup.w_source];
+}
+
const VkDescriptorImageInfo *wined3d_texture_vk_get_default_image_info(struct wined3d_texture_vk *texture_vk,
struct wined3d_context_vk *context_vk)
{
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 5e9673f2c76..2108eb65ba3 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -4229,6 +4229,7 @@ static void init_vulkan_format_info(struct wined3d_format_vk *format,
}
format->vk_format = vk_format;
+ format->f.color_fixup = COLOR_FIXUP_IDENTITY;
VK_CALL(vkGetPhysicalDeviceFormatProperties(vk_physical_device, vk_format, &properties));
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index fee64bd47d2..f131f77f555 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -653,19 +653,111 @@ VkImageViewType vk_image_view_type_from_wined3d(enum wined3d_resource_type type,
}
}
+static VkImageView wined3d_view_vk_create_texture_view(struct wined3d_context_vk *context_vk,
+ const struct wined3d_view_desc *desc, struct wined3d_texture_vk *texture_vk,
+ const struct wined3d_format_vk *view_format_vk, struct color_fixup_desc fixup, bool srv)
+{
+ const struct wined3d_resource *resource = &texture_vk->t.resource;
+ const struct wined3d_vk_info *vk_info = context_vk->vk_info;
+ const struct wined3d_format_vk *format_vk;
+ struct wined3d_device_vk *device_vk;
+ VkImageViewCreateInfo create_info;
+ VkImageView vk_image_view;
+ VkResult vr;
+
+ device_vk = wined3d_device_vk(resource->device);
+
+ if (!wined3d_texture_vk_prepare_texture(texture_vk, context_vk))
+ {
+ ERR("Failed to prepare texture.\n");
+ return VK_NULL_HANDLE;
+ }
+
+ /* Depth formats are a little complicated. For example, the typeless
+ * format corresponding to depth/stencil view format WINED3DFMT_D32_FLOAT
+ * is WINED3DFMT_R32_TYPELESS, and the corresponding shader resource view
+ * format would be WINED3DFMT_R32_FLOAT. Vulkan depth/stencil formats are
+ * only compatible with themselves, so it's not possible to create e.g. a
+ * VK_FORMAT_R32_SFLOAT view on a VK_FORMAT_D32_SFLOAT image. In order to
+ * make it work, we create Vulkan images for WINED3DFMT_R32_TYPELESS
+ * resources with either a depth format (VK_FORMAT_D32_SFLOAT) or a colour
+ * format, depending on whether the bind flags include
+ * WINED3D_BIND_DEPTH_STENCIL or not. In order to then create a Vulkan
+ * view on the image, we then replace the view format here with the
+ * underlying resource format. However, that means it's still not possible
+ * to create e.g. a WINED3DFMT_R32_UINT view on a WINED3DFMT_R32_TYPELESS
+ * depth/stencil resource. */
+ if (resource->bind_flags & WINED3D_BIND_DEPTH_STENCIL)
+ format_vk = wined3d_format_vk(resource->format);
+ else
+ format_vk = view_format_vk;
+
+ create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ create_info.pNext = NULL;
+ create_info.flags = 0;
+ create_info.image = texture_vk->vk_image;
+ create_info.viewType = vk_image_view_type_from_wined3d(resource->type, desc->flags);
+ if (!srv && create_info.viewType == VK_IMAGE_VIEW_TYPE_3D)
+ {
+ if (desc->u.texture.layer_count > 1)
+ create_info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ else
+ create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ }
+ create_info.format = format_vk->vk_format;
+ if (is_stencil_view_format(&view_format_vk->f))
+ {
+ create_info.components.r = VK_COMPONENT_SWIZZLE_ZERO;
+ create_info.components.g = VK_COMPONENT_SWIZZLE_R;
+ create_info.components.b = VK_COMPONENT_SWIZZLE_ZERO;
+ create_info.components.a = VK_COMPONENT_SWIZZLE_ZERO;
+ }
+ else if (is_identity_fixup(fixup) || !can_use_texture_swizzle(context_vk->c.d3d_info, &format_vk->f))
+ {
+ create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
+ create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
+ create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
+ create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
+ }
+ else
+ {
+ wined3d_vk_swizzle_from_color_fixup(&create_info.components, fixup);
+ }
+ if ((resource->bind_flags & WINED3D_BIND_DEPTH_STENCIL)
+ && (view_format_vk->f.red_size || view_format_vk->f.green_size))
+ {
+ create_info.subresourceRange.aspectMask = 0;
+ if (view_format_vk->f.red_size)
+ create_info.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
+ if (view_format_vk->f.green_size)
+ create_info.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
+ }
+ else
+ {
+ create_info.subresourceRange.aspectMask = vk_aspect_mask_from_format(&format_vk->f);
+ }
+ create_info.subresourceRange.baseMipLevel = desc->u.texture.level_idx;
+ create_info.subresourceRange.levelCount = desc->u.texture.level_count;
+ create_info.subresourceRange.baseArrayLayer = desc->u.texture.layer_idx;
+ create_info.subresourceRange.layerCount = desc->u.texture.layer_count;
+ if ((vr = VK_CALL(vkCreateImageView(device_vk->vk_device, &create_info, NULL, &vk_image_view))) < 0)
+ {
+ ERR("Failed to create Vulkan image view, vr %s.\n", wined3d_debug_vkresult(vr));
+ return VK_NULL_HANDLE;
+ }
+
+ return vk_image_view;
+}
+
static void wined3d_render_target_view_vk_cs_init(void *object)
{
struct wined3d_rendertarget_view_vk *view_vk = object;
struct wined3d_view_desc *desc = &view_vk->v.desc;
const struct wined3d_format_vk *format_vk;
- struct VkImageViewCreateInfo create_info;
- const struct wined3d_vk_info *vk_info;
struct wined3d_texture_vk *texture_vk;
- struct wined3d_device_vk *device_vk;
struct wined3d_resource *resource;
struct wined3d_context *context;
uint32_t default_flags = 0;
- VkResult vr;
resource = view_vk->v.resource;
if (resource->type == WINED3D_RTYPE_BUFFER)
@@ -696,48 +788,15 @@ static void wined3d_render_target_view_vk_cs_init(void *object)
return;
}
- device_vk = wined3d_device_vk(resource->device);
- context = context_acquire(&device_vk->d, NULL, 0);
- vk_info = wined3d_context_vk(context)->vk_info;
+ context = context_acquire(resource->device, NULL, 0);
+ view_vk->vk_image_view = wined3d_view_vk_create_texture_view(wined3d_context_vk(context),
+ desc, texture_vk, format_vk, COLOR_FIXUP_IDENTITY, false);
+ context_release(context);
- if (!wined3d_texture_vk_prepare_texture(texture_vk, wined3d_context_vk(context)))
- {
- ERR("Failed to prepare texture.\n");
- context_release(context);
+ if (!view_vk->vk_image_view)
return;
- }
- create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
- create_info.pNext = NULL;
- create_info.flags = 0;
- create_info.image = texture_vk->vk_image;
- create_info.viewType = vk_image_view_type_from_wined3d(resource->type, desc->flags);
- if (create_info.viewType == VK_IMAGE_VIEW_TYPE_3D)
- {
- if (desc->u.texture.layer_count > 1)
- create_info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
- else
- create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
- }
- create_info.format = format_vk->vk_format;
- create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
- create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
- create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
- create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
- create_info.subresourceRange.aspectMask = vk_aspect_mask_from_format(&format_vk->f);
- create_info.subresourceRange.baseMipLevel = desc->u.texture.level_idx;
- create_info.subresourceRange.levelCount = desc->u.texture.level_count;
- create_info.subresourceRange.baseArrayLayer = desc->u.texture.layer_idx;
- create_info.subresourceRange.layerCount = desc->u.texture.layer_count;
- if ((vr = VK_CALL(vkCreateImageView(device_vk->vk_device, &create_info, NULL, &view_vk->vk_image_view))) < 0)
- {
- ERR("Failed to create Vulkan image view, vr %d.\n", vr);
- context_release(context);
- return;
- }
TRACE("Created image view 0x%s.\n", wine_dbgstr_longlong(view_vk->vk_image_view));
-
- context_release(context);
}
HRESULT wined3d_rendertarget_view_vk_init(struct wined3d_rendertarget_view_vk *view_vk,
@@ -920,14 +979,73 @@ HRESULT wined3d_shader_resource_view_gl_init(struct wined3d_shader_resource_view
return hr;
}
+static void wined3d_shader_resource_view_vk_cs_init(void *object)
+{
+ struct wined3d_shader_resource_view_vk *srv_vk = object;
+ struct wined3d_view_desc *desc = &srv_vk->v.desc;
+ struct wined3d_texture_vk *texture_vk;
+ const struct wined3d_format *format;
+ struct wined3d_resource *resource;
+ struct wined3d_context *context;
+ uint32_t default_flags = 0;
+ VkImageView vk_image_view;
+
+ resource = srv_vk->v.resource;
+ format = srv_vk->v.format;
+
+ if (resource->type == WINED3D_RTYPE_BUFFER)
+ {
+ FIXME("Buffer views not implemented.\n");
+ return;
+ }
+
+ texture_vk = wined3d_texture_vk(texture_from_resource(resource));
+
+ if (texture_vk->t.layer_count > 1)
+ default_flags |= WINED3D_VIEW_TEXTURE_ARRAY;
+
+ if (resource->format->id == format->id && desc->flags == default_flags
+ && !desc->u.texture.level_idx && desc->u.texture.level_count == texture_vk->t.level_count
+ && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture_vk->t.layer_count
+ && !(resource->bind_flags & WINED3D_BIND_DEPTH_STENCIL))
+ {
+ TRACE("Creating identity shader resource view.\n");
+ return;
+ }
+
+ if (texture_vk->t.swapchain && texture_vk->t.swapchain->state.desc.backbuffer_count > 1)
+ FIXME("Swapchain shader resource views not supported.\n");
+
+ context = context_acquire(resource->device, NULL, 0);
+ vk_image_view = wined3d_view_vk_create_texture_view(wined3d_context_vk(context),
+ desc, texture_vk, wined3d_format_vk(format), format->color_fixup, true);
+ context_release(context);
+
+ if (!vk_image_view)
+ return;
+
+ TRACE("Created image view 0x%s.\n", wine_dbgstr_longlong(vk_image_view));
+
+ srv_vk->view_vk.vk_image_info.imageView = vk_image_view;
+ srv_vk->view_vk.vk_image_info.sampler = VK_NULL_HANDLE;
+ srv_vk->view_vk.vk_image_info.imageLayout = texture_vk->layout;
+}
+
HRESULT wined3d_shader_resource_view_vk_init(struct wined3d_shader_resource_view_vk *view_vk,
const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
void *parent, const struct wined3d_parent_ops *parent_ops)
{
+ HRESULT hr;
+
TRACE("view_vk %p, desc %s, resource %p, parent %p, parent_ops %p.\n",
view_vk, wined3d_debug_view_desc(desc, resource), resource, parent, parent_ops);
- return wined3d_shader_resource_view_init(&view_vk->v, desc, resource, parent, parent_ops);
+ if (FAILED(hr = wined3d_shader_resource_view_init(&view_vk->v, desc, resource, parent, parent_ops)))
+ return hr;
+
+ wined3d_cs_init_object(resource->device->cs, wined3d_shader_resource_view_vk_cs_init, view_vk);
+
+ return hr;
}
HRESULT CDECL wined3d_shader_resource_view_create(const struct wined3d_view_desc *desc,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a7983b31b7d..a15b4826e2e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3946,6 +3946,7 @@ HRESULT wined3d_texture_no3d_init(struct wined3d_texture *texture_no3d, struct w
uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
void wined3d_gl_texture_swizzle_from_color_fixup(GLint swizzle[4], struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
+void wined3d_vk_swizzle_from_color_fixup(VkComponentMapping *mapping, struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
struct gl_texture
{
@@ -4593,9 +4594,16 @@ HRESULT wined3d_shader_resource_view_gl_init(struct wined3d_shader_resource_view
const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
+struct wined3d_view_vk
+{
+ VkDescriptorImageInfo vk_image_info;
+ uint64_t command_buffer_id;
+};
+
struct wined3d_shader_resource_view_vk
{
struct wined3d_shader_resource_view v;
+ struct wined3d_view_vk view_vk;
};
static inline struct wined3d_shader_resource_view_vk *wined3d_shader_resource_view_vk(
--
2.20.1
April 30, 2020
Re: [PATCH 1/2] d3dx9_36: Add semi-stub for D3DXOptimizeVertices.
by Vijay Kiran Kamuju
On Thu, Apr 30, 2020 at 3:10 PM Matteo Bruni <matteo.mystral(a)gmail.com> wrote:
>
> On Tue, Apr 28, 2020 at 4:34 PM Vijay Kiran Kamuju <infyquest(a)gmail.com> wrote:
> >
> > On Tue, Apr 28, 2020 at 1:43 PM Matteo Bruni <matteo.mystral(a)gmail.com> wrote:
> > >
> > > On Fri, Apr 17, 2020 at 4:14 PM Vijay Kiran Kamuju <infyquest(a)gmail.com> wrote:
> > > >
> > > > Added more checks and tests
> > >
> > > The test still doesn't really look for anything of interest. Also
> > > there are multiple warnings.
> > I have removed the tests which are causing warnings.
>
> This is not how you handle review feedback :/
I will fix the earlier tests and send a new version.
>
> > > BTW test_optimize_faces() isn't a good test to take inspiration from.
> > I wanted to have minimal test coverage to get it from staging to vanilla.
> > Can I look into Microsoft opensource implementations for inspiration?
>
> What is that? Opensource tests?
> Anyway, it depends on the license but it seems safer not to. Not that
> I can see any reason for looking in the first place.
FYI - Its the DirectXMesh library from Microsoft (MIT License).
https://github.com/microsoft/DirectXMesh.
April 30, 2020
Re: [PATCH 5/5] d3dcompiler: Set the x-dimension for struct types.
by Matteo Bruni
On Thu, Apr 30, 2020 at 4:55 AM Zebediah Figura <z.figura12(a)gmail.com> wrote:
>
> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
> ---
> dlls/d3dcompiler_43/hlsl.y | 11 ++++++++++-
> dlls/d3dcompiler_43/tests/hlsl_d3d9.c | 6 +++---
> 2 files changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
> index a33ea588ccf..9ef0b130d3d 100644
> --- a/dlls/d3dcompiler_43/hlsl.y
> +++ b/dlls/d3dcompiler_43/hlsl.y
> @@ -839,6 +839,13 @@ static struct list *gen_struct_fields(struct hlsl_type *type, DWORD modifiers, s
> return list;
> }
>
> +static DWORD get_array_size(const struct hlsl_type *type)
> +{
> + if (type->type == HLSL_CLASS_ARRAY)
> + return get_array_size(type->e.array.type) * type->e.array.elements_count;
Are arrays of arrays supported in HLSL?
April 30, 2020
Re: [PATCH 1/2] d3dx9_36: Add semi-stub for D3DXOptimizeVertices.
by Matteo Bruni
On Tue, Apr 28, 2020 at 4:34 PM Vijay Kiran Kamuju <infyquest(a)gmail.com> wrote:
>
> On Tue, Apr 28, 2020 at 1:43 PM Matteo Bruni <matteo.mystral(a)gmail.com> wrote:
> >
> > On Fri, Apr 17, 2020 at 4:14 PM Vijay Kiran Kamuju <infyquest(a)gmail.com> wrote:
> > >
> > > Added more checks and tests
> >
> > The test still doesn't really look for anything of interest. Also
> > there are multiple warnings.
> I have removed the tests which are causing warnings.
This is not how you handle review feedback :/
> > BTW test_optimize_faces() isn't a good test to take inspiration from.
> I wanted to have minimal test coverage to get it from staging to vanilla.
> Can I look into Microsoft opensource implementations for inspiration?
What is that? Opensource tests?
Anyway, it depends on the license but it seems safer not to. Not that
I can see any reason for looking in the first place.
April 30, 2020
Re: [PATCH 5/5] d3dcompiler: Set the x-dimension for struct types.
by Matteo Bruni
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
April 30, 2020