D3D12: Remove ComPtr from D3D12 objects when possible.
Returning COM for getters needlessly refcounts which wastes CPU cycles in critial sections and floods PIX traces with [Add/Release]Ref. BUG=dawn:212 Change-Id: Ifa853f2d5f78a450fdb7ffb9492f0d08dfbcdd37 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21364 Commit-Queue: Bryan Bernhart <bryan.bernhart@intel.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
4084c94c43
commit
19b21c5b85
|
@ -741,8 +741,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
ComputePipeline* pipeline = ToBackend(cmd->pipeline).Get();
|
ComputePipeline* pipeline = ToBackend(cmd->pipeline).Get();
|
||||||
PipelineLayout* layout = ToBackend(pipeline->GetLayout());
|
PipelineLayout* layout = ToBackend(pipeline->GetLayout());
|
||||||
|
|
||||||
commandList->SetComputeRootSignature(layout->GetRootSignature().Get());
|
commandList->SetComputeRootSignature(layout->GetRootSignature());
|
||||||
commandList->SetPipelineState(pipeline->GetPipelineState().Get());
|
commandList->SetPipelineState(pipeline->GetPipelineState());
|
||||||
|
|
||||||
bindingTracker->OnSetPipeline(pipeline);
|
bindingTracker->OnSetPipeline(pipeline);
|
||||||
|
|
||||||
|
@ -1105,8 +1105,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
RenderPipeline* pipeline = ToBackend(cmd->pipeline).Get();
|
RenderPipeline* pipeline = ToBackend(cmd->pipeline).Get();
|
||||||
PipelineLayout* layout = ToBackend(pipeline->GetLayout());
|
PipelineLayout* layout = ToBackend(pipeline->GetLayout());
|
||||||
|
|
||||||
commandList->SetGraphicsRootSignature(layout->GetRootSignature().Get());
|
commandList->SetGraphicsRootSignature(layout->GetRootSignature());
|
||||||
commandList->SetPipelineState(pipeline->GetPipelineState().Get());
|
commandList->SetPipelineState(pipeline->GetPipelineState());
|
||||||
commandList->IASetPrimitiveTopology(pipeline->GetD3D12PrimitiveTopology());
|
commandList->IASetPrimitiveTopology(pipeline->GetD3D12PrimitiveTopology());
|
||||||
|
|
||||||
bindingTracker->OnSetPipeline(pipeline);
|
bindingTracker->OnSetPipeline(pipeline);
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12_COMPUTE_PIPELINE_STATE_DESC d3dDesc = {};
|
D3D12_COMPUTE_PIPELINE_STATE_DESC d3dDesc = {};
|
||||||
d3dDesc.pRootSignature = ToBackend(GetLayout())->GetRootSignature().Get();
|
d3dDesc.pRootSignature = ToBackend(GetLayout())->GetRootSignature();
|
||||||
d3dDesc.CS.pShaderBytecode = compiledShader->GetBufferPointer();
|
d3dDesc.CS.pShaderBytecode = compiledShader->GetBufferPointer();
|
||||||
d3dDesc.CS.BytecodeLength = compiledShader->GetBufferSize();
|
d3dDesc.CS.BytecodeLength = compiledShader->GetBufferSize();
|
||||||
|
|
||||||
|
@ -69,8 +69,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
ToBackend(GetDevice())->ReferenceUntilUnused(mPipelineState);
|
ToBackend(GetDevice())->ReferenceUntilUnused(mPipelineState);
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<ID3D12PipelineState> ComputePipeline::GetPipelineState() {
|
ID3D12PipelineState* ComputePipeline::GetPipelineState() const {
|
||||||
return mPipelineState;
|
return mPipelineState.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}} // namespace dawn_native::d3d12
|
}} // namespace dawn_native::d3d12
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
const ComputePipelineDescriptor* descriptor);
|
const ComputePipelineDescriptor* descriptor);
|
||||||
ComputePipeline() = delete;
|
ComputePipeline() = delete;
|
||||||
|
|
||||||
ComPtr<ID3D12PipelineState> GetPipelineState();
|
ID3D12PipelineState* GetPipelineState() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~ComputePipeline() override;
|
~ComputePipeline() override;
|
||||||
|
|
|
@ -32,15 +32,15 @@ namespace dawn_native { namespace d3d12 {
|
||||||
// ID3D12Pageable that was initially created as an ID3D12Heap (i.e. SubAllocation). If the
|
// ID3D12Pageable that was initially created as an ID3D12Heap (i.e. SubAllocation). If the
|
||||||
// ID3D12Pageable was initially created as an ID3D12Resource (i.e. DirectAllocation), then
|
// ID3D12Pageable was initially created as an ID3D12Resource (i.e. DirectAllocation), then
|
||||||
// use GetD3D12Pageable().
|
// use GetD3D12Pageable().
|
||||||
ComPtr<ID3D12Heap> Heap::GetD3D12Heap() const {
|
ID3D12Heap* Heap::GetD3D12Heap() const {
|
||||||
ComPtr<ID3D12Heap> heap;
|
ComPtr<ID3D12Heap> heap;
|
||||||
HRESULT result = mD3d12Pageable.As(&heap);
|
HRESULT result = mD3d12Pageable.As(&heap);
|
||||||
ASSERT(SUCCEEDED(result));
|
ASSERT(SUCCEEDED(result));
|
||||||
return heap;
|
return heap.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<ID3D12Pageable> Heap::GetD3D12Pageable() const {
|
ID3D12Pageable* Heap::GetD3D12Pageable() const {
|
||||||
return mD3d12Pageable;
|
return mD3d12Pageable.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
MemorySegment Heap::GetMemorySegment() const {
|
MemorySegment Heap::GetMemorySegment() const {
|
||||||
|
|
|
@ -35,8 +35,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
Heap(ComPtr<ID3D12Pageable> d3d12Pageable, MemorySegment memorySegment, uint64_t size);
|
Heap(ComPtr<ID3D12Pageable> d3d12Pageable, MemorySegment memorySegment, uint64_t size);
|
||||||
~Heap();
|
~Heap();
|
||||||
|
|
||||||
ComPtr<ID3D12Heap> GetD3D12Heap() const;
|
ID3D12Heap* GetD3D12Heap() const;
|
||||||
ComPtr<ID3D12Pageable> GetD3D12Pageable() const;
|
ID3D12Pageable* GetD3D12Pageable() const;
|
||||||
MemorySegment GetMemorySegment() const;
|
MemorySegment GetMemorySegment() const;
|
||||||
|
|
||||||
// We set mLastRecordingSerial to denote the serial this heap was last recorded to be used.
|
// We set mLastRecordingSerial to denote the serial this heap was last recorded to be used.
|
||||||
|
|
|
@ -186,8 +186,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
return mSamplerRootParameterInfo[group];
|
return mSamplerRootParameterInfo[group];
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<ID3D12RootSignature> PipelineLayout::GetRootSignature() const {
|
ID3D12RootSignature* PipelineLayout::GetRootSignature() const {
|
||||||
return mRootSignature;
|
return mRootSignature.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t PipelineLayout::GetDynamicRootParameterIndex(uint32_t group,
|
uint32_t PipelineLayout::GetDynamicRootParameterIndex(uint32_t group,
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
// Returns the index of the root parameter reserved for a dynamic buffer binding
|
// Returns the index of the root parameter reserved for a dynamic buffer binding
|
||||||
uint32_t GetDynamicRootParameterIndex(uint32_t group, BindingIndex bindingIndex) const;
|
uint32_t GetDynamicRootParameterIndex(uint32_t group, BindingIndex bindingIndex) const;
|
||||||
|
|
||||||
ComPtr<ID3D12RootSignature> GetRootSignature() const;
|
ID3D12RootSignature* GetRootSignature() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~PipelineLayout() override = default;
|
~PipelineLayout() override = default;
|
||||||
|
|
|
@ -359,7 +359,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
|
|
||||||
PipelineLayout* layout = ToBackend(GetLayout());
|
PipelineLayout* layout = ToBackend(GetLayout());
|
||||||
|
|
||||||
descriptorD3D12.pRootSignature = layout->GetRootSignature().Get();
|
descriptorD3D12.pRootSignature = layout->GetRootSignature();
|
||||||
|
|
||||||
// D3D12 logs warnings if any empty input state is used
|
// D3D12 logs warnings if any empty input state is used
|
||||||
std::array<D3D12_INPUT_ELEMENT_DESC, kMaxVertexAttributes> inputElementDescriptors;
|
std::array<D3D12_INPUT_ELEMENT_DESC, kMaxVertexAttributes> inputElementDescriptors;
|
||||||
|
@ -420,8 +420,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
return mD3d12PrimitiveTopology;
|
return mD3d12PrimitiveTopology;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<ID3D12PipelineState> RenderPipeline::GetPipelineState() {
|
ID3D12PipelineState* RenderPipeline::GetPipelineState() const {
|
||||||
return mPipelineState;
|
return mPipelineState.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12_INPUT_LAYOUT_DESC RenderPipeline::ComputeInputLayout(
|
D3D12_INPUT_LAYOUT_DESC RenderPipeline::ComputeInputLayout(
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
RenderPipeline() = delete;
|
RenderPipeline() = delete;
|
||||||
|
|
||||||
D3D12_PRIMITIVE_TOPOLOGY GetD3D12PrimitiveTopology() const;
|
D3D12_PRIMITIVE_TOPOLOGY GetD3D12PrimitiveTopology() const;
|
||||||
ComPtr<ID3D12PipelineState> GetPipelineState();
|
ID3D12PipelineState* GetPipelineState() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
~RenderPipeline() override;
|
~RenderPipeline() override;
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
if (!heap->IsInResidencyLRUCache() && !heap->IsResidencyLocked()) {
|
if (!heap->IsInResidencyLRUCache() && !heap->IsResidencyLocked()) {
|
||||||
DAWN_TRY(EnsureCanMakeResident(heap->GetSize(),
|
DAWN_TRY(EnsureCanMakeResident(heap->GetSize(),
|
||||||
GetMemorySegmentInfo(heap->GetMemorySegment())));
|
GetMemorySegmentInfo(heap->GetMemorySegment())));
|
||||||
ID3D12Pageable* pageable = heap->GetD3D12Pageable().Get();
|
ID3D12Pageable* pageable = heap->GetD3D12Pageable();
|
||||||
DAWN_TRY(CheckHRESULT(mDevice->GetD3D12Device()->MakeResident(1, &pageable),
|
DAWN_TRY(CheckHRESULT(mDevice->GetD3D12Device()->MakeResident(1, &pageable),
|
||||||
"Making a scheduled-to-be-used resource resident"));
|
"Making a scheduled-to-be-used resource resident"));
|
||||||
}
|
}
|
||||||
|
@ -206,7 +206,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
}
|
}
|
||||||
|
|
||||||
sizeEvicted += heap->GetSize();
|
sizeEvicted += heap->GetSize();
|
||||||
resourcesToEvict.push_back(heap->GetD3D12Pageable().Get());
|
resourcesToEvict.push_back(heap->GetD3D12Pageable());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resourcesToEvict.size() > 0) {
|
if (resourcesToEvict.size() > 0) {
|
||||||
|
@ -244,7 +244,7 @@ namespace dawn_native { namespace d3d12 {
|
||||||
// update its position in the LRU.
|
// update its position in the LRU.
|
||||||
heap->RemoveFromList();
|
heap->RemoveFromList();
|
||||||
} else {
|
} else {
|
||||||
heapsToMakeResident.push_back(heap->GetD3D12Pageable().Get());
|
heapsToMakeResident.push_back(heap->GetD3D12Pageable());
|
||||||
if (heap->GetMemorySegment() == MemorySegment::Local) {
|
if (heap->GetMemorySegment() == MemorySegment::Local) {
|
||||||
localSizeToMakeResident += heap->GetSize();
|
localSizeToMakeResident += heap->GetSize();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -294,8 +294,8 @@ namespace dawn_native { namespace d3d12 {
|
||||||
ComPtr<ID3D12Resource> placedResource;
|
ComPtr<ID3D12Resource> placedResource;
|
||||||
DAWN_TRY(CheckOutOfMemoryHRESULT(
|
DAWN_TRY(CheckOutOfMemoryHRESULT(
|
||||||
mDevice->GetD3D12Device()->CreatePlacedResource(
|
mDevice->GetD3D12Device()->CreatePlacedResource(
|
||||||
heap->GetD3D12Heap().Get(), allocation.GetOffset(), &resourceDescriptor,
|
heap->GetD3D12Heap(), allocation.GetOffset(), &resourceDescriptor, initialUsage,
|
||||||
initialUsage, nullptr, IID_PPV_ARGS(&placedResource)),
|
nullptr, IID_PPV_ARGS(&placedResource)),
|
||||||
"ID3D12Device::CreatePlacedResource"));
|
"ID3D12Device::CreatePlacedResource"));
|
||||||
|
|
||||||
// After CreatePlacedResource has finished, the heap can be unlocked from residency. This
|
// After CreatePlacedResource has finished, the heap can be unlocked from residency. This
|
||||||
|
|
Loading…
Reference in New Issue