Commit 8305ebd4 by Tim Van Patten Committed by Commit Bot

Add tests to show bad waitSync/flush behavior

Add the following tests to show ANGLE's poor behavior with glWaitSync/glFlush leading to a vkQueueSubmit each time: FenceSyncTest::MultipleFenceDraw MultithreadingTestES3::MultithreadFenceDraw MultithreadingTestES3::MultithreadFenceTexImage Bug: angleproject:5306 Test: FenceSyncTest::MultipleFenceDraw Test: MultithreadingTestES3::MultithreadFenceDraw Test: MultithreadingTestES3, MultithreadFenceTexImage Change-Id: I16f653af028677e3c621c3b9a7fd5963fa03d656 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2519092Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Tim Van Patten <timvp@google.com>
parent 9a0284e8
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
// //
#include "test_utils/ANGLETest.h" #include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
using namespace angle; using namespace angle;
...@@ -25,11 +26,14 @@ class FenceNVTest : public ANGLETest ...@@ -25,11 +26,14 @@ class FenceNVTest : public ANGLETest
class FenceSyncTest : public ANGLETest class FenceSyncTest : public ANGLETest
{ {
public:
static constexpr uint32_t kSize = 1024;
protected: protected:
FenceSyncTest() FenceSyncTest()
{ {
setWindowWidth(128); setWindowWidth(kSize);
setWindowHeight(128); setWindowHeight(kSize);
setConfigRedBits(8); setConfigRedBits(8);
setConfigGreenBits(8); setConfigGreenBits(8);
setConfigBlueBits(8); setConfigBlueBits(8);
...@@ -259,6 +263,78 @@ TEST_P(FenceSyncTest, BasicOperations) ...@@ -259,6 +263,78 @@ TEST_P(FenceSyncTest, BasicOperations)
} }
} }
// Test that multiple fences and draws can be issued
TEST_P(FenceSyncTest, MultipleFenceDraw)
{
constexpr int kNumIterations = 10;
constexpr int kNumDraws = 5;
// Create a texture/FBO to draw to
GLTexture texture;
glBindTexture(GL_TEXTURE_2D, texture.get());
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
ASSERT_GL_NO_ERROR();
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
ANGLE_GL_PROGRAM(redProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
bool drawGreen = true;
for (int numIterations = 0; numIterations < kNumIterations; ++numIterations)
{
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
ASSERT_GL_NO_ERROR();
for (int i = 0; i < kNumDraws; ++i)
{
GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
ASSERT_GL_NO_ERROR();
// Force the fence to be created
glFlush();
drawGreen = !drawGreen;
GLuint program = 0;
if (drawGreen)
{
program = greenProgram.get();
}
else
{
program = redProgram.get();
}
drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.0f);
ASSERT_GL_NO_ERROR();
glWaitSync(sync, 0, GL_TIMEOUT_IGNORED);
EXPECT_GL_NO_ERROR();
glDeleteSync(sync);
ASSERT_GL_NO_ERROR();
}
// Blit to the default FBO
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
ASSERT_GL_NO_ERROR();
swapBuffers();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLColor color;
if (drawGreen)
{
color = GLColor::green;
}
else
{
color = GLColor::red;
}
EXPECT_PIXEL_RECT_EQ(0, 0, kSize, kSize, color);
}
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these // Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against. // tests should be run against.
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FenceNVTest); ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FenceNVTest);
......
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