yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
4.0 KiB165 linesraw
1// d3d12-resource.cpp
2#include "d3d12-resource.h"
3
4namespace gfx
5{
6using namespace Slang;
7
8/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D3D12BarrierSubmitter
9 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
10
11void D3D12BarrierSubmitter::_flush()
12{
13    assert(m_numBarriers > 0);
14
15    if (m_commandList)
16    {
17        m_commandList->ResourceBarrier(UINT(m_numBarriers), m_barriers);
18    }
19    m_numBarriers = 0;
20}
21
22D3D12_RESOURCE_BARRIER& D3D12BarrierSubmitter::_expandOne()
23{
24    _flush();
25    return m_barriers[m_numBarriers++];
26}
27
28void D3D12BarrierSubmitter::transition(
29    ID3D12Resource* resource,
30    D3D12_RESOURCE_STATES prevState,
31    D3D12_RESOURCE_STATES nextState)
32{
33    if (nextState != prevState)
34    {
35        D3D12_RESOURCE_BARRIER& barrier = expandOne();
36
37        const UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
38        const D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
39
40        ::memset(&barrier, 0, sizeof(barrier));
41        barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
42        barrier.Flags = flags;
43        barrier.Transition.pResource = resource;
44        barrier.Transition.StateBefore = prevState;
45        barrier.Transition.StateAfter = nextState;
46        barrier.Transition.Subresource = subresource;
47    }
48    else
49    {
50        if (nextState == D3D12_RESOURCE_STATE_UNORDERED_ACCESS)
51        {
52            D3D12_RESOURCE_BARRIER& barrier = expandOne();
53
54            ::memset(&barrier, 0, sizeof(barrier));
55            barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
56            barrier.UAV.pResource = resource;
57        }
58    }
59}
60
61/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D3D12ResourceBase
62 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
63
64/* static */ DXGI_FORMAT
65D3D12ResourceBase::calcFormat(D3DUtil::UsageType usage, ID3D12Resource* resource)
66{
67    return resource ? D3DUtil::calcFormat(usage, resource->GetDesc().Format) : DXGI_FORMAT_UNKNOWN;
68}
69
70void D3D12ResourceBase::transition(
71    D3D12_RESOURCE_STATES oldState,
72    D3D12_RESOURCE_STATES nextState,
73    D3D12BarrierSubmitter& submitter)
74{
75    // Transition only if there is a resource
76    if (m_resource && oldState != nextState)
77    {
78        submitter.transition(m_resource, oldState, nextState);
79    }
80}
81
82/* !!!!!!!!!!!!!!!!!!!!!!!!! D3D12Resource !!!!!!!!!!!!!!!!!!!!!!!! */
83
84/* static */ void D3D12Resource::setDebugName(ID3D12Resource* resource, const char* name)
85{
86    if (resource)
87    {
88        resource->SetName(String(name).toWString().begin());
89    }
90}
91
92void D3D12Resource::setDebugName(const char* name)
93{
94    setDebugName(m_resource, name);
95}
96
97void D3D12Resource::setDebugName(const wchar_t* name)
98{
99    if (m_resource)
100    {
101        m_resource->SetName(name);
102    }
103}
104
105void D3D12Resource::setResource(ID3D12Resource* resource)
106{
107    if (resource != m_resource)
108    {
109        if (resource)
110        {
111            resource->AddRef();
112        }
113        if (m_resource)
114        {
115            m_resource->Release();
116        }
117        m_resource = resource;
118    }
119}
120
121void D3D12Resource::setResourceNull()
122{
123    if (m_resource)
124    {
125        m_resource->Release();
126        m_resource = nullptr;
127    }
128}
129
130Result D3D12Resource::initCommitted(
131    ID3D12Device* device,
132    const D3D12_HEAP_PROPERTIES& heapProps,
133    D3D12_HEAP_FLAGS heapFlags,
134    const D3D12_RESOURCE_DESC& resourceDesc,
135    D3D12_RESOURCE_STATES initState,
136    const D3D12_CLEAR_VALUE* clearValue)
137{
138    setResourceNull();
139    ComPtr<ID3D12Resource> resource;
140    SLANG_RETURN_ON_FAIL(device->CreateCommittedResource(
141        &heapProps,
142        heapFlags,
143        &resourceDesc,
144        initState,
145        clearValue,
146        IID_PPV_ARGS(resource.writeRef())));
147    setResource(resource);
148    return SLANG_OK;
149}
150
151ID3D12Resource* D3D12Resource::detach()
152{
153    ID3D12Resource* resource = m_resource;
154    m_resource = nullptr;
155    return resource;
156}
157
158void D3D12Resource::swap(ComPtr<ID3D12Resource>& resourceInOut)
159{
160    ID3D12Resource* tmp = m_resource;
161    m_resource = resourceInOut.detach();
162    resourceInOut.attach(tmp);
163}
164
165} // namespace gfx