Files
Seele/src/Engine/Graphics/Metal/RenderPass.mm
T

70 lines
3.3 KiB
Plaintext
Raw Normal View History

2024-04-09 16:41:12 +02:00
#include "RenderPass.h"
2024-04-10 08:43:56 +02:00
#include "Enums.h"
2024-04-09 16:41:12 +02:00
#include "Graphics/RenderTarget.h"
#include "Metal/MTLRenderPass.hpp"
2024-04-10 08:43:56 +02:00
#include "Texture.h"
2024-04-09 16:41:12 +02:00
using namespace Seele;
using namespace Seele::Metal;
2025-03-04 19:38:03 +09:00
RenderPass::RenderPass(PGraphics graphics, Gfx::RenderTargetLayout _layout, Array<Gfx::SubPassDependency> dependencies,
2024-08-26 21:49:09 +02:00
Gfx::PViewport viewport, const std::string& name)
2025-03-04 19:38:03 +09:00
: Gfx::RenderPass(std::move(_layout), dependencies), graphics(graphics), viewport(viewport), name(name) {
2024-08-28 17:54:14 +02:00
renderPass = MTL::RenderPassDescriptor::renderPassDescriptor();
renderPass->setRenderTargetArrayLength(1);
renderPass->setRenderTargetWidth(viewport->getWidth());
renderPass->setRenderTargetHeight(viewport->getHeight());
renderPass->setDefaultRasterSampleCount(viewport->getSamples());
2024-04-10 08:43:56 +02:00
2024-08-28 17:54:14 +02:00
for (size_t i = 0; i < layout.colorAttachments.size(); ++i) {
const auto& color = layout.colorAttachments[i];
MTL::RenderPassColorAttachmentDescriptor* desc = renderPass->colorAttachments()->object(i);
desc->setClearColor(MTL::ClearColor(color.clear.color.float32[0], color.clear.color.float32[1], color.clear.color.float32[2],
color.clear.color.float32[3]));
desc->setLoadAction(cast(color.getLoadOp()));
desc->setStoreAction(cast(color.getStoreOp()));
desc->setLevel(0);
if (!layout.resolveAttachments.empty()) {
const auto& resolve = layout.resolveAttachments[i];
desc->setResolveLevel(0);
2025-03-04 19:38:03 +09:00
// store multisampled attachment as well
if(color.getStoreOp() == Gfx::SE_ATTACHMENT_STORE_OP_STORE) {
desc->setStoreAction(MTL::StoreActionStoreAndMultisampleResolve);
} else {
desc->setStoreAction(MTL::StoreActionMultisampleResolve);
}
2024-08-28 17:54:14 +02:00
desc->setResolveTexture(resolve.getTexture().cast<TextureBase>()->getImage());
}
2024-04-10 08:43:56 +02:00
}
2024-08-28 17:54:14 +02:00
if (layout.depthAttachment.getTexture() != nullptr) {
auto depth = renderPass->depthAttachment();
depth->setClearDepth(layout.depthAttachment.clear.depthStencil.depth);
depth->setLoadAction(cast(layout.depthAttachment.getLoadOp()));
depth->setStoreAction(cast(layout.depthAttachment.getStoreOp()));
2024-04-18 13:33:35 +02:00
2024-08-28 17:54:14 +02:00
if (layout.depthResolveAttachment.getTexture() != nullptr) {
2025-03-04 19:38:03 +09:00
// store multisampled attachment as well
if(layout.depthAttachment.getStoreOp() == Gfx::SE_ATTACHMENT_STORE_OP_STORE) {
depth->setStoreAction(MTL::StoreActionStoreAndMultisampleResolve);
} else {
depth->setStoreAction(MTL::StoreActionMultisampleResolve);
}
2024-08-28 17:54:14 +02:00
depth->setResolveTexture(layout.depthResolveAttachment.getTexture().cast<TextureBase>()->getImage());
}
2024-04-10 08:43:56 +02:00
}
2024-08-28 17:54:14 +02:00
// TODO: stencil
2024-04-09 16:41:12 +02:00
}
2024-04-18 13:33:35 +02:00
RenderPass::~RenderPass() {}
void RenderPass::updateRenderPass() {
2024-08-28 17:54:14 +02:00
for (size_t i = 0; i < layout.colorAttachments.size(); ++i) {
const auto& color = layout.colorAttachments[i];
auto desc = renderPass->colorAttachments()->object(i);
desc->setTexture(color.getTexture().cast<TextureBase>()->getImage());
}
if (layout.depthAttachment.getTexture() != nullptr) {
auto depth = renderPass->depthAttachment();
depth->setTexture(layout.depthAttachment.getTexture().cast<TextureBase>()->getImage());
}
2025-03-04 19:38:03 +09:00
}