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:
Michael Tang 2021-09-10 23:16:33 +00:00 committed by Dawn LUCI CQ
parent 2092a66ab5
commit b21ccebac8
2 changed files with 9 additions and 27 deletions

View File

@ -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 {

View File

@ -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;
};