From 1c439f61984ddba3d9800687c09fe577b21498ba Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 8 May 2019 16:37:04 +0300 Subject: [PATCH] vk: Fix some spec violations --- rpcs3/Emu/RSX/VK/VKCompute.h | 4 +-- rpcs3/Emu/RSX/VK/VKHelpers.h | 6 ++-- rpcs3/Emu/RSX/VK/VKRenderTargets.h | 26 ++++++------------ rpcs3/Emu/RSX/VK/VKTexture.cpp | 44 ++++++++++++++++-------------- 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKCompute.h b/rpcs3/Emu/RSX/VK/VKCompute.h index 43ed34347c..01f7bb365a 100644 --- a/rpcs3/Emu/RSX/VK/VKCompute.h +++ b/rpcs3/Emu/RSX/VK/VKCompute.h @@ -32,8 +32,8 @@ namespace vk { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_MAX_COMPUTE_TASKS } }; - //Reserve descriptor pools - m_descriptor_pool.create(*get_current_renderer(), descriptor_pool_sizes, 1); + // Reserve descriptor pools + m_descriptor_pool.create(*get_current_renderer(), descriptor_pool_sizes, 2); std::vector bindings(2); diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index a3d114e4c3..839d7f84f9 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -150,7 +150,7 @@ namespace vk void copy_image_to_buffer(VkCommandBuffer cmd, const vk::image* src, const vk::buffer* dst, const VkBufferImageCopy& region); void copy_buffer_to_image(VkCommandBuffer cmd, const vk::buffer* src, const vk::image* dst, const VkBufferImageCopy& region); - void copy_image_typeless(const command_buffer &cmd, const image *src, const image *dst, const areai& src_rect, const areai& dst_rect, + void copy_image_typeless(const command_buffer &cmd, image *src, image *dst, const areai& src_rect, const areai& dst_rect, u32 mipmaps, VkImageAspectFlags src_aspect, VkImageAspectFlags dst_aspect, VkImageAspectFlags src_transfer_mask = 0xFF, VkImageAspectFlags dst_transfer_mask = 0xFF); @@ -1067,13 +1067,13 @@ namespace vk return m_storage_aspect; } - void push_layout(command_buffer& cmd, VkImageLayout layout) + void push_layout(VkCommandBuffer cmd, VkImageLayout layout) { m_layout_stack.push(current_layout); change_image_layout(cmd, this, layout); } - void pop_layout(command_buffer& cmd) + void pop_layout(VkCommandBuffer cmd) { verify(HERE), !m_layout_stack.empty(); diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index d58454ab0f..8e5c6a1162 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -19,9 +19,6 @@ namespace vk u16 surface_width = 0; u16 surface_height = 0; - VkImageAspectFlags attachment_aspect_flag = VK_IMAGE_ASPECT_COLOR_BIT; - std::unordered_multimap> views; - u64 frame_tag = 0; // frame id when invalidated, 0 if not invalid using viewable_image::viewable_image; @@ -53,7 +50,7 @@ namespace vk bool is_depth_surface() const override { - return !!(attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT); + return !!(aspect() & VK_IMAGE_ASPECT_DEPTH_BIT); } bool matches_dimensions(u16 _width, u16 _height) const @@ -72,12 +69,12 @@ namespace vk // Initialize memory contents if we did not find anything usable // TODO: Properly sync with Cell - VkImageSubresourceRange range{ attachment_aspect_flag, 0, 1, 0, 1 }; + VkImageSubresourceRange range{ aspect(), 0, 1, 0, 1 }; const auto old_layout = current_layout; change_image_layout(cmd, this, VK_IMAGE_LAYOUT_GENERAL, range); - if (attachment_aspect_flag & VK_IMAGE_ASPECT_COLOR_BIT) + if (aspect() & VK_IMAGE_ASPECT_COLOR_BIT) { VkClearColorValue color{}; vkCmdClearColorImage(cmd, value, VK_IMAGE_LAYOUT_GENERAL, &color, 1, &range); @@ -117,12 +114,12 @@ namespace vk else { if (!formats_are_bitcast_compatible(format(), src_texture->format()) || - src_texture->attachment_aspect_flag != attachment_aspect_flag) + src_texture->aspect() != aspect()) { typeless_info.src_is_typeless = true; typeless_info.src_context = rsx::texture_upload_context::framebuffer_storage; typeless_info.src_native_format_override = (u32)info.format; - typeless_info.src_is_depth = !!(src_texture->attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT); + typeless_info.src_is_depth = src_texture->is_depth_surface(); typeless_info.src_scaling_hint = f32(src_bpp) / dst_bpp; } } @@ -236,7 +233,6 @@ namespace rsx if (format == rsx::surface_depth_format::z24s8) ds->native_pitch *= 2; - ds->attachment_aspect_flag = range.aspectMask; ds->rsx_pitch = (u16)pitch; ds->surface_width = (u16)width; ds->surface_height = (u16)height; @@ -303,8 +299,7 @@ namespace rsx static void prepare_rtt_for_drawing(vk::command_buffer& cmd, vk::render_target *surface) { - VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag); - change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, range); + surface->change_layout(cmd, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); //Reset deref count surface->deref_count = 0; @@ -313,14 +308,12 @@ namespace rsx static void prepare_rtt_for_sampling(vk::command_buffer& cmd, vk::render_target *surface) { - VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag); - change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, range); + surface->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } static void prepare_ds_for_drawing(vk::command_buffer& cmd, vk::render_target *surface) { - VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag); - change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, range); + surface->change_layout(cmd, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); //Reset deref count surface->deref_count = 0; @@ -329,8 +322,7 @@ namespace rsx static void prepare_ds_for_sampling(vk::command_buffer& cmd, vk::render_target *surface) { - VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag); - change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, range); + surface->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } static bool surface_is_pitch_compatible(const std::unique_ptr &surface, size_t pitch) diff --git a/rpcs3/Emu/RSX/VK/VKTexture.cpp b/rpcs3/Emu/RSX/VK/VKTexture.cpp index 10ccf98ece..93c4d0a953 100644 --- a/rpcs3/Emu/RSX/VK/VKTexture.cpp +++ b/rpcs3/Emu/RSX/VK/VKTexture.cpp @@ -58,6 +58,10 @@ namespace vk void copy_image_to_buffer(VkCommandBuffer cmd, const vk::image* src, const vk::buffer* dst, const VkBufferImageCopy& region) { + // Always validate + verify("Invalid image layout!" HERE), + src->current_layout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL || src->current_layout == VK_IMAGE_LAYOUT_GENERAL; + switch (src->format()) { default: @@ -118,6 +122,10 @@ namespace vk void copy_buffer_to_image(VkCommandBuffer cmd, const vk::buffer* src, const vk::image* dst, const VkBufferImageCopy& region) { + // Always validate + verify("Invalid image layout!" HERE), + dst->current_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || dst->current_layout == VK_IMAGE_LAYOUT_GENERAL; + switch (dst->format()) { default: @@ -177,7 +185,7 @@ namespace vk } } - void copy_image_typeless(const vk::command_buffer& cmd, const vk::image* src, const vk::image* dst, const areai& src_rect, const areai& dst_rect, + void copy_image_typeless(const vk::command_buffer& cmd, vk::image* src, vk::image* dst, const areai& src_rect, const areai& dst_rect, u32 mipmaps, VkImageAspectFlags src_aspect, VkImageAspectFlags dst_aspect, VkImageAspectFlags src_transfer_mask, VkImageAspectFlags dst_transfer_mask) { if (src->info.format == dst->info.format) @@ -186,16 +194,15 @@ namespace vk return; } - auto preferred_src_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - auto preferred_dst_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - const auto src_layout = src->current_layout; - const auto dst_layout = dst->current_layout; - - if (src->current_layout != preferred_src_format) - change_image_layout(cmd, src->value, src_layout, preferred_src_format, vk::get_image_subresource_range(0, 0, 1, 1, src_aspect)); - - if (dst->current_layout != preferred_dst_format && src != dst) - change_image_layout(cmd, dst->value, dst_layout, preferred_dst_format, vk::get_image_subresource_range(0, 0, 1, 1, dst_aspect)); + if (LIKELY(src != dst)) + { + src->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + dst->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + } + else + { + src->push_layout(cmd, VK_IMAGE_LAYOUT_GENERAL); + } auto scratch_buf = vk::get_scratch_buffer(); VkBufferImageCopy src_copy{}, dst_copy{}; @@ -264,11 +271,8 @@ namespace vk dst_copy.imageSubresource.mipLevel++; } - if (src_layout != preferred_src_format) - change_image_layout(cmd, src->value, preferred_src_format, src_layout, vk::get_image_subresource_range(0, 0, 1, 1, src_aspect)); - - if (dst_layout != preferred_dst_format && src != dst) - change_image_layout(cmd, dst->value, preferred_dst_format, dst_layout, vk::get_image_subresource_range(0, 0, 1, 1, dst_aspect)); + src->pop_layout(cmd); + if (src != dst) dst->pop_layout(cmd); } void copy_image(VkCommandBuffer cmd, VkImage src, VkImage dst, VkImageLayout srcLayout, VkImageLayout dstLayout, @@ -651,10 +655,9 @@ namespace vk const auto scratch_buf = vk::get_scratch_buffer(); const auto data_length = src->info.extent.width * src->info.extent.height * 4; - const auto current_layout = src->current_layout; - vk::change_image_layout(cmd, real_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); + src->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); vkCmdCopyImageToBuffer(cmd, src->value, src->current_layout, scratch_buf->value, 1, ©); - vk::change_image_layout(cmd, real_src, current_layout, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); + src->pop_layout(cmd); vk::insert_buffer_memory_barrier(cmd, scratch_buf->value, 0, data_length, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, @@ -667,8 +670,7 @@ namespace vk VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); real_src = vk::get_typeless_helper(src->info.format, src->width(), src->height()); - vk::change_image_layout(cmd, real_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); - + real_src->change_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vkCmdCopyBufferToImage(cmd, scratch_buf->value, real_src->value, real_src->current_layout, 1, ©); } }