[dawn][native] Change EnforceLimitSpecInvariants to use CombinedLimits
This is in preparation to separate Compat limits into a separate
extension struct.
Bug: 416304914
Change-Id: I0a5227ba1921f38eaa2e90990a1baf4e978c69a1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/245015
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Auto-Submit: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/native/Device.cpp b/src/dawn/native/Device.cpp
index 1eac9bf..b142d01 100644
--- a/src/dawn/native/Device.cpp
+++ b/src/dawn/native/Device.cpp
@@ -364,7 +364,7 @@
mLimits.hostMappedPointerLimits = GetPhysicalDevice()->GetLimits().hostMappedPointerLimits;
// Handle maxXXXPerStage/maxXXXInStage.
- EnforceLimitSpecInvariants(&mLimits.v1, effectiveFeatureLevel);
+ EnforceLimitSpecInvariants(&mLimits, effectiveFeatureLevel);
if (mLimits.v1.maxStorageBuffersInFragmentStage < 1) {
// If there is no storage buffer in fragment stage, UseBlitForB2T is not possible.
@@ -404,7 +404,7 @@
DeviceBase::DeviceBase() : mState(State::Alive), mToggles(ToggleStage::Device) {
GetDefaultLimits(&mLimits, wgpu::FeatureLevel::Core);
- EnforceLimitSpecInvariants(&mLimits.v1, wgpu::FeatureLevel::Core);
+ EnforceLimitSpecInvariants(&mLimits, wgpu::FeatureLevel::Core);
mFormatTable = BuildFormatTable(this);
DeviceDescriptor desc = {};
diff --git a/src/dawn/native/Limits.cpp b/src/dawn/native/Limits.cpp
index 3a76cb0..d852ae5 100644
--- a/src/dawn/native/Limits.cpp
+++ b/src/dawn/native/Limits.cpp
@@ -422,19 +422,19 @@
std::min(limits->v1.maxUniformBufferBindingSize, limits->v1.maxBufferSize);
}
-void EnforceLimitSpecInvariants(Limits* limits, wgpu::FeatureLevel featureLevel) {
+void EnforceLimitSpecInvariants(CombinedLimits* limits, wgpu::FeatureLevel featureLevel) {
// In all feature levels, maxXXXPerStage is raised to maxXXXInStage
// The reason for this is in compatibility mode, maxXXXPerStage defaults to = 4.
// That means if the adapter has 8 maxXXXInStage and 8 maxXXXPerStage
// and you request maxXXXInStage = 3 things work but, if you request
// maxXXXInStage = 5 they'd fail because suddenly you're you'd also be required
// to request maxXXXPerStage to 5. So, we auto-uprade the perStage limits.
- limits->maxStorageBuffersPerShaderStage =
- Max(limits->maxStorageBuffersPerShaderStage, limits->maxStorageBuffersInVertexStage,
- limits->maxStorageBuffersInFragmentStage);
- limits->maxStorageTexturesPerShaderStage =
- Max(limits->maxStorageTexturesPerShaderStage, limits->maxStorageTexturesInVertexStage,
- limits->maxStorageTexturesInFragmentStage);
+ limits->v1.maxStorageBuffersPerShaderStage =
+ Max(limits->v1.maxStorageBuffersPerShaderStage, limits->v1.maxStorageBuffersInVertexStage,
+ limits->v1.maxStorageBuffersInFragmentStage);
+ limits->v1.maxStorageTexturesPerShaderStage =
+ Max(limits->v1.maxStorageTexturesPerShaderStage, limits->v1.maxStorageTexturesInVertexStage,
+ limits->v1.maxStorageTexturesInFragmentStage);
if (featureLevel != wgpu::FeatureLevel::Compatibility) {
// In core mode the maxStorageXXXInYYYStage are always set to maxStorageXXXPerShaderStage
@@ -448,10 +448,10 @@
// device.limits.maxStorageBuffersPerShaderStage = 5;
// It's ok to use 5 storage buffers in fragment stage because in core
// we originally only had maxStorageBuffersPerShaderStage
- limits->maxStorageBuffersInFragmentStage = limits->maxStorageBuffersPerShaderStage;
- limits->maxStorageTexturesInFragmentStage = limits->maxStorageTexturesPerShaderStage;
- limits->maxStorageBuffersInVertexStage = limits->maxStorageBuffersPerShaderStage;
- limits->maxStorageTexturesInVertexStage = limits->maxStorageTexturesPerShaderStage;
+ limits->v1.maxStorageBuffersInFragmentStage = limits->v1.maxStorageBuffersPerShaderStage;
+ limits->v1.maxStorageTexturesInFragmentStage = limits->v1.maxStorageTexturesPerShaderStage;
+ limits->v1.maxStorageBuffersInVertexStage = limits->v1.maxStorageBuffersPerShaderStage;
+ limits->v1.maxStorageTexturesInVertexStage = limits->v1.maxStorageTexturesPerShaderStage;
}
}
diff --git a/src/dawn/native/Limits.h b/src/dawn/native/Limits.h
index 094d47a..4c78a90 100644
--- a/src/dawn/native/Limits.h
+++ b/src/dawn/native/Limits.h
@@ -53,7 +53,7 @@
CombinedLimits ReifyDefaultLimits(const CombinedLimits& limits, wgpu::FeatureLevel featureLevel);
// Fixup limits after device creation
-void EnforceLimitSpecInvariants(Limits* limits, wgpu::FeatureLevel featureLevel);
+void EnforceLimitSpecInvariants(CombinedLimits* limits, wgpu::FeatureLevel featureLevel);
// Validate that |requiredLimits| are no better than |supportedLimits|.
MaybeError ValidateLimits(const CombinedLimits& supportedLimits,
diff --git a/src/dawn/tests/unittests/native/LimitsTests.cpp b/src/dawn/tests/unittests/native/LimitsTests.cpp
index 4b08553..48f298f 100644
--- a/src/dawn/tests/unittests/native/LimitsTests.cpp
+++ b/src/dawn/tests/unittests/native/LimitsTests.cpp
@@ -504,126 +504,126 @@
TEST(Limits, FixupDeviceLimits) {
// Test maxXXXInStage is raised to maxXXXPerStage in core
{
- Limits limits;
- limits.maxStorageBuffersInFragmentStage = 1;
- limits.maxStorageBuffersInVertexStage = 2;
- limits.maxStorageBuffersPerShaderStage = 3;
+ CombinedLimits limits;
+ limits.v1.maxStorageBuffersInFragmentStage = 1;
+ limits.v1.maxStorageBuffersInVertexStage = 2;
+ limits.v1.maxStorageBuffersPerShaderStage = 3;
- limits.maxStorageTexturesInFragmentStage = 4;
- limits.maxStorageTexturesInVertexStage = 5;
- limits.maxStorageTexturesPerShaderStage = 6;
+ limits.v1.maxStorageTexturesInFragmentStage = 4;
+ limits.v1.maxStorageTexturesInVertexStage = 5;
+ limits.v1.maxStorageTexturesPerShaderStage = 6;
EnforceLimitSpecInvariants(&limits, wgpu::FeatureLevel::Core);
- EXPECT_EQ(limits.maxStorageBuffersInFragmentStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersInVertexStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersPerShaderStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInFragmentStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInVertexStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersPerShaderStage, 3u);
- EXPECT_EQ(limits.maxStorageTexturesInFragmentStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesInVertexStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesPerShaderStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInFragmentStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInVertexStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesPerShaderStage, 6u);
}
// Test maxXXXInStage are not raised to maxXXXPerStage in compat
{
- Limits limits;
- limits.maxStorageBuffersInFragmentStage = 1;
- limits.maxStorageBuffersInVertexStage = 2;
- limits.maxStorageBuffersPerShaderStage = 3;
+ CombinedLimits limits;
+ limits.v1.maxStorageBuffersInFragmentStage = 1;
+ limits.v1.maxStorageBuffersInVertexStage = 2;
+ limits.v1.maxStorageBuffersPerShaderStage = 3;
- limits.maxStorageTexturesInFragmentStage = 4;
- limits.maxStorageTexturesInVertexStage = 5;
- limits.maxStorageTexturesPerShaderStage = 6;
+ limits.v1.maxStorageTexturesInFragmentStage = 4;
+ limits.v1.maxStorageTexturesInVertexStage = 5;
+ limits.v1.maxStorageTexturesPerShaderStage = 6;
EnforceLimitSpecInvariants(&limits, wgpu::FeatureLevel::Compatibility);
- EXPECT_EQ(limits.maxStorageBuffersInFragmentStage, 1u);
- EXPECT_EQ(limits.maxStorageBuffersInVertexStage, 2u);
- EXPECT_EQ(limits.maxStorageBuffersPerShaderStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInFragmentStage, 1u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInVertexStage, 2u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersPerShaderStage, 3u);
- EXPECT_EQ(limits.maxStorageTexturesInFragmentStage, 4u);
- EXPECT_EQ(limits.maxStorageTexturesInVertexStage, 5u);
- EXPECT_EQ(limits.maxStorageTexturesPerShaderStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInFragmentStage, 4u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInVertexStage, 5u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesPerShaderStage, 6u);
}
// Test maxXXXPerStage is raised to maxXXXInStage in core
{
- Limits limits;
- limits.maxStorageBuffersInFragmentStage = 3;
- limits.maxStorageBuffersInVertexStage = 2;
- limits.maxStorageBuffersPerShaderStage = 1;
+ CombinedLimits limits;
+ limits.v1.maxStorageBuffersInFragmentStage = 3;
+ limits.v1.maxStorageBuffersInVertexStage = 2;
+ limits.v1.maxStorageBuffersPerShaderStage = 1;
- limits.maxStorageTexturesInFragmentStage = 6;
- limits.maxStorageTexturesInVertexStage = 5;
- limits.maxStorageTexturesPerShaderStage = 4;
+ limits.v1.maxStorageTexturesInFragmentStage = 6;
+ limits.v1.maxStorageTexturesInVertexStage = 5;
+ limits.v1.maxStorageTexturesPerShaderStage = 4;
EnforceLimitSpecInvariants(&limits, wgpu::FeatureLevel::Core);
- EXPECT_EQ(limits.maxStorageBuffersInFragmentStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersInVertexStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersPerShaderStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInFragmentStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInVertexStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersPerShaderStage, 3u);
- EXPECT_EQ(limits.maxStorageTexturesInFragmentStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesInVertexStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesPerShaderStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInFragmentStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInVertexStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesPerShaderStage, 6u);
- limits.maxStorageBuffersInFragmentStage = 2;
- limits.maxStorageBuffersInVertexStage = 3;
- limits.maxStorageBuffersPerShaderStage = 1;
+ limits.v1.maxStorageBuffersInFragmentStage = 2;
+ limits.v1.maxStorageBuffersInVertexStage = 3;
+ limits.v1.maxStorageBuffersPerShaderStage = 1;
- limits.maxStorageTexturesInFragmentStage = 5;
- limits.maxStorageTexturesInVertexStage = 6;
- limits.maxStorageTexturesPerShaderStage = 4;
+ limits.v1.maxStorageTexturesInFragmentStage = 5;
+ limits.v1.maxStorageTexturesInVertexStage = 6;
+ limits.v1.maxStorageTexturesPerShaderStage = 4;
EnforceLimitSpecInvariants(&limits, wgpu::FeatureLevel::Core);
- EXPECT_EQ(limits.maxStorageBuffersInFragmentStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersInVertexStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersPerShaderStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInFragmentStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInVertexStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersPerShaderStage, 3u);
- EXPECT_EQ(limits.maxStorageTexturesInFragmentStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesInVertexStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesPerShaderStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInFragmentStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInVertexStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesPerShaderStage, 6u);
}
// Test maxXXXPerStage is raised to maxXXXInStage compat
{
- Limits limits;
- limits.maxStorageBuffersInFragmentStage = 3;
- limits.maxStorageBuffersInVertexStage = 2;
- limits.maxStorageBuffersPerShaderStage = 1;
+ CombinedLimits limits;
+ limits.v1.maxStorageBuffersInFragmentStage = 3;
+ limits.v1.maxStorageBuffersInVertexStage = 2;
+ limits.v1.maxStorageBuffersPerShaderStage = 1;
- limits.maxStorageTexturesInFragmentStage = 6;
- limits.maxStorageTexturesInVertexStage = 5;
- limits.maxStorageTexturesPerShaderStage = 4;
+ limits.v1.maxStorageTexturesInFragmentStage = 6;
+ limits.v1.maxStorageTexturesInVertexStage = 5;
+ limits.v1.maxStorageTexturesPerShaderStage = 4;
EnforceLimitSpecInvariants(&limits, wgpu::FeatureLevel::Compatibility);
- EXPECT_EQ(limits.maxStorageBuffersInFragmentStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersInVertexStage, 2u);
- EXPECT_EQ(limits.maxStorageBuffersPerShaderStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInFragmentStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInVertexStage, 2u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersPerShaderStage, 3u);
- EXPECT_EQ(limits.maxStorageTexturesInFragmentStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesInVertexStage, 5u);
- EXPECT_EQ(limits.maxStorageTexturesPerShaderStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInFragmentStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInVertexStage, 5u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesPerShaderStage, 6u);
- limits.maxStorageBuffersInFragmentStage = 2;
- limits.maxStorageBuffersInVertexStage = 3;
- limits.maxStorageBuffersPerShaderStage = 1;
+ limits.v1.maxStorageBuffersInFragmentStage = 2;
+ limits.v1.maxStorageBuffersInVertexStage = 3;
+ limits.v1.maxStorageBuffersPerShaderStage = 1;
- limits.maxStorageTexturesInFragmentStage = 5;
- limits.maxStorageTexturesInVertexStage = 6;
- limits.maxStorageTexturesPerShaderStage = 4;
+ limits.v1.maxStorageTexturesInFragmentStage = 5;
+ limits.v1.maxStorageTexturesInVertexStage = 6;
+ limits.v1.maxStorageTexturesPerShaderStage = 4;
EnforceLimitSpecInvariants(&limits, wgpu::FeatureLevel::Compatibility);
- EXPECT_EQ(limits.maxStorageBuffersInFragmentStage, 2u);
- EXPECT_EQ(limits.maxStorageBuffersInVertexStage, 3u);
- EXPECT_EQ(limits.maxStorageBuffersPerShaderStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInFragmentStage, 2u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersInVertexStage, 3u);
+ EXPECT_EQ(limits.v1.maxStorageBuffersPerShaderStage, 3u);
- EXPECT_EQ(limits.maxStorageTexturesInFragmentStage, 5u);
- EXPECT_EQ(limits.maxStorageTexturesInVertexStage, 6u);
- EXPECT_EQ(limits.maxStorageTexturesPerShaderStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInFragmentStage, 5u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesInVertexStage, 6u);
+ EXPECT_EQ(limits.v1.maxStorageTexturesPerShaderStage, 6u);
}
}