aboutsummaryrefslogtreecommitdiff
path: root/demo/d3d12/renderStateD3D12.cpp
blob: 28a69f478625dc982bbc5225142fbfa239d77ec5 (plain) (blame)
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
#include "renderStateD3D12.h"

namespace FlexSample {

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Dx12RenderStateManager !!!!!!!!!!!!!!!!!!!!!!!!!! */

int RenderStateManagerD3D12::initialize(AppGraphCtxD3D12* renderContext, size_t maxHeapAlloc)
{
	m_renderContext = renderContext;
	m_device = renderContext->m_device;
	
	m_fence.init(m_device);
	m_scopeManager.init(m_device, &m_fence);
	m_srvCbvUavDescriptorHeap.init(m_device, 256, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE);
	m_samplerDescriptorHeap.init(m_device, 64, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE);

	{
		NvCo::Dx12CircularResourceHeap::Desc desc;
		desc.init();
		desc.m_blockSize = maxHeapAlloc;
		m_constantHeap.init(m_device, desc, &m_fence);
	}

	return NV_OK;
}

void RenderStateManagerD3D12::updateCompleted()
{
	m_scopeManager.updateCompleted();
	m_constantHeap.updateCompleted();
}

void RenderStateManagerD3D12::onGpuWorkSubmitted(ID3D12CommandQueue* commandQueue)
{
	assert(commandQueue);
	if (!commandQueue)
	{
		printf("Must pass a ID3D12CommandQueue to onGpuWorkSubmitted");
		return;
	}

	const uint64_t signalValue = m_fence.nextSignal(commandQueue);
	
	m_scopeManager.addSync(signalValue);
	m_constantHeap.addSync(signalValue);
}

RenderStateD3D12 RenderStateManagerD3D12::getState()
{
	RenderStateD3D12 state;

	state.m_renderContext = m_renderContext;
	state.m_commandList = m_renderContext->m_commandList;
	state.m_device = m_device;

	state.m_constantHeap = &m_constantHeap;
	state.m_srvCbvUavDescriptorHeap = &m_srvCbvUavDescriptorHeap;
	state.m_fence = &m_fence;
	state.m_scopeManager = &m_scopeManager;
	state.m_samplerDescriptorHeap = &m_samplerDescriptorHeap;

	return state;
}


} // namespace FlexSample