Files
QuaternionEngine/src/render/graph/builder.cpp

99 lines
2.7 KiB
C++

#include "builder.h"
#include "resources.h"
// ---- RGPassResources ----
VkImage RGPassResources::image(RGImageHandle h) const
{
const RGImageRecord *rec = _registry ? _registry->get_image(h) : nullptr;
return rec ? rec->image : VK_NULL_HANDLE;
}
VkImageView RGPassResources::image_view(RGImageHandle h) const
{
const RGImageRecord *rec = _registry ? _registry->get_image(h) : nullptr;
return rec ? rec->imageView : VK_NULL_HANDLE;
}
VkBuffer RGPassResources::buffer(RGBufferHandle h) const
{
const RGBufferRecord *rec = _registry ? _registry->get_buffer(h) : nullptr;
return rec ? rec->buffer : VK_NULL_HANDLE;
}
// ---- RGPassBuilder ----
void RGPassBuilder::read(RGImageHandle h, RGImageUsage usage)
{
_imageReads.push_back({h, usage});
}
void RGPassBuilder::write(RGImageHandle h, RGImageUsage usage)
{
_imageWrites.push_back({h, usage});
}
void RGPassBuilder::read_buffer(RGBufferHandle h, RGBufferUsage usage)
{
_bufferReads.push_back({h, usage});
}
void RGPassBuilder::write_buffer(RGBufferHandle h, RGBufferUsage usage)
{
_bufferWrites.push_back({h, usage});
}
void RGPassBuilder::read_buffer(VkBuffer buffer, RGBufferUsage usage, VkDeviceSize size, const char* name)
{
if (!_registry || buffer == VK_NULL_HANDLE) return;
// Dedup/import
RGBufferHandle h = _registry->find_buffer(buffer);
if (!h.valid())
{
RGImportedBufferDesc d{};
d.name = name ? name : "external.buffer";
d.buffer = buffer;
d.size = size;
d.currentStage = VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT;
d.currentAccess = 0;
h = _registry->add_imported(d);
}
read_buffer(h, usage);
}
void RGPassBuilder::write_buffer(VkBuffer buffer, RGBufferUsage usage, VkDeviceSize size, const char* name)
{
if (!_registry || buffer == VK_NULL_HANDLE) return;
RGBufferHandle h = _registry->find_buffer(buffer);
if (!h.valid())
{
RGImportedBufferDesc d{};
d.name = name ? name : "external.buffer";
d.buffer = buffer;
d.size = size;
d.currentStage = VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT;
d.currentAccess = 0;
h = _registry->add_imported(d);
}
write_buffer(h, usage);
}
void RGPassBuilder::write_color(RGImageHandle h, bool clearOnLoad, VkClearValue clear)
{
RGAttachmentInfo a{};
a.image = h;
a.clearOnLoad = clearOnLoad;
a.clear = clear;
a.store = true;
_colors.push_back(a);
write(h, RGImageUsage::ColorAttachment);
}
void RGPassBuilder::write_depth(RGImageHandle h, bool clearOnLoad, VkClearValue clear)
{
if (_depthRef == nullptr) _depthRef = &_depthTemp;
_depthRef->image = h;
_depthRef->clearOnLoad = clearOnLoad;
_depthRef->clear = clear;
_depthRef->store = true;
write(h, RGImageUsage::DepthAttachment);
}