diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 0196042ec7..c2f28bf480 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -3385,3 +3385,81 @@ void vulkan_framebuffer_generate_mips( * the dependency chain will ensure we don't start * next pass until the mipchain is complete. */ } + +void vulkan_framebuffer_copy(VkImage image, + struct Size2D size, + VkCommandBuffer cmd, + VkImage src_image, VkImageLayout src_layout) +{ + VkImageCopy region; + + vulkan_image_layout_transition_levels(cmd, image,VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 0, VK_ACCESS_TRANSFER_WRITE_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT); + + memset(®ion, 0, sizeof(region)); + + region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.srcSubresource.layerCount = 1; + region.dstSubresource = region.srcSubresource; + region.extent.width = size.width; + region.extent.height = size.height; + region.extent.depth = 1; + + vkCmdCopyImage(cmd, + src_image, src_layout, + image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, ®ion); + + vulkan_image_layout_transition_levels(cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); +} + +void vulkan_framebuffer_clear(VkImage image, VkCommandBuffer cmd) +{ + VkClearColorValue color; + VkImageSubresourceRange range; + + vulkan_image_layout_transition_levels(cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT); + + memset(&color, 0, sizeof(color)); + memset(&range, 0, sizeof(range)); + + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + range.levelCount = 1; + range.layerCount = 1; + + vkCmdClearColorImage(cmd, + image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + &color, + 1, + &range); + + vulkan_image_layout_transition_levels(cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); +} diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 0f55c46e91..c6e974c25c 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -609,6 +609,13 @@ void vulkan_framebuffer_generate_mips( unsigned levels ); +void vulkan_framebuffer_copy(VkImage image, + struct Size2D size, + VkCommandBuffer cmd, + VkImage src_image, VkImageLayout src_layout); + +void vulkan_framebuffer_clear(VkImage image, VkCommandBuffer cmd); + void vulkan_initialize_render_pass(VkDevice device, VkFormat format, VkRenderPass *render_pass); diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index 0e92b33756..8f092f00c3 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -231,9 +231,6 @@ class Framebuffer VkFramebuffer get_framebuffer() const { return framebuffer; } VkRenderPass get_render_pass() const { return render_pass; } - void clear(VkCommandBuffer cmd); - void copy(VkCommandBuffer cmd, VkImage image, VkImageLayout layout); - unsigned get_levels() const { return levels; } private: @@ -769,7 +766,8 @@ void vulkan_filter_chain::update_history(DeferredDisposer &disposer, && input_texture.format != tmp->get_format())) tmp->set_size(disposer, { input_texture.width, input_texture.height }, input_texture.format); - tmp->copy(cmd, input_texture.image, src_layout); + vulkan_framebuffer_copy(tmp->get_image(), tmp->get_size(), + cmd, input_texture.image, src_layout); /* Transition input texture back. */ if (input_texture.layout != VK_IMAGE_LAYOUT_GENERAL) @@ -1096,12 +1094,12 @@ void vulkan_filter_chain::clear_history_and_feedback(VkCommandBuffer cmd) { unsigned i; for (i = 0; i < original_history.size(); i++) - original_history[i]->clear(cmd); + vulkan_framebuffer_clear(original_history[i]->get_image(), cmd); for (i = 0; i < passes.size(); i++) { Framebuffer *fb = passes[i]->get_feedback_framebuffer(); if (fb) - fb->clear(cmd); + vulkan_framebuffer_clear(fb->get_image(), cmd); } } @@ -2401,78 +2399,6 @@ Framebuffer::Framebuffer( init(nullptr); } -void Framebuffer::clear(VkCommandBuffer cmd) -{ - VkClearColorValue color; - VkImageSubresourceRange range; - - vulkan_image_layout_transition_levels(cmd, - image, - VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT); - - memset(&color, 0, sizeof(color)); - memset(&range, 0, sizeof(range)); - - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - range.levelCount = 1; - range.layerCount = 1; - - vkCmdClearColorImage(cmd, - image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - &color, - 1, - &range); - - vulkan_image_layout_transition_levels(cmd, - image, - VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); -} - -void Framebuffer::copy(VkCommandBuffer cmd, - VkImage src_image, VkImageLayout src_layout) -{ - VkImageCopy region; - - vulkan_image_layout_transition_levels(cmd, image,VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 0, VK_ACCESS_TRANSFER_WRITE_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT); - - memset(®ion, 0, sizeof(region)); - - region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - region.srcSubresource.layerCount = 1; - region.dstSubresource = region.srcSubresource; - region.extent.width = size.width; - region.extent.height = size.height; - region.extent.depth = 1; - - vkCmdCopyImage(cmd, - src_image, src_layout, - image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, ®ion); - - vulkan_image_layout_transition_levels(cmd, image,VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); -} - void Framebuffer::init(DeferredDisposer *disposer) { VkMemoryRequirements mem_reqs;