Update SetBindGroup dynamic offsets to uint32_t

In WebGPU these are uint32_t because Vulkan accepts at most a 32-bit
unsigned integer.

Bug: dawn:22
Change-Id: Ia61cd710f80c19135ac215a9a93ef9a8f683bac2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/12942
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
This commit is contained in:
Austin Eng 2019-11-01 15:51:01 +00:00 committed by Commit Bot service account
parent c5e06a5d9f
commit 314fd3513d
17 changed files with 68 additions and 69 deletions

View File

@ -396,7 +396,7 @@
{"name": "group index", "type": "uint32_t"}, {"name": "group index", "type": "uint32_t"},
{"name": "group", "type": "bind group"}, {"name": "group", "type": "bind group"},
{"name": "dynamic offset count", "type": "uint32_t", "default": "0"}, {"name": "dynamic offset count", "type": "uint32_t", "default": "0"},
{"name": "dynamic offsets", "type": "uint64_t", "annotation": "const*", "length": "dynamic offset count", "optional": true} {"name": "dynamic offsets", "type": "uint32_t", "annotation": "const*", "length": "dynamic offset count", "optional": true}
] ]
}, },
{ {
@ -834,7 +834,7 @@
{"name": "group index", "type": "uint32_t"}, {"name": "group index", "type": "uint32_t"},
{"name": "group", "type": "bind group"}, {"name": "group", "type": "bind group"},
{"name": "dynamic offset count", "type": "uint32_t", "default": "0"}, {"name": "dynamic offset count", "type": "uint32_t", "default": "0"},
{"name": "dynamic offsets", "type": "uint64_t", "annotation": "const*", "length": "dynamic offset count", "optional": true} {"name": "dynamic offsets", "type": "uint32_t", "annotation": "const*", "length": "dynamic offset count", "optional": true}
] ]
}, },
{ {
@ -980,7 +980,7 @@
{"name": "group index", "type": "uint32_t"}, {"name": "group index", "type": "uint32_t"},
{"name": "group", "type": "bind group"}, {"name": "group", "type": "bind group"},
{"name": "dynamic offset count", "type": "uint32_t", "default": "0"}, {"name": "dynamic offset count", "type": "uint32_t", "default": "0"},
{"name": "dynamic offsets", "type": "uint64_t", "annotation": "const*", "length": "dynamic offset count", "optional": true} {"name": "dynamic offsets", "type": "uint32_t", "annotation": "const*", "length": "dynamic offset count", "optional": true}
] ]
}, },
{ {

View File

@ -159,7 +159,7 @@ void frame() {
pass.SetPipeline(pipeline); pass.SetPipeline(pipeline);
for (size_t i = 0; i < kNumTriangles; i++) { for (size_t i = 0; i < kNumTriangles; i++) {
uint64_t offset = i * sizeof(ShaderData); uint32_t offset = i * sizeof(ShaderData);
pass.SetBindGroup(0, bindGroup, 1, &offset); pass.SetBindGroup(0, bindGroup, 1, &offset);
pass.Draw(3, 1, 0, 0); pass.Draw(3, 1, 0, 0);
} }

View File

@ -22,7 +22,7 @@
namespace dawn_native { namespace dawn_native {
// Extends BindGroupTrackerBase to also keep track of resources that need a usage transition. // Extends BindGroupTrackerBase to also keep track of resources that need a usage transition.
template <bool CanInheritBindGroups, typename DynamicOffset = uint64_t> template <bool CanInheritBindGroups, typename DynamicOffset>
class BindGroupAndStorageBarrierTrackerBase class BindGroupAndStorageBarrierTrackerBase
: public BindGroupTrackerBase<CanInheritBindGroups, DynamicOffset> { : public BindGroupTrackerBase<CanInheritBindGroups, DynamicOffset> {
using Base = BindGroupTrackerBase<CanInheritBindGroups, DynamicOffset>; using Base = BindGroupTrackerBase<CanInheritBindGroups, DynamicOffset>;
@ -33,7 +33,7 @@ namespace dawn_native {
void OnSetBindGroup(uint32_t index, void OnSetBindGroup(uint32_t index,
BindGroupBase* bindGroup, BindGroupBase* bindGroup,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
uint64_t* dynamicOffsets) { uint32_t* dynamicOffsets) {
if (this->mBindGroups[index] != bindGroup) { if (this->mBindGroups[index] != bindGroup) {
mBuffers[index] = {}; mBuffers[index] = {};
mBuffersNeedingBarrier[index] = {}; mBuffersNeedingBarrier[index] = {};

View File

@ -29,13 +29,13 @@ namespace dawn_native {
// pipeline state or it changes. // pipeline state or it changes.
// |DynamicOffset| is a template parameter because offsets in Vulkan are uint32_t but uint64_t // |DynamicOffset| is a template parameter because offsets in Vulkan are uint32_t but uint64_t
// in other backends. // in other backends.
template <bool CanInheritBindGroups, typename DynamicOffset = uint64_t> template <bool CanInheritBindGroups, typename DynamicOffset>
class BindGroupTrackerBase { class BindGroupTrackerBase {
public: public:
void OnSetBindGroup(uint32_t index, void OnSetBindGroup(uint32_t index,
BindGroupBase* bindGroup, BindGroupBase* bindGroup,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
uint64_t* dynamicOffsets) { uint32_t* dynamicOffsets) {
ASSERT(index < kMaxBindGroups); ASSERT(index < kMaxBindGroups);
if (mBindGroupLayoutsMask[index]) { if (mBindGroupLayoutsMask[index]) {
@ -113,21 +113,20 @@ namespace dawn_native {
PipelineLayoutBase* mLastAppliedPipelineLayout = nullptr; PipelineLayoutBase* mLastAppliedPipelineLayout = nullptr;
private: private:
// Vulkan backend use uint32_t as dynamic offsets type, it is not correct. // We have two overloads here because offsets in Vulkan are uint32_t but uint64_t
// Vulkan should use VkDeviceSize. Dawn vulkan backend has to handle this. // in other backends.
static void SetDynamicOffsets(uint32_t* data, static void SetDynamicOffsets(uint64_t* data,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
uint64_t* dynamicOffsets) { uint32_t* dynamicOffsets) {
for (uint32_t i = 0; i < dynamicOffsetCount; ++i) { for (uint32_t i = 0; i < dynamicOffsetCount; ++i) {
ASSERT(dynamicOffsets[i] <= std::numeric_limits<uint32_t>::max()); data[i] = static_cast<uint64_t>(dynamicOffsets[i]);
data[i] = static_cast<uint32_t>(dynamicOffsets[i]);
} }
} }
static void SetDynamicOffsets(uint64_t* data, static void SetDynamicOffsets(uint32_t* data,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
uint64_t* dynamicOffsets) { uint32_t* dynamicOffsets) {
memcpy(data, dynamicOffsets, sizeof(uint64_t) * dynamicOffsetCount); memcpy(data, dynamicOffsets, sizeof(uint32_t) * dynamicOffsetCount);
} }
}; };

View File

@ -122,7 +122,7 @@ namespace dawn_native {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>();
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
commands->NextData<uint64_t>(cmd->dynamicOffsetCount); commands->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
TrackBindGroupResourceUsage(cmd->group.Get(), usageTracker); TrackBindGroupResourceUsage(cmd->group.Get(), usageTracker);
@ -339,7 +339,7 @@ namespace dawn_native {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>();
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
commands->NextData<uint64_t>(cmd->dynamicOffsetCount); commands->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
TrackBindGroupResourceUsage(cmd->group.Get(), &usageTracker); TrackBindGroupResourceUsage(cmd->group.Get(), &usageTracker);

View File

@ -136,7 +136,7 @@ namespace dawn_native {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>();
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
commands->NextData<uint64_t>(cmd->dynamicOffsetCount); commands->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
cmd->~SetBindGroupCmd(); cmd->~SetBindGroupCmd();
} break; } break;

View File

@ -73,7 +73,7 @@ namespace dawn_native {
void ProgrammablePassEncoder::SetBindGroup(uint32_t groupIndex, void ProgrammablePassEncoder::SetBindGroup(uint32_t groupIndex,
BindGroupBase* group, BindGroupBase* group,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
const uint64_t* dynamicOffsets) { const uint32_t* dynamicOffsets) {
mEncodingContext->TryEncode(this, [&](CommandAllocator* allocator) -> MaybeError { mEncodingContext->TryEncode(this, [&](CommandAllocator* allocator) -> MaybeError {
DAWN_TRY(GetDevice()->ValidateObject(group)); DAWN_TRY(GetDevice()->ValidateObject(group));
@ -111,8 +111,8 @@ namespace dawn_native {
cmd->group = group; cmd->group = group;
cmd->dynamicOffsetCount = dynamicOffsetCount; cmd->dynamicOffsetCount = dynamicOffsetCount;
if (dynamicOffsetCount > 0) { if (dynamicOffsetCount > 0) {
uint64_t* offsets = allocator->AllocateData<uint64_t>(cmd->dynamicOffsetCount); uint32_t* offsets = allocator->AllocateData<uint32_t>(cmd->dynamicOffsetCount);
memcpy(offsets, dynamicOffsets, dynamicOffsetCount * sizeof(uint64_t)); memcpy(offsets, dynamicOffsets, dynamicOffsetCount * sizeof(uint32_t));
} }
return {}; return {};

View File

@ -38,7 +38,7 @@ namespace dawn_native {
void SetBindGroup(uint32_t groupIndex, void SetBindGroup(uint32_t groupIndex,
BindGroupBase* group, BindGroupBase* group,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
const uint64_t* dynamicOffsets); const uint32_t* dynamicOffsets);
protected: protected:
// Construct an "error" programmable pass encoder. // Construct an "error" programmable pass encoder.

View File

@ -73,7 +73,7 @@ namespace dawn_native { namespace d3d12 {
} // anonymous namespace } // anonymous namespace
class BindGroupStateTracker : public BindGroupAndStorageBarrierTrackerBase<false> { class BindGroupStateTracker : public BindGroupAndStorageBarrierTrackerBase<false, uint64_t> {
public: public:
BindGroupStateTracker(Device* device) BindGroupStateTracker(Device* device)
: BindGroupAndStorageBarrierTrackerBase(), mDevice(device) { : BindGroupAndStorageBarrierTrackerBase(), mDevice(device) {
@ -493,7 +493,7 @@ namespace dawn_native { namespace d3d12 {
SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = commands->NextCommand<SetBindGroupCmd>();
BindGroup* group = ToBackend(cmd->group.Get()); BindGroup* group = ToBackend(cmd->group.Get());
if (cmd->dynamicOffsetCount) { if (cmd->dynamicOffsetCount) {
commands->NextData<uint64_t>(cmd->dynamicOffsetCount); commands->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindingTracker->TrackSetBindGroup(group, cmd->index, indexInSubmit); bindingTracker->TrackSetBindGroup(group, cmd->index, indexInSubmit);
} break; } break;
@ -860,10 +860,10 @@ namespace dawn_native { namespace d3d12 {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>();
BindGroup* group = ToBackend(cmd->group.Get()); BindGroup* group = ToBackend(cmd->group.Get());
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = mCommands.NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindingTracker->OnSetBindGroup(cmd->index, group, cmd->dynamicOffsetCount, bindingTracker->OnSetBindGroup(cmd->index, group, cmd->dynamicOffsetCount,
@ -1154,10 +1154,10 @@ namespace dawn_native { namespace d3d12 {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>();
BindGroup* group = ToBackend(cmd->group.Get()); BindGroup* group = ToBackend(cmd->group.Get());
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = iter->NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = iter->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindingTracker->OnSetBindGroup(cmd->index, group, cmd->dynamicOffsetCount, bindingTracker->OnSetBindGroup(cmd->index, group, cmd->dynamicOffsetCount,

View File

@ -394,7 +394,7 @@ namespace dawn_native { namespace metal {
// pipeline state. // pipeline state.
// Bind groups may be inherited because bind groups are packed in the buffer / // Bind groups may be inherited because bind groups are packed in the buffer /
// texture tables in contiguous order. // texture tables in contiguous order.
class BindGroupTracker : public BindGroupTrackerBase<true> { class BindGroupTracker : public BindGroupTrackerBase<true, uint64_t> {
public: public:
explicit BindGroupTracker(StorageBufferLengthTracker* lengthTracker) explicit BindGroupTracker(StorageBufferLengthTracker* lengthTracker)
: BindGroupTrackerBase(), mLengthTracker(lengthTracker) { : BindGroupTrackerBase(), mLengthTracker(lengthTracker) {
@ -764,9 +764,9 @@ namespace dawn_native { namespace metal {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>();
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = mCommands.NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindGroups.OnSetBindGroup(cmd->index, ToBackend(cmd->group.Get()), bindGroups.OnSetBindGroup(cmd->index, ToBackend(cmd->group.Get()),
@ -1026,9 +1026,9 @@ namespace dawn_native { namespace metal {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>();
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = iter->NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = iter->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindGroups.OnSetBindGroup(cmd->index, ToBackend(cmd->group.Get()), bindGroups.OnSetBindGroup(cmd->index, ToBackend(cmd->group.Get()),

View File

@ -210,7 +210,7 @@ namespace dawn_native { namespace opengl {
RenderPipelineBase* mLastPipeline = nullptr; RenderPipelineBase* mLastPipeline = nullptr;
}; };
class BindGroupTracker : public BindGroupTrackerBase<false> { class BindGroupTracker : public BindGroupTrackerBase<false, uint64_t> {
public: public:
void OnSetPipeline(RenderPipeline* pipeline) { void OnSetPipeline(RenderPipeline* pipeline) {
BindGroupTrackerBase::OnSetPipeline(pipeline); BindGroupTrackerBase::OnSetPipeline(pipeline);
@ -666,9 +666,9 @@ namespace dawn_native { namespace opengl {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>();
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = mCommands.NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindGroupTracker.OnSetBindGroup(cmd->index, cmd->group.Get(), bindGroupTracker.OnSetBindGroup(cmd->index, cmd->group.Get(),
cmd->dynamicOffsetCount, dynamicOffsets); cmd->dynamicOffsetCount, dynamicOffsets);
@ -954,9 +954,9 @@ namespace dawn_native { namespace opengl {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>();
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = iter->NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = iter->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
bindGroupTracker.OnSetBindGroup(cmd->index, cmd->group.Get(), bindGroupTracker.OnSetBindGroup(cmd->index, cmd->group.Get(),
cmd->dynamicOffsetCount, dynamicOffsets); cmd->dynamicOffsetCount, dynamicOffsets);

View File

@ -645,9 +645,9 @@ namespace dawn_native { namespace vulkan {
SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>();
BindGroup* bindGroup = ToBackend(cmd->group.Get()); BindGroup* bindGroup = ToBackend(cmd->group.Get());
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = mCommands.NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
descriptorSets.OnSetBindGroup(cmd->index, bindGroup, cmd->dynamicOffsetCount, descriptorSets.OnSetBindGroup(cmd->index, bindGroup, cmd->dynamicOffsetCount,
@ -850,9 +850,9 @@ namespace dawn_native { namespace vulkan {
case Command::SetBindGroup: { case Command::SetBindGroup: {
SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>(); SetBindGroupCmd* cmd = iter->NextCommand<SetBindGroupCmd>();
BindGroup* bindGroup = ToBackend(cmd->group.Get()); BindGroup* bindGroup = ToBackend(cmd->group.Get());
uint64_t* dynamicOffsets = nullptr; uint32_t* dynamicOffsets = nullptr;
if (cmd->dynamicOffsetCount > 0) { if (cmd->dynamicOffsetCount > 0) {
dynamicOffsets = iter->NextData<uint64_t>(cmd->dynamicOffsetCount); dynamicOffsets = iter->NextData<uint32_t>(cmd->dynamicOffsetCount);
} }
descriptorSets.OnSetBindGroup(cmd->index, bindGroup, cmd->dynamicOffsetCount, descriptorSets.OnSetBindGroup(cmd->index, bindGroup, cmd->dynamicOffsetCount,

View File

@ -571,7 +571,7 @@ TEST_P(BindGroupTests, SetDynamicBindGroupBeforePipeline) {
wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass.renderPassInfo); wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass.renderPassInfo);
// Set the first dynamic bind group. // Set the first dynamic bind group.
uint64_t dynamicOffset = 0; uint32_t dynamicOffset = 0;
pass.SetBindGroup(0, bindGroup, 1, &dynamicOffset); pass.SetBindGroup(0, bindGroup, 1, &dynamicOffset);
// Set the second dynamic bind group. // Set the second dynamic bind group.
@ -645,7 +645,7 @@ TEST_P(BindGroupTests, BindGroupsPersistAfterPipelineChange) {
// Set the first bind group at a dynamic offset. // Set the first bind group at a dynamic offset.
// This bind group matches the slot in the pipeline layout. // This bind group matches the slot in the pipeline layout.
uint64_t dynamicOffset = 0; uint32_t dynamicOffset = 0;
pass.SetBindGroup(0, bindGroup, 1, &dynamicOffset); pass.SetBindGroup(0, bindGroup, 1, &dynamicOffset);
// Set the second bind group at a dynamic offset. // Set the second bind group at a dynamic offset.
@ -740,7 +740,7 @@ TEST_P(BindGroupTests, DrawThenChangePipelineAndBindGroup) {
pass.SetPipeline(pipeline0); pass.SetPipeline(pipeline0);
// Set the first bind group to color0 in the dynamic uniform buffer. // Set the first bind group to color0 in the dynamic uniform buffer.
uint64_t dynamicOffset = 0; uint32_t dynamicOffset = 0;
pass.SetBindGroup(0, uniformBindGroup, 1, &dynamicOffset); pass.SetBindGroup(0, uniformBindGroup, 1, &dynamicOffset);
// Set the first bind group to color1 in the dynamic uniform buffer. // Set the first bind group to color1 in the dynamic uniform buffer.

View File

@ -216,7 +216,7 @@ TEST_P(DynamicBufferOffsetTests, BasicRenderPipeline) {
utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
std::array<uint64_t, 2> offsets = {0, 0}; std::array<uint32_t, 2> offsets = {0, 0};
wgpu::RenderPassEncoder renderPassEncoder = wgpu::RenderPassEncoder renderPassEncoder =
commandEncoder.BeginRenderPass(&renderPass.renderPassInfo); commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
renderPassEncoder.SetPipeline(pipeline); renderPassEncoder.SetPipeline(pipeline);
@ -237,7 +237,7 @@ TEST_P(DynamicBufferOffsetTests, SetDynamicOffestsRenderPipeline) {
utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, std::array<uint32_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
kMinDynamicBufferOffsetAlignment}; kMinDynamicBufferOffsetAlignment};
wgpu::RenderPassEncoder renderPassEncoder = wgpu::RenderPassEncoder renderPassEncoder =
commandEncoder.BeginRenderPass(&renderPass.renderPassInfo); commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
@ -258,7 +258,7 @@ TEST_P(DynamicBufferOffsetTests, SetDynamicOffestsRenderPipeline) {
TEST_P(DynamicBufferOffsetTests, BasicComputePipeline) { TEST_P(DynamicBufferOffsetTests, BasicComputePipeline) {
wgpu::ComputePipeline pipeline = CreateComputePipeline(); wgpu::ComputePipeline pipeline = CreateComputePipeline();
std::array<uint64_t, 2> offsets = {0, 0}; std::array<uint32_t, 2> offsets = {0, 0};
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
wgpu::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass(); wgpu::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass();
@ -277,7 +277,7 @@ TEST_P(DynamicBufferOffsetTests, BasicComputePipeline) {
TEST_P(DynamicBufferOffsetTests, SetDynamicOffestsComputePipeline) { TEST_P(DynamicBufferOffsetTests, SetDynamicOffestsComputePipeline) {
wgpu::ComputePipeline pipeline = CreateComputePipeline(); wgpu::ComputePipeline pipeline = CreateComputePipeline();
std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, std::array<uint32_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
kMinDynamicBufferOffsetAlignment}; kMinDynamicBufferOffsetAlignment};
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
@ -303,7 +303,7 @@ TEST_P(DynamicBufferOffsetTests, InheritDynamicOffestsRenderPipeline) {
utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, std::array<uint32_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
kMinDynamicBufferOffsetAlignment}; kMinDynamicBufferOffsetAlignment};
wgpu::RenderPassEncoder renderPassEncoder = wgpu::RenderPassEncoder renderPassEncoder =
commandEncoder.BeginRenderPass(&renderPass.renderPassInfo); commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
@ -332,7 +332,7 @@ TEST_P(DynamicBufferOffsetTests, InheritDynamicOffestsComputePipeline) {
wgpu::ComputePipeline pipeline = CreateComputePipeline(); wgpu::ComputePipeline pipeline = CreateComputePipeline();
wgpu::ComputePipeline testPipeline = CreateComputePipeline(true); wgpu::ComputePipeline testPipeline = CreateComputePipeline(true);
std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, std::array<uint32_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
kMinDynamicBufferOffsetAlignment}; kMinDynamicBufferOffsetAlignment};
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
@ -360,9 +360,9 @@ TEST_P(DynamicBufferOffsetTests, UpdateDynamicOffestsMultipleTimesRenderPipeline
utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize); utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, std::array<uint32_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
kMinDynamicBufferOffsetAlignment}; kMinDynamicBufferOffsetAlignment};
std::array<uint64_t, 2> testOffsets = {0, 0}; std::array<uint32_t, 2> testOffsets = {0, 0};
wgpu::RenderPassEncoder renderPassEncoder = wgpu::RenderPassEncoder renderPassEncoder =
commandEncoder.BeginRenderPass(&renderPass.renderPassInfo); commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
@ -384,9 +384,9 @@ TEST_P(DynamicBufferOffsetTests, UpdateDynamicOffestsMultipleTimesRenderPipeline
TEST_P(DynamicBufferOffsetTests, UpdateDynamicOffsetsMultipleTimesComputePipeline) { TEST_P(DynamicBufferOffsetTests, UpdateDynamicOffsetsMultipleTimesComputePipeline) {
wgpu::ComputePipeline pipeline = CreateComputePipeline(); wgpu::ComputePipeline pipeline = CreateComputePipeline();
std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment, std::array<uint32_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
kMinDynamicBufferOffsetAlignment}; kMinDynamicBufferOffsetAlignment};
std::array<uint64_t, 2> testOffsets = {0, 0}; std::array<uint32_t, 2> testOffsets = {0, 0};
wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder(); wgpu::CommandEncoder commandEncoder = device.CreateCommandEncoder();
wgpu::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass(); wgpu::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass();

View File

@ -541,7 +541,7 @@ void DrawCallPerf::RecordRenderCommands(Encoder pass) {
break; break;
case BindGroup::Dynamic: { case BindGroup::Dynamic: {
uint64_t dynamicOffset = static_cast<uint64_t>(i * mAlignedUniformSize); uint32_t dynamicOffset = static_cast<uint32_t>(i * mAlignedUniformSize);
pass.SetBindGroup(uniformBindGroupIndex, mUniformBindGroups[0], 1, &dynamicOffset); pass.SetBindGroup(uniformBindGroupIndex, mUniformBindGroups[0], 1, &dynamicOffset);
} break; } break;

View File

@ -693,7 +693,7 @@ class SetBindGroupValidationTest : public ValidationTest {
} }
void TestRenderPassBindGroup(wgpu::BindGroup bindGroup, void TestRenderPassBindGroup(wgpu::BindGroup bindGroup,
uint64_t* offsets, uint32_t* offsets,
uint32_t count, uint32_t count,
bool expectation) { bool expectation) {
wgpu::RenderPipeline renderPipeline = CreateRenderPipeline(); wgpu::RenderPipeline renderPipeline = CreateRenderPipeline();
@ -713,7 +713,7 @@ class SetBindGroupValidationTest : public ValidationTest {
} }
void TestComputePassBindGroup(wgpu::BindGroup bindGroup, void TestComputePassBindGroup(wgpu::BindGroup bindGroup,
uint64_t* offsets, uint32_t* offsets,
uint32_t count, uint32_t count,
bool expectation) { bool expectation) {
wgpu::ComputePipeline computePipeline = CreateComputePipeline(); wgpu::ComputePipeline computePipeline = CreateComputePipeline();
@ -741,7 +741,7 @@ TEST_F(SetBindGroupValidationTest, Basic) {
device, mBindGroupLayout, device, mBindGroupLayout,
{{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}}); {{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}});
std::array<uint64_t, 2> offsets = {256, 0}; std::array<uint32_t, 2> offsets = {256, 0};
TestRenderPassBindGroup(bindGroup, offsets.data(), 2, true); TestRenderPassBindGroup(bindGroup, offsets.data(), 2, true);
@ -758,7 +758,7 @@ TEST_F(SetBindGroupValidationTest, DynamicOffsetsMismatch) {
{{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}}); {{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}});
// Number of offsets mismatch. // Number of offsets mismatch.
std::array<uint64_t, 1> mismatchOffsets = {0}; std::array<uint32_t, 1> mismatchOffsets = {0};
TestRenderPassBindGroup(bindGroup, mismatchOffsets.data(), 1, false); TestRenderPassBindGroup(bindGroup, mismatchOffsets.data(), 1, false);
@ -775,7 +775,7 @@ TEST_F(SetBindGroupValidationTest, DynamicOffsetsNotAligned) {
{{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}}); {{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}});
// Dynamic offsets are not aligned. // Dynamic offsets are not aligned.
std::array<uint64_t, 2> notAlignedOffsets = {1, 2}; std::array<uint32_t, 2> notAlignedOffsets = {1, 2};
TestRenderPassBindGroup(bindGroup, notAlignedOffsets.data(), 2, false); TestRenderPassBindGroup(bindGroup, notAlignedOffsets.data(), 2, false);
@ -792,7 +792,7 @@ TEST_F(SetBindGroupValidationTest, OffsetOutOfBoundDynamicUniformBuffer) {
{{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}}); {{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}});
// Dynamic offset + offset is larger than buffer size. // Dynamic offset + offset is larger than buffer size.
std::array<uint64_t, 2> overFlowOffsets = {1024, 0}; std::array<uint32_t, 2> overFlowOffsets = {1024, 0};
TestRenderPassBindGroup(bindGroup, overFlowOffsets.data(), 2, false); TestRenderPassBindGroup(bindGroup, overFlowOffsets.data(), 2, false);
@ -809,7 +809,7 @@ TEST_F(SetBindGroupValidationTest, OffsetOutOfBoundDynamicStorageBuffer) {
{{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}}); {{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}});
// Dynamic offset + offset is larger than buffer size. // Dynamic offset + offset is larger than buffer size.
std::array<uint64_t, 2> overFlowOffsets = {0, 1024}; std::array<uint32_t, 2> overFlowOffsets = {0, 1024};
TestRenderPassBindGroup(bindGroup, overFlowOffsets.data(), 2, false); TestRenderPassBindGroup(bindGroup, overFlowOffsets.data(), 2, false);
@ -827,7 +827,7 @@ TEST_F(SetBindGroupValidationTest, BindingSizeOutOfBoundDynamicUniformBuffer) {
// Dynamic offset + offset isn't larger than buffer size. // Dynamic offset + offset isn't larger than buffer size.
// But with binding size, it will trigger OOB error. // But with binding size, it will trigger OOB error.
std::array<uint64_t, 2> offsets = {512, 0}; std::array<uint32_t, 2> offsets = {512, 0};
TestRenderPassBindGroup(bindGroup, offsets.data(), 2, false); TestRenderPassBindGroup(bindGroup, offsets.data(), 2, false);
@ -843,7 +843,7 @@ TEST_F(SetBindGroupValidationTest, BindingSizeOutOfBoundDynamicStorageBuffer) {
{{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}}); {{0, uniformBuffer, 0, kBindingSize}, {1, storageBuffer, 0, kBindingSize}});
// Dynamic offset + offset isn't larger than buffer size. // Dynamic offset + offset isn't larger than buffer size.
// But with binding size, it will trigger OOB error. // But with binding size, it will trigger OOB error.
std::array<uint64_t, 2> offsets = {0, 512}; std::array<uint32_t, 2> offsets = {0, 512};
TestRenderPassBindGroup(bindGroup, offsets.data(), 2, false); TestRenderPassBindGroup(bindGroup, offsets.data(), 2, false);

View File

@ -71,7 +71,7 @@ TEST_F(WireArgumentTests, ValueArrayArgument) {
WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(device, nullptr); WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(device, nullptr);
WGPUComputePassEncoder pass = wgpuCommandEncoderBeginComputePass(encoder, nullptr); WGPUComputePassEncoder pass = wgpuCommandEncoderBeginComputePass(encoder, nullptr);
std::array<uint64_t, 4> testOffsets = {0, 42, 0xDEAD'BEEF'DEAD'BEEFu, 0xFFFF'FFFF'FFFF'FFFFu}; std::array<uint32_t, 4> testOffsets = {0, 42, 0xDEAD'BEEFu, 0xFFFF'FFFFu};
wgpuComputePassEncoderSetBindGroup(pass, 0, bindGroup, testOffsets.size(), testOffsets.data()); wgpuComputePassEncoderSetBindGroup(pass, 0, bindGroup, testOffsets.size(), testOffsets.data());
WGPUCommandEncoder apiEncoder = api.GetNewCommandEncoder(); WGPUCommandEncoder apiEncoder = api.GetNewCommandEncoder();
@ -82,7 +82,7 @@ TEST_F(WireArgumentTests, ValueArrayArgument) {
EXPECT_CALL(api, ComputePassEncoderSetBindGroup( EXPECT_CALL(api, ComputePassEncoderSetBindGroup(
apiPass, 0, apiBindGroup, testOffsets.size(), apiPass, 0, apiBindGroup, testOffsets.size(),
MatchesLambda([testOffsets](const uint64_t* offsets) -> bool { MatchesLambda([testOffsets](const uint32_t* offsets) -> bool {
for (size_t i = 0; i < testOffsets.size(); i++) { for (size_t i = 0; i < testOffsets.size(); i++) {
if (offsets[i] != testOffsets[i]) { if (offsets[i] != testOffsets[i]) {
return false; return false;