Adding interface for renderpass layout transitions
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -76,6 +76,7 @@ void Command::beginRenderPass(PRenderPass renderPass, PFramebuffer framebuffer)
|
||||
|
||||
void Command::endRenderPass()
|
||||
{
|
||||
boundRenderPass->endRenderPass();
|
||||
boundRenderPass = nullptr;
|
||||
boundFramebuffer = nullptr;
|
||||
vkCmdEndRenderPass(handle);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, ®ion);
|
||||
|
||||
// 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, ®ion);
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(), ¤tImageIndex);
|
||||
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 = {
|
||||
|
||||
Reference in New Issue
Block a user