Commit 3a256228 by Jamie Madill Committed by Commit Bot

Update ANGLE_multiview validation.

Multiview transform feedback now passes if the transform feedback is paused. Also updates the relevant validation. This aligns the ANGLE_multiview validation with OVR_multivew and with the WebGL extension spec. This change allow us to combine multiple draw call validation updates into one update function. Bug: angleproject:3012 Change-Id: I2ce04edc386039134198afa1792201e03cc20490 Reviewed-on: https://chromium-review.googlesource.com/c/1357148 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 611bbaab
......@@ -24,7 +24,7 @@ Status
Version
Last Modified Date: July 31, 2018
Last Modified Date: December 8, 2018
Author Revision: 1
Number
......@@ -115,8 +115,8 @@ Additions to Chapter 2 of the OpenGL ES 3.0 Specification (OpenGL ES Operation)
- Add another bullet point:
"
* by any Draw* command if the number of views in the draw
framebuffer is greater than 1 and there is an active transform
feedback object.
framebuffer is greater than 1 and there is an active and not
paused transform feedback object.
"
Additions to Chapter 3 of the OpenGL ES 3.0 Specification (Rasterization)
......
......@@ -1176,7 +1176,6 @@ void Context::bindTransformFeedback(GLenum target, GLuint transformFeedbackHandl
TransformFeedback *transformFeedback =
checkTransformFeedbackAllocation(transformFeedbackHandle);
mGLState.setTransformFeedbackBinding(this, transformFeedback);
mStateCache.onTransformFeedbackChange(this);
}
void Context::bindProgramPipeline(GLuint pipelineHandle)
......@@ -3167,7 +3166,7 @@ void Context::beginTransformFeedback(PrimitiveMode primitiveMode)
ASSERT(!transformFeedback->isPaused());
transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
mStateCache.onTransformFeedbackChange(this);
mStateCache.onActiveTransformFeedbackChange(this);
}
bool Context::hasActiveTransformFeedback(GLuint program) const
......@@ -6440,7 +6439,7 @@ void Context::endTransformFeedback()
{
TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
transformFeedback->end(this);
mStateCache.onTransformFeedbackChange(this);
mStateCache.onActiveTransformFeedbackChange(this);
}
void Context::transformFeedbackVaryings(GLuint program,
......@@ -6517,12 +6516,14 @@ void Context::pauseTransformFeedback()
{
TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
transformFeedback->pause();
mStateCache.onActiveTransformFeedbackChange(this);
}
void Context::resumeTransformFeedback()
{
TransformFeedback *transformFeedback = mGLState.getCurrentTransformFeedback();
transformFeedback->resume();
mStateCache.onActiveTransformFeedbackChange(this);
}
void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
......@@ -8351,7 +8352,7 @@ void StateCache::onQueryChange(Context *context)
updateBasicDrawStatesError();
}
void StateCache::onTransformFeedbackChange(Context *context)
void StateCache::onActiveTransformFeedbackChange(Context *context)
{
updateBasicDrawStatesError();
}
......
......@@ -176,7 +176,7 @@ class StateCache final : angle::NonCopyable
void onDefaultVertexAttributeChange(Context *context);
void onActiveTextureChange(Context *context);
void onQueryChange(Context *context);
void onTransformFeedbackChange(Context *context);
void onActiveTransformFeedbackChange(Context *context);
void onUniformBufferStateChange(Context *context);
void onBufferBindingChange(Context *context);
......
......@@ -2694,7 +2694,7 @@ const char *ValidateDrawStates(Context *context)
const TransformFeedback *transformFeedbackObject = state.getCurrentTransformFeedback();
if (transformFeedbackObject != nullptr && transformFeedbackObject->isActive() &&
framebufferNumViews > 1)
!transformFeedbackObject->isPaused() && framebufferNumViews > 1)
{
return kMultiviewTransformFeedback;
}
......
......@@ -524,10 +524,7 @@ class MultiviewLayeredRenderTest : public MultiviewFramebufferTestBase,
// 2) does not generate any error if the draw framebuffer has exactly 1 view.
TEST_P(MultiviewDrawValidationTest, IndirectDraw)
{
if (!requestMultiviewExtension())
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
const GLint viewportOffsets[4] = {0, 0, 2, 0};
......@@ -604,10 +601,7 @@ TEST_P(MultiviewDrawValidationTest, IndirectDraw)
// 2) does not generate any error if the number of views is the same.
TEST_P(MultiviewDrawValidationTest, NumViewsMismatch)
{
if (!requestMultiviewExtension())
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
const GLint viewportOffsets[4] = {0, 0, 2, 0};
......@@ -710,14 +704,11 @@ TEST_P(MultiviewDrawValidationTest, NumViewsMismatchForNonMultiviewProgram)
// The test verifies that glDraw*:
// 1) generates an INVALID_OPERATION error if the number of views in the active draw framebuffer is
// greater than 1 and there is an active transform feedback object.
// greater than 1 and there is an active not paused transform feedback object.
// 2) does not generate any error if the number of views in the draw framebuffer is 1.
TEST_P(MultiviewDrawValidationTest, ActiveTransformFeedback)
{
if (!requestMultiviewExtension())
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
const GLint viewportOffsets[4] = {0, 0, 2, 0};
......@@ -784,23 +775,23 @@ void main()
EXPECT_GL_NO_ERROR();
}
// A paused transform feedback should still trigger an error.
// A paused transform feedback should not trigger an error.
glBeginTransformFeedback(GL_TRIANGLES);
glPauseTransformFeedback();
ASSERT_GL_NO_ERROR();
glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
ASSERT_GL_NO_ERROR();
// Unbind transform feedback - should succeed.
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
ASSERT_GL_NO_ERROR();
// Rebind paused transform feedback - should fail.
// Rebind paused transform feedback - should succeed.
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
ASSERT_GL_NO_ERROR();
glResumeTransformFeedback();
glEndTransformFeedback();
......@@ -828,13 +819,7 @@ void main()
TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
{
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension());
if (extensionRequestable("GL_EXT_disjoint_timer_query"))
{
glRequestExtensionANGLE("GL_EXT_disjoint_timer_query");
}
ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_disjoint_timer_query"));
ANGLE_SKIP_TEST_IF(!ensureExtensionEnabled("GL_EXT_disjoint_timer_query"));
ANGLE_GL_PROGRAM(dualViewProgram, kDualViewVSSource, kDualViewFSSource);
......@@ -918,10 +903,8 @@ TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
// The test checks that glDrawArrays can be used to render into two views.
TEST_P(MultiviewRenderDualViewTest, DrawArrays)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
drawQuad(mProgram, "vPosition", 0.0f, 1.0f, true);
ASSERT_GL_NO_ERROR();
......@@ -931,10 +914,8 @@ TEST_P(MultiviewRenderDualViewTest, DrawArrays)
// The test checks that glDrawElements can be used to render into two views.
TEST_P(MultiviewRenderDualViewTest, DrawElements)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
drawIndexedQuad(mProgram, "vPosition", 0.0f, 1.0f, true);
ASSERT_GL_NO_ERROR();
......@@ -944,10 +925,8 @@ TEST_P(MultiviewRenderDualViewTest, DrawElements)
// The test checks that glDrawRangeElements can be used to render into two views.
TEST_P(MultiviewRenderDualViewTest, DrawRangeElements)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
drawIndexedQuad(mProgram, "vPosition", 0.0f, 1.0f, true, true);
ASSERT_GL_NO_ERROR();
......@@ -957,10 +936,7 @@ TEST_P(MultiviewRenderDualViewTest, DrawRangeElements)
// The test checks that glDrawArrays can be used to render into four views.
TEST_P(MultiviewRenderTest, DrawArraysFourViews)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
constexpr char kVS[] =
"#version 300 es\n"
......@@ -1018,10 +994,7 @@ TEST_P(MultiviewRenderTest, DrawArraysFourViews)
// The test checks that glDrawArraysInstanced can be used to render into two views.
TEST_P(MultiviewRenderTest, DrawArraysInstanced)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
constexpr char kVS[] =
"#version 300 es\n"
......@@ -1087,10 +1060,7 @@ TEST_P(MultiviewRenderTest, DrawArraysInstanced)
// not by 3.
TEST_P(MultiviewRenderTest, AttribDivisor)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
// Looks like an incorrect D3D debug layer message is generated on Windows AMD and NVIDIA.
// May be specific to Windows 7 / Windows Server 2008. http://anglebug.com/2778
......@@ -1174,10 +1144,7 @@ TEST_P(MultiviewRenderTest, AttribDivisor)
// multi-view context propagate the correct divisor to the driver.
TEST_P(MultiviewRenderTest, DivisorOrderOfOperation)
{
if (!requestMultiviewExtension(isMultisampled()))
{
return;
}
ANGLE_SKIP_TEST_IF(!requestMultiviewExtension(isMultisampled()));
updateFBOs(1, 1, 2);
......
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