Skip to content

Commit 7516d9b

Browse files
authored
Add resolve region capability and lower D3D12GraphicsCommandList version required. (#77)
* Add resolve region capability and lower D3D12GraphicsCommandList version required. * Add V9 check.
1 parent 5e77265 commit 7516d9b

File tree

5 files changed

+38
-15
lines changed

5 files changed

+38
-15
lines changed

plume_d3d12.cpp

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,6 +1854,14 @@ namespace plume {
18541854
return;
18551855
}
18561856

1857+
// Attempt to query the interfaces available for this command list.
1858+
d3d->QueryInterface(IID_PPV_ARGS(&d3dV1));
1859+
d3d->QueryInterface(IID_PPV_ARGS(&d3dV4));
1860+
1861+
# ifdef PLUME_D3D12_AGILITY_SDK_ENABLED
1862+
d3d->QueryInterface(IID_PPV_ARGS(&d3dV9));
1863+
# endif
1864+
18571865
d3d->Close();
18581866
}
18591867

@@ -1977,10 +1985,12 @@ namespace plume {
19771985
}
19781986

19791987
void D3D12CommandList::traceRays(uint32_t width, uint32_t height, uint32_t depth, RenderBufferReference shaderBindingTable, const RenderShaderBindingGroupsInfo &shaderBindingGroupsInfo) {
1988+
assert(d3dV4 != nullptr);
1989+
assert(activeComputePipelineLayout != nullptr); // Ray tracing uses compute layout
1990+
19801991
const D3D12Buffer *interfaceBuffer = static_cast<const D3D12Buffer *>(shaderBindingTable.ref);
19811992
assert(interfaceBuffer != nullptr);
19821993
assert((interfaceBuffer->desc.flags & RenderBufferFlag::SHADER_BINDING_TABLE) && "Buffer must allow being used as a shader binding table.");
1983-
assert(activeComputePipelineLayout != nullptr); // Ray tracing uses compute layout
19841994

19851995
D3D12_GPU_VIRTUAL_ADDRESS tableAddress = interfaceBuffer->d3d->GetGPUVirtualAddress() + shaderBindingTable.offset;
19861996
const RenderShaderBindingGroupInfo &rayGen = shaderBindingGroupsInfo.rayGen;
@@ -2002,7 +2012,7 @@ namespace plume {
20022012
desc.Width = width;
20032013
desc.Height = height;
20042014
desc.Depth = depth;
2005-
d3d->DispatchRays(&desc);
2015+
d3dV4->DispatchRays(&desc);
20062016
}
20072017

20082018
void D3D12CommandList::drawInstanced(uint32_t vertexCountPerInstance, uint32_t instanceCount, uint32_t startVertexLocation, uint32_t startInstanceLocation) {
@@ -2040,8 +2050,9 @@ namespace plume {
20402050
break;
20412051
}
20422052
case D3D12Pipeline::Type::Raytracing: {
2053+
assert(d3dV4 != nullptr);
20432054
const D3D12RaytracingPipeline *raytracingPipeline = static_cast<const D3D12RaytracingPipeline *>(interfacePipeline);
2044-
d3d->SetPipelineState1(raytracingPipeline->stateObject);
2055+
d3dV4->SetPipelineState1(raytracingPipeline->stateObject);
20452056
break;
20462057
}
20472058
default:
@@ -2228,8 +2239,9 @@ namespace plume {
22282239

22292240
void D3D12CommandList::setDepthBias(float depthBias, float depthBiasClamp, float slopeScaledDepthBias) {
22302241
# ifdef PLUME_D3D12_AGILITY_SDK_ENABLED
2242+
assert(d3dV9 != nullptr);
22312243
assert(queue->device->capabilities.dynamicDepthBias && "Dynamic depth bias is unsupported on this device.");
2232-
d3d->RSSetDepthBias(depthBias, depthBiasClamp, slopeScaledDepthBias);
2244+
d3dV9->RSSetDepthBias(depthBias, depthBiasClamp, slopeScaledDepthBias);
22332245
# else
22342246
assert(false && "Dynamic depth bias is unsupported without the Agility SDK.");
22352247
# endif
@@ -2337,6 +2349,7 @@ namespace plume {
23372349
}
23382350

23392351
void D3D12CommandList::resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) {
2352+
assert(d3dV1 != nullptr);
23402353
assert(dstTexture != nullptr);
23412354
assert(srcTexture != nullptr);
23422355

@@ -2351,11 +2364,12 @@ namespace plume {
23512364
}
23522365

23532366
setSamplePositions(interfaceDstTexture);
2354-
d3d->ResolveSubresourceRegion(interfaceDstTexture->d3d, 0, dstX, dstY, interfaceSrcTexture->d3d, 0, (srcRect != nullptr) ? &rect : nullptr, toDXGI(interfaceDstTexture->desc.format), toD3D12(resolveMode));
2367+
d3dV1->ResolveSubresourceRegion(interfaceDstTexture->d3d, 0, dstX, dstY, interfaceSrcTexture->d3d, 0, (srcRect != nullptr) ? &rect : nullptr, toDXGI(interfaceDstTexture->desc.format), toD3D12(resolveMode));
23552368
resetSamplePositions();
23562369
}
23572370

23582371
void D3D12CommandList::buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) {
2372+
assert(d3dV4 != nullptr);
23592373
assert(dstAccelerationStructure != nullptr);
23602374
assert(scratchBuffer.ref != nullptr);
23612375

@@ -2374,10 +2388,11 @@ namespace plume {
23742388
buildDesc.DestAccelerationStructureData = interfaceAccelerationStructure->buffer->d3d->GetGPUVirtualAddress() + interfaceAccelerationStructure->offset;
23752389
buildDesc.ScratchAccelerationStructureData = interfaceScratchBuffer->d3d->GetGPUVirtualAddress() + scratchBuffer.offset;
23762390

2377-
d3d->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
2391+
d3dV4->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
23782392
}
23792393

23802394
void D3D12CommandList::buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) {
2395+
assert(d3dV4 != nullptr);
23812396
assert(dstAccelerationStructure != nullptr);
23822397
assert(scratchBuffer.ref != nullptr);
23832398
assert(instancesBuffer.ref != nullptr);
@@ -2400,7 +2415,7 @@ namespace plume {
24002415
buildDesc.DestAccelerationStructureData = interfaceAccelerationStructure->buffer->d3d->GetGPUVirtualAddress() + interfaceAccelerationStructure->offset;
24012416
buildDesc.ScratchAccelerationStructureData = interfaceScratchBuffer->d3d->GetGPUVirtualAddress() + scratchBuffer.offset;
24022417

2403-
d3d->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
2418+
d3dV4->BuildRaytracingAccelerationStructure(&buildDesc, 0, nullptr);
24042419
}
24052420

24062421
void D3D12CommandList::discardTexture(const RenderTexture* texture) {
@@ -2470,6 +2485,7 @@ namespace plume {
24702485

24712486
const D3D12Texture *interfaceTexture = static_cast<const D3D12Texture *>(texture);
24722487
if (interfaceTexture->desc.multisampling.sampleLocationsEnabled) {
2488+
assert(d3dV1 != nullptr);
24732489
thread_local std::vector<D3D12_SAMPLE_POSITION> samplePositions;
24742490
samplePositions.resize(interfaceTexture->desc.multisampling.sampleCount);
24752491
for (uint32_t i = 0; i < interfaceTexture->desc.multisampling.sampleCount; i++) {
@@ -2478,7 +2494,7 @@ namespace plume {
24782494
samplePositions[i].Y = location.y;
24792495
}
24802496

2481-
d3d->SetSamplePositions(uint32_t(samplePositions.size()), 1, samplePositions.data());
2497+
d3dV1->SetSamplePositions(uint32_t(samplePositions.size()), 1, samplePositions.data());
24822498
activeSamplePositions = true;
24832499
}
24842500
else {
@@ -2488,7 +2504,8 @@ namespace plume {
24882504

24892505
void D3D12CommandList::resetSamplePositions() {
24902506
if (activeSamplePositions) {
2491-
d3d->SetSamplePositions(0, 0, nullptr);
2507+
assert(d3dV1 != nullptr);
2508+
d3dV1->SetSamplePositions(0, 0, nullptr);
24922509
activeSamplePositions = false;
24932510
targetFramebufferSamplePositionsSet = false;
24942511
}
@@ -3670,10 +3687,12 @@ namespace plume {
36703687
}
36713688

36723689
// Determine if the device supports sample locations.
3690+
bool resolveRegionOption = false;
36733691
bool samplePositionsOption = false;
36743692
D3D12_FEATURE_DATA_D3D12_OPTIONS2 d3d12Options2 = {};
36753693
res = deviceOption->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2, &d3d12Options2, sizeof(d3d12Options2));
36763694
if (SUCCEEDED(res)) {
3695+
resolveRegionOption = true;
36773696
samplePositionsOption = d3d12Options2.ProgrammableSamplePositionsTier >= D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_1;
36783697
}
36793698

@@ -3738,8 +3757,8 @@ namespace plume {
37383757
capabilities.raytracing = rtSupportOption;
37393758
capabilities.raytracingStateUpdate = rtStateUpdateSupportOption;
37403759
capabilities.sampleLocations = samplePositionsOption;
3741-
// Resolve modes require sample positions support.
3742-
capabilities.resolveModes = samplePositionsOption;
3760+
capabilities.resolveRegion = resolveRegionOption;
3761+
capabilities.resolveModes = samplePositionsOption; // Resolve modes require sample positions support.
37433762
capabilities.triangleFan = triangleFanSupportOption;
37443763
capabilities.dynamicDepthBias = dynamicDepthBiasOption;
37453764
capabilities.uma = uma;

plume_d3d12.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,11 @@ namespace plume {
169169
};
170170

171171
struct D3D12CommandList : RenderCommandList {
172+
ID3D12GraphicsCommandList *d3d = nullptr;
173+
ID3D12GraphicsCommandList1 *d3dV1 = nullptr;
174+
ID3D12GraphicsCommandList4 *d3dV4 = nullptr;
172175
# ifdef PLUME_D3D12_AGILITY_SDK_ENABLED
173-
ID3D12GraphicsCommandList9 *d3d = nullptr;
174-
# else
175-
ID3D12GraphicsCommandList7 *d3d = nullptr;
176+
ID3D12GraphicsCommandList9 *d3dV9 = nullptr;
176177
# endif
177178
ID3D12CommandAllocator *commandAllocator = nullptr;
178179
D3D12CommandQueue *queue = nullptr;

plume_metal.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3811,6 +3811,7 @@ namespace plume {
38113811
// capabilities.raytracing = mtl->supportsRaytracing();
38123812
capabilities.maxTextureSize = mtl->supportsFamily(MTL::GPUFamilyApple3) ? 16384 : 8192;
38133813
capabilities.sampleLocations = mtl->programmableSamplePositionsSupported();
3814+
capabilities.resolveRegion = true;
38143815
capabilities.resolveModes = false;
38153816
capabilities.scalarBlockLayout = true;
38163817
capabilities.presentWait = true;

plume_render_interface_types.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1752,7 +1752,8 @@ namespace plume {
17521752
// MSAA.
17531753
bool sampleLocations = false;
17541754

1755-
// Resolve Modes.
1755+
// Resolve.
1756+
bool resolveRegion = false;
17561757
bool resolveModes = false;
17571758

17581759
// Bindless resources.

plume_vulkan.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4108,6 +4108,7 @@ namespace plume {
41084108
capabilities.raytracing = rayTracingSupported;
41094109
capabilities.raytracingStateUpdate = false;
41104110
capabilities.sampleLocations = (sampleLocationProperties.sampleLocationSampleCounts != 0);
4111+
capabilities.resolveRegion = true;
41114112
capabilities.resolveModes = false;
41124113
capabilities.descriptorIndexing = descriptorIndexingSupported;
41134114
capabilities.scalarBlockLayout = scalarBlockLayoutSupported;

0 commit comments

Comments
 (0)