@@ -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;
0 commit comments