diff options
| author | skallweitNV <64953474+skallweitNV@users.noreply.github.com> | 2024-06-10 18:12:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-10 18:12:01 +0200 |
| commit | 6857dd57549f01daa025f45221a693259e474958 (patch) | |
| tree | c6db90150ff093eea525e57c7e52c0cc1c970095 /tools/gfx/metal/metal-framebuffer.cpp | |
| parent | 0974463daf0982626cb2b8c8bb6f494f3e6c9e52 (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.cpp | 78 |
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; |
