Commit 69643438 by Geoff Lang Committed by Commit Bot

D3D11: Reorder VAO synchronization.

The index range was being resolved in the call to VertexArray11::syncStateForDraw but the code which invalidates the input layout was being executed before this. BUG=837002 Change-Id: I4e00b53cdc51f8758b0e2ba9e2dfc93b5e22556c Reviewed-on: https://chromium-review.googlesource.com/1032633 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 5528d11f
...@@ -2033,6 +2033,9 @@ gl::Error StateManager11::updateState(const gl::Context *context, ...@@ -2033,6 +2033,9 @@ gl::Error StateManager11::updateState(const gl::Context *context,
mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
} }
VertexArray11 *vao11 = GetImplAs<VertexArray11>(glState.getVertexArray());
ANGLE_TRY(vao11->syncStateForDraw(context, drawCallParams));
// Changes in the draw call can affect the vertex buffer translations. // Changes in the draw call can affect the vertex buffer translations.
if (!mLastFirstVertex.valid() || mLastFirstVertex.value() != drawCallParams.firstVertex()) if (!mLastFirstVertex.valid() || mLastFirstVertex.value() != drawCallParams.firstVertex())
{ {
...@@ -2040,9 +2043,6 @@ gl::Error StateManager11::updateState(const gl::Context *context, ...@@ -2040,9 +2043,6 @@ gl::Error StateManager11::updateState(const gl::Context *context,
invalidateInputLayout(); invalidateInputLayout();
} }
VertexArray11 *vao11 = GetImplAs<VertexArray11>(glState.getVertexArray());
ANGLE_TRY(vao11->syncStateForDraw(context, drawCallParams));
if (drawCallParams.isDrawElements()) if (drawCallParams.isDrawElements())
{ {
ANGLE_TRY(applyIndexBuffer(context, drawCallParams)); ANGLE_TRY(applyIndexBuffer(context, drawCallParams));
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "test_utils/ANGLETest.h" #include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h" #include "test_utils/gl_raii.h"
#include <array>
using namespace angle; using namespace angle;
namespace namespace
...@@ -165,6 +167,97 @@ TEST_P(RobustBufferAccessBehaviorTest, DrawElementsIndexOutOfRangeWithDynamicDra ...@@ -165,6 +167,97 @@ TEST_P(RobustBufferAccessBehaviorTest, DrawElementsIndexOutOfRangeWithDynamicDra
runIndexOutOfRangeTests(GL_DYNAMIC_DRAW); runIndexOutOfRangeTests(GL_DYNAMIC_DRAW);
} }
// Test that vertex buffers are rebound with the correct offsets in subsequent calls in the D3D11
// backend. http://crbug.com/837002
TEST_P(RobustBufferAccessBehaviorTest, D3D11StateSynchronizationOrderBug)
{
ANGLE_SKIP_TEST_IF(!initExtension());
glDisable(GL_DEPTH_TEST);
// 2 quads, the first one red, the second one green
const std::array<angle::Vector4, 16> vertices{
angle::Vector4(-1.0f, 1.0f, 0.5f, 1.0f), // v0
angle::Vector4(1.0f, 0.0f, 0.0f, 1.0f), // c0
angle::Vector4(-1.0f, -1.0f, 0.5f, 1.0f), // v1
angle::Vector4(1.0f, 0.0f, 0.0f, 1.0f), // c1
angle::Vector4(1.0f, -1.0f, 0.5f, 1.0f), // v2
angle::Vector4(1.0f, 0.0f, 0.0f, 1.0f), // c2
angle::Vector4(1.0f, 1.0f, 0.5f, 1.0f), // v3
angle::Vector4(1.0f, 0.0f, 0.0f, 1.0f), // c3
angle::Vector4(-1.0f, 1.0f, 0.5f, 1.0f), // v4
angle::Vector4(0.0f, 1.0f, 0.0f, 1.0f), // c4
angle::Vector4(-1.0f, -1.0f, 0.5f, 1.0f), // v5
angle::Vector4(0.0f, 1.0f, 0.0f, 1.0f), // c5
angle::Vector4(1.0f, -1.0f, 0.5f, 1.0f), // v6
angle::Vector4(0.0f, 1.0f, 0.0f, 1.0f), // c6
angle::Vector4(1.0f, 1.0f, 0.5f, 1.0f), // v7
angle::Vector4(0.0f, 1.0f, 0.0f, 1.0f), // c7
};
GLBuffer vb;
glBindBuffer(GL_ARRAY_BUFFER, vb);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices.data(), GL_STATIC_DRAW);
const std::array<GLushort, 12> indicies{
0, 1, 2, 0, 2, 3, // quad0
4, 5, 6, 4, 6, 7, // quad1
};
GLBuffer ib;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies), indicies.data(), GL_STATIC_DRAW);
constexpr char kVS[] = R"(
precision highp float;
attribute vec4 a_position;
attribute vec4 a_color;
varying vec4 v_color;
void main()
{
gl_Position = a_position;
v_color = a_color;
})";
constexpr char kFS[] = R"(
precision highp float;
varying vec4 v_color;
void main()
{
gl_FragColor = v_color;
})";
ANGLE_GL_PROGRAM(program, kVS, kFS);
glUseProgram(program);
GLint positionLocation = glGetAttribLocation(program, "a_position");
glEnableVertexAttribArray(positionLocation);
glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, sizeof(angle::Vector4) * 2, 0);
GLint colorLocation = glGetAttribLocation(program, "a_color");
glEnableVertexAttribArray(colorLocation);
glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(angle::Vector4) * 2,
reinterpret_cast<const void *>(sizeof(angle::Vector4)));
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT,
reinterpret_cast<const void *>(sizeof(GLshort) * 6));
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT,
reinterpret_cast<const void *>(sizeof(GLshort) * 6));
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
}
ANGLE_INSTANTIATE_TEST(RobustBufferAccessBehaviorTest, ANGLE_INSTANTIATE_TEST(RobustBufferAccessBehaviorTest,
ES2_D3D9(), ES2_D3D9(),
ES2_D3D11_FL9_3(), ES2_D3D11_FL9_3(),
......
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