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