blob: c676f44eb8b6a0d8f1893e6a0f8d4e44dfa26a36 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
|