diff options
| author | Simon Kallweit <simon.kallweit@gmail.com> | 2024-05-27 06:03:13 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-27 15:03:13 +0200 |
| commit | d9443d670ef8413971fe7c3f02368b60a7fc5904 (patch) | |
| tree | 001e763846b23814b0e4960991fc457d7b580a0f /tools/gfx/metal/metal-framebuffer.cpp | |
| parent | 4f1cbf6f4d561320b8e3c73b871cc95dd13c6207 (diff) | |
[gfx] metal backend skeleton (#4223)
* add metal-cpp submodule
* add metal-cpp cmake target
* gfx metal backend skeleton
* add premake support
* add foundation framework
* add metal-cpp include to premake
* update vs project file
---------
Co-authored-by: Simon Kallweit <skallweit@nvidia.com>
Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com>
Diffstat (limited to 'tools/gfx/metal/metal-framebuffer.cpp')
| -rw-r--r-- | tools/gfx/metal/metal-framebuffer.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/tools/gfx/metal/metal-framebuffer.cpp b/tools/gfx/metal/metal-framebuffer.cpp new file mode 100644 index 000000000..c676f44eb --- /dev/null +++ b/tools/gfx/metal/metal-framebuffer.cpp @@ -0,0 +1,75 @@ +// metal-framebuffer.cpp +#include "metal-framebuffer.h" +#include "metal-device.h" +#include "metal-resource-views.h" +#include "metal-helper-functions.h" + +namespace gfx +{ + +using namespace Slang; + +namespace metal +{ + +FramebufferLayoutImpl::~FramebufferLayoutImpl() +{ + //m_renderPass->release(); +} + +Result FramebufferLayoutImpl::init(DeviceImpl* renderer, 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_renderer = renderer; + m_desc = desc; + return SLANG_OK; +} + +FramebufferImpl::~FramebufferImpl() +{ +} + +Result FramebufferImpl::init(DeviceImpl* renderer, const IFramebuffer::Desc& desc) +{ + m_renderer = renderer; + 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) + { + // 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)); + } + + // Initialize depthstencil and render target views + depthStencilView = desc.depthStencilView; + + renderTargetViews.setCount(desc.renderTargetCount); + for (int i = 0; i < desc.renderTargetCount; ++i) + { + renderTargetViews[i] = desc.renderTargetViews[i]; + } + + return SLANG_OK; +} + +} // namespace metal +} // namespace gfx |
