yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
1.9 KiB75 linesraw
1// metal-framebuffer.cpp
2#include "metal-framebuffer.h"
3
4#include "metal-device.h"
5#include "metal-helper-functions.h"
6#include "metal-resource-views.h"
7
8namespace gfx
9{
10
11using namespace Slang;
12
13namespace metal
14{
15
16Result FramebufferLayoutImpl::init(const IFramebufferLayout::Desc& desc)
17{
18    for (Index i = 0; i < desc.renderTargetCount; ++i)
19    {
20        m_renderTargets.add(desc.renderTargets[i]);
21    }
22    if (desc.depthStencil)
23    {
24        m_depthStencil = *desc.depthStencil;
25    }
26    else
27    {
28        m_depthStencil = {};
29    }
30    return SLANG_OK;
31}
32
33Result FramebufferImpl::init(DeviceImpl* device, const IFramebuffer::Desc& desc)
34{
35    m_device = device;
36    m_layout = static_cast<FramebufferLayoutImpl*>(desc.layout);
37    m_renderTargetViews.setCount(desc.renderTargetCount);
38    for (Index i = 0; i < desc.renderTargetCount; ++i)
39    {
40        m_renderTargetViews[i] = static_cast<TextureResourceViewImpl*>(desc.renderTargetViews[i]);
41    }
42    m_depthStencilView = static_cast<TextureResourceViewImpl*>(desc.depthStencilView);
43
44    // Determine framebuffer dimensions & sample count;
45    m_width = 1;
46    m_height = 1;
47    m_sampleCount = 1;
48
49    auto visitView = [this](TextureResourceViewImpl* view)
50    {
51        const ITextureResource::Desc* textureDesc = view->m_texture->getDesc();
52        const IResourceView::Desc* viewDesc = view->getViewDesc();
53        m_width =
54            Math::Max(1u, uint32_t(textureDesc->size.width >> viewDesc->subresourceRange.mipLevel));
55        m_height = Math::Max(
56            1u,
57            uint32_t(textureDesc->size.height >> viewDesc->subresourceRange.mipLevel));
58        m_sampleCount = Math::Max(m_sampleCount, uint32_t(textureDesc->sampleDesc.numSamples));
59        return SLANG_OK;
60    };
61
62    for (auto view : m_renderTargetViews)
63    {
64        visitView(view);
65    }
66    if (m_depthStencilView)
67    {
68        visitView(m_depthStencilView);
69    }
70
71    return SLANG_OK;
72}
73
74} // namespace metal
75} // namespace gfx