Commit 9349e262 by shrekshao Committed by Commit Bot

Fix multiDraw* with DYNAMIC_DRAW buffer usage

Specialized Context11 impl to prevent promote Dynamic during MultiDraw. Add different buffer usage to MultiDraw and BaseVertexBaseInstance tests. Bug: angleproject:3402, angleproject:4754 Change-Id: I50e1a6fd6c8b6fd48f130c43545b895335d2e55b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2268581 Commit-Queue: Shrek Shao <shrekshao@google.com> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 796df76c
......@@ -260,7 +260,8 @@ class Context11 : public ContextD3D, public MultisampleTextureInitializer
const void *indices,
GLsizei instanceCount,
GLint baseVertex,
GLuint baseInstance);
GLuint baseInstance,
bool promoteDynamic);
Renderer11 *mRenderer;
IncompleteTextureSet mIncompleteTextures;
......
......@@ -2169,7 +2169,8 @@ angle::Result StateManager11::updateState(const gl::Context *context,
const void *indices,
GLsizei instanceCount,
GLint baseVertex,
GLuint baseInstance)
GLuint baseInstance,
bool promoteDynamic)
{
const gl::State &glState = context->getState();
......@@ -2213,7 +2214,7 @@ angle::Result StateManager11::updateState(const gl::Context *context,
ANGLE_TRY(mVertexArray11->syncStateForDraw(context, firstVertex, vertexOrIndexCount,
indexTypeOrInvalid, indices, instanceCount,
baseVertex, baseInstance));
baseVertex, baseInstance, promoteDynamic));
// Changes in the draw call can affect the vertex buffer translations.
if (!mLastFirstVertex.valid() || mLastFirstVertex.value() != firstVertex)
......
......@@ -240,7 +240,8 @@ class StateManager11 final : angle::NonCopyable
const void *indices,
GLsizei instanceCount,
GLint baseVertex,
GLuint baseInstance);
GLuint baseInstance,
bool promoteDynamic);
void setShaderResourceShared(gl::ShaderType shaderType,
UINT resourceSlot,
......
......@@ -128,7 +128,8 @@ angle::Result VertexArray11::syncStateForDraw(const gl::Context *context,
const void *indices,
GLsizei instances,
GLint baseVertex,
GLuint baseInstance)
GLuint baseInstance,
bool promoteDynamic)
{
Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer();
StateManager11 *stateManager = renderer->getStateManager();
......@@ -161,7 +162,7 @@ angle::Result VertexArray11::syncStateForDraw(const gl::Context *context,
ANGLE_TRY(updateDynamicAttribs(context, stateManager->getVertexDataManager(),
firstVertex, vertexOrIndexCount, indexTypeOrInvalid,
indices, instances, baseVertex, baseInstance,
activeDynamicAttribs));
promoteDynamic, activeDynamicAttribs));
stateManager->invalidateInputLayout();
}
}
......@@ -295,6 +296,7 @@ angle::Result VertexArray11::updateDynamicAttribs(const gl::Context *context,
GLsizei instances,
GLint baseVertex,
GLuint baseInstance,
bool promoteDynamic,
const gl::AttributesMask &activeDynamicAttribs)
{
const auto &glState = context->getState();
......@@ -322,8 +324,11 @@ angle::Result VertexArray11::updateDynamicAttribs(const gl::Context *context,
activeDynamicAttribs, startVertex, vertexCount,
instances, baseInstance));
VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs,
vertexCount);
if (promoteDynamic)
{
VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs,
vertexCount);
}
return angle::Result::Continue;
}
......
......@@ -40,7 +40,8 @@ class VertexArray11 : public VertexArrayImpl
const void *indices,
GLsizei instances,
GLint baseVertex,
GLuint baseInstance);
GLuint baseInstance,
bool promoteDynamic);
// This will check the dynamic attribs mask.
bool hasActiveDynamicAttrib(const gl::Context *context);
......@@ -74,6 +75,7 @@ class VertexArray11 : public VertexArrayImpl
GLsizei instances,
GLint baseVertex,
GLuint baseInstance,
bool promoteDynamic,
const gl::AttributesMask &activeDynamicAttribs);
angle::Result updateElementArrayStorage(const gl::Context *context,
......
......@@ -359,14 +359,14 @@ void main()
void doDrawArraysBaseInstanceReset()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 6 * kCountY);
glDrawArraysInstanced(GL_TRIANGLES, 0, 6 * kCountY, 1);
}
void doDrawElementsBaseVertexBaseInstanceReset()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, 6 * kCountY, GL_UNSIGNED_SHORT,
reinterpret_cast<GLvoid *>(static_cast<uintptr_t>(0)));
glDrawElementsInstanced(GL_TRIANGLES, 6 * kCountY, GL_UNSIGNED_SHORT,
reinterpret_cast<GLvoid *>(static_cast<uintptr_t>(0)), 1);
}
void doMultiDrawElementsInstancedBaseVertexBaseInstance()
......@@ -582,6 +582,7 @@ TEST_P(DrawBaseVertexBaseInstanceTest, DrawArraysInstancedBaseInstance)
checkDrawResult(false);
doDrawArraysBaseInstanceReset();
EXPECT_GL_NO_ERROR();
checkDrawResult(false, true);
}
......@@ -598,7 +599,6 @@ TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawArraysInstancedBaseInstance)
}
ANGLE_SKIP_TEST_IF(!requestExtensions());
ANGLE_SKIP_TEST_IF(getBufferDataUsage() == GL_DYNAMIC_DRAW);
GLProgram program;
setupProgram(program, true, true);
......@@ -619,6 +619,7 @@ TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawArraysInstancedBaseInstance)
checkDrawResult(false);
doDrawArraysBaseInstanceReset();
EXPECT_GL_NO_ERROR();
checkDrawResult(false, true);
}
......@@ -656,7 +657,6 @@ TEST_P(DrawBaseVertexBaseInstanceTest, DrawElementsInstancedBaseVertexBaseInstan
TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawElementsInstancedBaseVertexBaseInstance)
{
ANGLE_SKIP_TEST_IF(!requestExtensions());
ANGLE_SKIP_TEST_IF(getBufferDataUsage() == GL_DYNAMIC_DRAW);
GLProgram program;
setupProgram(program, false, true);
......
......@@ -62,7 +62,14 @@ enum class InstancingOption
UseInstancing,
};
using MultiDrawTestParams = std::tuple<angle::PlatformParameters, DrawIDOption, InstancingOption>;
enum class BufferDataUsageOption
{
StaticDraw,
DynamicDraw
};
using MultiDrawTestParams =
std::tuple<angle::PlatformParameters, DrawIDOption, InstancingOption, BufferDataUsageOption>;
struct PrintToStringParamName
{
......@@ -70,6 +77,8 @@ struct PrintToStringParamName
{
::std::stringstream ss;
ss << std::get<0>(info.param)
<< (std::get<3>(info.param) == BufferDataUsageOption::StaticDraw ? "__StaticDraw"
: "__DynamicDraw")
<< (std::get<2>(info.param) == InstancingOption::UseInstancing ? "__Instanced" : "")
<< (std::get<1>(info.param) == DrawIDOption::UseDrawID ? "__DrawID" : "");
return ss.str();
......@@ -111,6 +120,12 @@ class MultiDrawTest : public ANGLETestBase, public ::testing::TestWithParam<Mult
return std::get<2>(GetParam()) == InstancingOption::UseInstancing;
}
GLenum getBufferDataUsage() const
{
return std::get<3>(GetParam()) == BufferDataUsageOption::StaticDraw ? GL_STATIC_DRAW
: GL_DYNAMIC_DRAW;
}
std::string VertexShaderSource()
{
......@@ -216,22 +231,22 @@ void main()
glGenBuffers(1, &mNonIndexedVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mNonIndexedVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * mNonIndexedVertices.size(),
mNonIndexedVertices.data(), GL_STATIC_DRAW);
mNonIndexedVertices.data(), getBufferDataUsage());
glGenBuffers(1, &mVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * mVertices.size(), mVertices.data(),
GL_STATIC_DRAW);
getBufferDataUsage());
glGenBuffers(1, &mIndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * mIndices.size(), mIndices.data(),
GL_STATIC_DRAW);
getBufferDataUsage());
glGenBuffers(1, &mInstanceBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mInstanceBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instances.size(), instances.data(),
GL_STATIC_DRAW);
getBufferDataUsage());
ASSERT_GL_NO_ERROR();
}
......@@ -515,19 +530,21 @@ const angle::PlatformParameters es2_platforms[] = {
INSTANTIATE_TEST_SUITE_P(
,
MultiDrawTest,
testing::Combine(testing::ValuesIn(::angle::FilterTestParams(platforms, ArraySize(platforms))),
testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID),
testing::Values(InstancingOption::NoInstancing,
InstancingOption::UseInstancing)),
testing::Combine(
testing::ValuesIn(::angle::FilterTestParams(platforms, ArraySize(platforms))),
testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID),
testing::Values(InstancingOption::NoInstancing, InstancingOption::UseInstancing),
testing::Values(BufferDataUsageOption::StaticDraw, BufferDataUsageOption::DynamicDraw)),
PrintToStringParamName());
INSTANTIATE_TEST_SUITE_P(
,
MultiDrawNoInstancingSupportTest,
testing::Combine(testing::ValuesIn(::angle::FilterTestParams(es2_platforms,
ArraySize(es2_platforms))),
testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID),
testing::Values(InstancingOption::UseInstancing)),
testing::Combine(
testing::ValuesIn(::angle::FilterTestParams(es2_platforms, ArraySize(es2_platforms))),
testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID),
testing::Values(InstancingOption::UseInstancing),
testing::Values(BufferDataUsageOption::StaticDraw, BufferDataUsageOption::DynamicDraw)),
PrintToStringParamName());
} // namespace
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