| // |
| // Copyright 2020 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // VulkanDescriptorSetTest: |
| // Various tests related for Vulkan descriptor sets. |
| // |
| |
| #include "test_utils/ANGLETest.h" |
| #include "test_utils/gl_raii.h" |
| |
| #include "libANGLE/Context.h" |
| #include "libANGLE/angletypes.h" |
| #include "libANGLE/renderer/vulkan/ContextVk.h" |
| #include "libANGLE/renderer/vulkan/ProgramVk.h" |
| #include "libANGLE/renderer/vulkan/vk_helpers.h" |
| |
| using namespace angle; |
| |
| namespace |
| { |
| |
| class VulkanDescriptorSetTest : public ANGLETest<> |
| { |
| protected: |
| VulkanDescriptorSetTest() {} |
| |
| void testSetUp() override |
| { |
| mMaxSetsPerPool = rx::vk::DynamicDescriptorPool::GetMaxSetsPerPoolForTesting(); |
| mMaxSetsPerPoolMultiplier = |
| rx::vk::DynamicDescriptorPool::GetMaxSetsPerPoolMultiplierForTesting(); |
| } |
| |
| void testTearDown() override |
| { |
| rx::vk::DynamicDescriptorPool::SetMaxSetsPerPoolForTesting(mMaxSetsPerPool); |
| rx::vk::DynamicDescriptorPool::SetMaxSetsPerPoolMultiplierForTesting( |
| mMaxSetsPerPoolMultiplier); |
| } |
| |
| static constexpr uint32_t kMaxSetsForTesting = 1; |
| static constexpr uint32_t kMaxSetsMultiplierForTesting = 1; |
| |
| void limitMaxSets() |
| { |
| rx::vk::DynamicDescriptorPool::SetMaxSetsPerPoolForTesting(kMaxSetsForTesting); |
| rx::vk::DynamicDescriptorPool::SetMaxSetsPerPoolMultiplierForTesting( |
| kMaxSetsMultiplierForTesting); |
| } |
| |
| private: |
| uint32_t mMaxSetsPerPool; |
| uint32_t mMaxSetsPerPoolMultiplier; |
| }; |
| |
| // Test atomic counter read. |
| TEST_P(VulkanDescriptorSetTest, AtomicCounterReadLimitedDescriptorPool) |
| { |
| // Skipping test while we work on enabling atomic counter buffer support in th D3D renderer. |
| // http://anglebug.com/1729 |
| ANGLE_SKIP_TEST_IF(IsD3D11()); |
| |
| // Must be before program creation to limit the descriptor pool sizes when creating the pipeline |
| // layout. |
| limitMaxSets(); |
| |
| constexpr char kFS[] = |
| "#version 310 es\n" |
| "precision highp float;\n" |
| "layout(binding = 0, offset = 4) uniform atomic_uint ac;\n" |
| "out highp vec4 my_color;\n" |
| "void main()\n" |
| "{\n" |
| " my_color = vec4(0.0);\n" |
| " uint a1 = atomicCounter(ac);\n" |
| " if (a1 == 3u) my_color = vec4(1.0);\n" |
| "}\n"; |
| |
| ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS); |
| |
| glUseProgram(program.get()); |
| |
| // The initial value of counter 'ac' is 3u. |
| unsigned int bufferData[3] = {11u, 3u, 1u}; |
| GLBuffer atomicCounterBuffer; |
| glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, atomicCounterBuffer); |
| glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomicCounterBuffer); |
| |
| for (int i = 0; i < 5; ++i) |
| { |
| glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(bufferData), bufferData, GL_STATIC_DRAW); |
| drawQuad(program.get(), essl31_shaders::PositionAttrib(), 0.0f); |
| ASSERT_GL_NO_ERROR(); |
| EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white); |
| } |
| } |
| |
| ANGLE_INSTANTIATE_TEST(VulkanDescriptorSetTest, ES31_VULKAN(), ES31_VULKAN_SWIFTSHADER()); |
| |
| } // namespace |