Files
Seele/src/Engine/Graphics/RenderPass/VisibilityPass.cpp
T

100 lines
4.6 KiB
C++
Raw Normal View History

2024-06-04 21:34:14 +02:00
#include "VisibilityPass.h"
2024-06-07 09:19:47 +02:00
#include "Graphics/Shader.h"
2024-06-04 21:34:14 +02:00
using namespace Seele;
2024-06-07 18:43:10 +02:00
extern bool resetVisibility;
2024-06-09 12:20:04 +02:00
VisibilityPass::VisibilityPass(Gfx::PGraphics graphics, PScene scene) : RenderPass(graphics, scene) {}
2024-06-04 21:34:14 +02:00
2024-06-09 12:20:04 +02:00
VisibilityPass::~VisibilityPass() {}
2024-06-04 21:34:14 +02:00
2024-06-09 12:20:04 +02:00
void VisibilityPass::beginFrame(const Component::Camera& cam) {
2024-06-04 21:34:14 +02:00
RenderPass::beginFrame(cam);
2024-06-07 14:56:42 +02:00
cullingBuffer->rotateBuffer(VertexData::getMeshletCount() * sizeof(VertexData::MeshletCullingInfo), true);
2024-06-09 12:20:04 +02:00
if (resetVisibility) {
2024-06-07 18:43:10 +02:00
Array<VertexData::MeshletCullingInfo> cullingData(VertexData::getMeshletCount());
std::memset(cullingData.data(), 0xffff, cullingData.size() * sizeof(VertexData::MeshletCullingInfo));
2024-06-07 09:19:47 +02:00
2024-06-09 12:20:04 +02:00
cullingBuffer->updateContents(
ShaderBufferCreateInfo{.sourceData =
{
.size = VertexData::getMeshletCount() * sizeof(VertexData::MeshletCullingInfo),
.data = (uint8*)cullingData.data(),
},
.numElements = VertexData::getMeshletCount()});
cullingBuffer->pipelineBarrier(Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT,
Gfx::SE_ACCESS_MEMORY_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
2024-06-07 18:43:10 +02:00
resetVisibility = false;
}
2024-06-04 21:34:14 +02:00
}
2024-06-09 12:20:04 +02:00
void VisibilityPass::render() {
cullingBuffer->pipelineBarrier(Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_MESH_SHADER_BIT_EXT,
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT);
2024-06-07 09:19:47 +02:00
cullingBuffer->clear();
2024-06-09 12:20:04 +02:00
cullingBuffer->pipelineBarrier(Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT, Gfx::SE_ACCESS_SHADER_READ_BIT,
Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
2024-06-04 21:34:14 +02:00
2024-06-07 09:19:47 +02:00
visibilityDescriptor->reset();
visibilitySet = visibilityDescriptor->allocateDescriptorSet();
visibilitySet->updateTexture(0, visibilityAttachment.getTexture());
visibilitySet->updateBuffer(1, cullingBuffer);
visibilitySet->writeChanges();
2024-06-09 12:20:04 +02:00
2024-06-07 09:19:47 +02:00
Gfx::OComputeCommand command = graphics->createComputeCommand("VisibilityCommand");
command->bindPipeline(visibilityPipeline);
command->bindDescriptor({viewParamsSet, visibilitySet});
2024-06-07 18:43:10 +02:00
command->dispatch(threadGroupSize.x, threadGroupSize.y, threadGroupSize.z);
2024-06-07 09:19:47 +02:00
Array<Gfx::OComputeCommand> commands;
commands.add(std::move(command));
graphics->executeCommands(std::move(commands));
2024-06-09 12:20:04 +02:00
cullingBuffer->pipelineBarrier(Gfx::SE_ACCESS_SHADER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
Gfx::SE_ACCESS_SHADER_READ_BIT,
Gfx::SE_PIPELINE_STAGE_TASK_SHADER_BIT_EXT | Gfx::SE_PIPELINE_STAGE_MESH_SHADER_BIT_EXT);
2024-06-04 21:34:14 +02:00
}
2024-06-09 12:20:04 +02:00
void VisibilityPass::endFrame() {}
2024-06-04 21:34:14 +02:00
2024-06-09 12:20:04 +02:00
void VisibilityPass::publishOutputs() {
2024-06-07 09:19:47 +02:00
uint32_t viewportWidth = viewport->getWidth();
uint32_t viewportHeight = viewport->getHeight();
threadGroupSize = glm::ceil(glm::vec3(viewportWidth / (float)BLOCK_SIZE, viewportHeight / (float)BLOCK_SIZE, 1));
visibilityDescriptor = graphics->createDescriptorLayout("pVisibilityParams");
2024-06-09 12:20:04 +02:00
visibilityDescriptor->addDescriptorBinding(Gfx::DescriptorBinding{
.binding = 0,
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
});
visibilityDescriptor->addDescriptorBinding(Gfx::DescriptorBinding{
.binding = 1,
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER,
.access = Gfx::SE_DESCRIPTOR_ACCESS_READ_WRITE_BIT,
});
2024-06-04 21:34:14 +02:00
visibilityDescriptor->create();
visibilityLayout = graphics->createPipelineLayout("VisibilityLayout");
visibilityLayout->addDescriptorLayout(viewParamsLayout);
visibilityLayout->addDescriptorLayout(visibilityDescriptor);
2024-06-09 12:20:04 +02:00
2024-06-04 21:34:14 +02:00
ShaderCreateInfo createInfo = {
.name = "Visibility",
.mainModule = "VisibilityCompute",
.entryPoint = "computeMain",
.rootSignature = visibilityLayout,
};
visibilityShader = graphics->createComputeShader(createInfo);
visibilityLayout->create();
Gfx::ComputePipelineCreateInfo pipelineInfo;
pipelineInfo.computeShader = visibilityShader;
pipelineInfo.pipelineLayout = std::move(visibilityLayout);
visibilityPipeline = graphics->createComputePipeline(std::move(pipelineInfo));
2024-06-07 09:19:47 +02:00
cullingBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{.dynamic = true, .name = "CullingBuffer"});
resources->registerBufferOutput("CULLINGBUFFER", cullingBuffer);
2024-06-04 21:34:14 +02:00
}
2024-06-09 12:20:04 +02:00
void VisibilityPass::createRenderPass() { visibilityAttachment = resources->requestRenderTarget("VISIBILITY"); }