Skip to content

Commit c74db28

Browse files
Merge pull request #26 from batuhanbozyel/GLEAM-41-Move-legacy-d3d12-barriers-to-enhanced-barrier-api
Gleam 41 move legacy d3d12 barriers to enhanced barrier api
2 parents b118e32 + 872f4e4 commit c74db28

23 files changed

Lines changed: 504 additions & 189 deletions

Engine/Source/Runtime/src/Core/Application.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ void Application::Run()
5252
auto world = worldManager->GetActiveWorld();
5353
world->Update();
5454

55+
renderSystem->PreRender(world);
5556
renderSystem->Render(world);
5657
}
5758
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#pragma once
2+
#include "Core/EngineDefines.h"
3+
#include "Container/Array.h"
4+
5+
namespace Gleam {
6+
7+
enum class BarrierStage
8+
{
9+
None,
10+
All,
11+
AllShading,
12+
NonFragmentShading,
13+
VertexShading,
14+
FragmentShading,
15+
ComputeShading,
16+
RenderTarget,
17+
DepthStencil,
18+
Copy
19+
};
20+
21+
enum class BarrierAccess
22+
{
23+
None,
24+
Common,
25+
RenderTarget,
26+
ShaderResource,
27+
UnorderedAccess,
28+
DepthStencilRead,
29+
DepthStencilWrite,
30+
CopySource,
31+
CopyDest
32+
};
33+
34+
enum class BarrierLayout
35+
{
36+
Undefined,
37+
Common,
38+
RenderTarget,
39+
ShaderResource,
40+
UnorderedAccess,
41+
DepthStencilRead,
42+
DepthStencilWrite,
43+
CopySource,
44+
CopyDest
45+
};
46+
47+
struct BufferBarrier
48+
{
49+
NativeGraphicsHandle resource = nullptr;
50+
BarrierStage srcStage = BarrierStage::None;
51+
BarrierStage dstStage = BarrierStage::None;
52+
BarrierAccess srcAccess = BarrierAccess::None;
53+
BarrierAccess dstAccess = BarrierAccess::None;
54+
};
55+
56+
struct TextureBarrier
57+
{
58+
NativeGraphicsHandle resource = nullptr;
59+
BarrierStage srcStage = BarrierStage::None;
60+
BarrierStage dstStage = BarrierStage::None;
61+
BarrierAccess srcAccess = BarrierAccess::None;
62+
BarrierAccess dstAccess = BarrierAccess::None;
63+
BarrierLayout oldLayout = BarrierLayout::Undefined;
64+
BarrierLayout newLayout = BarrierLayout::Undefined;
65+
};
66+
67+
struct BarrierGroup
68+
{
69+
TArray<BufferBarrier> bufferBarriers;
70+
TArray<TextureBarrier> textureBarriers;
71+
};
72+
73+
} // namespace Gleam

Engine/Source/Runtime/src/Renderer/CommandBuffer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "Container/Pointer.h"
44

55
#include "Shader.h"
6+
#include "Barrier.h"
67
#include "Texture.h"
78
#include "Pipeline.h"
89
#include "ConstantBuffer.h"
@@ -81,6 +82,8 @@ class CommandBuffer final
8182

8283
void Blit(const Texture& source, const Texture& destination) const;
8384

85+
void Barrier(const BarrierGroup& barrier) const;
86+
8487
void Begin(const TStringView debugName) const;
8588

8689
void End() const;

Engine/Source/Runtime/src/Renderer/DirectX/DirectXCommandBuffer.cpp

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#ifdef USE_DIRECTX_RENDERER
44
#include "Renderer/CommandBuffer.h"
55

6-
#include "DirectXTransitionManager.h"
76
#include "DirectXDevice.h"
87
#include "DirectXUtils.h"
98

@@ -57,15 +56,12 @@ void CommandBuffer::BeginRenderPass(const RenderPassDescriptor& renderPassDesc,
5756

5857
auto resource = static_cast<ID3D12Resource*>(colorAttachmentDesc.texture.GetHandle());
5958
colorAttachments[i].cpuDescriptor = colorAttachmentDesc.texture.GetRenderTargetView();
60-
DirectXTransitionManager::TransitionLayout(mHandle->commandList,
61-
resource, D3D12_RESOURCE_STATE_RENDER_TARGET);
6259
}
6360

6461
if (renderPassDesc.depthAttachment.texture.IsValid())
6562
{
6663
auto format = renderPassDesc.depthAttachment.texture.GetDescriptor().format;
6764
auto resource = static_cast<ID3D12Resource*>(renderPassDesc.depthAttachment.texture.GetHandle());
68-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, resource, D3D12_RESOURCE_STATE_DEPTH_WRITE);
6965

7066
D3D12_RENDER_PASS_DEPTH_STENCIL_DESC depthAttachment{};
7167
depthAttachment.cpuDescriptor = renderPassDesc.depthAttachment.texture.GetRenderTargetView();
@@ -171,14 +167,7 @@ void CommandBuffer::CopyBuffer(const NativeGraphicsHandle src, const NativeGraph
171167
{
172168
auto srcBuffer = static_cast<ID3D12Resource*>(src);
173169
auto dstBuffer = static_cast<ID3D12Resource*>(dst);
174-
175-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, dstBuffer, D3D12_RESOURCE_STATE_COPY_DEST);
176-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, srcBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE);
177-
178170
mHandle->commandList->CopyBufferRegion(dstBuffer, dstOffset, srcBuffer, srcOffset, size);
179-
180-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, srcBuffer, D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE);
181-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, dstBuffer, D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE);
182171
}
183172

184173
void CommandBuffer::Blit(const Texture& source, const Texture& destination) const
@@ -187,9 +176,6 @@ void CommandBuffer::Blit(const Texture& source, const Texture& destination) cons
187176
auto srcTexture = static_cast<ID3D12Resource*>(source.GetHandle());
188177
auto dstTexture = static_cast<ID3D12Resource*>(destination.GetHandle());
189178

190-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, dstTexture, D3D12_RESOURCE_STATE_COPY_DEST);
191-
DirectXTransitionManager::TransitionLayout(mHandle->commandList, srcTexture, D3D12_RESOURCE_STATE_COPY_SOURCE);
192-
193179
D3D12_TEXTURE_COPY_LOCATION dst{};
194180
dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
195181
dst.pResource = dstTexture;
@@ -202,6 +188,68 @@ void CommandBuffer::Blit(const Texture& source, const Texture& destination) cons
202188
mHandle->commandList->CopyTextureRegion(&dst, 0, 0, 0, &src, nullptr);
203189
}
204190

191+
void CommandBuffer::Barrier(const BarrierGroup& barrier) const
192+
{
193+
TArray<D3D12_BUFFER_BARRIER> d3d12BufferBarriers;
194+
TArray<D3D12_TEXTURE_BARRIER> d3d12TextureBarriers;
195+
196+
d3d12BufferBarriers.reserve(barrier.bufferBarriers.size());
197+
d3d12TextureBarriers.reserve(barrier.textureBarriers.size());
198+
199+
for (const BufferBarrier& bufferBarrier : barrier.bufferBarriers)
200+
{
201+
D3D12_BUFFER_BARRIER d3d12Barrier = {};
202+
d3d12Barrier.SyncBefore = BarrierStageToD3D12_BARRIER_SYNC(bufferBarrier.srcStage);
203+
d3d12Barrier.SyncAfter = BarrierStageToD3D12_BARRIER_SYNC(bufferBarrier.dstStage);
204+
d3d12Barrier.AccessBefore = BarrierAccessToD3D12_BARRIER_ACCESS(bufferBarrier.srcAccess);
205+
d3d12Barrier.AccessAfter = BarrierAccessToD3D12_BARRIER_ACCESS(bufferBarrier.dstAccess);
206+
d3d12Barrier.pResource = static_cast<ID3D12Resource*>(bufferBarrier.resource);
207+
d3d12Barrier.Offset = 0;
208+
d3d12Barrier.Size = UINT64_MAX;
209+
d3d12BufferBarriers.emplace_back(d3d12Barrier);
210+
}
211+
212+
for (const TextureBarrier& textureBarrier : barrier.textureBarriers)
213+
{
214+
D3D12_TEXTURE_BARRIER d3d12Barrier = {};
215+
d3d12Barrier.SyncBefore = BarrierStageToD3D12_BARRIER_SYNC(textureBarrier.srcStage);
216+
d3d12Barrier.SyncAfter = BarrierStageToD3D12_BARRIER_SYNC(textureBarrier.dstStage);
217+
d3d12Barrier.AccessBefore = BarrierAccessToD3D12_BARRIER_ACCESS(textureBarrier.srcAccess);
218+
d3d12Barrier.AccessAfter = BarrierAccessToD3D12_BARRIER_ACCESS(textureBarrier.dstAccess);
219+
d3d12Barrier.LayoutBefore = BarrierLayoutToD3D12_BARRIER_LAYOUT(textureBarrier.oldLayout);
220+
d3d12Barrier.LayoutAfter = BarrierLayoutToD3D12_BARRIER_LAYOUT(textureBarrier.newLayout);
221+
d3d12Barrier.pResource = static_cast<ID3D12Resource*>(textureBarrier.resource);
222+
d3d12Barrier.Subresources.IndexOrFirstMipLevel = 0xffffffff;
223+
d3d12Barrier.Subresources.NumMipLevels = 0;
224+
d3d12Barrier.Subresources.FirstArraySlice = 0;
225+
d3d12Barrier.Subresources.NumArraySlices = 0;
226+
d3d12Barrier.Subresources.FirstPlane = 0;
227+
d3d12Barrier.Subresources.NumPlanes = 0;
228+
d3d12Barrier.Flags = D3D12_TEXTURE_BARRIER_FLAG_NONE;
229+
d3d12TextureBarriers.emplace_back(d3d12Barrier);
230+
}
231+
232+
TArray<D3D12_BARRIER_GROUP> barrierGroups;
233+
if (not d3d12BufferBarriers.empty())
234+
{
235+
D3D12_BARRIER_GROUP bufferGroup = {};
236+
bufferGroup.Type = D3D12_BARRIER_TYPE_BUFFER;
237+
bufferGroup.NumBarriers = static_cast<UINT32>(d3d12BufferBarriers.size());
238+
bufferGroup.pBufferBarriers = d3d12BufferBarriers.data();
239+
barrierGroups.emplace_back(bufferGroup);
240+
}
241+
242+
if (not d3d12TextureBarriers.empty())
243+
{
244+
D3D12_BARRIER_GROUP textureGroup = {};
245+
textureGroup.Type = D3D12_BARRIER_TYPE_TEXTURE;
246+
textureGroup.NumBarriers = static_cast<UINT32>(d3d12TextureBarriers.size());
247+
textureGroup.pTextureBarriers = d3d12TextureBarriers.data();
248+
barrierGroups.emplace_back(textureGroup);
249+
}
250+
mHandle->commandList->Barrier(static_cast<UINT32>(barrierGroups.size()), barrierGroups.data());
251+
}
252+
205253
void CommandBuffer::Begin(const TStringView debugName) const
206254
{
207255
TWString debugNameW = StringUtils::Convert(debugName);

Engine/Source/Runtime/src/Renderer/DirectX/DirectXDevice.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include "DirectXDevice.h"
55
#include "DirectXUtils.h"
66
#include "DirectXSwapchain.h"
7-
#include "DirectXTransitionManager.h"
87

98
#include "Core/Engine.h"
109
#include "Core/Globals.h"
@@ -177,18 +176,15 @@ Texture GraphicsDevice::CreateTexture(const TextureDescriptor& descriptor)
177176
Texture texture(descriptor);
178177

179178
D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE;
180-
D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE;
181179
if (descriptor.usage & TextureUsage_Attachment)
182180
{
183181
if (Utils::IsColorFormat(descriptor.format))
184182
{
185183
flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
186-
initialState = D3D12_RESOURCE_STATE_RENDER_TARGET;
187184
}
188185
else
189186
{
190187
flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
191-
initialState = D3D12_RESOURCE_STATE_DEPTH_WRITE;
192188
}
193189
}
194190

@@ -197,7 +193,7 @@ Texture GraphicsDevice::CreateTexture(const TextureDescriptor& descriptor)
197193
flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
198194
}
199195

200-
D3D12_RESOURCE_DESC resourceDesc = {
196+
D3D12_RESOURCE_DESC1 resourceDesc = {
201197
.Dimension = TextureDimensionToD3D12_RESOURCE_DIMENSION(descriptor.dimension),
202198
.Alignment = 0,
203199
.Width = (UINT64)descriptor.size.width,
@@ -219,17 +215,19 @@ Texture GraphicsDevice::CreateTexture(const TextureDescriptor& descriptor)
219215
};
220216

221217
// TODO: Create MSAA texture
222-
DX_CHECK(static_cast<ID3D12Device10*>(mHandle)->CreateCommittedResource(
218+
DX_CHECK(static_cast<ID3D12Device10*>(mHandle)->CreateCommittedResource3(
223219
&heapProperties,
224220
D3D12_HEAP_FLAG_NONE,
225221
&resourceDesc,
226-
initialState,
222+
D3D12_BARRIER_LAYOUT_COMMON,
223+
nullptr,
224+
nullptr,
225+
0,
227226
nullptr,
228227
__uuidof(ID3D12Resource*),
229228
&texture.mHandle
230229
));
231230
static_cast<ID3D12Resource*>(texture.mHandle)->SetName(StringUtils::Convert(descriptor.name).c_str());
232-
DirectXTransitionManager::SetLayout(static_cast<ID3D12Resource*>(texture.mHandle), initialState);
233231

234232
// Create RTV or DSV for attachments
235233
if (descriptor.usage & TextureUsage_Attachment)
@@ -395,7 +393,6 @@ void GraphicsDevice::Dispose(Heap& heap)
395393

396394
void GraphicsDevice::Dispose(Texture& texture)
397395
{
398-
DirectXTransitionManager::RemoveResource(static_cast<ID3D12Resource*>(texture.mHandle));
399396
if (texture.GetDescriptor().usage & TextureUsage_Attachment)
400397
{
401398
if (Utils::IsDepthFormat(texture.GetDescriptor().format))

Engine/Source/Runtime/src/Renderer/DirectX/DirectXHeap.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "Renderer/Heap.h"
55
#include "Renderer/Buffer.h"
66

7-
#include "DirectXTransitionManager.h"
7+
#include "DirectXDevice.h"
88
#include "DirectXUtils.h"
99

1010
using namespace Gleam;
@@ -21,14 +21,13 @@ Buffer Heap::Allocate(const BufferDescriptor& descriptor)
2121
}
2222
mStackPtr = newStackPtr;
2323

24-
auto initialState = D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE;
2524
auto flags = D3D12_RESOURCE_FLAG_NONE;
2625
if (mDescriptor.memoryType != MemoryType::CPU)
2726
{
2827
flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
2928
}
3029

31-
D3D12_RESOURCE_DESC resourceDesc = {
30+
D3D12_RESOURCE_DESC1 resourceDesc = {
3231
.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER,
3332
.Alignment = mAlignment,
3433
.Width = descriptor.size,
@@ -42,11 +41,13 @@ Buffer Heap::Allocate(const BufferDescriptor& descriptor)
4241
};
4342

4443
ID3D12Resource* resource = nullptr;
45-
DX_CHECK(static_cast<ID3D12Device10*>(mDevice->GetHandle())->CreatePlacedResource(
44+
DX_CHECK(static_cast<ID3D12Device10*>(mDevice->GetHandle())->CreatePlacedResource2(
4645
static_cast<ID3D12Heap*>(mHandle),
4746
alignedStackPtr,
4847
&resourceDesc,
49-
initialState,
48+
D3D12_BARRIER_LAYOUT_UNDEFINED,
49+
nullptr,
50+
0,
5051
nullptr,
5152
IID_PPV_ARGS(&resource)
5253
));
@@ -56,7 +57,6 @@ Buffer Heap::Allocate(const BufferDescriptor& descriptor)
5657
TWString resourceName = ss.str();
5758

5859
resource->SetName(resourceName.c_str());
59-
DirectXTransitionManager::SetLayout(resource, initialState);
6060

6161
void* contents = nullptr;
6262
if (mDescriptor.memoryType != MemoryType::GPU)
@@ -73,7 +73,6 @@ Buffer Heap::Allocate(const BufferDescriptor& descriptor)
7373

7474
void Heap::Free(Buffer& buffer)
7575
{
76-
DirectXTransitionManager::RemoveResource(static_cast<ID3D12Resource*>(buffer.mHandle));
7776
static_cast<DirectXDevice*>(mDevice)->ReleaseResourceView(buffer.mResourceView);
7877
static_cast<ID3D12Resource*>(buffer.mHandle)->Release();
7978
buffer.mResourceView = InvalidResourceIndex;

Engine/Source/Runtime/src/Renderer/DirectX/DirectXSwapchain.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include "DirectXSwapchain.h"
55
#include "DirectXDevice.h"
66
#include "DirectXUtils.h"
7-
#include "DirectXTransitionManager.h"
87

98
#include "Core/Engine.h"
109
#include "Core/Globals.h"
@@ -161,11 +160,32 @@ const Texture& DirectXSwapchain::AcquireNextDrawable()
161160
void DirectXSwapchain::Present(const CommandBuffer* cmd)
162161
{
163162
auto& ctx = mContext[mCurrentFrameIndex];
164-
DirectXTransitionManager::TransitionLayout(
165-
static_cast<ID3D12GraphicsCommandList7*>(cmd->GetHandle()),
166-
static_cast<ID3D12Resource*>(mTextures[mCurrentFrameIndex].GetHandle()), D3D12_RESOURCE_STATE_PRESENT
167-
);
163+
D3D12_TEXTURE_BARRIER textureBarrier = {
164+
.SyncBefore = D3D12_BARRIER_SYNC_RENDER_TARGET,
165+
.SyncAfter = D3D12_BARRIER_SYNC_NONE,
166+
.AccessBefore = D3D12_BARRIER_ACCESS_RENDER_TARGET,
167+
.AccessAfter = D3D12_BARRIER_ACCESS_NO_ACCESS,
168+
.LayoutBefore = D3D12_BARRIER_LAYOUT_RENDER_TARGET,
169+
.LayoutAfter = D3D12_BARRIER_LAYOUT_PRESENT,
170+
.pResource = static_cast<ID3D12Resource*>(mTextures[mCurrentFrameIndex].GetHandle()),
171+
.Subresources = {
172+
.IndexOrFirstMipLevel = 0xffffffff,
173+
.NumMipLevels = 0,
174+
.FirstArraySlice = 0,
175+
.NumArraySlices = 0,
176+
.FirstPlane = 0,
177+
.NumPlanes = 0
178+
},
179+
.Flags = D3D12_TEXTURE_BARRIER_FLAG_NONE
180+
};
168181

182+
D3D12_BARRIER_GROUP barrier = {
183+
.Type = D3D12_BARRIER_TYPE_TEXTURE,
184+
.NumBarriers = 1,
185+
.pTextureBarriers = &textureBarrier
186+
};
187+
static_cast<ID3D12GraphicsCommandList7*>(cmd->GetHandle())->Barrier(1, &barrier);
188+
169189
cmd->End();
170190
cmd->Commit();
171191

@@ -197,7 +217,6 @@ Texture DirectXSwapchain::CreateSwapchainBuffer(GraphicsDevice* device, uint32_t
197217

198218
DX_CHECK(mHandle->GetBuffer(buffer, IID_PPV_ARGS(&texture)));
199219
static_cast<ID3D12Device10*>(device->GetHandle())->CreateRenderTargetView(texture, &rtvDesc, rtv);
200-
DirectXTransitionManager::SetLayout(texture, D3D12_RESOURCE_STATE_PRESENT);
201220

202221
TStringStream ss;
203222
ss << "Swapchain::Drawable_" << buffer;

0 commit comments

Comments
 (0)