(shader_vulkan.cpp) Move more C code to vulkan_common.c
This commit is contained in:
parent
bcf8ff3d0a
commit
90874b434e
|
@ -3385,3 +3385,81 @@ void vulkan_framebuffer_generate_mips(
|
||||||
* the dependency chain will ensure we don't start
|
* the dependency chain will ensure we don't start
|
||||||
* next pass until the mipchain is complete. */
|
* 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);
|
||||||
|
}
|
||||||
|
|
|
@ -609,6 +609,13 @@ void vulkan_framebuffer_generate_mips(
|
||||||
unsigned levels
|
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,
|
void vulkan_initialize_render_pass(VkDevice device,
|
||||||
VkFormat format, VkRenderPass *render_pass);
|
VkFormat format, VkRenderPass *render_pass);
|
||||||
|
|
||||||
|
|
|
@ -231,9 +231,6 @@ class Framebuffer
|
||||||
VkFramebuffer get_framebuffer() const { return framebuffer; }
|
VkFramebuffer get_framebuffer() const { return framebuffer; }
|
||||||
VkRenderPass get_render_pass() const { return render_pass; }
|
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; }
|
unsigned get_levels() const { return levels; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -769,7 +766,8 @@ void vulkan_filter_chain::update_history(DeferredDisposer &disposer,
|
||||||
&& input_texture.format != tmp->get_format()))
|
&& input_texture.format != tmp->get_format()))
|
||||||
tmp->set_size(disposer, { input_texture.width, input_texture.height }, input_texture.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. */
|
/* Transition input texture back. */
|
||||||
if (input_texture.layout != VK_IMAGE_LAYOUT_GENERAL)
|
if (input_texture.layout != VK_IMAGE_LAYOUT_GENERAL)
|
||||||
|
@ -1096,12 +1094,12 @@ void vulkan_filter_chain::clear_history_and_feedback(VkCommandBuffer cmd)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
for (i = 0; i < original_history.size(); 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++)
|
for (i = 0; i < passes.size(); i++)
|
||||||
{
|
{
|
||||||
Framebuffer *fb = passes[i]->get_feedback_framebuffer();
|
Framebuffer *fb = passes[i]->get_feedback_framebuffer();
|
||||||
if (fb)
|
if (fb)
|
||||||
fb->clear(cmd);
|
vulkan_framebuffer_clear(fb->get_image(), cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2401,78 +2399,6 @@ Framebuffer::Framebuffer(
|
||||||
init(nullptr);
|
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)
|
void Framebuffer::init(DeferredDisposer *disposer)
|
||||||
{
|
{
|
||||||
VkMemoryRequirements mem_reqs;
|
VkMemoryRequirements mem_reqs;
|
||||||
|
|
Loading…
Reference in New Issue