Commit 26ae42cf by Jamie Madill Committed by Commit Bot

Vulkan: Clean up handleDirtyTexturesImpl.

Adds a new bitset helper and changes a check to an ASSERT. Refactoring change only. Bug: angleproject:4959 Change-Id: I0de9f1b707c87cfb6fed8a110654783059e55c99 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2345025 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarCharlie Lao <cclao@google.com>
parent dceaabb1
...@@ -139,6 +139,8 @@ class BitSetT final ...@@ -139,6 +139,8 @@ class BitSetT final
constexpr static BitSetT Zero() { return BitSetT(); } constexpr static BitSetT Zero() { return BitSetT(); }
ParamT first() const;
private: private:
// Produces a mask of ones up to the "x"th bit. // Produces a mask of ones up to the "x"th bit.
constexpr static BitsT Mask(std::size_t x) constexpr static BitsT Mask(std::size_t x)
...@@ -451,6 +453,13 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos) ...@@ -451,6 +453,13 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos)
} }
template <size_t N, typename BitsT, typename ParamT> template <size_t N, typename BitsT, typename ParamT>
ParamT BitSetT<N, BitsT, ParamT>::first() const
{
ASSERT(!none());
return static_cast<ParamT>(gl::ScanForward(mBits));
}
template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT>::Iterator::Iterator(const BitSetT &bits) : mBitsCopy(bits), mCurrentBit(0) BitSetT<N, BitsT, ParamT>::Iterator::Iterator(const BitSetT &bits) : mBitsCopy(bits), mCurrentBit(0)
{ {
if (bits.any()) if (bits.any())
......
...@@ -82,12 +82,14 @@ TYPED_TEST(BitSetTest, Basic) ...@@ -82,12 +82,14 @@ TYPED_TEST(BitSetTest, Basic)
EXPECT_TRUE(mBits.any()); EXPECT_TRUE(mBits.any());
EXPECT_FALSE(mBits.none()); EXPECT_FALSE(mBits.none());
EXPECT_EQ(mBits.count(), mBits.size() / 2); EXPECT_EQ(mBits.count(), mBits.size() / 2);
EXPECT_EQ(mBits.first(), 1u);
mBits.set(); mBits.set();
EXPECT_TRUE(mBits.all()); EXPECT_TRUE(mBits.all());
EXPECT_TRUE(mBits.any()); EXPECT_TRUE(mBits.any());
EXPECT_FALSE(mBits.none()); EXPECT_FALSE(mBits.none());
EXPECT_EQ(mBits.count(), mBits.size()); EXPECT_EQ(mBits.count(), mBits.size());
EXPECT_EQ(mBits.first(), 0u);
mBits.reset(); mBits.reset();
EXPECT_FALSE(mBits.all()); EXPECT_FALSE(mBits.all());
......
...@@ -1369,27 +1369,20 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( ...@@ -1369,27 +1369,20 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl(
} }
else else
{ {
gl::ShaderBitSet shaderBits = gl::ShaderBitSet remainingShaderBits =
executable->getSamplerShaderBitsForTextureUnitIndex(textureUnit); executable->getSamplerShaderBitsForTextureUnitIndex(textureUnit);
if (shaderBits.any()) ASSERT(remainingShaderBits.any());
gl::ShaderType firstShader = remainingShaderBits.first();
remainingShaderBits.reset(firstShader);
// If we have multiple shader accessing it, we barrier against all shader stage read
// given that we only support vertex/frag shaders
if (remainingShaderBits.any())
{ {
gl::ShaderType shader = textureLayout = vk::ImageLayout::AllGraphicsShadersReadOnly;
static_cast<gl::ShaderType>(gl::ScanForward(shaderBits.bits()));
shaderBits.reset(shader);
// If we have multiple shader accessing it, we barrier against all shader stage read
// given that we only support vertex/frag shaders
if (shaderBits.any())
{
textureLayout = vk::ImageLayout::AllGraphicsShadersReadOnly;
}
else
{
textureLayout = kShaderReadOnlyImageLayouts[shader];
}
} }
else else
{ {
textureLayout = vk::ImageLayout::AllGraphicsShadersReadOnly; textureLayout = kShaderReadOnlyImageLayouts[firstShader];
} }
} }
// Ensure the image is in read-only layout // Ensure the image is in read-only layout
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment