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 ...@@ -260,7 +260,8 @@ class Context11 : public ContextD3D, public MultisampleTextureInitializer
const void *indices, const void *indices,
GLsizei instanceCount, GLsizei instanceCount,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance); GLuint baseInstance,
bool promoteDynamic);
Renderer11 *mRenderer; Renderer11 *mRenderer;
IncompleteTextureSet mIncompleteTextures; IncompleteTextureSet mIncompleteTextures;
......
...@@ -2169,7 +2169,8 @@ angle::Result StateManager11::updateState(const gl::Context *context, ...@@ -2169,7 +2169,8 @@ angle::Result StateManager11::updateState(const gl::Context *context,
const void *indices, const void *indices,
GLsizei instanceCount, GLsizei instanceCount,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance) GLuint baseInstance,
bool promoteDynamic)
{ {
const gl::State &glState = context->getState(); const gl::State &glState = context->getState();
...@@ -2213,7 +2214,7 @@ angle::Result StateManager11::updateState(const gl::Context *context, ...@@ -2213,7 +2214,7 @@ angle::Result StateManager11::updateState(const gl::Context *context,
ANGLE_TRY(mVertexArray11->syncStateForDraw(context, firstVertex, vertexOrIndexCount, ANGLE_TRY(mVertexArray11->syncStateForDraw(context, firstVertex, vertexOrIndexCount,
indexTypeOrInvalid, indices, instanceCount, indexTypeOrInvalid, indices, instanceCount,
baseVertex, baseInstance)); baseVertex, baseInstance, promoteDynamic));
// 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() != firstVertex) if (!mLastFirstVertex.valid() || mLastFirstVertex.value() != firstVertex)
......
...@@ -240,7 +240,8 @@ class StateManager11 final : angle::NonCopyable ...@@ -240,7 +240,8 @@ class StateManager11 final : angle::NonCopyable
const void *indices, const void *indices,
GLsizei instanceCount, GLsizei instanceCount,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance); GLuint baseInstance,
bool promoteDynamic);
void setShaderResourceShared(gl::ShaderType shaderType, void setShaderResourceShared(gl::ShaderType shaderType,
UINT resourceSlot, UINT resourceSlot,
......
...@@ -128,7 +128,8 @@ angle::Result VertexArray11::syncStateForDraw(const gl::Context *context, ...@@ -128,7 +128,8 @@ angle::Result VertexArray11::syncStateForDraw(const gl::Context *context,
const void *indices, const void *indices,
GLsizei instances, GLsizei instances,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance) GLuint baseInstance,
bool promoteDynamic)
{ {
Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer(); Renderer11 *renderer = GetImplAs<Context11>(context)->getRenderer();
StateManager11 *stateManager = renderer->getStateManager(); StateManager11 *stateManager = renderer->getStateManager();
...@@ -161,7 +162,7 @@ angle::Result VertexArray11::syncStateForDraw(const gl::Context *context, ...@@ -161,7 +162,7 @@ angle::Result VertexArray11::syncStateForDraw(const gl::Context *context,
ANGLE_TRY(updateDynamicAttribs(context, stateManager->getVertexDataManager(), ANGLE_TRY(updateDynamicAttribs(context, stateManager->getVertexDataManager(),
firstVertex, vertexOrIndexCount, indexTypeOrInvalid, firstVertex, vertexOrIndexCount, indexTypeOrInvalid,
indices, instances, baseVertex, baseInstance, indices, instances, baseVertex, baseInstance,
activeDynamicAttribs)); promoteDynamic, activeDynamicAttribs));
stateManager->invalidateInputLayout(); stateManager->invalidateInputLayout();
} }
} }
...@@ -295,6 +296,7 @@ angle::Result VertexArray11::updateDynamicAttribs(const gl::Context *context, ...@@ -295,6 +296,7 @@ angle::Result VertexArray11::updateDynamicAttribs(const gl::Context *context,
GLsizei instances, GLsizei instances,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance, GLuint baseInstance,
bool promoteDynamic,
const gl::AttributesMask &activeDynamicAttribs) const gl::AttributesMask &activeDynamicAttribs)
{ {
const auto &glState = context->getState(); const auto &glState = context->getState();
...@@ -322,8 +324,11 @@ angle::Result VertexArray11::updateDynamicAttribs(const gl::Context *context, ...@@ -322,8 +324,11 @@ angle::Result VertexArray11::updateDynamicAttribs(const gl::Context *context,
activeDynamicAttribs, startVertex, vertexCount, activeDynamicAttribs, startVertex, vertexCount,
instances, baseInstance)); instances, baseInstance));
VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs, if (promoteDynamic)
vertexCount); {
VertexDataManager::PromoteDynamicAttribs(context, mTranslatedAttribs, activeDynamicAttribs,
vertexCount);
}
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -40,7 +40,8 @@ class VertexArray11 : public VertexArrayImpl ...@@ -40,7 +40,8 @@ class VertexArray11 : public VertexArrayImpl
const void *indices, const void *indices,
GLsizei instances, GLsizei instances,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance); GLuint baseInstance,
bool promoteDynamic);
// This will check the dynamic attribs mask. // This will check the dynamic attribs mask.
bool hasActiveDynamicAttrib(const gl::Context *context); bool hasActiveDynamicAttrib(const gl::Context *context);
...@@ -74,6 +75,7 @@ class VertexArray11 : public VertexArrayImpl ...@@ -74,6 +75,7 @@ class VertexArray11 : public VertexArrayImpl
GLsizei instances, GLsizei instances,
GLint baseVertex, GLint baseVertex,
GLuint baseInstance, GLuint baseInstance,
bool promoteDynamic,
const gl::AttributesMask &activeDynamicAttribs); const gl::AttributesMask &activeDynamicAttribs);
angle::Result updateElementArrayStorage(const gl::Context *context, angle::Result updateElementArrayStorage(const gl::Context *context,
......
...@@ -359,14 +359,14 @@ void main() ...@@ -359,14 +359,14 @@ void main()
void doDrawArraysBaseInstanceReset() void doDrawArraysBaseInstanceReset()
{ {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 6 * kCountY); glDrawArraysInstanced(GL_TRIANGLES, 0, 6 * kCountY, 1);
} }
void doDrawElementsBaseVertexBaseInstanceReset() void doDrawElementsBaseVertexBaseInstanceReset()
{ {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, 6 * kCountY, GL_UNSIGNED_SHORT, glDrawElementsInstanced(GL_TRIANGLES, 6 * kCountY, GL_UNSIGNED_SHORT,
reinterpret_cast<GLvoid *>(static_cast<uintptr_t>(0))); reinterpret_cast<GLvoid *>(static_cast<uintptr_t>(0)), 1);
} }
void doMultiDrawElementsInstancedBaseVertexBaseInstance() void doMultiDrawElementsInstancedBaseVertexBaseInstance()
...@@ -582,6 +582,7 @@ TEST_P(DrawBaseVertexBaseInstanceTest, DrawArraysInstancedBaseInstance) ...@@ -582,6 +582,7 @@ TEST_P(DrawBaseVertexBaseInstanceTest, DrawArraysInstancedBaseInstance)
checkDrawResult(false); checkDrawResult(false);
doDrawArraysBaseInstanceReset(); doDrawArraysBaseInstanceReset();
EXPECT_GL_NO_ERROR();
checkDrawResult(false, true); checkDrawResult(false, true);
} }
...@@ -598,7 +599,6 @@ TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawArraysInstancedBaseInstance) ...@@ -598,7 +599,6 @@ TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawArraysInstancedBaseInstance)
} }
ANGLE_SKIP_TEST_IF(!requestExtensions()); ANGLE_SKIP_TEST_IF(!requestExtensions());
ANGLE_SKIP_TEST_IF(getBufferDataUsage() == GL_DYNAMIC_DRAW);
GLProgram program; GLProgram program;
setupProgram(program, true, true); setupProgram(program, true, true);
...@@ -619,6 +619,7 @@ TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawArraysInstancedBaseInstance) ...@@ -619,6 +619,7 @@ TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawArraysInstancedBaseInstance)
checkDrawResult(false); checkDrawResult(false);
doDrawArraysBaseInstanceReset(); doDrawArraysBaseInstanceReset();
EXPECT_GL_NO_ERROR();
checkDrawResult(false, true); checkDrawResult(false, true);
} }
...@@ -656,7 +657,6 @@ TEST_P(DrawBaseVertexBaseInstanceTest, DrawElementsInstancedBaseVertexBaseInstan ...@@ -656,7 +657,6 @@ TEST_P(DrawBaseVertexBaseInstanceTest, DrawElementsInstancedBaseVertexBaseInstan
TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawElementsInstancedBaseVertexBaseInstance) TEST_P(DrawBaseVertexBaseInstanceTest, MultiDrawElementsInstancedBaseVertexBaseInstance)
{ {
ANGLE_SKIP_TEST_IF(!requestExtensions()); ANGLE_SKIP_TEST_IF(!requestExtensions());
ANGLE_SKIP_TEST_IF(getBufferDataUsage() == GL_DYNAMIC_DRAW);
GLProgram program; GLProgram program;
setupProgram(program, false, true); setupProgram(program, false, true);
......
...@@ -62,7 +62,14 @@ enum class InstancingOption ...@@ -62,7 +62,14 @@ enum class InstancingOption
UseInstancing, 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 struct PrintToStringParamName
{ {
...@@ -70,6 +77,8 @@ struct PrintToStringParamName ...@@ -70,6 +77,8 @@ struct PrintToStringParamName
{ {
::std::stringstream ss; ::std::stringstream ss;
ss << std::get<0>(info.param) 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<2>(info.param) == InstancingOption::UseInstancing ? "__Instanced" : "")
<< (std::get<1>(info.param) == DrawIDOption::UseDrawID ? "__DrawID" : ""); << (std::get<1>(info.param) == DrawIDOption::UseDrawID ? "__DrawID" : "");
return ss.str(); return ss.str();
...@@ -111,6 +120,12 @@ class MultiDrawTest : public ANGLETestBase, public ::testing::TestWithParam<Mult ...@@ -111,6 +120,12 @@ class MultiDrawTest : public ANGLETestBase, public ::testing::TestWithParam<Mult
return std::get<2>(GetParam()) == InstancingOption::UseInstancing; 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() std::string VertexShaderSource()
{ {
...@@ -216,22 +231,22 @@ void main() ...@@ -216,22 +231,22 @@ void main()
glGenBuffers(1, &mNonIndexedVertexBuffer); glGenBuffers(1, &mNonIndexedVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mNonIndexedVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, mNonIndexedVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * mNonIndexedVertices.size(), glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * mNonIndexedVertices.size(),
mNonIndexedVertices.data(), GL_STATIC_DRAW); mNonIndexedVertices.data(), getBufferDataUsage());
glGenBuffers(1, &mVertexBuffer); glGenBuffers(1, &mVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * mVertices.size(), mVertices.data(), glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * mVertices.size(), mVertices.data(),
GL_STATIC_DRAW); getBufferDataUsage());
glGenBuffers(1, &mIndexBuffer); glGenBuffers(1, &mIndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * mIndices.size(), mIndices.data(), glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * mIndices.size(), mIndices.data(),
GL_STATIC_DRAW); getBufferDataUsage());
glGenBuffers(1, &mInstanceBuffer); glGenBuffers(1, &mInstanceBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mInstanceBuffer); glBindBuffer(GL_ARRAY_BUFFER, mInstanceBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instances.size(), instances.data(), glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instances.size(), instances.data(),
GL_STATIC_DRAW); getBufferDataUsage());
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
} }
...@@ -515,19 +530,21 @@ const angle::PlatformParameters es2_platforms[] = { ...@@ -515,19 +530,21 @@ const angle::PlatformParameters es2_platforms[] = {
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
, ,
MultiDrawTest, MultiDrawTest,
testing::Combine(testing::ValuesIn(::angle::FilterTestParams(platforms, ArraySize(platforms))), testing::Combine(
testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID), testing::ValuesIn(::angle::FilterTestParams(platforms, ArraySize(platforms))),
testing::Values(InstancingOption::NoInstancing, testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID),
InstancingOption::UseInstancing)), testing::Values(InstancingOption::NoInstancing, InstancingOption::UseInstancing),
testing::Values(BufferDataUsageOption::StaticDraw, BufferDataUsageOption::DynamicDraw)),
PrintToStringParamName()); PrintToStringParamName());
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
, ,
MultiDrawNoInstancingSupportTest, MultiDrawNoInstancingSupportTest,
testing::Combine(testing::ValuesIn(::angle::FilterTestParams(es2_platforms, testing::Combine(
ArraySize(es2_platforms))), testing::ValuesIn(::angle::FilterTestParams(es2_platforms, ArraySize(es2_platforms))),
testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID), testing::Values(DrawIDOption::NoDrawID, DrawIDOption::UseDrawID),
testing::Values(InstancingOption::UseInstancing)), testing::Values(InstancingOption::UseInstancing),
testing::Values(BufferDataUsageOption::StaticDraw, BufferDataUsageOption::DynamicDraw)),
PrintToStringParamName()); PrintToStringParamName());
} // namespace } // 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