From: Stefan Dösinger stefan@codeweavers.com
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/context_vk.c | 4 ++++ dlls/wined3d/device.c | 39 +++++++++++++++++++++++++--------- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index c53b9aa6c65..f3b0a42b8f1 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -1352,6 +1352,10 @@ static bool wined3d_shader_resource_bindings_add_null_srv_binding(struct wined3d return wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set, binding_idx, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, NULL, &v->vk_info_3d, NULL);
+ case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: + return wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set, + binding_idx, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, NULL, &v->vk_info_cube, NULL); + case WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY: return wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set, binding_idx, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, NULL, &v->vk_info_2d_array, NULL); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 4ad475734b4..3716d3e0635 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -666,7 +666,7 @@ static void wined3d_null_image_vk_cleanup(struct wined3d_null_image_vk *image, }
static bool wined3d_null_image_vk_init(struct wined3d_null_image_vk *image, struct wined3d_context_vk *context_vk, - VkCommandBuffer vk_command_buffer, VkImageType type, unsigned int sample_count) + VkCommandBuffer vk_command_buffer, VkImageType type, unsigned int layer_count, unsigned int sample_count) { struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device); const struct wined3d_vk_info *vk_info = context_vk->vk_info; @@ -674,23 +674,27 @@ static bool wined3d_null_image_vk_init(struct wined3d_null_image_vk *image, stru VkImageSubresourceRange range; VkImageCreateInfo image_desc; unsigned int memory_type_idx; + uint32_t flags = 0; VkResult vr;
static const VkClearColorValue colour = {0};
- TRACE("image %p, context_vk %p, vk_command_buffer %p, type %#x, sample_count %u.\n", - image, context_vk, vk_command_buffer, type, sample_count); + TRACE("image %p, context_vk %p, vk_command_buffer %p, type %#x, layer_count %u, sample_count %u.\n", + image, context_vk, vk_command_buffer, type, layer_count, sample_count); + + if (type == VK_IMAGE_TYPE_2D && layer_count >= 6) + flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
image_desc.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; image_desc.pNext = NULL; - image_desc.flags = 0; + image_desc.flags = flags; image_desc.imageType = type; image_desc.format = VK_FORMAT_R8G8B8A8_UNORM; image_desc.extent.width = 1; image_desc.extent.height = 1; image_desc.extent.depth = 1; image_desc.mipLevels = 1; - image_desc.arrayLayers = 1; + image_desc.arrayLayers = layer_count; image_desc.samples = sample_count; image_desc.tiling = VK_IMAGE_TILING_OPTIMAL; image_desc.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; @@ -748,7 +752,7 @@ static bool wined3d_null_image_vk_init(struct wined3d_null_image_vk *image, stru range.baseMipLevel = 0; range.levelCount = 1; range.baseArrayLayer = 0; - range.layerCount = 1; + range.layerCount = layer_count; VK_CALL(vkCmdClearColorImage(vk_command_buffer, image->vk_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &colour, 1, &range));
@@ -793,25 +797,25 @@ bool wined3d_device_vk_create_null_resources(struct wined3d_device_vk *device_vk return false; VK_CALL(vkCmdFillBuffer(vk_command_buffer, r->bo.vk_buffer, r->bo.buffer_offset, r->bo.size, 0x00000000u));
- if (!wined3d_null_image_vk_init(&r->image_1d, context_vk, vk_command_buffer, VK_IMAGE_TYPE_1D, 1)) + if (!wined3d_null_image_vk_init(&r->image_1d, context_vk, vk_command_buffer, VK_IMAGE_TYPE_1D, 1, 1)) { ERR("Failed to create 1D image.\n"); goto fail; }
- if (!wined3d_null_image_vk_init(&r->image_2d, context_vk, vk_command_buffer, VK_IMAGE_TYPE_2D, 1)) + if (!wined3d_null_image_vk_init(&r->image_2d, context_vk, vk_command_buffer, VK_IMAGE_TYPE_2D, 6, 1)) { ERR("Failed to create 2D image.\n"); goto fail; }
- if (!wined3d_null_image_vk_init(&r->image_2dms, context_vk, vk_command_buffer, VK_IMAGE_TYPE_2D, sample_count)) + if (!wined3d_null_image_vk_init(&r->image_2dms, context_vk, vk_command_buffer, VK_IMAGE_TYPE_2D, 1, sample_count)) { ERR("Failed to create 2D MSAA image.\n"); goto fail; }
- if (!wined3d_null_image_vk_init(&r->image_3d, context_vk, vk_command_buffer, VK_IMAGE_TYPE_3D, 1)) + if (!wined3d_null_image_vk_init(&r->image_3d, context_vk, vk_command_buffer, VK_IMAGE_TYPE_3D, 1, 1)) { ERR("Failed to create 3D image.\n"); goto fail; @@ -942,6 +946,18 @@ bool wined3d_device_vk_create_null_views(struct wined3d_device_vk *device_vk, st TRACE("Created 3D image view 0x%s.\n", wine_dbgstr_longlong(v->vk_info_3d.imageView));
view_desc.image = r->image_2d.vk_image; + view_desc.subresourceRange.layerCount = 6; + view_desc.viewType = VK_IMAGE_VIEW_TYPE_CUBE; + if ((vr = VK_CALL(vkCreateImageView(device_vk->vk_device, &view_desc, NULL, &v->vk_info_cube.imageView))) < 0) + { + ERR("Failed to create cube image view, vr %s.\n", wined3d_debug_vkresult(vr)); + goto fail; + } + v->vk_info_cube.sampler = VK_NULL_HANDLE; + v->vk_info_cube.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + TRACE("Created cube image view 0x%s.\n", wine_dbgstr_longlong(v->vk_info_cube.imageView)); + + view_desc.subresourceRange.layerCount = 1; view_desc.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; if ((vr = VK_CALL(vkCreateImageView(device_vk->vk_device, &view_desc, NULL, &v->vk_info_2d_array.imageView))) < 0) { @@ -968,6 +984,8 @@ bool wined3d_device_vk_create_null_views(struct wined3d_device_vk *device_vk, st fail: if (v->vk_info_2d_array.imageView) VK_CALL(vkDestroyImageView(device_vk->vk_device, v->vk_info_2d_array.imageView, NULL)); + if (v->vk_info_cube.imageView) + VK_CALL(vkDestroyImageView(device_vk->vk_device, v->vk_info_cube.imageView, NULL)); if (v->vk_info_3d.imageView) VK_CALL(vkDestroyImageView(device_vk->vk_device, v->vk_info_3d.imageView, NULL)); if (v->vk_info_2dms.imageView) @@ -989,6 +1007,7 @@ void wined3d_device_vk_destroy_null_views(struct wined3d_device_vk *device_vk, s
wined3d_context_vk_destroy_image_view(context_vk, v->vk_info_2dms_array.imageView, id); wined3d_context_vk_destroy_image_view(context_vk, v->vk_info_2d_array.imageView, id); + wined3d_context_vk_destroy_image_view(context_vk, v->vk_info_cube.imageView, id); wined3d_context_vk_destroy_image_view(context_vk, v->vk_info_3d.imageView, id); wined3d_context_vk_destroy_image_view(context_vk, v->vk_info_2dms.imageView, id); wined3d_context_vk_destroy_image_view(context_vk, v->vk_info_2d.imageView, id); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ebbe379f2d2..dda26aacd07 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3632,6 +3632,7 @@ struct wined3d_null_views_vk VkDescriptorImageInfo vk_info_2d; VkDescriptorImageInfo vk_info_2dms; VkDescriptorImageInfo vk_info_3d; + VkDescriptorImageInfo vk_info_cube; VkDescriptorImageInfo vk_info_2d_array; VkDescriptorImageInfo vk_info_2dms_array; };