// Copyright 2020 The Dawn & Tint Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <vector> #include "dawn/tests/DawnTest.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { // Clear the content of the result buffer into 0xFFFFFFFF. constexpr static uint64_t kSentinelValue = …; constexpr static uint64_t kZero = …; constexpr static unsigned int kRTSize = …; constexpr uint64_t kMinDestinationOffset = …; constexpr uint64_t kMinCount = …; constexpr wgpu::TextureFormat kColorFormat = …; constexpr wgpu::TextureFormat kDepthStencilFormat = …; class QueryTests : public DawnTest { … }; class OcclusionExpectation : public detail::Expectation { … }; class OcclusionQueryTests : public QueryTests { … }; // Test creating query set with the type of Occlusion TEST_P(OcclusionQueryTests, QuerySetCreation) { … } // Test destroying query set TEST_P(OcclusionQueryTests, QuerySetDestroy) { … } // Draw a bottom right triangle with depth/stencil testing enabled and check whether there is // sample passed the testing by non-precise occlusion query with the results: // zero indicates that no sample passed depth/stencil testing, // non-zero indicates that at least one sample passed depth/stencil testing. TEST_P(OcclusionQueryTests, QueryWithDepthStencilTest) { … } // Draw a bottom right triangle with scissor testing enabled and check whether there is // sample passed the testing by non-precise occlusion query with the results: // zero indicates that no sample passed scissor testing, // non-zero indicates that at least one sample passed scissor testing. TEST_P(OcclusionQueryTests, QueryWithScissorTest) { … } // Test begin occlusion query with same query index on different render pass TEST_P(OcclusionQueryTests, Rewrite) { … } // Test resolving occlusion query correctly if the queries are written sparsely, which also tests // the query resetting at the start of render passes on Vulkan backend. TEST_P(OcclusionQueryTests, ResolveSparseQueries) { … } // Test resolving occlusion query to 0 if all queries are not written TEST_P(OcclusionQueryTests, ResolveWithoutWritten) { … } // Test setting an occlusion query to non-zero, then rewriting it without drawing, resolves to 0. TEST_P(OcclusionQueryTests, RewriteNoDrawToZero) { … } // Test setting an occlusion query to non-zero, then rewriting it without drawing, resolves to 0. // Do the two queries+resolves in separate submits. TEST_P(OcclusionQueryTests, RewriteNoDrawToZeroSeparateSubmit) { … } // Test that resetting an occlusion query to zero works when a draw is done where all primitives // fail the depth test. TEST_P(OcclusionQueryTests, RewriteToZeroWithDraw) { … } // Test resolving occlusion query to the destination buffer with offset TEST_P(OcclusionQueryTests, ResolveToBufferWithOffset) { … } class TimestampExpectation : public detail::Expectation { … }; class TimestampQueryTests : public QueryTests { … }; // Test creating query set with the type of Timestamp TEST_P(TimestampQueryTests, QuerySetCreation) { … } // Test calling timestamp query from command encoder TEST_P(TimestampQueryTests, TimestampOnCommandEncoder) { … } // Test timestampWrites with query set in compute pass descriptor TEST_P(TimestampQueryTests, TimestampWritesQuerySetOnComputePass) { … } // Test timestampWrites with query index in compute pass descriptor TEST_P(TimestampQueryTests, TimestampWritesQueryIndexOnComputePass) { … } // Test timestampWrites with timestamp location in compute pass descriptor TEST_P(TimestampQueryTests, TimestampWritesLocationOnComputePass) { … } // Test timestampWrites on compute pass without pipeline TEST_P(TimestampQueryTests, TimestampWritesOnComputePassWithNoPipline) { … } // Test timestampWrites with query set in render pass descriptor TEST_P(TimestampQueryTests, TimestampWritesQuerySetOnRenderPass) { … } // Test timestampWrites with query index in render pass descriptor TEST_P(TimestampQueryTests, TimestampWritesQueryIndexOnRenderPass) { … } // Test timestampWrites with timestamp location in render pass descriptor TEST_P(TimestampQueryTests, TimestampWritesLocationOnRenderPass) { … } // Test timestampWrites on render pass without pipeline TEST_P(TimestampQueryTests, TimestampWritesOnRenderPassWithNoPipline) { … } // Test timestampWrites on render pass with pipeline but no fragment stage TEST_P(TimestampQueryTests, TimestampWritesOnRenderPassWithOnlyVertexStage) { … } // Test resolving timestamp query from another different encoder TEST_P(TimestampQueryTests, ResolveFromAnotherEncoder) { … } // Test resolving timestamp query correctly if the queries are written sparsely TEST_P(TimestampQueryTests, ResolveSparseQueries) { … } // Test resolving timestamp query to 0 if all queries are not written TEST_P(TimestampQueryTests, ResolveWithoutWritten) { … } // Test resolving timestamp query to one slot in the buffer TEST_P(TimestampQueryTests, ResolveToBufferWithOffset) { … } // Test resolving a query set twice into the same destination buffer with potentially overlapping // ranges TEST_P(TimestampQueryTests, ResolveTwiceToSameBuffer) { … } // Test calling WriteTimestamp many times into separate query sets. // Regression test for crbug.com/dawn/1603. TEST_P(TimestampQueryTests, ManyWriteTimestampDistinctQuerySets) { … } class TimestampQueryInsidePassesTests : public TimestampQueryTests { … }; // Test calling timestamp query from render pass encoder TEST_P(TimestampQueryInsidePassesTests, FromOnRenderPass) { … } // Test calling timestamp query from compute pass encoder TEST_P(TimestampQueryInsidePassesTests, FromComputePass) { … } DAWN_INSTANTIATE_TEST(OcclusionQueryTests, D3D11Backend(), D3D12Backend(), MetalBackend(), MetalBackend({ … }; DAWN_INSTANTIATE_TEST(TimestampQueryTests, D3D11Backend(), D3D12Backend(), MetalBackend(), OpenGLBackend(), OpenGLESBackend(), VulkanBackend()); DAWN_INSTANTIATE_TEST(TimestampQueryInsidePassesTests, D3D11Backend(), D3D12Backend(), MetalBackend(), OpenGLBackend(), OpenGLESBackend(), VulkanBackend()); } // anonymous namespace } // namespace dawn