D3D12: Use a separate space for the index offset constants
Tint's HLSL writer can now map sets to spaces, so we can use a dedicated space and register to store the index offset constants. Currently, we use the first space (0) and find a free unused register. Bug: dawn:1103 Change-Id: Ie1fe95ec314097baf0e0952a0c78222cad493c95 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/63223 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Michael Tang <tangm@microsoft.com>
This commit is contained in:
parent
2092a66ab5
commit
b21ccebac8
src/dawn_native/d3d12
|
@ -160,27 +160,6 @@ namespace dawn_native { namespace d3d12 {
|
|||
// |ranges| will have resized and the pointers in the |rootParameter|s will be invalid.
|
||||
ASSERT(rangeIndex == rangesCount);
|
||||
|
||||
// Since Tint's HLSL writer doesn't currently map sets to spaces, we use the default space
|
||||
// (0).
|
||||
mFirstIndexOffsetRegisterSpace = 0;
|
||||
BindGroupIndex firstOffsetGroup{mFirstIndexOffsetRegisterSpace};
|
||||
if (GetBindGroupLayoutsMask()[firstOffsetGroup]) {
|
||||
// Find the last register used on firstOffsetGroup.
|
||||
auto bgl = ToBackend(GetBindGroupLayout(firstOffsetGroup));
|
||||
uint32_t maxRegister = 0;
|
||||
for (BindingIndex bindingIndex{0}; bindingIndex < bgl->GetBindingCount();
|
||||
++bindingIndex) {
|
||||
uint32_t shaderRegister = bgl->GetShaderRegister(bindingIndex);
|
||||
if (shaderRegister > maxRegister) {
|
||||
maxRegister = shaderRegister;
|
||||
}
|
||||
}
|
||||
mFirstIndexOffsetShaderRegister = maxRegister + 1;
|
||||
} else {
|
||||
// firstOffsetGroup is not in use, we can use the first register.
|
||||
mFirstIndexOffsetShaderRegister = 0;
|
||||
}
|
||||
|
||||
D3D12_ROOT_PARAMETER indexOffsetConstants{};
|
||||
indexOffsetConstants.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
|
||||
indexOffsetConstants.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
|
||||
|
@ -188,8 +167,8 @@ namespace dawn_native { namespace d3d12 {
|
|||
// NOTE: We should consider delaying root signature creation until we know how many values
|
||||
// we need
|
||||
indexOffsetConstants.Constants.Num32BitValues = 2;
|
||||
indexOffsetConstants.Constants.RegisterSpace = mFirstIndexOffsetRegisterSpace;
|
||||
indexOffsetConstants.Constants.ShaderRegister = mFirstIndexOffsetShaderRegister;
|
||||
indexOffsetConstants.Constants.RegisterSpace = kReservedRegisterSpace;
|
||||
indexOffsetConstants.Constants.ShaderRegister = kFirstOffsetInfoBaseRegister;
|
||||
mFirstIndexOffsetParameterIndex = rootParameters.size();
|
||||
// NOTE: We should consider moving this entry to earlier in the root signature since offsets
|
||||
// would need to be updated often
|
||||
|
@ -251,11 +230,11 @@ namespace dawn_native { namespace d3d12 {
|
|||
}
|
||||
|
||||
uint32_t PipelineLayout::GetFirstIndexOffsetRegisterSpace() const {
|
||||
return mFirstIndexOffsetRegisterSpace;
|
||||
return kReservedRegisterSpace;
|
||||
}
|
||||
|
||||
uint32_t PipelineLayout::GetFirstIndexOffsetShaderRegister() const {
|
||||
return mFirstIndexOffsetShaderRegister;
|
||||
return kFirstOffsetInfoBaseRegister;
|
||||
}
|
||||
|
||||
uint32_t PipelineLayout::GetFirstIndexOffsetParameterIndex() const {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#ifndef DAWNNATIVE_D3D12_PIPELINELAYOUTD3D12_H_
|
||||
#define DAWNNATIVE_D3D12_PIPELINELAYOUTD3D12_H_
|
||||
|
||||
#include "common/Constants.h"
|
||||
#include "common/ityp_array.h"
|
||||
#include "dawn_native/BindingInfo.h"
|
||||
#include "dawn_native/PipelineLayout.h"
|
||||
|
@ -22,6 +23,10 @@
|
|||
|
||||
namespace dawn_native { namespace d3d12 {
|
||||
|
||||
// We reserve a register space that a user cannot use.
|
||||
static constexpr uint32_t kReservedRegisterSpace = kMaxBindGroups + 1;
|
||||
static constexpr uint32_t kFirstOffsetInfoBaseRegister = 0;
|
||||
|
||||
class Device;
|
||||
|
||||
class PipelineLayout final : public PipelineLayoutBase {
|
||||
|
@ -53,8 +58,6 @@ namespace dawn_native { namespace d3d12 {
|
|||
ityp::array<BindingIndex, uint32_t, kMaxDynamicBuffersPerPipelineLayout>,
|
||||
kMaxBindGroups>
|
||||
mDynamicRootParameterIndices;
|
||||
uint32_t mFirstIndexOffsetRegisterSpace;
|
||||
uint32_t mFirstIndexOffsetShaderRegister;
|
||||
uint32_t mFirstIndexOffsetParameterIndex;
|
||||
ComPtr<ID3D12RootSignature> mRootSignature;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue