[YCbCr Samplers] Separate YCbCr from non-YCbCr in hashing/equality
This CL takes whether a Sampler is YCbCr into account for content
hashing and equality checks. We will extend these checks with checks on
the full YCbCr state in followup to be able to distinguish between
distinct YCbCr samplers.
Change-Id: I0421d3974d3f134b6230158fd6ceb142962b4c61
Bug: 41488897
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/196795
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Colin Blundell <blundell@chromium.org>
diff --git a/src/dawn/native/Sampler.cpp b/src/dawn/native/Sampler.cpp
index 392dd8e..c1f545d 100644
--- a/src/dawn/native/Sampler.cpp
+++ b/src/dawn/native/Sampler.cpp
@@ -139,7 +139,8 @@
size_t SamplerBase::ComputeContentHash() {
ObjectContentHasher recorder;
recorder.Record(mAddressModeU, mAddressModeV, mAddressModeW, mMagFilter, mMinFilter,
- mMipmapFilter, mLodMinClamp, mLodMaxClamp, mCompareFunction, mMaxAnisotropy);
+ mMipmapFilter, mLodMinClamp, mLodMaxClamp, mCompareFunction, mMaxAnisotropy,
+ mIsYCbCr);
return recorder.GetContentHash();
}
@@ -157,7 +158,8 @@
a->mAddressModeW == b->mAddressModeW && a->mMagFilter == b->mMagFilter &&
a->mMinFilter == b->mMinFilter && a->mMipmapFilter == b->mMipmapFilter &&
a->mLodMinClamp == b->mLodMinClamp && a->mLodMaxClamp == b->mLodMaxClamp &&
- a->mCompareFunction == b->mCompareFunction && a->mMaxAnisotropy == b->mMaxAnisotropy;
+ a->mCompareFunction == b->mCompareFunction && a->mMaxAnisotropy == b->mMaxAnisotropy &&
+ a->mIsYCbCr == b->mIsYCbCr;
}
} // namespace dawn::native
diff --git a/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp b/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp
index 530dfb9..4a7c8aa 100644
--- a/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp
+++ b/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp
@@ -41,7 +41,7 @@
// exploiting an implementation detail of Dawn Native.
class ObjectCachingTest : public ValidationTest {
std::vector<wgpu::FeatureName> GetRequiredFeatures() override {
- return {wgpu::FeatureName::StaticSamplers};
+ return {wgpu::FeatureName::StaticSamplers, wgpu::FeatureName::YCbCrVulkanSamplers};
}
void SetUp() override {
@@ -541,5 +541,25 @@
EXPECT_EQ(sampler.Get(), sameSampler.Get());
}
+// Test that YCbCr samplers are correctly deduplicated.
+TEST_F(ObjectCachingTest, YCbCrSamplerDeduplication) {
+ wgpu::SamplerDescriptor samplerDesc;
+ wgpu::YCbCrVkDescriptor yCbCrDesc = {};
+ samplerDesc.nextInChain = &yCbCrDesc;
+ wgpu::Sampler sampler = device.CreateSampler(&samplerDesc);
+
+ wgpu::SamplerDescriptor sameSamplerDesc;
+ wgpu::YCbCrVkDescriptor sameYCbCrDesc = {};
+ sameSamplerDesc.nextInChain = &sameYCbCrDesc;
+ wgpu::Sampler sameSampler = device.CreateSampler(&sameSamplerDesc);
+
+ wgpu::SamplerDescriptor otherSamplerDescNoYCbCrSampling;
+ wgpu::Sampler otherSamplerNoYCbCrSampling =
+ device.CreateSampler(&otherSamplerDescNoYCbCrSampling);
+
+ EXPECT_NE(sampler.Get(), otherSamplerNoYCbCrSampling.Get());
+ EXPECT_EQ(sampler.Get(), sameSampler.Get());
+}
+
} // anonymous namespace
} // namespace dawn