Commit 44ae899a by Olli Etuaho Committed by Commit Bot

Fix resource init/teardown in multiview tests

This calls TearDown functions properly in MultiviewDrawTest test classes. GL RAII objects can't be used as test class members since the GL objects need to be deleted before the test class TearDown is called. Since now the tests call ANGLETestTearDown, this causes D3D debug layer messages to be checked. It turns out that there are some seemingly incorrect debug layer messages generated on AMD bots, so the failing tests are now disabled on AMD/Windows. BUG=angleproject:2765 TEST=angle_end2end_tests Change-Id: Ifa0fe4d19b76aa84bb3b6b18c8f66a8ab6bd893e Reviewed-on: https://chromium-review.googlesource.com/1179839Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 87498164
...@@ -73,22 +73,33 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase ...@@ -73,22 +73,33 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase
mViewWidth(0), mViewWidth(0),
mViewHeight(0), mViewHeight(0),
mNumViews(0), mNumViews(0),
mColorTexture(0u),
mDepthTexture(0u),
mDrawFramebuffer(0u),
mMultiviewLayout(multiviewLayout) mMultiviewLayout(multiviewLayout)
{ {
} }
void FramebufferTestSetUp() { MultiviewTestBase::MultiviewTestBaseSetUp(); } void FramebufferTestSetUp() { MultiviewTestBase::MultiviewTestBaseSetUp(); }
void FramebufferTestTearDown()
{
freeFBOs();
MultiviewTestBase::MultiviewTestBaseTearDown();
}
void updateFBOs(int viewWidth, int height, int numViews, int numLayers, int baseViewIndex) void updateFBOs(int viewWidth, int height, int numViews, int numLayers, int baseViewIndex)
{ {
ASSERT(numViews + baseViewIndex <= numLayers); ASSERT(numViews + baseViewIndex <= numLayers);
freeFBOs();
mViewWidth = viewWidth; mViewWidth = viewWidth;
mViewHeight = height; mViewHeight = height;
mNumViews = numViews; mNumViews = numViews;
mColorTexture.reset(); glGenTextures(1, &mColorTexture);
mDepthTexture.reset(); glGenTextures(1, &mDepthTexture);
mDrawFramebuffer.reset();
mReadFramebuffer.clear();
// Create color and depth textures. // Create color and depth textures.
switch (mMultiviewLayout) switch (mMultiviewLayout)
...@@ -125,6 +136,8 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase ...@@ -125,6 +136,8 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase
} }
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
glGenFramebuffers(1, &mDrawFramebuffer);
// Create draw framebuffer to be used for multiview rendering. // Create draw framebuffer to be used for multiview rendering.
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mDrawFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mDrawFramebuffer);
switch (mMultiviewLayout) switch (mMultiviewLayout)
...@@ -168,6 +181,7 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase ...@@ -168,6 +181,7 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase
{ {
case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE: case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
mReadFramebuffer.resize(1); mReadFramebuffer.resize(1);
glGenFramebuffers(1, mReadFramebuffer.data());
glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[0]); glBindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer[0]);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
mColorTexture, 0); mColorTexture, 0);
...@@ -176,6 +190,7 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase ...@@ -176,6 +190,7 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase
break; break;
case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE: case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
mReadFramebuffer.resize(numLayers); mReadFramebuffer.resize(numLayers);
glGenFramebuffers(mReadFramebuffer.size(), mReadFramebuffer.data());
for (int i = 0; i < numLayers; ++i) for (int i = 0; i < numLayers; ++i)
{ {
glBindFramebuffer(GL_FRAMEBUFFER, mReadFramebuffer[i]); glBindFramebuffer(GL_FRAMEBUFFER, mReadFramebuffer[i]);
...@@ -227,16 +242,41 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase ...@@ -227,16 +242,41 @@ class MultiviewFramebufferTestBase : public MultiviewTestBase
return GLColor(0, 0, 0, 0); return GLColor(0, 0, 0, 0);
} }
GLTexture mColorTexture;
GLTexture mDepthTexture;
int mViewWidth; int mViewWidth;
int mViewHeight; int mViewHeight;
int mNumViews; int mNumViews;
GLuint mColorTexture;
GLuint mDepthTexture;
private: private:
GLFramebuffer mDrawFramebuffer; GLuint mDrawFramebuffer;
std::vector<GLFramebuffer> mReadFramebuffer; std::vector<GLuint> mReadFramebuffer;
GLenum mMultiviewLayout; GLenum mMultiviewLayout;
void freeFBOs()
{
if (mDrawFramebuffer)
{
glDeleteFramebuffers(1, &mDrawFramebuffer);
mDrawFramebuffer = 0;
}
if (!mReadFramebuffer.empty())
{
glDeleteFramebuffers(mReadFramebuffer.size(), mReadFramebuffer.data());
mReadFramebuffer.clear();
}
if (mDepthTexture)
{
glDeleteTextures(1, &mDepthTexture);
mDepthTexture = 0;
}
if (mColorTexture)
{
glDeleteTextures(1, &mColorTexture);
mColorTexture = 0;
}
}
}; };
class MultiviewRenderTest : public MultiviewFramebufferTestBase, class MultiviewRenderTest : public MultiviewFramebufferTestBase,
...@@ -245,6 +285,7 @@ class MultiviewRenderTest : public MultiviewFramebufferTestBase, ...@@ -245,6 +285,7 @@ class MultiviewRenderTest : public MultiviewFramebufferTestBase,
protected: protected:
MultiviewRenderTest() : MultiviewFramebufferTestBase(GetParam(), GetParam().mMultiviewLayout) {} MultiviewRenderTest() : MultiviewFramebufferTestBase(GetParam(), GetParam().mMultiviewLayout) {}
void SetUp() override { MultiviewFramebufferTestBase::FramebufferTestSetUp(); } void SetUp() override { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
void TearDown() override { MultiviewFramebufferTestBase::FramebufferTestTearDown(); }
void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) override void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) override
{ {
...@@ -275,13 +316,6 @@ class MultiviewRenderDualViewTest : public MultiviewRenderTest ...@@ -275,13 +316,6 @@ class MultiviewRenderDualViewTest : public MultiviewRenderTest
{ {
protected: protected:
MultiviewRenderDualViewTest() : mProgram(0u) {} MultiviewRenderDualViewTest() : mProgram(0u) {}
~MultiviewRenderDualViewTest()
{
if (mProgram != 0u)
{
glDeleteProgram(mProgram);
}
}
void SetUp() override void SetUp() override
{ {
...@@ -299,6 +333,17 @@ class MultiviewRenderDualViewTest : public MultiviewRenderTest ...@@ -299,6 +333,17 @@ class MultiviewRenderDualViewTest : public MultiviewRenderTest
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
} }
void TearDown() override
{
if (mProgram != 0u)
{
glDeleteProgram(mProgram);
mProgram = 0u;
}
MultiviewRenderTest::TearDown();
}
void checkOutput() void checkOutput()
{ {
EXPECT_EQ(GLColor::black, GetViewColor(0, 0, 0)); EXPECT_EQ(GLColor::black, GetViewColor(0, 0, 0));
...@@ -310,38 +355,34 @@ class MultiviewRenderDualViewTest : public MultiviewRenderTest ...@@ -310,38 +355,34 @@ class MultiviewRenderDualViewTest : public MultiviewRenderTest
GLuint mProgram; GLuint mProgram;
}; };
class MultiviewDrawValidationTest : public MultiviewRenderDualViewTest // Base class for tests that care mostly about draw call validity and not rendering results.
class MultiviewDrawValidationTest : public MultiviewTest
{ {
protected: protected:
MultiviewDrawValidationTest() {} MultiviewDrawValidationTest() : MultiviewTest() {}
void SetUp() override void initOnePixelColorTexture2D(GLuint texId)
{ {
MultiviewRenderDualViewTest::SetUp(); glBindTexture(GL_TEXTURE_2D, texId);
glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
glBindTexture(GL_TEXTURE_2D, mTex2d);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
}
glBindVertexArray(mVao); // This initializes a simple VAO with a valid vertex buffer and index buffer with three
// vertices.
void initVAO(GLuint vao, GLuint vertexBuffer, GLuint indexBuffer)
{
glBindVertexArray(vao);
const float kVertexData[3] = {0.0f}; const float kVertexData[3] = {0.0f};
glBindBuffer(GL_ARRAY_BUFFER, mVbo); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3u, &kVertexData[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3u, &kVertexData[0], GL_STATIC_DRAW);
const unsigned int kIndices[3] = {0u, 1u, 2u}; const unsigned int kIndices[3] = {0u, 1u, 2u};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 3, &kIndices[0], glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 3, &kIndices[0],
GL_STATIC_DRAW); GL_STATIC_DRAW);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
} }
GLTexture mTex2d;
GLVertexArray mVao;
GLBuffer mVbo;
GLBuffer mIbo;
GLFramebuffer mFramebuffer;
}; };
class MultiviewOcclusionQueryTest : public MultiviewRenderTest class MultiviewOcclusionQueryTest : public MultiviewRenderTest
...@@ -386,7 +427,23 @@ class MultiviewProgramGenerationTest : public MultiviewTest ...@@ -386,7 +427,23 @@ class MultiviewProgramGenerationTest : public MultiviewTest
class MultiviewRenderPrimitiveTest : public MultiviewRenderTest class MultiviewRenderPrimitiveTest : public MultiviewRenderTest
{ {
protected: protected:
MultiviewRenderPrimitiveTest() {} MultiviewRenderPrimitiveTest() : mVBO(0u) {}
void SetUp() override
{
MultiviewRenderTest::SetUp();
glGenBuffers(1, &mVBO);
}
void TearDown() override
{
if (mVBO)
{
glDeleteBuffers(1, &mVBO);
mVBO = 0u;
}
MultiviewRenderTest::TearDown();
}
void setupGeometry(const std::vector<Vector2> &vertexData) void setupGeometry(const std::vector<Vector2> &vertexData)
{ {
...@@ -413,7 +470,7 @@ class MultiviewRenderPrimitiveTest : public MultiviewRenderTest ...@@ -413,7 +470,7 @@ class MultiviewRenderPrimitiveTest : public MultiviewRenderTest
} }
} }
} }
GLBuffer mVBO; GLuint mVBO;
}; };
class MultiviewSideBySideRenderTest : public MultiviewFramebufferTestBase, class MultiviewSideBySideRenderTest : public MultiviewFramebufferTestBase,
...@@ -424,8 +481,10 @@ class MultiviewSideBySideRenderTest : public MultiviewFramebufferTestBase, ...@@ -424,8 +481,10 @@ class MultiviewSideBySideRenderTest : public MultiviewFramebufferTestBase,
: MultiviewFramebufferTestBase(GetParam(), GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE) : MultiviewFramebufferTestBase(GetParam(), GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE)
{ {
} }
void SetUp() override { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) override void SetUp() final { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
void TearDown() final { MultiviewFramebufferTestBase::FramebufferTestTearDown(); }
void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final
{ {
workarounds->selectViewInGeometryShader = GetParam().mForceUseGeometryShaderOnD3D; workarounds->selectViewInGeometryShader = GetParam().mForceUseGeometryShaderOnD3D;
} }
...@@ -439,8 +498,9 @@ class MultiviewLayeredRenderTest : public MultiviewFramebufferTestBase, ...@@ -439,8 +498,9 @@ class MultiviewLayeredRenderTest : public MultiviewFramebufferTestBase,
: MultiviewFramebufferTestBase(GetParam(), GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE) : MultiviewFramebufferTestBase(GetParam(), GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE)
{ {
} }
void SetUp() override { MultiviewFramebufferTestBase::FramebufferTestSetUp(); } void SetUp() final { MultiviewFramebufferTestBase::FramebufferTestSetUp(); }
void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) override void TearDown() final { MultiviewFramebufferTestBase::FramebufferTestTearDown(); }
void overrideWorkaroundsD3D(WorkaroundsD3D *workarounds) final
{ {
workarounds->selectViewInGeometryShader = GetParam().mForceUseGeometryShaderOnD3D; workarounds->selectViewInGeometryShader = GetParam().mForceUseGeometryShaderOnD3D;
} }
...@@ -466,12 +526,23 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw) ...@@ -466,12 +526,23 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw)
"void main()\n" "void main()\n"
"{}\n"; "{}\n";
GLVertexArray vao;
GLBuffer vertexBuffer;
GLBuffer indexBuffer;
initVAO(vao, vertexBuffer, indexBuffer);
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLBuffer commandBuffer; GLBuffer commandBuffer;
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, commandBuffer); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, commandBuffer);
const GLuint commandData[] = {1u, 1u, 0u, 0u, 0u}; const GLuint commandData[] = {1u, 1u, 0u, 0u, 0u};
glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(GLuint) * 5u, &commandData[0], GL_STATIC_DRAW); glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(GLuint) * 5u, &commandData[0], GL_STATIC_DRAW);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
GLTexture tex2D;
initOnePixelColorTexture2D(tex2D);
// Check for a GL_INVALID_OPERATION error with the framebuffer having 2 views. // Check for a GL_INVALID_OPERATION error with the framebuffer having 2 views.
{ {
const std::string &vsSource = const std::string &vsSource =
...@@ -483,8 +554,8 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw) ...@@ -483,8 +554,8 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw)
ANGLE_GL_PROGRAM(program, vsSource, fsSource); ANGLE_GL_PROGRAM(program, vsSource, fsSource);
glUseProgram(program); glUseProgram(program);
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 2, &viewportOffsets[0]); 2, &viewportOffsets[0]);
glDrawArraysIndirect(GL_TRIANGLES, nullptr); glDrawArraysIndirect(GL_TRIANGLES, nullptr);
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
...@@ -504,8 +575,8 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw) ...@@ -504,8 +575,8 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw)
ANGLE_GL_PROGRAM(program, vsSource, fsSource); ANGLE_GL_PROGRAM(program, vsSource, fsSource);
glUseProgram(program); glUseProgram(program);
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 1, &viewportOffsets[0]); 1, &viewportOffsets[0]);
glDrawArraysIndirect(GL_TRIANGLES, nullptr); glDrawArraysIndirect(GL_TRIANGLES, nullptr);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -543,12 +614,23 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatch) ...@@ -543,12 +614,23 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatch)
ANGLE_GL_PROGRAM(program, vsSource, fsSource); ANGLE_GL_PROGRAM(program, vsSource, fsSource);
glUseProgram(program); glUseProgram(program);
GLVertexArray vao;
GLBuffer vertexBuffer;
GLBuffer indexBuffer;
initVAO(vao, vertexBuffer, indexBuffer);
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLTexture tex2D;
initOnePixelColorTexture2D(tex2D);
// Check for a GL_INVALID_OPERATION error with the framebuffer and program having different // Check for a GL_INVALID_OPERATION error with the framebuffer and program having different
// number of views. // number of views.
{ {
// The framebuffer has only 1 view. // The framebuffer has only 1 view.
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 1, &viewportOffsets[0]); 1, &viewportOffsets[0]);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
...@@ -560,8 +642,8 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatch) ...@@ -560,8 +642,8 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatch)
// Check that no errors are generated if the number of views in both program and draw // Check that no errors are generated if the number of views in both program and draw
// framebuffer matches. // framebuffer matches.
{ {
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 2, &viewportOffsets[0]); 2, &viewportOffsets[0]);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -592,8 +674,19 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatchForNonMultiviewProgram) ...@@ -592,8 +674,19 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatchForNonMultiviewProgram)
ANGLE_GL_PROGRAM(programNoMultiview, vsSourceNoMultiview, fsSourceNoMultiview); ANGLE_GL_PROGRAM(programNoMultiview, vsSourceNoMultiview, fsSourceNoMultiview);
glUseProgram(programNoMultiview); glUseProgram(programNoMultiview);
GLVertexArray vao;
GLBuffer vertexBuffer;
GLBuffer indexBuffer;
initVAO(vao, vertexBuffer, indexBuffer);
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLTexture tex2D;
initOnePixelColorTexture2D(tex2D);
const GLint viewportOffsets[4] = {0, 0, 2, 0}; const GLint viewportOffsets[4] = {0, 0, 2, 0};
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, 0, 2, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 2,
&viewportOffsets[0]); &viewportOffsets[0]);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
...@@ -639,6 +732,11 @@ TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback) ...@@ -639,6 +732,11 @@ TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback)
ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(dualViewProgram, kDualViewVSSource, kDualViewFSSource, ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(dualViewProgram, kDualViewVSSource, kDualViewFSSource,
dualViewTFVaryings, GL_SEPARATE_ATTRIBS); dualViewTFVaryings, GL_SEPARATE_ATTRIBS);
GLVertexArray vao;
GLBuffer vertexBuffer;
GLBuffer indexBuffer;
initVAO(vao, vertexBuffer, indexBuffer);
GLBuffer tbo; GLBuffer tbo;
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tbo); glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tbo);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 16u, nullptr, GL_STATIC_DRAW); glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 16u, nullptr, GL_STATIC_DRAW);
...@@ -652,11 +750,17 @@ TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback) ...@@ -652,11 +750,17 @@ TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback)
glBeginTransformFeedback(GL_TRIANGLES); glBeginTransformFeedback(GL_TRIANGLES);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLTexture tex2D;
initOnePixelColorTexture2D(tex2D);
// Check that drawArrays generates an error when there is an active transform feedback object // Check that drawArrays generates an error when there is an active transform feedback object
// and the number of views in the draw framebuffer is greater than 1. // and the number of views in the draw framebuffer is greater than 1.
{ {
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 2, &viewportOffsets[0]); 2, &viewportOffsets[0]);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
} }
...@@ -697,8 +801,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback) ...@@ -697,8 +801,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback)
// Check that drawArrays does not generate an error when the number of views in the draw // Check that drawArrays does not generate an error when the number of views in the draw
// framebuffer is 1. // framebuffer is 1.
{ {
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 1, &viewportOffsets[0]); 1, &viewportOffsets[0]);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
} }
...@@ -721,6 +825,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery) ...@@ -721,6 +825,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_disjoint_timer_query")); ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_disjoint_timer_query"));
ANGLE_GL_PROGRAM(dualViewProgram, kDualViewVSSource, kDualViewFSSource);
const GLint viewportOffsets[4] = {0, 0, 2, 0}; const GLint viewportOffsets[4] = {0, 0, 2, 0};
const std::string &vsSource = const std::string &vsSource =
"#version 300 es\n" "#version 300 es\n"
...@@ -734,15 +840,26 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery) ...@@ -734,15 +840,26 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
ANGLE_GL_PROGRAM(singleViewProgram, vsSource, fsSource); ANGLE_GL_PROGRAM(singleViewProgram, vsSource, fsSource);
glUseProgram(singleViewProgram); glUseProgram(singleViewProgram);
GLVertexArray vao;
GLBuffer vertexBuffer;
GLBuffer indexBuffer;
initVAO(vao, vertexBuffer, indexBuffer);
GLuint query = 0u; GLuint query = 0u;
glGenQueriesEXT(1, &query); glGenQueriesEXT(1, &query);
glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query); glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query);
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLTexture tex2D;
initOnePixelColorTexture2D(tex2D);
// Check first case. // Check first case.
{ {
glUseProgram(mProgram); glUseProgram(dualViewProgram);
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 2, &viewportOffsets[0]); 2, &viewportOffsets[0]);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
...@@ -752,8 +869,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery) ...@@ -752,8 +869,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
// Check second case. // Check second case.
{ {
glUseProgram(singleViewProgram); glUseProgram(singleViewProgram);
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 1, &viewportOffsets[0]); 1, &viewportOffsets[0]);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
...@@ -765,9 +882,9 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery) ...@@ -765,9 +882,9 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
// Check starting a query after a successful draw. // Check starting a query after a successful draw.
{ {
glUseProgram(mProgram); glUseProgram(dualViewProgram);
glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d, glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0,
0, 2, &viewportOffsets[0]); 2, &viewportOffsets[0]);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
...@@ -960,6 +1077,10 @@ TEST_P(MultiviewRenderTest, AttribDivisor) ...@@ -960,6 +1077,10 @@ TEST_P(MultiviewRenderTest, AttribDivisor)
return; return;
} }
// Looks like an incorrect D3D debug layer message is generated on Windows / AMD.
// May be specific to Windows 7 / Windows Server 2008. http://anglebug.com/2778
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11() && IsAMD());
const std::string &vsSource = const std::string &vsSource =
"#version 300 es\n" "#version 300 es\n"
"#extension GL_OVR_multiview : require\n" "#extension GL_OVR_multiview : require\n"
...@@ -1716,6 +1837,10 @@ TEST_P(MultiviewRenderTest, ProgramRelinkUpdatesAttribDivisor) ...@@ -1716,6 +1837,10 @@ TEST_P(MultiviewRenderTest, ProgramRelinkUpdatesAttribDivisor)
return; return;
} }
// Looks like an incorrect D3D debug layer message is generated on Windows / AMD.
// May be specific to Windows 7 / Windows Server 2008. http://anglebug.com/2778
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11() && IsAMD());
const int kViewWidth = 4; const int kViewWidth = 4;
const int kViewHeight = 1; const int kViewHeight = 1;
const int kNumViews = 2; const int kNumViews = 2;
...@@ -1852,6 +1977,10 @@ TEST_P(MultiviewRenderTest, DivisorUpdatedOnProgramChange) ...@@ -1852,6 +1977,10 @@ TEST_P(MultiviewRenderTest, DivisorUpdatedOnProgramChange)
// Test failing on P400 graphics card (anglebug.com/2228) // Test failing on P400 graphics card (anglebug.com/2228)
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11() && IsNVIDIA()); ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11() && IsNVIDIA());
// Looks like an incorrect D3D debug layer message is generated on Windows / AMD.
// May be specific to Windows 7 / Windows Server 2008. http://anglebug.com/2778
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11() && IsAMD());
GLVertexArray vao; GLVertexArray vao;
glBindVertexArray(vao); glBindVertexArray(vao);
GLBuffer vbo; GLBuffer vbo;
...@@ -2175,8 +2304,8 @@ MultiviewRenderTestParams LayeredVertexShaderD3D11() ...@@ -2175,8 +2304,8 @@ MultiviewRenderTestParams LayeredVertexShaderD3D11()
} }
ANGLE_INSTANTIATE_TEST(MultiviewDrawValidationTest, ANGLE_INSTANTIATE_TEST(MultiviewDrawValidationTest,
SideBySideVertexShaderOpenGL(3, 1), VertexShaderOpenGL(3, 1),
SideBySideVertexShaderD3D11(3, 1)); VertexShaderD3D11(3, 1));
ANGLE_INSTANTIATE_TEST(MultiviewRenderDualViewTest, ANGLE_INSTANTIATE_TEST(MultiviewRenderDualViewTest,
SideBySideVertexShaderOpenGL(), SideBySideVertexShaderOpenGL(),
LayeredVertexShaderOpenGL(), LayeredVertexShaderOpenGL(),
......
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