// // Copyright 2015 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. // // StateChangeTest: // Specifically designed for an ANGLE implementation of GL, these tests validate that // ANGLE's dirty bits systems don't get confused by certain sequences of state changes. // #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" #include "util/random_utils.h" #include <thread> usingnamespaceangle; namespace { class StateChangeTest : public ANGLETest<> { … }; class StateChangeTestES3 : public StateChangeTest { … }; class StateChangeTestES31 : public StateChangeTest { … }; // Ensure that CopyTexImage2D syncs framebuffer changes. TEST_P(StateChangeTest, CopyTexImage2DSync) { … } // Ensure that CopyTexSubImage2D syncs framebuffer changes. TEST_P(StateChangeTest, CopyTexSubImage2DSync) { … } // Test that Framebuffer completeness caching works when color attachments change. TEST_P(StateChangeTest, FramebufferIncompleteColorAttachment) { … } // Test that caching works when color attachments change with TexStorage. TEST_P(StateChangeTest, FramebufferIncompleteWithTexStorage) { … } // Test that caching works when color attachments change with CompressedTexImage2D. TEST_P(StateChangeTestES3, FramebufferIncompleteWithCompressedTex) { … } // Test that caching works when color attachments are deleted. TEST_P(StateChangeTestES3, FramebufferIncompleteWhenAttachmentDeleted) { … } // Test that Framebuffer completeness caching works when depth attachments change. TEST_P(StateChangeTest, FramebufferIncompleteDepthAttachment) { … } // Test that Framebuffer completeness caching works when stencil attachments change. TEST_P(StateChangeTest, FramebufferIncompleteStencilAttachment) { … } // Test that Framebuffer completeness caching works when depth-stencil attachments change. TEST_P(StateChangeTestES3, FramebufferIncompleteDepthStencilAttachment) { … } // Test that enabling GL_SAMPLE_ALPHA_TO_COVERAGE doesn't generate errors. TEST_P(StateChangeTest, AlphaToCoverageEnable) { … } const char kSimpleAttributeVS[] = …; const char kSimpleAttributeFS[] = …; // Tests that using a buffered attribute, then disabling it and using current value, works. TEST_P(StateChangeTest, DisablingBufferedVertexAttribute) { … } // Tests that setting value for a subset of default attributes doesn't affect others. TEST_P(StateChangeTest, SetCurrentAttribute) { … } // Tests that drawing with transform feedback paused, then lines without transform feedback works // without Vulkan validation errors. TEST_P(StateChangeTestES3, DrawPausedXfbThenNonXfbLines) { … } // Tests that vertex attribute value is preserved across context switches. TEST_P(StateChangeTest, MultiContextVertexAttribute) { … } // Ensure that CopyTexSubImage3D syncs framebuffer changes. TEST_P(StateChangeTestES3, CopyTexSubImage3DSync) { … } // Ensure that BlitFramebuffer syncs framebuffer changes. TEST_P(StateChangeTestES3, BlitFramebufferSync) { … } // Ensure that ReadBuffer and DrawBuffers sync framebuffer changes. TEST_P(StateChangeTestES3, ReadBufferAndDrawBuffersSync) { … } // Tests calling invalidate on incomplete framebuffers after switching attachments. // Adapted partially from WebGL 2 test "renderbuffers/invalidate-framebuffer" TEST_P(StateChangeTestES3, IncompleteRenderbufferAttachmentInvalidateSync) { … } class StateChangeRenderTest : public StateChangeTest { … }; // Test that re-creating a currently attached texture works as expected. TEST_P(StateChangeRenderTest, RecreateTexture) { … } // Test that re-creating a currently attached renderbuffer works as expected. TEST_P(StateChangeRenderTest, RecreateRenderbuffer) { … } // Test that recreating a texture with GenerateMipmaps signals the FBO is dirty. TEST_P(StateChangeRenderTest, GenerateMipmap) { … } // Tests that gl_DepthRange syncs correctly after a change. TEST_P(StateChangeRenderTest, DepthRangeUpdates) { … } class StateChangeRenderTestES3 : public StateChangeRenderTest { … }; TEST_P(StateChangeRenderTestES3, InvalidateNonCurrentFramebuffer) { … } // Tests that D3D11 dirty bit updates don't forget about BufferSubData attrib updates. TEST_P(StateChangeTest, VertexBufferUpdatedAfterDraw) { … } // Tests that drawing after flush without any state change works. TEST_P(StateChangeTestES3, DrawAfterFlushWithNoStateChange) { … } // Test that switching VAOs keeps the disabled "current value" attributes up-to-date. TEST_P(StateChangeTestES3, VertexArrayObjectAndDisabledAttributes) { … } const char kSamplerMetadataVertexShader0[] = …; const char kSamplerMetadataVertexShader1[] = …; const char kSamplerMetadataFragmentShader[] = …; // Tests that changing an active program invalidates the sampler metadata properly. TEST_P(StateChangeTestES3, SamplerMetadataUpdateOnSetProgram) { … } // Tests that redefining Buffer storage syncs with the Transform Feedback object. TEST_P(StateChangeTestES3, RedefineTransformFeedbackBuffer) { … } // Variations: // // - bool: whether to use WebGL compatibility mode. StateChangeTestWebGL2Params; std::string StateChangeTestWebGL2Print( const ::testing::TestParamInfo<StateChangeTestWebGL2Params> ¶msInfo) { … } // State change test verifying both ES3 and WebGL2 specific behaviors. // Test is parameterized to allow execution with and without WebGL validation. // Note that this can not inherit from StateChangeTest due to the need to use ANGLETestWithParam. class StateChangeTestWebGL2 : public ANGLETest<StateChangeTestWebGL2Params> { … }; // Note: tested multiple other combinations: // // - Clearing/drawing to the framebuffer after invalidating, without using a // secondary FBO // - Clearing the framebuffer after invalidating, using a secondary FBO // - Invalidating after clearing/drawing to the FBO, to verify WebGL's behavior // that after invalidation, the framebuffer is either unmodified, or cleared // to transparent black // // This combination, drawing after invalidating plus copying from the drawn-to // texture, was the only one which provoked the original bug in the Metal // backend with the following command line arguments: // // MTL_DEBUG_LAYER=1 MTL_DEBUG_LAYER_VALIDATE_LOAD_ACTIONS=1 \ // MTL_DEBUG_LAYER_VALIDATE_STORE_ACTIONS=1 \ // MTL_DEBUG_LAYER_VALIDATE_UNRETAINED_RESOURCES=4 \ // angle_end2end_tests ... // // See anglebug.com/42265402. TEST_P(StateChangeTestWebGL2, InvalidateThenDrawFBO) { … } // Simple state change tests for line loop drawing. There is some very specific handling of line // line loops in Vulkan and we need to test switching between drawElements and drawArrays calls to // validate every edge cases. class LineLoopStateChangeTest : public StateChangeTest { … }; // Draw an hourglass with a drawElements call followed by a square with drawArrays. TEST_P(LineLoopStateChangeTest, DrawElementsThenDrawArrays) { … } // Draw line loop using a drawArrays followed by an hourglass with drawElements. TEST_P(LineLoopStateChangeTest, DrawArraysThenDrawElements) { … } // Draw a triangle with a drawElements call and a non-zero offset and draw the same // triangle with the same offset again followed by a line loop with drawElements. TEST_P(LineLoopStateChangeTest, DrawElementsThenDrawElements) { … } // Simple state change tests, primarily focused on basic object lifetime and dependency management // with back-ends that don't support that automatically (i.e. Vulkan). class SimpleStateChangeTest : public ANGLETest<> { … }; class SimpleStateChangeTestES3 : public SimpleStateChangeTest { … }; class SimpleStateChangeTestES31 : public SimpleStateChangeTestES3 { … }; class SimpleStateChangeTestComputeES31 : public SimpleStateChangeTest { … }; class ImageES31PPO { … }; class SimpleStateChangeTestComputeES31PPO : public ImageES31PPO, public SimpleStateChangeTest { … }; constexpr char kSimpleVertexShader[] = …; constexpr char kSimpleVertexShaderForPoints[] = …; constexpr char kZeroVertexShaderForPoints[] = …; constexpr char kSimpleFragmentShader[] = …; void SimpleStateChangeTest::simpleDrawWithBuffer(GLBuffer *buffer) { … } void SimpleStateChangeTest::simpleDrawWithColor(const GLColor &color) { … } // Test that we can do a drawElements call successfully after making a drawArrays call in the same // frame. TEST_P(SimpleStateChangeTest, DrawArraysThenDrawElements) { … } // Draw a triangle with drawElements and a non-zero offset and draw the same // triangle with the same offset followed by binding the same element buffer. TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElements) { … } // Draw a triangle with drawElements then change the index buffer and draw again. TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElementsNewIndexBuffer) { … } // Draw a triangle with drawElements then change the indices and draw again. TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElementsNewIndices) { … } // Draw a triangle with drawElements then change the indices and draw again. Similar to // DrawElementsThenDrawElementsNewIndices, but changes the whole index buffer (not just half). This // triggers a different path in the Vulkan backend based on the fact that the majority of the buffer // is being updated. TEST_P(SimpleStateChangeTest, DrawElementsThenDrawElementsWholeNewIndices) { … } // Draw a triangle with drawElements and a non-zero offset and draw the same // triangle with the same offset followed by binding a USHORT element buffer. TEST_P(SimpleStateChangeTest, DrawElementsUBYTEX2ThenDrawElementsUSHORT) { … } // Draw a points use multiple unaligned vertex buffer with same data, // verify all the rendering results are the same. TEST_P(SimpleStateChangeTest, DrawRepeatUnalignedVboChange) { … } // Handles deleting a Buffer when it's being used. TEST_P(SimpleStateChangeTest, DeleteBufferInUse) { … } // Tests that resizing a Buffer during a draw works as expected. TEST_P(SimpleStateChangeTest, RedefineBufferInUse) { … } // Tests updating a buffer's contents while in use, without redefining it. TEST_P(SimpleStateChangeTest, UpdateBufferInUse) { … } // Tests that deleting an in-flight Texture does not immediately delete the resource. TEST_P(SimpleStateChangeTest, DeleteTextureInUse) { … } // Tests that modifying a texture parameter in-flight does not cause problems. TEST_P(SimpleStateChangeTest, ChangeTextureFilterModeBetweenTwoDraws) { … } // Tests that bind the same texture all the time between different draw calls. TEST_P(SimpleStateChangeTest, RebindTextureDrawAgain) { … } // Tests that we can draw with a texture, modify the texture with a texSubImage, and then draw again // correctly. TEST_P(SimpleStateChangeTest, DrawWithTextureTexSubImageThenDrawAgain) { … } // Test that we can alternate between textures between different draws. TEST_P(SimpleStateChangeTest, DrawTextureAThenTextureBThenTextureA) { … } // Tests that redefining an in-flight Texture does not affect the in-flight resource. TEST_P(SimpleStateChangeTest, RedefineTextureInUse) { … } // Test updating a Texture's contents while in use by GL works as expected. TEST_P(SimpleStateChangeTest, UpdateTextureInUse) { … } void SimpleStateChangeTest::updateTextureBoundToFramebufferHelper(UpdateFunc updateFunc) { … } // Tests that TexSubImage updates are flushed before rendering. TEST_P(SimpleStateChangeTest, TexSubImageOnTextureBoundToFrambuffer) { … } // Tests that CopyTexSubImage updates are flushed before rendering. TEST_P(SimpleStateChangeTest, CopyTexSubImageOnTextureBoundToFrambuffer) { … } // Tests that the read framebuffer doesn't affect what the draw call thinks the attachments are // (which is what the draw framebuffer dictates) when a command is issued with the GL_FRAMEBUFFER // target. TEST_P(SimpleStateChangeTestES3, ReadFramebufferDrawFramebufferDifferentAttachments) { … } // Tests that invalidate then copy then blend works. TEST_P(SimpleStateChangeTestES3, InvalidateThenCopyThenBlend) { … } // Tests that invalidate then blit then blend works. TEST_P(SimpleStateChangeTestES3, InvalidateThenBlitThenBlend) { … } // Tests that invalidate then generate mipmaps works TEST_P(SimpleStateChangeTestES3, InvalidateThenGenerateMipmapsThenBlend) { … } // Tests that invalidate then upload works TEST_P(SimpleStateChangeTestES3, InvalidateThenUploadThenBlend) { … } // Tests that invalidate then sub upload works TEST_P(SimpleStateChangeTestES3, InvalidateThenSubUploadThenBlend) { … } // Tests that invalidate then compute write works TEST_P(SimpleStateChangeTestES31, InvalidateThenStorageWriteThenBlend) { … } // Tests that invalidate then compute write works inside PPO TEST_P(SimpleStateChangeTestES31, InvalidateThenStorageWriteThenBlendPpo) { … } // Tests that sub-invalidate then draw works. TEST_P(SimpleStateChangeTestES3, SubInvalidateThenDraw) { … } // Tests that mid-render-pass invalidate then clear works for color buffers. This test ensures that // the invalidate is undone on draw. TEST_P(SimpleStateChangeTestES3, ColorInvalidateThenClear) { … } // Tests that mid-render-pass invalidate then clear works for depth buffers. This test ensures that // the invalidate is undone on draw. TEST_P(SimpleStateChangeTestES3, DepthInvalidateThenClear) { … } // Invalidate an RGB framebuffer and verify that the alpha channel is not destroyed and remains // valid after a draw call. TEST_P(SimpleStateChangeTestES3, InvalidateRGBThenDraw) { … } // Invalidate an RGB framebuffer and verify that the alpha channel is not destroyed, even if the // color channels may be garbage. TEST_P(SimpleStateChangeTestES3, DrawAndInvalidateRGBThenVerifyAlpha) { … } // Tests deleting a Framebuffer that is in use. TEST_P(SimpleStateChangeTest, DeleteFramebufferInUse) { … } // This test was made to reproduce a specific issue with our Vulkan backend where were releasing // buffers too early. The test has 2 textures, we first create a texture and update it with // multiple updates, but we don't use it right away, we instead draw using another texture // then we bind the first texture and draw with it. TEST_P(SimpleStateChangeTest, DynamicAllocationOfMemoryForTextures) { … } // Tests deleting a Framebuffer that is in use. TEST_P(SimpleStateChangeTest, RedefineFramebufferInUse) { … } // Tests that redefining a Framebuffer Texture Attachment works as expected. TEST_P(SimpleStateChangeTest, RedefineFramebufferTexture) { … } // Trips a bug in the Vulkan back-end where a Texture wouldn't transition correctly. TEST_P(SimpleStateChangeTest, DrawAndClearTextureRepeatedly) { … } // Test that clear followed by rebind of framebuffer attachment works (with noop clear in between). TEST_P(SimpleStateChangeTestES3, ClearThenNoopClearThenRebindAttachment) { … } // Test that clear followed by rebind of framebuffer attachment works (with 0-sized scissor clear in // between). TEST_P(SimpleStateChangeTestES3, ClearThenZeroSizeScissoredClearThenRebindAttachment) { … } // Test that clear followed by rebind of framebuffer attachment works (with noop blit in between). TEST_P(SimpleStateChangeTestES3, ClearThenNoopBlitThenRebindAttachment) { … } // Validates disabling cull face really disables it. TEST_P(SimpleStateChangeTest, EnableAndDisableCullFace) { … } TEST_P(SimpleStateChangeTest, ScissorTest) { … } // This test validates we are able to change the valid of a uniform dynamically. TEST_P(SimpleStateChangeTest, UniformUpdateTest) { … } // Tests that changing the storage of a Renderbuffer currently in use by GL works as expected. TEST_P(SimpleStateChangeTest, RedefineRenderbufferInUse) { … } // Validate that we can draw -> change frame buffer size -> draw and we'll be rendering // at the full size of the new framebuffer. TEST_P(SimpleStateChangeTest, ChangeFramebufferSizeBetweenTwoDraws) { … } // Tries to relink a program in use and use it again to draw something else. TEST_P(SimpleStateChangeTest, RelinkProgram) { … } // Creates a program that uses uniforms and then immediately release it and then use it. Should be // valid. TEST_P(SimpleStateChangeTest, ReleaseShaderInUseThatReadsFromUniforms) { … } // Tests that sampler sync isn't masked by program textures. TEST_P(SimpleStateChangeTestES3, SamplerSyncNotTiedToProgram) { … } // Tests different samplers can be used with same texture obj on different tex units. TEST_P(SimpleStateChangeTestES3, MultipleSamplersWithSingleTextureObject) { … } // Tests that rendering works as expected with multiple VAOs. TEST_P(SimpleStateChangeTestES31, MultipleVertexArrayObjectRendering) { … } // Tests that consecutive identical draw calls that write to an image in the fragment shader work // correctly. This requires a memory barrier in between the draw calls which should not be // reordered w.r.t the calls. TEST_P(SimpleStateChangeTestES31, DrawWithImageTextureThenDrawAgain) { … } // Tests that sampling from a texture in one draw call followed by writing to its image in another // draw call works correctly. This requires a barrier in between the draw calls. TEST_P(SimpleStateChangeTestES31, DrawWithTextureThenDrawWithImage) { … } // Tests that reading from a ubo in one draw call followed by writing to it as SSBO in another draw // call works correctly. This requires a barrier in between the draw calls. TEST_P(SimpleStateChangeTestES31, DrawWithUBOThenDrawWithSSBO) { … } // Tests that writing to an SSBO in the fragment shader before and after a change to the drawbuffers // still works TEST_P(SimpleStateChangeTestES31, FragWriteSSBOThenChangeDrawbuffersThenWriteSSBO) { … } // Tests that writing to an SSBO in the vertex shader before and after a change to the drawbuffers // still works TEST_P(SimpleStateChangeTestES31, VertWriteSSBOThenChangeDrawbuffersThenWriteSSBO) { … } // Tests that rendering to a texture in one draw call followed by sampling from it in a dispatch // call works correctly. This requires an implicit barrier in between the calls. TEST_P(SimpleStateChangeTestES31, DrawThenSampleWithCompute) { … } // Tests that clearing a texture followed by sampling from it in a dispatch call works correctly. // In the Vulkan backend, the clear is deferred and should be flushed correctly. TEST_P(SimpleStateChangeTestES31, ClearThenSampleWithCompute) { … } // Tests that writing to a buffer with transform feedback in one draw call followed by reading from // it in a dispatch call works correctly. This requires an implicit barrier in between the calls. TEST_P(SimpleStateChangeTestES31, TransformFeedbackThenReadWithCompute) { … } // Tests that deleting an in-flight image texture does not immediately delete the resource. TEST_P(SimpleStateChangeTestComputeES31, DeleteImageTextureInUse) { … } // Tests that bind the same image texture all the time between different dispatch calls. TEST_P(SimpleStateChangeTestComputeES31, RebindImageTextureDispatchAgain) { … } // Tests that we can dispatch with an image texture, modify the image texture with a texSubImage, // and then dispatch again correctly. TEST_P(SimpleStateChangeTestComputeES31, DispatchWithImageTextureTexSubImageThenDispatchAgain) { … } // Test updating an image texture's contents while in use by GL works as expected. TEST_P(SimpleStateChangeTestComputeES31, UpdateImageTextureInUse) { … } // Test that we can alternate between image textures between different dispatchs. TEST_P(SimpleStateChangeTestComputeES31, DispatchImageTextureAThenTextureBThenTextureA) { … } // Tests that glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) after draw works, where the render // pass is marked as closed. TEST_P(SimpleStateChangeTestES31, DrawThenChangeFBOThenStorageWrite) { … } // Copied from SimpleStateChangeTestComputeES31::DeleteImageTextureInUse // Tests that deleting an in-flight image texture does not immediately delete the resource. TEST_P(SimpleStateChangeTestComputeES31PPO, DeleteImageTextureInUse) { … } static constexpr char kColorVS[] = …; static constexpr char kColorFS[] = …; class ValidationStateChangeTest : public ANGLETest<> { … }; class WebGL2ValidationStateChangeTest : public ValidationStateChangeTest { … }; class ValidationStateChangeTestES31 : public ANGLETest<> { … }; class WebGLComputeValidationStateChangeTest : public ANGLETest<> { … }; class RobustBufferAccessWebGL2ValidationStateChangeTest : public WebGL2ValidationStateChangeTest { … }; // Tests that mapping and unmapping an array buffer in various ways causes rendering to fail. // This isn't guaranteed to produce an error by GL. But we assume ANGLE always errors. TEST_P(ValidationStateChangeTest, MapBufferAndDraw) { … } // Tests that mapping an immutable and persistent buffer after calling glVertexAttribPointer() // allows rendering to succeed. TEST_P(ValidationStateChangeTest, MapImmutablePersistentBufferAndDraw) { … } // Tests that mapping an immutable and persistent buffer before calling glVertexAttribPointer() // allows rendering to succeed. This case is special in that the VertexArray is not observing the // buffer yet, so it's various cached buffer states aren't updated when the buffer is mapped. TEST_P(ValidationStateChangeTest, MapImmutablePersistentBufferThenVAPAndDraw) { … } // Tests that changing a vertex binding with glVertexAttribDivisor updates the mapped buffer check. TEST_P(ValidationStateChangeTestES31, MapBufferAndDrawWithDivisor) { … } // Tests that changing a vertex binding with glVertexAttribDivisor updates the buffer size check. TEST_P(WebGLComputeValidationStateChangeTest, DrawPastEndOfBufferWithDivisor) { … } // Tests state changes with uniform block validation. TEST_P(WebGL2ValidationStateChangeTest, UniformBlockNegativeAPI) { … } // Tests that redefining attachment storage updates the component type mask TEST_P(WebGL2ValidationStateChangeTest, AttachmentTypeRedefinition) { … } // Tests various state change effects on draw framebuffer validation. TEST_P(WebGL2ValidationStateChangeTest, DrawFramebufferNegativeAPI) { … } // Tests various state change effects on draw framebuffer validation with MRT. TEST_P(WebGL2ValidationStateChangeTest, MultiAttachmentDrawFramebufferNegativeAPI) { … } // Tests that switching the program properly syncs the framebuffer implementation TEST_P(WebGL2ValidationStateChangeTest, IncompatibleDrawFramebufferProgramSwitch) { … } // Tests that updating the render target storage properly syncs the framebuffer implementation TEST_P(WebGL2ValidationStateChangeTest, MultiAttachmentIncompatibleDrawFramebufferStorageUpdate) { … } // Tests negative API state change cases with Transform Feedback bindings. TEST_P(WebGL2ValidationStateChangeTest, TransformFeedbackNegativeAPI) { … } // Test sampler format validation caching works. TEST_P(WebGL2ValidationStateChangeTest, SamplerFormatCache) { … } // Tests that we retain the correct draw mode settings with transform feedback changes. TEST_P(ValidationStateChangeTest, TransformFeedbackDrawModes) { … } // Tests a valid rendering setup with two textures. Followed by a draw with conflicting samplers. TEST_P(ValidationStateChangeTest, TextureConflict) { … } // Tests that mapping the element array buffer triggers errors. TEST_P(ValidationStateChangeTest, MapElementArrayBuffer) { … } // Tests that deleting a non-active texture does not reset the current texture cache. TEST_P(SimpleStateChangeTest, DeleteNonActiveTextureThenDraw) { … } // Tests that deleting a texture successfully binds the zero texture. TEST_P(SimpleStateChangeTest, DeleteTextureThenDraw) { … } void SimpleStateChangeTest::bindTextureToFbo(GLFramebuffer &fbo, GLTexture &texture) { … } void SimpleStateChangeTest::drawToFboWithCulling(const GLenum frontFace, bool earlyFrontFaceDirty) { … } // Validates if culling rasterization states work with FBOs using CCW winding. TEST_P(SimpleStateChangeTest, FboEarlyCullFaceBackCCWState) { … } // Validates if culling rasterization states work with FBOs using CW winding. TEST_P(SimpleStateChangeTest, FboEarlyCullFaceBackCWState) { … } TEST_P(SimpleStateChangeTest, FboLateCullFaceBackCCWState) { … } // Validates if culling rasterization states work with FBOs using CW winding. TEST_P(SimpleStateChangeTest, FboLateCullFaceBackCWState) { … } // Test that vertex attribute translation is still kept after binding it to another buffer then // binding back to the previous buffer. TEST_P(SimpleStateChangeTest, RebindTranslatedAttribute) { … } // Test that switching between programs that only contain default uniforms is correct. TEST_P(SimpleStateChangeTest, TwoProgramsWithOnlyDefaultUniforms) { … } // Test that glDrawArrays when an empty-sized element array buffer is bound doesn't crash. // Regression test for crbug.com/1172577. TEST_P(SimpleStateChangeTest, DrawArraysWithZeroSizedElementArrayBuffer) { … } // Validates GL_RASTERIZER_DISCARD state is tracked correctly TEST_P(SimpleStateChangeTestES3, RasterizerDiscardState) { … } // Test that early return on binding the same texture is functional TEST_P(SimpleStateChangeTestES3, BindingSameTexture) { … } // Test that early return on binding the same sampler is functional TEST_P(SimpleStateChangeTestES3, BindingSameSampler) { … } // Test that early return on binding the same buffer is functional TEST_P(SimpleStateChangeTestES3, BindingSameBuffer) { … } class ImageRespecificationTest : public ANGLETest<> { … }; // Verify that a swizzle on an active sampler is handled appropriately TEST_P(ImageRespecificationTest, Swizzle) { … } // Verify that when a texture is respecified through glEGLImageTargetTexture2DOES, // the Framebuffer that has the texture as a color attachment is recreated before next use. TEST_P(ImageRespecificationTest, ImageTarget2DOESSwitch) { … } // Covers a bug where sometimes we wouldn't catch invalid element buffer sizes. TEST_P(WebGL2ValidationStateChangeTest, DeleteElementArrayBufferValidation) { … } // Covers a bug in the D3D11 back-end related to how buffers are translated. TEST_P(RobustBufferAccessWebGL2ValidationStateChangeTest, BindZeroSizeBufferThenDeleteBufferBug) { … } // Tests DrawElements with an empty buffer using a VAO. TEST_P(WebGL2ValidationStateChangeTest, DrawElementsEmptyVertexArray) { … } // Test that closing the render pass due to an update to UBO data then drawing non-indexed followed // by indexed works. TEST_P(SimpleStateChangeTestES31, DrawThenUpdateUBOThenDrawThenDrawIndexed) { … } // Test that switching framebuffers then a non-indexed draw followed by an indexed one works. TEST_P(SimpleStateChangeTestES31, DrawThenChangeFBOThenDrawThenDrawIndexed) { … } // Test that switching framebuffers then a non-indexed draw followed by an indexed one works, with // another context flushing work in between the two draw calls. TEST_P(SimpleStateChangeTestES31, DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed) { … } // Negative test for EXT_primitive_bounding_box TEST_P(SimpleStateChangeTestES31, PrimitiveBoundingBoxEXTNegativeTest) { … } // Negative test for OES_primitive_bounding_box TEST_P(SimpleStateChangeTestES31, PrimitiveBoundingBoxOESNegativeTest) { … } // Update an element array buffer that is already in use. TEST_P(SimpleStateChangeTest, UpdateBoundElementArrayBuffer) { … } // Covers a bug where we would use a stale cache variable in the Vulkan back-end. TEST_P(SimpleStateChangeTestES3, DeleteFramebufferBeforeQuery) { … } // Covers an edge case TEST_P(SimpleStateChangeTestES3, TextureTypeConflictAfterDraw) { … } // Regression test for a bug where a mutable texture is used with non-zero base level then rebased // to zero but made incomplete and attached to the framebuffer. The texture's image is not // recreated with level 0, leading to errors when drawing to the framebuffer. TEST_P(SimpleStateChangeTestES3, NonZeroBaseMutableTextureThenZeroBaseButIncompleteBug) { … } // Regression test for a bug where the framebuffer binding was not synced during invalidate when a // clear operation was deferred. TEST_P(SimpleStateChangeTestES3, ChangeFramebufferThenInvalidateWithClear) { … } // Test that clear / invalidate / clear works. The invalidate is for a target that's not cleared. // Regression test for a bug where invalidate() would start a render pass to perform the first // clear, while the second clear didn't expect a render pass opened without any draw calls in it. TEST_P(SimpleStateChangeTestES3, ClearColorInvalidateDepthClearColor) { … } // Regression test for a bug where glInvalidateFramebuffer(GL_FRAMEBUFFER, ...) was invalidating // both the draw and read framebuffers. TEST_P(SimpleStateChangeTestES3, InvalidateFramebufferShouldntInvalidateReadFramebuffer) { … } // Test that respecifies a buffer after we start XFB. TEST_P(SimpleStateChangeTestES3, RespecifyBufferAfterBeginTransformFeedback) { … } // Test a bug angleproject:6998 in TransformFeedback code path by allocating paddingBuffer first and // then allocate another buffer and then deallocate paddingBuffer and then allocate buffer again. // This new buffer will be allocated in the space where paddingBuffer was allocated which causing // XFB generate VVL error. TEST_P(SimpleStateChangeTestES3, RespecifyBufferAfterBeginTransformFeedbackInDeletedPaddingBuffer) { … } // Regression test for a bug in the Vulkan backend where a draw-based copy after a deferred flush // would lead to an image view being destroyed too early. TEST_P(SimpleStateChangeTestES3, DrawFlushThenCopyTexImage) { … } TEST_P(SimpleStateChangeTestES3, DrawFlushThenBlit) { … } class VertexAttribArrayStateChangeTest : public ANGLETest<> { … }; TEST_P(VertexAttribArrayStateChangeTest, Basic) { … } TEST_P(SimpleStateChangeTestES3, DepthOnlyToColorAttachmentPreservesBlendState) { … } // Tests a bug where we wouldn't update our cached base/max levels in Vulkan. TEST_P(SimpleStateChangeTestES3, MaxLevelChange) { … } // Tests a bug when removing an element array buffer bound to two vertex arrays. TEST_P(SimpleStateChangeTestES3, DeleteDoubleBoundBufferAndVertexArray) { … } // Tests state change for glLineWidth. TEST_P(StateChangeTestES3, LineWidth) { … } // Tests state change for out-of-range value for glLineWidth. The expectation // here is primarily that rendering backends do not crash with invalid line // width values. TEST_P(StateChangeTestES3, LineWidthOutOfRangeDoesntCrash) { … } // Tests state change for glPolygonOffset. TEST_P(StateChangeTestES3, PolygonOffset) { … } // Tests state change for glPolygonOffsetClampEXT. TEST_P(StateChangeTestES3, PolygonOffsetClamp) { … } // Tests state change for glBlendColor. TEST_P(StateChangeTestES3, BlendColor) { … } // Tests state change for ref and mask in glStencilFuncSeparate. TEST_P(StateChangeTestES3, StencilReferenceAndCompareMask) { … } // Tests state change for mask in glStencilMaskSeparate. TEST_P(StateChangeTestES3, StencilWriteMask) { … } // Tests that |discard| works with stencil write mask TEST_P(StateChangeTestES3, StencilWriteMaskVsDiscard) { … } // Tests state change for glCullFace and glEnable(GL_CULL_FACE) as well as glFrontFace TEST_P(StateChangeTestES3, CullFaceAndFrontFace) { … } // Tests state change for draw primitive mode TEST_P(StateChangeTestES3, PrimitiveMode) { … } // Tests that vertex attributes are correctly bound after a masked clear. In the Vulkan backend, // the masked clear is done with an internal shader that doesn't use vertex attributes. TEST_P(StateChangeTestES3, DrawMaskedClearDraw) { … } // Tests state change for vertex attribute stride TEST_P(StateChangeTestES3, VertexStride) { … } // Tests state change for vertex attribute format TEST_P(StateChangeTestES3, VertexFormat) { … } // Tests state change for depth test, write and function TEST_P(StateChangeTestES3, DepthTestWriteAndFunc) { … } // Tests state change for depth test while depth write is enabled TEST_P(StateChangeTestES3, DepthTestToggleWithDepthWrite) { … } // Tests state change for stencil test and function TEST_P(StateChangeTestES3, StencilTestAndFunc) { … } // Tests state change for rasterizer discard TEST_P(StateChangeTestES3, RasterizerDiscard) { … } // Tests state change for GL_POLYGON_OFFSET_FILL. TEST_P(StateChangeTestES3, PolygonOffsetFill) { … } // Tests state change for GL_PRIMITIVE_RESTART. TEST_P(StateChangeTestES3, PrimitiveRestart) { … } // Tests that primitive restart for patches can be queried when tessellation shaders are available, // and that its value is independent of whether primitive restart is enabled. TEST_P(StateChangeTestES31, PrimitiveRestartForPatchQuery) { … } // Tests state change for GL_COLOR_LOGIC_OP and glLogicOp. TEST_P(StateChangeTestES3, LogicOp) { … } // Test for a bug with the VK_EXT_graphics_pipeline_library implementation in a scenario such as // this: // // - Use blend function A, draw <-- a new pipeline is created // - Use blend function B, draw <-- a new pipeline is created, // new transition from A to B // - Switch to program 2 // - Use blend function A, draw <-- a new pipeline is created // - Switch to program 1 // - draw <-- the first pipeline is retrieved from cache, // new transition from B to A // - Use blend function B, draw <-- the second pipeline is retrieved from transition // - Switch to program 3 // - draw <-- a new pipeline is created // // With graphics pipeline library, the fragment output partial pipeline changes as follows: // // - Use blend function A, draw <-- a new fragment output pipeline is created // - Use blend function B, draw <-- a new fragment output pipeline is created, // new transition from A to B // - Switch to program 2 // - Use blend function A, draw <-- the first fragment output pipeline is retrieved from cache // - Switch to program 1 // - draw <-- the first monolithic pipeline is retrieved from cache // - Use blend function B, draw <-- the second monolithic pipeline is retrieved from transition // - Switch to program 3 // - draw <-- the second fragment output pipeline is retrieved from cache // // The bug was that the dirty blend state was discarded when the monolithic pipeline was retrieved // through the transition graph, and the last draw call used a stale fragment output pipeline (from // the last draw call with function A) // TEST_P(StateChangeTestES3, FragmentOutputStateChangeAfterCachedPipelineTransition) { … } // Tests a specific case for multiview and queries. TEST_P(SimpleStateChangeTestES3, MultiviewAndQueries) { … } // Tests a bug related to an ordering of certain commands. TEST_P(SimpleStateChangeTestES3, ClearQuerySwapClear) { … } // Tests a bug around sampler2D swap and uniform locations. TEST_P(StateChangeTestES3, SamplerSwap) { … } // Tests a bug around sampler2D reordering and uniform locations. TEST_P(StateChangeTestES3, SamplerReordering) { … } // Test that switching FBO attachments affects sample coverage TEST_P(StateChangeTestES3, SampleCoverageFramebufferAttachmentSwitch) { … } // Test that switching FBO attachments affects alpha-to-coverage TEST_P(StateChangeTestES3, AlphaToCoverageFramebufferAttachmentSwitch) { … } // Test that switching FBO attachments affects depth test TEST_P(StateChangeTestES3, DepthTestFramebufferAttachmentSwitch) { … } // Test that switching FBO attachments affects blend state TEST_P(StateChangeTestES3, BlendFramebufferAttachmentSwitch) { … } // Tests state change for sample shading. TEST_P(StateChangeTestES31, SampleShading) { … } // Tests state changes with uniform block binding. TEST_P(StateChangeTestES3, UniformBlockBinding) { … } // Tests that viewport changes within a render pass are correct. WebGPU sets a default viewport, // cover the omission of setViewport in the backend. TEST_P(StateChangeTest, ViewportChangeWithinRenderPass) { … } // Tests that scissor changes within a render pass are correct. WebGPU sets a default scissor, cover // the omission of setScissorRect in the backend. TEST_P(StateChangeTest, ScissortChangeWithinRenderPass) { … } } // anonymous namespace ANGLE_INSTANTIATE_TEST_ES2(…); ANGLE_INSTANTIATE_TEST_ES2(…); ANGLE_INSTANTIATE_TEST_ES2(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3_AND(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31_AND(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_COMBINE_1(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…); ANGLE_INSTANTIATE_TEST_ES2(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3_AND(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…);