summaryrefslogtreecommitdiffstats
path: root/tools/gfx/metal/metal-framebuffer.cpp
diff options
context:
space:
mode:
authorskallweitNV <64953474+skallweitNV@users.noreply.github.com>2024-06-10 18:12:01 +0200
committerGitHub <noreply@github.com>2024-06-10 18:12:01 +0200
commit6857dd57549f01daa025f45221a693259e474958 (patch)
treec6db90150ff093eea525e57c7e52c0cc1c970095 /tools/gfx/metal/metal-framebuffer.cpp
parent0974463daf0982626cb2b8c8bb6f494f3e6c9e52 (diff)
[gfx] Metal graphics support (#4324)
* fix double semicolons * fix another double semicolon * wait for init data upload * remove obsolete setData * refactor swapchain to work on virtual back buffers * buffer/texture use breakable device reference * refactor input layout * create render command encoder * add todo * refactor framebuffer layout * refactor framebuffer * refactor shader program * translatePrimitiveType * add more translate functions * refactor framebuffer * refactor render pass * implement graphics pipeline state * add depth stencil state * initial render command encoder support * comment
Diffstat (limited to 'tools/gfx/metal/metal-framebuffer.cpp')
-rw-r--r--tools/gfx/metal/metal-framebuffer.cpp78
1 files changed, 37 insertions, 41 deletions
diff --git a/tools/gfx/metal/metal-framebuffer.cpp b/tools/gfx/metal/metal-framebuffer.cpp
index 46e60b2eb..76e944b4a 100644
--- a/tools/gfx/metal/metal-framebuffer.cpp
+++ b/tools/gfx/metal/metal-framebuffer.cpp
@@ -12,60 +12,56 @@ using namespace Slang;
namespace metal
{
-FramebufferLayoutImpl::~FramebufferLayoutImpl()
+Result FramebufferLayoutImpl::init(const IFramebufferLayout::Desc& desc)
{
- //m_renderPass->release();
-}
-
-Result FramebufferLayoutImpl::init(DeviceImpl* device, const IFramebufferLayout::Desc& desc)
-{
- // Metal doesn't have a notion of Framebuffers or FramebufferLayouts per se.
- // We simply stash the desc and use it when creating the (convenience) Framebuffer
- m_device = device;
- m_desc = desc;
+ for (Index i = 0; i < desc.renderTargetCount; ++i)
+ {
+ m_renderTargets.add(desc.renderTargets[i]);
+ }
+ if (desc.depthStencil)
+ {
+ m_depthStencil = *desc.depthStencil;
+ }
+ else
+ {
+ m_depthStencil = {};
+ }
return SLANG_OK;
}
-FramebufferImpl::~FramebufferImpl()
-{
-}
-
Result FramebufferImpl::init(DeviceImpl* device, const IFramebuffer::Desc& desc)
{
m_device = device;
m_layout = static_cast<FramebufferLayoutImpl*>(desc.layout);
- m_width = m_height = 1;
-
- TextureResourceViewImpl* dsv = static_cast<TextureResourceViewImpl*>(desc.depthStencilView);
-
- // Get frame dimensions from attachments.
- if (dsv)
+ m_renderTargetViews.setCount(desc.renderTargetCount);
+ for (Index i = 0; i < desc.renderTargetCount; ++i)
{
- // If we have a depth attachment, get frame size from there.
- auto size = dsv->m_texture->getDesc()->size;
- auto viewDesc = dsv->getViewDesc();
- m_width = Math::Max(1u, uint32_t(size.width >> viewDesc->subresourceRange.mipLevel));
- m_height = Math::Max(1u, uint32_t(size.height >> viewDesc->subresourceRange.mipLevel));
- }
- else if (desc.renderTargetCount > 0)
- {
- // If we don't have a depth attachment, then we must have at least
- // one color attachment. Get frame dimension from there.
- auto viewImpl = static_cast<TextureResourceViewImpl*>(desc.renderTargetViews[0]);
- auto resourceDesc = viewImpl->m_texture->getDesc();
- auto viewDesc = viewImpl->getViewDesc();
- auto size = resourceDesc->size;
- m_width = Math::Max(1u, uint32_t(size.width >> viewDesc->subresourceRange.mipLevel));
- m_height = Math::Max(1u, uint32_t(size.height >> viewDesc->subresourceRange.mipLevel));
+ m_renderTargetViews[i] = static_cast<TextureResourceViewImpl*>(desc.renderTargetViews[i]);
}
+ m_depthStencilView = static_cast<TextureResourceViewImpl*>(desc.depthStencilView);
+
+ // Determine framebuffer dimensions & sample count;
+ m_width = 1;
+ m_height = 1;
+ m_sampleCount = 1;
- // Initialize depthstencil and render target views
- depthStencilView = desc.depthStencilView;
+ auto visitView = [this](TextureResourceViewImpl* view)
+ {
+ const ITextureResource::Desc* textureDesc = view->m_texture->getDesc();
+ const IResourceView::Desc* viewDesc = view->getViewDesc();
+ m_width = Math::Max(1u, uint32_t(textureDesc->size.width >> viewDesc->subresourceRange.mipLevel));
+ m_height = Math::Max(1u, uint32_t(textureDesc->size.height >> viewDesc->subresourceRange.mipLevel));
+ m_sampleCount = Math::Max(m_sampleCount, uint32_t(textureDesc->sampleDesc.numSamples));
+ return SLANG_OK;
+ };
- renderTargetViews.setCount(desc.renderTargetCount);
- for (int i = 0; i < desc.renderTargetCount; ++i)
+ for (auto view : m_renderTargetViews)
+ {
+ visitView(view);
+ }
+ if (m_depthStencilView)
{
- renderTargetViews[i] = desc.renderTargetViews[i];
+ visitView(m_depthStencilView);
}
return SLANG_OK;