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
|
@ -160,27 +160,6 @@ namespace dawn_native { namespace d3d12 {
|
||||||
// |ranges| will have resized and the pointers in the |rootParameter|s will be invalid.
|
// |ranges| will have resized and the pointers in the |rootParameter|s will be invalid.
|
||||||
ASSERT(rangeIndex == rangesCount);
|
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{};
|
D3D12_ROOT_PARAMETER indexOffsetConstants{};
|
||||||
indexOffsetConstants.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
|
indexOffsetConstants.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
|
||||||
indexOffsetConstants.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
|
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
|
// NOTE: We should consider delaying root signature creation until we know how many values
|
||||||
// we need
|
// we need
|
||||||
indexOffsetConstants.Constants.Num32BitValues = 2;
|
indexOffsetConstants.Constants.Num32BitValues = 2;
|
||||||
indexOffsetConstants.Constants.RegisterSpace = mFirstIndexOffsetRegisterSpace;
|
indexOffsetConstants.Constants.RegisterSpace = kReservedRegisterSpace;
|
||||||
indexOffsetConstants.Constants.ShaderRegister = mFirstIndexOffsetShaderRegister;
|
indexOffsetConstants.Constants.ShaderRegister = kFirstOffsetInfoBaseRegister;
|
||||||
mFirstIndexOffsetParameterIndex = rootParameters.size();
|
mFirstIndexOffsetParameterIndex = rootParameters.size();
|
||||||
// NOTE: We should consider moving this entry to earlier in the root signature since offsets
|
// NOTE: We should consider moving this entry to earlier in the root signature since offsets
|
||||||
// would need to be updated often
|
// would need to be updated often
|
||||||
|
@ -251,11 +230,11 @@ namespace dawn_native { namespace d3d12 {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t PipelineLayout::GetFirstIndexOffsetRegisterSpace() const {
|
uint32_t PipelineLayout::GetFirstIndexOffsetRegisterSpace() const {
|
||||||
return mFirstIndexOffsetRegisterSpace;
|
return kReservedRegisterSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t PipelineLayout::GetFirstIndexOffsetShaderRegister() const {
|
uint32_t PipelineLayout::GetFirstIndexOffsetShaderRegister() const {
|
||||||
return mFirstIndexOffsetShaderRegister;
|
return kFirstOffsetInfoBaseRegister;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t PipelineLayout::GetFirstIndexOffsetParameterIndex() const {
|
uint32_t PipelineLayout::GetFirstIndexOffsetParameterIndex() const {
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#ifndef DAWNNATIVE_D3D12_PIPELINELAYOUTD3D12_H_
|
#ifndef DAWNNATIVE_D3D12_PIPELINELAYOUTD3D12_H_
|
||||||
#define DAWNNATIVE_D3D12_PIPELINELAYOUTD3D12_H_
|
#define DAWNNATIVE_D3D12_PIPELINELAYOUTD3D12_H_
|
||||||
|
|
||||||
|
#include "common/Constants.h"
|
||||||
#include "common/ityp_array.h"
|
#include "common/ityp_array.h"
|
||||||
#include "dawn_native/BindingInfo.h"
|
#include "dawn_native/BindingInfo.h"
|
||||||
#include "dawn_native/PipelineLayout.h"
|
#include "dawn_native/PipelineLayout.h"
|
||||||
|
@ -22,6 +23,10 @@
|
||||||
|
|
||||||
namespace dawn_native { namespace d3d12 {
|
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 Device;
|
||||||
|
|
||||||
class PipelineLayout final : public PipelineLayoutBase {
|
class PipelineLayout final : public PipelineLayoutBase {
|
||||||
|
@ -53,8 +58,6 @@ namespace dawn_native { namespace d3d12 {
|
||||||
ityp::array<BindingIndex, uint32_t, kMaxDynamicBuffersPerPipelineLayout>,
|
ityp::array<BindingIndex, uint32_t, kMaxDynamicBuffersPerPipelineLayout>,
|
||||||
kMaxBindGroups>
|
kMaxBindGroups>
|
||||||
mDynamicRootParameterIndices;
|
mDynamicRootParameterIndices;
|
||||||
uint32_t mFirstIndexOffsetRegisterSpace;
|
|
||||||
uint32_t mFirstIndexOffsetShaderRegister;
|
|
||||||
uint32_t mFirstIndexOffsetParameterIndex;
|
uint32_t mFirstIndexOffsetParameterIndex;
|
||||||
ComPtr<ID3D12RootSignature> mRootSignature;
|
ComPtr<ID3D12RootSignature> mRootSignature;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue