D3D12: Remove increment during bindgroup population.
Simplifies descriptor heap allocations by removing increment which is
no longer required by Populate().
BUG=dawn:155
Change-Id: I1d9cd2c607691dc1bcffddd82aa46a10c2bf6fd3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/20048
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Bryan Bernhart <bryan.bernhart@intel.com>
diff --git a/src/dawn_native/d3d12/BindGroupD3D12.cpp b/src/dawn_native/d3d12/BindGroupD3D12.cpp
index e4591ac..4d27b52 100644
--- a/src/dawn_native/d3d12/BindGroupD3D12.cpp
+++ b/src/dawn_native/d3d12/BindGroupD3D12.cpp
@@ -180,10 +180,10 @@
}
d3d12Device->CopyDescriptorsSimple(
- viewDescriptorCount, viewDescriptorHeapAllocation.GetCPUHandle(0),
- mCPUViewAllocation.OffsetFrom(0, 0), D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+ viewDescriptorCount, viewDescriptorHeapAllocation.GetBaseCPUDescriptor(),
+ mCPUViewAllocation.GetBaseDescriptor(), D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
- mBaseViewDescriptor = viewDescriptorHeapAllocation.GetGPUHandle(0);
+ mBaseViewDescriptor = viewDescriptorHeapAllocation.GetBaseGPUDescriptor();
}
const uint32_t samplerDescriptorCount = bgl->GetSamplerDescriptorCount();
@@ -197,10 +197,10 @@
}
d3d12Device->CopyDescriptorsSimple(
- samplerDescriptorCount, samplerDescriptorHeapAllocation.GetCPUHandle(0),
- mCPUSamplerAllocation.OffsetFrom(0, 0), D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
+ samplerDescriptorCount, samplerDescriptorHeapAllocation.GetBaseCPUDescriptor(),
+ mCPUSamplerAllocation.GetBaseDescriptor(), D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
- mBaseSamplerDescriptor = samplerDescriptorHeapAllocation.GetGPUHandle(0);
+ mBaseSamplerDescriptor = samplerDescriptorHeapAllocation.GetBaseGPUDescriptor();
}
// Record both the device and heap serials to determine later if the allocations are still
diff --git a/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.cpp b/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.cpp
index 635b25e..021c47a 100644
--- a/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.cpp
+++ b/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.cpp
@@ -23,6 +23,11 @@
: mBaseDescriptor(baseDescriptor), mHeapIndex(heapIndex) {
}
+ D3D12_CPU_DESCRIPTOR_HANDLE CPUDescriptorHeapAllocation::GetBaseDescriptor() const {
+ ASSERT(IsValid());
+ return mBaseDescriptor;
+ }
+
D3D12_CPU_DESCRIPTOR_HANDLE CPUDescriptorHeapAllocation::OffsetFrom(
uint32_t sizeIncrementInBytes,
uint32_t offsetInDescriptorCount) const {
diff --git a/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.h b/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.h
index 560c998..05aaf51 100644
--- a/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.h
+++ b/src/dawn_native/d3d12/CPUDescriptorHeapAllocationD3D12.h
@@ -27,6 +27,8 @@
CPUDescriptorHeapAllocation() = default;
CPUDescriptorHeapAllocation(D3D12_CPU_DESCRIPTOR_HANDLE baseDescriptor, uint32_t heapIndex);
+ D3D12_CPU_DESCRIPTOR_HANDLE GetBaseDescriptor() const;
+
D3D12_CPU_DESCRIPTOR_HANDLE OffsetFrom(uint32_t sizeIncrementInBytes,
uint32_t offsetInDescriptorCount) const;
uint32_t GetHeapIndex() const;
diff --git a/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.cpp b/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.cpp
index fd16f1e..2ca7885 100644
--- a/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.cpp
+++ b/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.cpp
@@ -17,30 +17,21 @@
namespace dawn_native { namespace d3d12 {
- DescriptorHeapAllocation::DescriptorHeapAllocation() : mSizeIncrement(0) {
- }
-
DescriptorHeapAllocation::DescriptorHeapAllocation(
- uint32_t sizeIncrement,
D3D12_CPU_DESCRIPTOR_HANDLE baseCPUDescriptorHandle,
D3D12_GPU_DESCRIPTOR_HANDLE baseGPUDescriptorHandle)
- : mSizeIncrement(sizeIncrement),
- mBaseCPUDescriptorHandle(baseCPUDescriptorHandle),
+ : mBaseCPUDescriptorHandle(baseCPUDescriptorHandle),
mBaseGPUDescriptorHandle(baseGPUDescriptorHandle) {
}
- D3D12_CPU_DESCRIPTOR_HANDLE DescriptorHeapAllocation::GetCPUHandle(uint32_t offset) const {
+ D3D12_GPU_DESCRIPTOR_HANDLE DescriptorHeapAllocation::GetBaseGPUDescriptor() const {
ASSERT(!IsInvalid());
- D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = mBaseCPUDescriptorHandle;
- cpuHandle.ptr += mSizeIncrement * offset;
- return cpuHandle;
+ return mBaseGPUDescriptorHandle;
}
- D3D12_GPU_DESCRIPTOR_HANDLE DescriptorHeapAllocation::GetGPUHandle(uint32_t offset) const {
+ D3D12_CPU_DESCRIPTOR_HANDLE DescriptorHeapAllocation::GetBaseCPUDescriptor() const {
ASSERT(!IsInvalid());
- D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle = mBaseGPUDescriptorHandle;
- gpuHandle.ptr += mSizeIncrement * offset;
- return gpuHandle;
+ return mBaseCPUDescriptorHandle;
}
bool DescriptorHeapAllocation::IsInvalid() const {
diff --git a/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.h b/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.h
index 30a034c..e63d415 100644
--- a/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.h
+++ b/src/dawn_native/d3d12/DescriptorHeapAllocationD3D12.h
@@ -21,23 +21,20 @@
namespace dawn_native { namespace d3d12 {
- // Wrapper for a handle into a descriptor heap.
+ // Wrapper for a handle into a GPU-only descriptor heap.
class DescriptorHeapAllocation {
public:
- DescriptorHeapAllocation();
- DescriptorHeapAllocation(uint32_t sizeIncrement,
- D3D12_CPU_DESCRIPTOR_HANDLE baseCPUDescriptorHandle,
+ DescriptorHeapAllocation() = default;
+ DescriptorHeapAllocation(D3D12_CPU_DESCRIPTOR_HANDLE baseCPUDescriptorHandle,
D3D12_GPU_DESCRIPTOR_HANDLE baseGPUDescriptorHandle);
~DescriptorHeapAllocation() = default;
- D3D12_CPU_DESCRIPTOR_HANDLE GetCPUHandle(uint32_t offset) const;
- D3D12_GPU_DESCRIPTOR_HANDLE GetGPUHandle(uint32_t offset) const;
+ D3D12_GPU_DESCRIPTOR_HANDLE GetBaseGPUDescriptor() const;
+ D3D12_CPU_DESCRIPTOR_HANDLE GetBaseCPUDescriptor() const;
bool IsInvalid() const;
private:
- uint32_t mSizeIncrement;
-
D3D12_CPU_DESCRIPTOR_HANDLE mBaseCPUDescriptorHandle = {0};
D3D12_GPU_DESCRIPTOR_HANDLE mBaseGPUDescriptorHandle = {0};
};
diff --git a/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp b/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
index 101ca4b..d881f26 100644
--- a/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
+++ b/src/dawn_native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
@@ -101,16 +101,20 @@
ID3D12DescriptorHeap* descriptorHeap = mShaderVisibleBuffers[heapType].heap.Get();
- D3D12_CPU_DESCRIPTOR_HANDLE baseCPUDescriptor =
- descriptorHeap->GetCPUDescriptorHandleForHeapStart();
- baseCPUDescriptor.ptr += mSizeIncrements[heapType] * startOffset;
+ const uint64_t heapOffset = mSizeIncrements[heapType] * startOffset;
- D3D12_GPU_DESCRIPTOR_HANDLE baseGPUDescriptor =
- descriptorHeap->GetGPUDescriptorHandleForHeapStart();
- baseGPUDescriptor.ptr += mSizeIncrements[heapType] * startOffset;
+ // Check for 32-bit overflow since CPU heap start handle uses size_t.
+ const size_t cpuHeapStartPtr = descriptorHeap->GetCPUDescriptorHandleForHeapStart().ptr;
- return DescriptorHeapAllocation{mSizeIncrements[heapType], baseCPUDescriptor,
- baseGPUDescriptor};
+ ASSERT(heapOffset <= std::numeric_limits<size_t>::max() - cpuHeapStartPtr);
+
+ const D3D12_CPU_DESCRIPTOR_HANDLE baseCPUDescriptor = {cpuHeapStartPtr +
+ static_cast<size_t>(heapOffset)};
+
+ const D3D12_GPU_DESCRIPTOR_HANDLE baseGPUDescriptor = {
+ descriptorHeap->GetGPUDescriptorHandleForHeapStart().ptr + heapOffset};
+
+ return DescriptorHeapAllocation{baseCPUDescriptor, baseGPUDescriptor};
}
std::array<ID3D12DescriptorHeap*, 2> ShaderVisibleDescriptorAllocator::GetShaderVisibleHeaps()