From 521cafcfffb156902294ff891d995f51cd41f517 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 11 Mar 2021 13:54:35 +0100 Subject: [PATCH] wined3d: Pass a resource range to wined3d_context_vk_image_barrier(). In particular, this allows different sub-resources of the same texture to have different image layouts, as required when doing blits between them. Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/context_vk.c | 8 +-- dlls/wined3d/device.c | 13 ++-- dlls/wined3d/swapchain.c | 23 +++--- dlls/wined3d/texture.c | 125 ++++++++++++++++++++------------- dlls/wined3d/wined3d_private.h | 2 +- 5 files changed, 102 insertions(+), 69 deletions(-) diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index f24f6bec6df..b27b9e3b0c6 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -1561,7 +1561,7 @@ void wined3d_context_vk_wait_command_buffer(struct wined3d_context_vk *context_v void wined3d_context_vk_image_barrier(struct wined3d_context_vk *context_vk, VkCommandBuffer vk_command_buffer, VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask, VkImageLayout old_layout, - VkImageLayout new_layout, VkImage image, VkImageAspectFlags aspect_mask) + VkImageLayout new_layout, VkImage image, const VkImageSubresourceRange *range) { const struct wined3d_vk_info *vk_info = context_vk->vk_info; VkImageMemoryBarrier barrier; @@ -1577,11 +1577,7 @@ void wined3d_context_vk_image_barrier(struct wined3d_context_vk *context_vk, barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = image; - barrier.subresourceRange.aspectMask = aspect_mask; - barrier.subresourceRange.baseMipLevel = 0; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + barrier.subresourceRange = *range; VK_CALL(vkCmdPipelineBarrier(vk_command_buffer, src_stage_mask, dst_stage_mask, 0, 0, NULL, 0, NULL, 1, &barrier)); } diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index ad24805b5ef..289c5d941d6 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -669,23 +669,22 @@ static bool wined3d_null_image_vk_init(struct wined3d_null_image_vk *image, stru return false; } - wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - image->vk_image, VK_IMAGE_ASPECT_COLOR_BIT); - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; range.baseMipLevel = 0; range.levelCount = 1; range.baseArrayLayer = 0; range.layerCount = layer_count; + + wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, image->vk_image, &range); + VK_CALL(vkCmdClearColorImage(vk_command_buffer, image->vk_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &colour, 1, &range)); wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, 0, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - image->vk_image, VK_IMAGE_ASPECT_COLOR_BIT); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, image->vk_image, &range); TRACE("Created NULL image 0x%s, memory 0x%s.\n", wine_dbgstr_longlong(image->vk_image), wine_dbgstr_longlong(image->vk_memory)); diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 72e17a6f833..0683ffef6fe 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -1039,6 +1039,7 @@ static void wined3d_swapchain_vk_blit(struct wined3d_swapchain_vk *swapchain_vk, const struct wined3d_swapchain_desc *desc = &swapchain_vk->s.state.desc; const struct wined3d_vk_info *vk_info = context_vk->vk_info; VkCommandBuffer vk_command_buffer; + VkImageSubresourceRange vk_range; VkPresentInfoKHR present_desc; unsigned int present_idx; VkImageLayout vk_layout; @@ -1075,23 +1076,29 @@ static void wined3d_swapchain_vk_blit(struct wined3d_swapchain_vk *swapchain_vk, wined3d_context_vk_end_current_render_pass(context_vk); + vk_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + vk_range.baseMipLevel = 0; + vk_range.levelCount = 1; + vk_range.baseArrayLayer = 0; + vk_range.layerCount = 1; + wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, vk_access_mask_from_bind_flags(back_buffer_vk->t.resource.bind_flags), VK_ACCESS_TRANSFER_READ_BIT, back_buffer_vk->layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - back_buffer_vk->vk_image, VK_IMAGE_ASPECT_COLOR_BIT); + back_buffer_vk->vk_image, &vk_range); wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - swapchain_vk->vk_images[image_idx], VK_IMAGE_ASPECT_COLOR_BIT); + swapchain_vk->vk_images[image_idx], &vk_range); - blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blit.srcSubresource.mipLevel = 0; - blit.srcSubresource.baseArrayLayer = 0; - blit.srcSubresource.layerCount = 1; + blit.srcSubresource.aspectMask = vk_range.aspectMask; + blit.srcSubresource.mipLevel = vk_range.baseMipLevel; + blit.srcSubresource.baseArrayLayer = vk_range.baseArrayLayer; + blit.srcSubresource.layerCount = vk_range.layerCount; blit.srcOffsets[0].x = src_rect->left; blit.srcOffsets[0].y = src_rect->top; blit.srcOffsets[0].z = 0; @@ -1115,7 +1122,7 @@ static void wined3d_swapchain_vk_blit(struct wined3d_swapchain_vk *swapchain_vk, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, 0, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, - swapchain_vk->vk_images[image_idx], VK_IMAGE_ASPECT_COLOR_BIT); + swapchain_vk->vk_images[image_idx], &vk_range); if (desc->swap_effect == WINED3D_SWAP_EFFECT_DISCARD || desc->swap_effect == WINED3D_SWAP_EFFECT_FLIP_DISCARD) vk_layout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -1126,7 +1133,7 @@ static void wined3d_swapchain_vk_blit(struct wined3d_swapchain_vk *swapchain_vk, VK_ACCESS_TRANSFER_READ_BIT, vk_access_mask_from_bind_flags(back_buffer_vk->t.resource.bind_flags), vk_layout, back_buffer_vk->layout, - back_buffer_vk->vk_image, VK_IMAGE_ASPECT_COLOR_BIT); + back_buffer_vk->vk_image, &vk_range); back_buffer_vk->bind_mask = 0; swapchain_vk->vk_semaphores[present_idx].command_buffer_id = context_vk->current_command_buffer.id; diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index a4148b166f2..74dda1df09f 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -4592,6 +4592,7 @@ static void wined3d_texture_vk_upload_data(struct wined3d_context *context, struct wined3d_bo_address staging_bo_addr; const struct wined3d_vk_info *vk_info; VkCommandBuffer vk_command_buffer; + VkImageSubresourceRange vk_range; struct wined3d_bo_vk staging_bo; VkImageAspectFlags aspect_mask; struct wined3d_range range; @@ -4684,12 +4685,18 @@ static void wined3d_texture_vk_upload_data(struct wined3d_context *context, return; } + vk_range.aspectMask = aspect_mask; + vk_range.baseMipLevel = dst_level; + vk_range.levelCount = 1; + vk_range.baseArrayLayer = dst_sub_resource_idx / dst_texture_vk->t.level_count; + vk_range.layerCount = 1; + wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, vk_access_mask_from_bind_flags(dst_texture_vk->t.resource.bind_flags), VK_ACCESS_TRANSFER_WRITE_BIT, dst_texture_vk->layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - dst_texture_vk->vk_image, aspect_mask); + dst_texture_vk->vk_image, &vk_range); region.bufferOffset = staging_bo.buffer_offset; region.bufferRowLength = (dst_row_pitch / src_format->block_byte_count) * src_format->block_width; @@ -4697,10 +4704,10 @@ static void wined3d_texture_vk_upload_data(struct wined3d_context *context, region.bufferImageHeight = (dst_slice_pitch / dst_row_pitch) * src_format->block_height; else region.bufferImageHeight = 1; - region.imageSubresource.aspectMask = aspect_mask; - region.imageSubresource.mipLevel = dst_level; - region.imageSubresource.baseArrayLayer = dst_sub_resource_idx / dst_texture_vk->t.level_count; - region.imageSubresource.layerCount = 1; + region.imageSubresource.aspectMask = vk_range.aspectMask; + region.imageSubresource.mipLevel = vk_range.baseMipLevel; + region.imageSubresource.baseArrayLayer = vk_range.baseArrayLayer; + region.imageSubresource.layerCount = vk_range.layerCount; region.imageOffset.x = dst_x; region.imageOffset.y = dst_y; region.imageOffset.z = dst_z; @@ -4716,7 +4723,7 @@ static void wined3d_texture_vk_upload_data(struct wined3d_context *context, VK_ACCESS_TRANSFER_WRITE_BIT, vk_access_mask_from_bind_flags(dst_texture_vk->t.resource.bind_flags), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, dst_texture_vk->layout, - dst_texture_vk->vk_image, aspect_mask); + dst_texture_vk->vk_image, &vk_range); wined3d_context_vk_reference_texture(context_vk, dst_texture_vk); wined3d_context_vk_reference_bo(context_vk, &staging_bo); wined3d_context_vk_destroy_bo(context_vk, &staging_bo); @@ -4736,6 +4743,7 @@ static void wined3d_texture_vk_download_data(struct wined3d_context *context, struct wined3d_bo_address staging_bo_addr; const struct wined3d_vk_info *vk_info; VkCommandBuffer vk_command_buffer; + VkImageSubresourceRange vk_range; struct wined3d_bo_vk staging_bo; VkImageAspectFlags aspect_mask; VkBufferImageCopy region; @@ -4818,20 +4826,26 @@ static void wined3d_texture_vk_download_data(struct wined3d_context *context, return; } + vk_range.aspectMask = aspect_mask; + vk_range.baseMipLevel = src_level; + vk_range.levelCount = 1; + vk_range.baseArrayLayer = src_sub_resource_idx / src_texture_vk->t.level_count; + vk_range.layerCount = 1; + wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, vk_access_mask_from_bind_flags(src_texture_vk->t.resource.bind_flags), VK_ACCESS_TRANSFER_READ_BIT, src_texture_vk->layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - src_texture_vk->vk_image, aspect_mask); + src_texture_vk->vk_image, &vk_range); region.bufferOffset = staging_bo.buffer_offset; region.bufferRowLength = 0; region.bufferImageHeight = 0; - region.imageSubresource.aspectMask = aspect_mask; - region.imageSubresource.mipLevel = src_level; - region.imageSubresource.baseArrayLayer = src_sub_resource_idx / src_texture_vk->t.level_count; - region.imageSubresource.layerCount = 1; + region.imageSubresource.aspectMask = vk_range.aspectMask; + region.imageSubresource.mipLevel = vk_range.baseMipLevel; + region.imageSubresource.baseArrayLayer = vk_range.baseArrayLayer; + region.imageSubresource.layerCount = vk_range.layerCount; region.imageOffset.x = 0; region.imageOffset.y = 0; region.imageOffset.z = 0; @@ -4847,7 +4861,7 @@ static void wined3d_texture_vk_download_data(struct wined3d_context *context, VK_ACCESS_TRANSFER_READ_BIT, vk_access_mask_from_bind_flags(src_texture_vk->t.resource.bind_flags), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, src_texture_vk->layout, - src_texture_vk->vk_image, aspect_mask); + src_texture_vk->vk_image, &vk_range); wined3d_context_vk_reference_texture(context_vk, src_texture_vk); wined3d_context_vk_reference_bo(context_vk, &staging_bo); @@ -4933,6 +4947,7 @@ BOOL wined3d_texture_vk_prepare_texture(struct wined3d_texture_vk *texture_vk, struct wined3d_device_vk *device_vk; struct wined3d_resource *resource; VkCommandBuffer vk_command_buffer; + VkImageSubresourceRange vk_range; VkImageCreateInfo create_info; unsigned int memory_type_idx; VkResult vr; @@ -5067,12 +5082,18 @@ BOOL wined3d_texture_vk_prepare_texture(struct wined3d_texture_vk *texture_vk, return FALSE; } + vk_range.aspectMask = vk_aspect_mask_from_format(&format_vk->f); + vk_range.baseMipLevel = 0; + vk_range.levelCount = VK_REMAINING_MIP_LEVELS; + vk_range.baseArrayLayer = 0; + vk_range.layerCount = VK_REMAINING_ARRAY_LAYERS; + wined3d_context_vk_reference_texture(context_vk, texture_vk); wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, texture_vk->layout, - texture_vk->vk_image, vk_aspect_mask_from_format(&format_vk->f)); + texture_vk->vk_image, &vk_range); texture_vk->t.flags |= WINED3D_TEXTURE_RGB_ALLOCATED; @@ -5190,6 +5211,8 @@ HRESULT wined3d_texture_vk_init(struct wined3d_texture_vk *texture_vk, struct wi void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, struct wined3d_context_vk *context_vk, uint32_t bind_mask) { + VkImageSubresourceRange vk_range; + TRACE("texture_vk %p, context_vk %p, bind_mask %s.\n", texture_vk, context_vk, wined3d_debug_bind_flags(bind_mask)); @@ -5197,12 +5220,18 @@ void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, { TRACE(" %s -> %s.\n", wined3d_debug_bind_flags(texture_vk->bind_mask), wined3d_debug_bind_flags(bind_mask)); + + vk_range.aspectMask = vk_aspect_mask_from_format(texture_vk->t.resource.format); + vk_range.baseMipLevel = 0; + vk_range.levelCount = VK_REMAINING_MIP_LEVELS; + vk_range.baseArrayLayer = 0; + vk_range.layerCount = VK_REMAINING_ARRAY_LAYERS; + wined3d_context_vk_image_barrier(context_vk, wined3d_context_vk_get_command_buffer(context_vk), vk_pipeline_stage_mask_from_bind_flags(texture_vk->bind_mask), vk_pipeline_stage_mask_from_bind_flags(bind_mask), vk_access_mask_from_bind_flags(texture_vk->bind_mask), vk_access_mask_from_bind_flags(bind_mask), - texture_vk->layout, texture_vk->layout, texture_vk->vk_image, - vk_aspect_mask_from_format(texture_vk->t.resource.format)); + texture_vk->layout, texture_vk->layout, texture_vk->vk_image, &vk_range); } texture_vk->bind_mask = bind_mask; } @@ -6450,8 +6479,7 @@ static DWORD vk_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit_ struct wined3d_texture_vk *dst_texture_vk = wined3d_texture_vk(dst_texture); struct wined3d_context_vk *context_vk = wined3d_context_vk(context); const struct wined3d_vk_info *vk_info = context_vk->vk_info; - unsigned int src_level, src_layer, dst_level, dst_layer; - VkImageAspectFlags src_aspect, dst_aspect; + VkImageSubresourceRange vk_src_range, vk_dst_range; VkCommandBuffer vk_command_buffer; struct wined3d_blitter *next; bool resolve = false; @@ -6465,22 +6493,25 @@ static DWORD vk_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit_ if (!vk_blitter_blit_supported(op, context, &src_texture->resource, src_rect, &dst_texture->resource, dst_rect)) goto next; - src_aspect = vk_aspect_mask_from_format(src_texture_vk->t.resource.format); - dst_aspect = vk_aspect_mask_from_format(dst_texture_vk->t.resource.format); - if (wined3d_resource_get_sample_count(&src_texture_vk->t.resource) > 1) resolve = true; - src_level = src_sub_resource_idx % src_texture->level_count; - src_layer = src_sub_resource_idx / src_texture->level_count; + vk_src_range.aspectMask = vk_aspect_mask_from_format(src_texture_vk->t.resource.format); + vk_src_range.baseMipLevel = src_sub_resource_idx % src_texture->level_count; + vk_src_range.levelCount = 1; + vk_src_range.baseArrayLayer = src_sub_resource_idx / src_texture->level_count; + vk_src_range.layerCount = 1; - dst_level = dst_sub_resource_idx % dst_texture->level_count; - dst_layer = dst_sub_resource_idx / dst_texture->level_count; + vk_dst_range.aspectMask = vk_aspect_mask_from_format(dst_texture_vk->t.resource.format); + vk_dst_range.baseMipLevel = dst_sub_resource_idx % dst_texture->level_count; + vk_dst_range.levelCount = 1; + vk_dst_range.baseArrayLayer = dst_sub_resource_idx / dst_texture->level_count; + vk_dst_range.layerCount = 1; if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB)) ERR("Failed to load the source sub-resource.\n"); - if (wined3d_texture_is_full_rect(dst_texture, dst_level, dst_rect)) + if (wined3d_texture_is_full_rect(dst_texture, vk_dst_range.baseMipLevel, dst_rect)) { if (!wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB)) @@ -6510,29 +6541,29 @@ static DWORD vk_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit_ vk_access_mask_from_bind_flags(src_texture_vk->t.resource.bind_flags), VK_ACCESS_TRANSFER_READ_BIT, src_texture_vk->layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - src_texture_vk->vk_image, src_aspect); + src_texture_vk->vk_image, &vk_src_range); wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, vk_access_mask_from_bind_flags(dst_texture_vk->t.resource.bind_flags), VK_ACCESS_TRANSFER_WRITE_BIT, dst_texture_vk->layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - dst_texture_vk->vk_image, dst_aspect); + dst_texture_vk->vk_image, &vk_dst_range); if (resolve) { VkImageResolve region; - region.srcSubresource.aspectMask = src_aspect; - region.srcSubresource.mipLevel = src_level; - region.srcSubresource.baseArrayLayer = src_layer; - region.srcSubresource.layerCount = 1; + region.srcSubresource.aspectMask = vk_src_range.aspectMask; + region.srcSubresource.mipLevel = vk_src_range.baseMipLevel; + region.srcSubresource.baseArrayLayer = vk_src_range.baseArrayLayer; + region.srcSubresource.layerCount = vk_src_range.layerCount; region.srcOffset.x = src_rect->left; region.srcOffset.y = src_rect->top; region.srcOffset.z = 0; - region.dstSubresource.aspectMask = dst_aspect; - region.dstSubresource.mipLevel = dst_level; - region.dstSubresource.baseArrayLayer = dst_layer; - region.dstSubresource.layerCount = 1; + region.dstSubresource.aspectMask = vk_dst_range.aspectMask; + region.dstSubresource.mipLevel = vk_dst_range.baseMipLevel; + region.dstSubresource.baseArrayLayer = vk_dst_range.baseArrayLayer; + region.dstSubresource.layerCount = vk_dst_range.layerCount; region.dstOffset.x = dst_rect->left; region.dstOffset.y = dst_rect->top; region.dstOffset.z = 0; @@ -6547,17 +6578,17 @@ static DWORD vk_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit_ { VkImageCopy region; - region.srcSubresource.aspectMask = src_aspect; - region.srcSubresource.mipLevel = src_level; - region.srcSubresource.baseArrayLayer = src_layer; - region.srcSubresource.layerCount = 1; + region.srcSubresource.aspectMask = vk_src_range.aspectMask; + region.srcSubresource.mipLevel = vk_src_range.baseMipLevel; + region.srcSubresource.baseArrayLayer = vk_src_range.baseArrayLayer; + region.srcSubresource.layerCount = vk_src_range.layerCount; region.srcOffset.x = src_rect->left; region.srcOffset.y = src_rect->top; region.srcOffset.z = 0; - region.dstSubresource.aspectMask = dst_aspect; - region.dstSubresource.mipLevel = dst_level; - region.dstSubresource.baseArrayLayer = dst_layer; - region.dstSubresource.layerCount = 1; + region.dstSubresource.aspectMask = vk_dst_range.aspectMask; + region.dstSubresource.mipLevel = vk_dst_range.baseMipLevel; + region.dstSubresource.baseArrayLayer = vk_dst_range.baseArrayLayer; + region.dstSubresource.layerCount = vk_dst_range.layerCount; region.dstOffset.x = dst_rect->left; region.dstOffset.y = dst_rect->top; region.dstOffset.z = 0; @@ -6573,14 +6604,14 @@ static DWORD vk_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit_ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, vk_access_mask_from_bind_flags(dst_texture_vk->t.resource.bind_flags), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, dst_texture_vk->layout, - dst_texture_vk->vk_image, dst_aspect); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, dst_texture_vk->layout, + dst_texture_vk->vk_image, &vk_dst_range); wined3d_context_vk_image_barrier(context_vk, vk_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_ACCESS_TRANSFER_READ_BIT, vk_access_mask_from_bind_flags(src_texture_vk->t.resource.bind_flags), - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, src_texture_vk->layout, - src_texture_vk->vk_image, src_aspect); + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, src_texture_vk->layout, + src_texture_vk->vk_image, &vk_src_range); wined3d_texture_validate_location(dst_texture, dst_sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB); wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 63d4b9feb00..d4f1e4a9173 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2629,7 +2629,7 @@ VkRenderPass wined3d_context_vk_get_render_pass(struct wined3d_context_vk *conte void wined3d_context_vk_image_barrier(struct wined3d_context_vk *context_vk, VkCommandBuffer vk_command_buffer, VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask, VkImageLayout old_layout, - VkImageLayout new_layout, VkImage image, VkImageAspectFlags aspect_mask) DECLSPEC_HIDDEN; + VkImageLayout new_layout, VkImage image, const VkImageSubresourceRange *range) DECLSPEC_HIDDEN; HRESULT wined3d_context_vk_init(struct wined3d_context_vk *context_vk, struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; void wined3d_context_vk_poll_command_buffers(struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN;