99 lines
2.7 KiB
C++
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);
|
|
}
|