Adding interface for renderpass layout transitions

This commit is contained in:
Dynamitos
2024-01-31 09:49:53 +01:00
parent 1bf08f696b
commit 5678021c9e
34 changed files with 616 additions and 184 deletions
+20
View File
@@ -278,6 +278,11 @@ bool UniformBuffer::updateContents(const DataSource &sourceData)
return true;
}
void UniformBuffer::beginFrame()
{
Vulkan::Buffer::advanceBuffer();
}
void UniformBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
Gfx::QueueOwnedResource::transferOwnership(newOwner);
@@ -330,6 +335,11 @@ bool ShaderBuffer::updateContents(const DataSource &sourceData)
return true;
}
void ShaderBuffer::beginFrame()
{
Vulkan::Buffer::advanceBuffer();
}
void ShaderBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
Gfx::QueueOwnedResource::transferOwnership(newOwner);
@@ -386,6 +396,11 @@ void VertexBuffer::download(Array<uint8> &buffer)
unmap();
}
void VertexBuffer::beginFrame()
{
Vulkan::Buffer::advanceBuffer();
}
void VertexBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
Gfx::QueueOwnedResource::transferOwnership(newOwner);
@@ -435,6 +450,11 @@ void IndexBuffer::download(Array<uint8> &buffer)
unmap();
}
void IndexBuffer::beginFrame()
{
Vulkan::Buffer::advanceBuffer();
}
void IndexBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
Gfx::QueueOwnedResource::transferOwnership(newOwner);
+4
View File
@@ -60,6 +60,7 @@ public:
virtual ~UniformBuffer();
virtual bool updateContents(const DataSource &sourceData) override;
virtual void beginFrame() override;
protected:
// Inherited via Vulkan::Buffer
virtual VkAccessFlags getSourceAccessMask() override;
@@ -80,6 +81,7 @@ public:
ShaderBuffer(PGraphics graphics, const ShaderBufferCreateInfo &sourceData);
virtual ~ShaderBuffer();
virtual bool updateContents(const DataSource &sourceData) override;
virtual void beginFrame() override;
protected:
// Inherited via Vulkan::Buffer
@@ -102,6 +104,7 @@ public:
virtual void updateRegion(DataSource update) override;
virtual void download(Array<uint8>& buffer) override;
virtual void beginFrame() override;
protected:
// Inherited via Vulkan::Buffer
virtual VkAccessFlags getSourceAccessMask() override;
@@ -121,6 +124,7 @@ public:
virtual ~IndexBuffer();
virtual void download(Array<uint8>& buffer) override;
virtual void beginFrame() override;
protected:
// Inherited via Vulkan::Buffer
virtual VkAccessFlags getSourceAccessMask() override;
+1
View File
@@ -76,6 +76,7 @@ void Command::beginRenderPass(PRenderPass renderPass, PFramebuffer framebuffer)
void Command::endRenderPass()
{
boundRenderPass->endRenderPass();
boundRenderPass = nullptr;
boundFramebuffer = nullptr;
vkCmdEndRenderPass(handle);
+4
View File
@@ -10,6 +10,10 @@ VkBool32 Seele::Vulkan::debugCallback(
void* pUserData)
{
std::cerr << pCallbackData->pMessage << std::endl;
if(messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
{
return VK_FALSE;
}
return VK_FALSE;
}
+241
View File
@@ -1552,4 +1552,245 @@ Gfx::SeSamplerMipmapMode Seele::Vulkan::cast(const VkSamplerMipmapMode &filter)
default:
return SE_SAMPLER_MIPMAP_MODE_MAX_ENUM;
}
}
VkAccessFlagBits Seele::Vulkan::cast(const Gfx::SeAccessFlagBits &flags)
{
switch(flags)
{
case SE_ACCESS_INDIRECT_COMMAND_READ_BIT:
return VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
case SE_ACCESS_INDEX_READ_BIT:
return VK_ACCESS_INDEX_READ_BIT;
case SE_ACCESS_VERTEX_ATTRIBUTE_READ_BIT:
return VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
case SE_ACCESS_UNIFORM_READ_BIT:
return VK_ACCESS_UNIFORM_READ_BIT;
case SE_ACCESS_INPUT_ATTACHMENT_READ_BIT:
return VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
case SE_ACCESS_SHADER_READ_BIT:
return VK_ACCESS_SHADER_READ_BIT;
case SE_ACCESS_SHADER_WRITE_BIT:
return VK_ACCESS_SHADER_WRITE_BIT;
case SE_ACCESS_COLOR_ATTACHMENT_READ_BIT:
return VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
case SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT:
return VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
case SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:
return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
case SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:
return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
case SE_ACCESS_TRANSFER_READ_BIT:
return VK_ACCESS_TRANSFER_READ_BIT;
case SE_ACCESS_TRANSFER_WRITE_BIT:
return VK_ACCESS_TRANSFER_WRITE_BIT;
case SE_ACCESS_HOST_READ_BIT:
return VK_ACCESS_HOST_READ_BIT;
case SE_ACCESS_HOST_WRITE_BIT:
return VK_ACCESS_HOST_WRITE_BIT;
case SE_ACCESS_MEMORY_READ_BIT:
return VK_ACCESS_MEMORY_READ_BIT;
case SE_ACCESS_MEMORY_WRITE_BIT:
return VK_ACCESS_MEMORY_WRITE_BIT;
case SE_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT:
return VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT;
case SE_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT:
return VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT;
case SE_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT:
return VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT;
case SE_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT:
return VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT;
case SE_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT:
return VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT;
case SE_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT:
return VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT;
case SE_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV:
return VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV;
case SE_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV:
return VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV;
default:
return VK_ACCESS_FLAG_BITS_MAX_ENUM;
}
}
Gfx::SeAccessFlagBits Seele::Vulkan::cast(const VkAccessFlagBits &flags)
{
switch(flags)
{
case VK_ACCESS_INDIRECT_COMMAND_READ_BIT:
return SE_ACCESS_INDIRECT_COMMAND_READ_BIT;
case VK_ACCESS_INDEX_READ_BIT:
return SE_ACCESS_INDEX_READ_BIT;
case VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT:
return SE_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
case VK_ACCESS_UNIFORM_READ_BIT:
return SE_ACCESS_UNIFORM_READ_BIT;
case VK_ACCESS_INPUT_ATTACHMENT_READ_BIT:
return SE_ACCESS_INPUT_ATTACHMENT_READ_BIT;
case VK_ACCESS_SHADER_READ_BIT:
return SE_ACCESS_SHADER_READ_BIT;
case VK_ACCESS_SHADER_WRITE_BIT:
return SE_ACCESS_SHADER_WRITE_BIT;
case VK_ACCESS_COLOR_ATTACHMENT_READ_BIT:
return SE_ACCESS_COLOR_ATTACHMENT_READ_BIT;
case VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT:
return SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:
return SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:
return SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
case VK_ACCESS_TRANSFER_READ_BIT:
return SE_ACCESS_TRANSFER_READ_BIT;
case VK_ACCESS_TRANSFER_WRITE_BIT:
return SE_ACCESS_TRANSFER_WRITE_BIT;
case VK_ACCESS_HOST_READ_BIT:
return SE_ACCESS_HOST_READ_BIT;
case VK_ACCESS_HOST_WRITE_BIT:
return SE_ACCESS_HOST_WRITE_BIT;
case VK_ACCESS_MEMORY_READ_BIT:
return SE_ACCESS_MEMORY_READ_BIT;
case VK_ACCESS_MEMORY_WRITE_BIT:
return SE_ACCESS_MEMORY_WRITE_BIT;
case VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT:
return SE_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT;
case VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT:
return SE_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT;
case VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT:
return SE_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT;
case VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT:
return SE_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT;
case VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT:
return SE_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT;
case VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT:
return SE_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT;
case VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV:
return SE_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV;
case VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV:
return SE_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV;
default:
return SE_ACCESS_FLAG_BITS_MAX_ENUM;
}
}
VkPipelineStageFlagBits Seele::Vulkan::cast(const Gfx::SePipelineStageFlagBits &flags)
{
switch(flags)
{
case SE_PIPELINE_STAGE_TOP_OF_PIPE_BIT:
return VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
case SE_PIPELINE_STAGE_DRAW_INDIRECT_BIT:
return VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
case SE_PIPELINE_STAGE_VERTEX_INPUT_BIT:
return VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
case SE_PIPELINE_STAGE_VERTEX_SHADER_BIT:
return VK_PIPELINE_STAGE_VERTEX_SHADER_BIT;
case SE_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT:
return VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT;
case SE_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT:
return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;
case SE_PIPELINE_STAGE_GEOMETRY_SHADER_BIT:
return VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
case SE_PIPELINE_STAGE_FRAGMENT_SHADER_BIT:
return VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
case SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT:
return VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
case SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT:
return VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
case SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT:
return VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
case SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT:
return VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
case SE_PIPELINE_STAGE_TRANSFER_BIT:
return VK_PIPELINE_STAGE_TRANSFER_BIT;
case SE_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT:
return VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
case SE_PIPELINE_STAGE_HOST_BIT:
return VK_PIPELINE_STAGE_HOST_BIT;
case SE_PIPELINE_STAGE_ALL_GRAPHICS_BIT:
return VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
case SE_PIPELINE_STAGE_ALL_COMMANDS_BIT:
return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
case SE_PIPELINE_STAGE_NONE:
return VK_PIPELINE_STAGE_NONE;
case SE_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT:
return VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
case SE_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT:
return VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT;
case SE_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR:
return VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
case SE_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR:
return VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR;
case SE_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT:
return VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT;
case SE_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR:
return VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
case SE_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV:
return VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV;
case SE_PIPELINE_STAGE_TASK_SHADER_BIT_EXT:
return VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT;
case SE_PIPELINE_STAGE_MESH_SHADER_BIT_EXT:
return VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT;
default:
return VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM;
}
}
Gfx::SePipelineStageFlagBits Seele::Vulkan::cast(const VkPipelineStageFlagBits &flags)
{
switch(flags)
{
case VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT:
return SE_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
case VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT:
return SE_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
case VK_PIPELINE_STAGE_VERTEX_INPUT_BIT:
return SE_PIPELINE_STAGE_VERTEX_INPUT_BIT;
case VK_PIPELINE_STAGE_VERTEX_SHADER_BIT:
return SE_PIPELINE_STAGE_VERTEX_SHADER_BIT;
case VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT:
return SE_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT;
case VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT:
return SE_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;
case VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT:
return SE_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
case VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT:
return SE_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
case VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT:
return SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
case VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT:
return SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
case VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT:
return SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
case VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT:
return SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
case VK_PIPELINE_STAGE_TRANSFER_BIT:
return SE_PIPELINE_STAGE_TRANSFER_BIT;
case VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT:
return SE_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
case VK_PIPELINE_STAGE_HOST_BIT:
return SE_PIPELINE_STAGE_HOST_BIT;
case VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT:
return SE_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
case VK_PIPELINE_STAGE_ALL_COMMANDS_BIT:
return SE_PIPELINE_STAGE_ALL_COMMANDS_BIT;
case VK_PIPELINE_STAGE_NONE:
return SE_PIPELINE_STAGE_NONE;
case VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT:
return SE_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
case VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT:
return SE_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT;
case VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR:
return SE_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
case VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR:
return SE_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR;
case VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT:
return SE_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT;
case VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR:
return SE_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
case VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV:
return SE_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV;
case VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT:
return SE_PIPELINE_STAGE_TASK_SHADER_BIT_EXT;
case VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT:
return SE_PIPELINE_STAGE_MESH_SHADER_BIT_EXT;
default:
return SE_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM;
}
}
+4
View File
@@ -62,5 +62,9 @@ VkFilter cast(const Gfx::SeFilter &filter);
Gfx::SeFilter cast(const VkFilter &filter);
VkSamplerMipmapMode cast(const Gfx::SeSamplerMipmapMode &filter);
Gfx::SeSamplerMipmapMode cast(const VkSamplerMipmapMode &filter);
VkAccessFlagBits cast(const Gfx::SeAccessFlagBits &flags);
Gfx::SeAccessFlagBits cast(const VkAccessFlagBits &flags);
VkPipelineStageFlagBits cast(const Gfx::SePipelineStageFlagBits &flags);
Gfx::SePipelineStageFlagBits cast(const VkPipelineStageFlagBits &flags);
} // namespace Vulkan
} // namespace Seele
+8 -8
View File
@@ -7,7 +7,7 @@
using namespace Seele;
using namespace Seele::Vulkan;
Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRenderTargetLayout renderTargetLayout)
Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::RenderTargetLayout renderTargetLayout)
: graphics(graphics)
, layout(renderTargetLayout)
, renderPass(renderPass)
@@ -17,7 +17,7 @@ Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRende
Array<VkImageView> attachments;
uint32 width = 0;
uint32 height = 0;
for (auto inputAttachment : layout->inputAttachments)
for (auto inputAttachment : layout.inputAttachments)
{
PTexture2D vkInputAttachment = inputAttachment->getTexture().cast<Texture2D>();
attachments.add(vkInputAttachment->getView());
@@ -25,7 +25,7 @@ Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRende
width = std::max(width, vkInputAttachment->getWidth());
height = std::max(height, vkInputAttachment->getHeight());
}
for (auto colorAttachment : layout->colorAttachments)
for (auto colorAttachment : layout.colorAttachments)
{
PTexture2D vkColorAttachment = colorAttachment->getTexture().cast<Texture2D>();
attachments.add(vkColorAttachment->getView());
@@ -33,7 +33,7 @@ Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRende
width = std::max(width, vkColorAttachment->getWidth());
height = std::max(height, vkColorAttachment->getHeight());
}
for (auto resolveAttachment : layout->resolveAttachments)
for (auto resolveAttachment : layout.resolveAttachments)
{
PTexture2D vkResolveAttachment = resolveAttachment->getTexture().cast<Texture2D>();
attachments.add(vkResolveAttachment->getView());
@@ -41,17 +41,17 @@ Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRende
width = std::max(width, vkResolveAttachment->getWidth());
height = std::max(height, vkResolveAttachment->getHeight());
}
if (layout->depthAttachment != nullptr)
if (layout.depthAttachment != nullptr)
{
PTexture2D vkDepthAttachment = layout->depthAttachment->getTexture().cast<Texture2D>();
PTexture2D vkDepthAttachment = layout.depthAttachment->getTexture().cast<Texture2D>();
attachments.add(vkDepthAttachment->getView());
description.depthAttachment = vkDepthAttachment->getView();
width = std::max(width, vkDepthAttachment->getWidth());
height = std::max(height, vkDepthAttachment->getHeight());
}
if (layout->depthResolveAttachment != nullptr)
if (layout.depthResolveAttachment != nullptr)
{
PTexture2D vkDepthAttachment = layout->depthResolveAttachment->getTexture().cast<Texture2D>();
PTexture2D vkDepthAttachment = layout.depthResolveAttachment->getTexture().cast<Texture2D>();
attachments.add(vkDepthAttachment->getView());
description.depthResolveAttachment = vkDepthAttachment->getView();
width = std::max(width, vkDepthAttachment->getWidth());
+2 -2
View File
@@ -22,7 +22,7 @@ struct FramebufferDescription
class Framebuffer
{
public:
Framebuffer(PGraphics graphics, PRenderPass renderpass, Gfx::PRenderTargetLayout renderTargetLayout);
Framebuffer(PGraphics graphics, PRenderPass renderpass, Gfx::RenderTargetLayout renderTargetLayout);
virtual ~Framebuffer();
constexpr VkFramebuffer getHandle() const
{
@@ -37,7 +37,7 @@ private:
uint32 hash;
PGraphics graphics;
VkFramebuffer handle;
Gfx::PRenderTargetLayout layout;
Gfx::RenderTargetLayout layout;
PRenderPass renderPass;
};
DEFINE_REF(Framebuffer)
+5 -4
View File
@@ -80,9 +80,10 @@ Gfx::OViewport Graphics::createViewport(Gfx::PWindow owner, const ViewportCreate
{
return new Viewport(this, owner, viewportInfo);
}
Gfx::ORenderPass Graphics::createRenderPass(Gfx::ORenderTargetLayout layout, Gfx::PViewport renderArea)
Gfx::ORenderPass Graphics::createRenderPass(Gfx::RenderTargetLayout layout, Array<Gfx::SubPassDependency> dependencies, Gfx::PViewport renderArea)
{
return new RenderPass(this, std::move(layout), renderArea);
return new RenderPass(this, std::move(layout), std::move(dependencies), renderArea);
}
void Graphics::beginRenderPass(Gfx::PRenderPass renderPass)
{
@@ -415,8 +416,8 @@ void Graphics::setupDebugCallback()
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
.pNext = nullptr,
.flags = 0,
.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT,
.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,
.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
.pfnUserCallback = &debugCallback,
.pUserData = nullptr,
};
+1 -1
View File
@@ -35,7 +35,7 @@ public:
virtual Gfx::OWindow createWindow(const WindowCreateInfo &createInfo) override;
virtual Gfx::OViewport createViewport(Gfx::PWindow owner, const ViewportCreateInfo &createInfo) override;
virtual Gfx::ORenderPass createRenderPass(Gfx::ORenderTargetLayout layout, Gfx::PViewport renderArea) override;
virtual Gfx::ORenderPass createRenderPass(Gfx::RenderTargetLayout layout, Array<Gfx::SubPassDependency> dependencies, Gfx::PViewport renderArea) override;
virtual void beginRenderPass(Gfx::PRenderPass renderPass) override;
virtual void endRenderPass() override;
+6 -8
View File
@@ -171,12 +171,11 @@ PGraphicsPipeline PipelineCache::createPipeline(Gfx::LegacyPipelineCreateInfo gf
};
hash = CRC::Calculate(&depthStencilState, sizeof(depthStencilState), CRC::CRC_32(), hash);
const auto& colorAttachments = gfxInfo.renderPass->getLayout()->colorAttachments;
Array<VkPipelineColorBlendAttachmentState> blendAttachments(colorAttachments.size());
for(uint32 i = 0; i < colorAttachments.size(); ++i)
Array<VkPipelineColorBlendAttachmentState> blendAttachments;
for(uint32 i = 0; i < gfxInfo.colorBlend.attachmentCount; ++i)
{
const Gfx::ColorBlendState::BlendAttachment& attachment = gfxInfo.colorBlend.blendAttachments[i];
blendAttachments[i] = {
blendAttachments.add() = {
.blendEnable = attachment.blendEnable,
.srcColorBlendFactor = (VkBlendFactor)attachment.srcColorBlendFactor,
.dstColorBlendFactor = (VkBlendFactor)attachment.dstColorBlendFactor,
@@ -343,12 +342,11 @@ PGraphicsPipeline PipelineCache::createPipeline(Gfx::MeshPipelineCreateInfo gfxI
};
hash = CRC::Calculate(&depthStencilState, sizeof(depthStencilState), CRC::CRC_32(), hash);
const auto& colorAttachments = gfxInfo.renderPass->getLayout()->colorAttachments;
Array<VkPipelineColorBlendAttachmentState> blendAttachments(colorAttachments.size());
for (uint32 i = 0; i < colorAttachments.size(); ++i)
Array<VkPipelineColorBlendAttachmentState> blendAttachments;
for (uint32 i = 0; i < gfxInfo.colorBlend.attachmentCount; ++i)
{
const Gfx::ColorBlendState::BlendAttachment& attachment = gfxInfo.colorBlend.blendAttachments[i];
blendAttachments[i] = {
blendAttachments.add() = {
.blendEnable = attachment.blendEnable,
.srcColorBlendFactor = (VkBlendFactor)attachment.srcColorBlendFactor,
.dstColorBlendFactor = (VkBlendFactor)attachment.dstColorBlendFactor,
+3 -1
View File
@@ -6,6 +6,8 @@
using namespace Seele;
using namespace Seele::Vulkan;
static constexpr bool waitIdleOnSubmit = false;
Queue::Queue(PGraphics graphics, uint32 familyIndex, uint32 queueIndex)
: graphics(graphics)
, familyIndex(familyIndex)
@@ -49,7 +51,7 @@ void Queue::submitCommandBuffer(PCommand command, const Array<VkSemaphore>& sign
command->waitFlags.clear();
command->waitSemaphores.clear();
if (Gfx::waitIdleOnSubmit)
if (waitIdleOnSubmit)
{
command->fence->wait(1000 * 1000ull);
}
+68 -46
View File
@@ -8,8 +8,8 @@
using namespace Seele;
using namespace Seele::Vulkan;
RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx::PViewport viewport)
: Gfx::RenderPass(std::move(_layout))
RenderPass::RenderPass(PGraphics graphics, Gfx::RenderTargetLayout _layout, Array<Gfx::SubPassDependency> _dependencies, Gfx::PViewport viewport)
: Gfx::RenderPass(std::move(_layout), std::move(_dependencies))
, graphics(graphics)
{
renderArea.extent.width = viewport->getWidth();
@@ -25,7 +25,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
VkAttachmentReference2 depthResolveRef;
uint32 attachmentCounter = 0;
for (auto& inputAttachment : layout->inputAttachments)
for (auto& inputAttachment : layout.inputAttachments)
{
PTexture2D image = inputAttachment->getTexture().cast<Texture2D>();
VkAttachmentDescription2& desc = attachments.add() = {
@@ -37,8 +37,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.storeOp = cast(inputAttachment->getStoreOp()),
.stencilLoadOp = cast(inputAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(inputAttachment->getStencilStoreOp()),
.initialLayout = image->isDepthStencil() ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.finalLayout = image->isDepthStencil() ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.initialLayout = cast(inputAttachment->getInitialLayout()),
.finalLayout = cast(inputAttachment->getFinalLayout()),
};
inputRefs.add() = {
@@ -46,7 +46,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.layout = desc.initialLayout,
};
}
for (auto& colorAttachment : layout->colorAttachments)
for (auto& colorAttachment : layout.colorAttachments)
{
attachments.add() = {
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
@@ -58,8 +58,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.storeOp = cast(colorAttachment->getStoreOp()),
.stencilLoadOp = cast(colorAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(colorAttachment->getStencilStoreOp()),
.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.initialLayout = cast(colorAttachment->getInitialLayout()),
.finalLayout = cast(colorAttachment->getFinalLayout()),
};
VkClearValue& clearValue = clearValues.add();
@@ -75,7 +75,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
};
}
for (auto& resolveAttachment : layout->resolveAttachments)
for (auto& resolveAttachment : layout.resolveAttachments)
{
attachments.add() = {
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
@@ -87,8 +87,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.storeOp = cast(resolveAttachment->getStoreOp()),
.stencilLoadOp = cast(resolveAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(resolveAttachment->getStencilStoreOp()),
.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.initialLayout = cast(resolveAttachment->getInitialLayout()),
.finalLayout = cast(resolveAttachment->getFinalLayout()),
};
VkClearValue& clearValue = clearValues.add();
@@ -104,27 +104,27 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
};
}
if (layout->depthAttachment != nullptr)
if (layout.depthAttachment != nullptr)
{
PTexture2D image = layout->depthAttachment->getTexture().cast<Texture2D>();
PTexture2D image = layout.depthAttachment->getTexture().cast<Texture2D>();
attachments.add() = {
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
.pNext = nullptr,
.flags = 0,
.format = cast(image->getFormat()),
.samples = (VkSampleCountFlagBits)image->getNumSamples(),
.loadOp = cast(layout->depthAttachment->getLoadOp()),
.storeOp = cast(layout->depthAttachment->getStoreOp()),
.stencilLoadOp = cast(layout->depthAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(layout->depthAttachment->getStencilStoreOp()),
.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.loadOp = cast(layout.depthAttachment->getLoadOp()),
.storeOp = cast(layout.depthAttachment->getStoreOp()),
.stencilLoadOp = cast(layout.depthAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(layout.depthAttachment->getStencilStoreOp()),
.initialLayout = cast(layout.depthAttachment->getInitialLayout()),
.finalLayout = cast(layout.depthAttachment->getFinalLayout()),
};
VkClearValue& clearValue = clearValues.add();
if (attachments.back().loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
{
clearValue = cast(layout->depthAttachment->clear);
clearValue = cast(layout.depthAttachment->clear);
}
depthRef = {
@@ -134,21 +134,21 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
};
}
if (layout->depthResolveAttachment != nullptr)
if (layout.depthResolveAttachment != nullptr)
{
PTexture2D image = layout->depthResolveAttachment->getTexture().cast<Texture2D>();
PTexture2D image = layout.depthResolveAttachment->getTexture().cast<Texture2D>();
attachments.add() = {
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
.pNext = nullptr,
.flags = 0,
.format = cast(image->getFormat()),
.samples = (VkSampleCountFlagBits)image->getNumSamples(),
.loadOp = cast(layout->depthResolveAttachment->getLoadOp()),
.storeOp = cast(layout->depthResolveAttachment->getStoreOp()),
.stencilLoadOp = cast(layout->depthResolveAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(layout->depthResolveAttachment->getStencilStoreOp()),
.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.loadOp = cast(layout.depthResolveAttachment->getLoadOp()),
.storeOp = cast(layout.depthResolveAttachment->getStoreOp()),
.stencilLoadOp = cast(layout.depthResolveAttachment->getStencilLoadOp()),
.stencilStoreOp = cast(layout.depthResolveAttachment->getStencilStoreOp()),
.initialLayout = cast(layout.depthResolveAttachment->getInitialLayout()),
.finalLayout = cast(layout.depthResolveAttachment->getFinalLayout()),
};
depthResolveRef = {
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
@@ -167,7 +167,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
};
VkSubpassDescription2 subPassDesc = {
.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
.pNext = layout->depthResolveAttachment != nullptr ? &depthResolve : nullptr,
.pNext = layout.depthResolveAttachment != nullptr ? &depthResolve : nullptr,
.flags = 0,
.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
.inputAttachmentCount = (uint32)inputRefs.size(),
@@ -177,17 +177,20 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.pResolveAttachments = resolveRefs.size() > 0 ? resolveRefs.data() : nullptr,
.pDepthStencilAttachment = &depthRef,
};
VkSubpassDependency2 dependency = {
.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
.pNext = nullptr,
.srcSubpass = VK_SUBPASS_EXTERNAL,
.dstSubpass = 0,
.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT,
.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
};
Array<VkSubpassDependency2> dep;
for(const auto& d : dependencies) {
dep.add() = {
.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
.pNext = nullptr,
.srcSubpass = d.srcSubpass,
.dstSubpass = d.dstSubpass,
.srcStageMask = d.srcStage,
.dstStageMask = d.dstStage,
.srcAccessMask = d.srcAccess,
.dstAccessMask = d.dstAccess,
.dependencyFlags = 0,
};
}
VkRenderPassCreateInfo2 info = {
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
.pNext = nullptr,
@@ -195,8 +198,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx
.pAttachments = attachments.data(),
.subpassCount = 1,
.pSubpasses = &subPassDesc,
.dependencyCount = 1,
.pDependencies = &dependency,
.dependencyCount = (uint32)dep.size(),
.pDependencies = dep.data(),
};
VK_CHECK(vkCreateRenderPass2(graphics->getDevice(), &info, nullptr, &renderPass));
@@ -211,20 +214,39 @@ uint32 RenderPass::getFramebufferHash()
{
FramebufferDescription description;
std::memset(&description, 0, sizeof(FramebufferDescription));
for (auto& inputAttachment : layout->inputAttachments)
for (auto& inputAttachment : layout.inputAttachments)
{
PTexture2D tex = inputAttachment->getTexture().cast<Texture2D>();
description.inputAttachments[description.numInputAttachments++] = tex->getView();
}
for (auto& colorAttachment : layout->colorAttachments)
for (auto& colorAttachment : layout.colorAttachments)
{
PTexture2D tex = colorAttachment->getTexture().cast<Texture2D>();
description.colorAttachments[description.numColorAttachments++] = tex->getView();
}
if (layout->depthAttachment != nullptr)
if (layout.depthAttachment != nullptr)
{
PTexture2D tex = layout->depthAttachment->getTexture().cast<Texture2D>();
PTexture2D tex = layout.depthAttachment->getTexture().cast<Texture2D>();
description.depthAttachment = tex->getView();
}
return CRC::Calculate(&description, sizeof(FramebufferDescription), CRC::CRC_32());
}
void Vulkan::RenderPass::endRenderPass()
{
for (auto& inputAttachment : layout.inputAttachments)
{
PTexture2D tex = inputAttachment->getTexture().cast<Texture2D>();
tex->setLayout(inputAttachment->getFinalLayout());
}
for (auto& colorAttachment : layout.colorAttachments)
{
PTexture2D tex = colorAttachment->getTexture().cast<Texture2D>();
tex->setLayout(colorAttachment->getFinalLayout());
}
if (layout.depthAttachment != nullptr)
{
PTexture2D tex = layout.depthAttachment->getTexture().cast<Texture2D>();
tex->setLayout(layout.depthAttachment->getFinalLayout());
}
}
+2 -1
View File
@@ -9,9 +9,10 @@ namespace Vulkan
class RenderPass : public Gfx::RenderPass
{
public:
RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout layout, Gfx::PViewport viewport);
RenderPass(PGraphics graphics, Gfx::RenderTargetLayout layout, Array<Gfx::SubPassDependency> dependencies, Gfx::PViewport viewport);
virtual ~RenderPass();
uint32 getFramebufferHash();
void endRenderPass();
constexpr VkRenderPass getHandle() const
{
return renderPass;
+40 -20
View File
@@ -104,7 +104,9 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType,
const DataSource& sourceData = createInfo.sourceData;
if(sourceData.size > 0)
{
changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
VK_ACCESS_MEMORY_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
void* data;
VkMemoryPropertyFlags memProps;
VkBuffer stagingBuffer = VK_NULL_HANDLE;
@@ -161,7 +163,9 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType,
stagingBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
// When loading a texture from a file, we will almost always use it as a texture map for fragment shaders
changeLayout(Gfx::SE_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
changeLayout(Gfx::SE_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
if(stagingBuffer != VK_NULL_HANDLE)
{
vmaUnmapMemory(graphics->getAllocator(), stagingAlloc);
@@ -169,20 +173,24 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType,
}
}
}
if(usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
{
changeLayout(Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
changeLayout(Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
}
else if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
{
changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
}
else
{
changeLayout(Gfx::SE_IMAGE_LAYOUT_GENERAL);
changeLayout(Gfx::SE_IMAGE_LAYOUT_GENERAL,
VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
VK_ACCESS_MEMORY_WRITE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
}
VkImageViewCreateInfo viewInfo = {
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.pNext = nullptr,
@@ -210,13 +218,15 @@ TextureBase::~TextureBase()
}
void TextureBase::changeLayout(Gfx::SeImageLayout newLayout)
void TextureBase::changeLayout(Gfx::SeImageLayout newLayout,
VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{
VkImageMemoryBarrier barrier = {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.pNext = nullptr,
.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,
.srcAccessMask = srcAccess,
.dstAccessMask = dstAccess,
.oldLayout = cast(layout),
.newLayout = cast(newLayout),
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
@@ -225,14 +235,14 @@ void TextureBase::changeLayout(Gfx::SeImageLayout newLayout)
.subresourceRange = {
.aspectMask = aspect,
.baseMipLevel = 0,
.levelCount = 1,
.levelCount = mipLevels,
.baseArrayLayer = 0,
.layerCount = layerCount,
},
};
PCommandPool commandPool = graphics->getQueueCommands(currentOwner);
vkCmdPipelineBarrier(commandPool->getCommands()->getHandle(),
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
srcStage, dstStage,
0, 0, nullptr, 0, nullptr, 1, &barrier);
commandPool->submitCommands();
layout = newLayout;
@@ -243,7 +253,9 @@ void TextureBase::download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Arra
uint64 imageSize = width * height * depth * Gfx::getFormatInfo(format).blockSize;
auto prevLayout = layout;
changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_ACCESS_MEMORY_WRITE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
void* data;
VkBuffer stagingBuffer = VK_NULL_HANDLE;
VmaAllocation stagingAlloc;
@@ -286,7 +298,9 @@ void TextureBase::download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Arra
},
};
vkCmdCopyImageToBuffer(cmdBuffer->getHandle(), image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingBuffer, 1, &region);
changeLayout(prevLayout);
changeLayout(prevLayout,
VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_MEMORY_READ_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
VK_CHECK(vmaMapMemory(graphics->getAllocator(), stagingAlloc, &data));
buffer.resize(imageSize);
std::memcpy(buffer.data(), data, buffer.size());
@@ -397,9 +411,11 @@ Texture2D::~Texture2D()
{
}
void Texture2D::changeLayout(Gfx::SeImageLayout newLayout)
void Texture2D::changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage)
{
TextureBase::changeLayout(newLayout);
TextureBase::changeLayout(newLayout, srcAccess, srcStage, dstAccess, dstStage);
}
void Texture2D::download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer)
@@ -429,9 +445,11 @@ Texture3D::~Texture3D()
{
}
void Texture3D::changeLayout(Gfx::SeImageLayout newLayout)
void Texture3D::changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage)
{
TextureBase::changeLayout(newLayout);
TextureBase::changeLayout(newLayout, srcAccess, srcStage, dstAccess, dstStage);
}
void Texture3D::download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer)
@@ -460,9 +478,11 @@ TextureCube::~TextureCube()
{
}
void TextureCube::changeLayout(Gfx::SeImageLayout newLayout)
void TextureCube::changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage)
{
TextureBase::changeLayout(newLayout);
TextureBase::changeLayout(newLayout, srcAccess, srcStage, dstAccess, dstStage);
}
void TextureCube::download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer)
+16 -4
View File
@@ -36,6 +36,10 @@ public:
{
return layout;
}
void setLayout(Gfx::SeImageLayout val)
{
layout = val;
}
constexpr VkImageAspectFlags getAspect() const
{
return aspect;
@@ -63,7 +67,9 @@ public:
void executeOwnershipBarrier(Gfx::QueueType newOwner);
void executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage);
void changeLayout(Gfx::SeImageLayout newLayout);
void changeLayout(Gfx::SeImageLayout newLayout,
VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage);
void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer);
protected:
@@ -118,7 +124,9 @@ public:
{
return mipLevels;
}
virtual void changeLayout(Gfx::SeImageLayout newLayout) override;
virtual void changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage) override;
virtual void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer) override;
protected:
@@ -159,7 +167,9 @@ public:
{
return mipLevels;
}
virtual void changeLayout(Gfx::SeImageLayout newLayout) override;
virtual void changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage) override;
virtual void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer) override;
protected:
@@ -200,7 +210,9 @@ public:
{
return mipLevels;
}
virtual void changeLayout(Gfx::SeImageLayout newLayout) override;
virtual void changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage) override;
virtual void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer) override;
protected:
// Inherited via QueueOwnedResource
+7 -6
View File
@@ -66,12 +66,12 @@ Window::Window(PGraphics graphics, const WindowCreateInfo &createInfo)
, instance(graphics->getInstance())
, swapchain(VK_NULL_HANDLE)
{
float xscale, yscale;
glfwGetMonitorContentScale(glfwGetPrimaryMonitor(), &xscale, &yscale);
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow *handle = glfwCreateWindow(createInfo.width, createInfo.height, createInfo.title, nullptr, nullptr);
GLFWwindow *handle = glfwCreateWindow(createInfo.width / xscale, createInfo.height / yscale, createInfo.title, nullptr, nullptr);
windowHandle = handle;
glfwSetWindowUserPointer(handle, this);
int w, h;
glfwGetWindowSize(handle, &w, &h);
glfwSetKeyCallback(handle, &glfwKeyCallback);
glfwSetCursorPosCallback(handle, &glfwMouseMoveCallback);
@@ -111,13 +111,14 @@ void Window::beginFrame()
imageAvailableFences[currentSemaphoreIndex]->wait(100000);
imageAvailableFences[currentSemaphoreIndex]->reset();
vkAcquireNextImageKHR(graphics->getDevice(), swapchain, std::numeric_limits<uint64>::max(), imageAvailableSemaphores[currentSemaphoreIndex]->getHandle(), imageAvailableFences[currentSemaphoreIndex]->getHandle(), &currentImageIndex);
graphics->getGraphicsCommands()->getCommands()->waitForSemaphore(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, imageAvailableSemaphores[currentSemaphoreIndex]);
swapChainTextures[currentImageIndex]->changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
graphics->getGraphicsCommands()->getCommands()->waitForSemaphore(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, imageAvailableSemaphores[currentSemaphoreIndex]);
}
void Window::endFrame()
{
swapChainTextures[currentImageIndex]->changeLayout(Gfx::SE_IMAGE_LAYOUT_PRESENT_SRC_KHR);
swapChainTextures[currentImageIndex]->changeLayout(Gfx::SE_IMAGE_LAYOUT_PRESENT_SRC_KHR,
Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Gfx::SE_ACCESS_MEMORY_READ_BIT, Gfx::SE_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
graphics->getGraphicsCommands()->submitCommands(renderingDoneSemaphores[currentSemaphoreIndex]);
VkSemaphore renderDoneHandle = renderingDoneSemaphores[currentSemaphoreIndex]->getHandle();
VkPresentInfoKHR presentInfo = {