mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-06 02:09:55 +03:00
Fix multi-draw's gl_DrawID in non-multi-draw draws
The uniform value for gl_DrawID was never reset, so if a program was first used with multi-draw and then without it, gl_DrawID would not contain zero. Test credit info-tibo@orange.fr Bug: angleproject:8245 Change-Id: I73a613ab2858cde4633fadf6a1a523e462167eb0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4662137 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Steven Noonan <steven@uplinklabs.net> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
This commit is contained in:
committed by
Angle LUCI CQ
parent
0892420bcf
commit
fede75ffbd
@@ -483,63 +483,65 @@ angle::Result Context11::drawElementsIndirect(const gl::Context *context,
|
||||
}
|
||||
|
||||
#define DRAW_ARRAYS__ \
|
||||
do \
|
||||
{ \
|
||||
ANGLE_TRY(mRenderer->getStateManager()->updateState( \
|
||||
context, mode, firsts[drawID], counts[drawID], gl::DrawElementsType::InvalidEnum, \
|
||||
nullptr, 0, 0, 0, false)); \
|
||||
ANGLE_TRY( \
|
||||
mRenderer->drawArrays(context, mode, firsts[drawID], counts[drawID], 0, 0, false)); \
|
||||
}
|
||||
} while (0)
|
||||
#define DRAW_ARRAYS_INSTANCED_ \
|
||||
do \
|
||||
{ \
|
||||
ANGLE_TRY(mRenderer->getStateManager()->updateState( \
|
||||
context, mode, firsts[drawID], counts[drawID], gl::DrawElementsType::InvalidEnum, \
|
||||
nullptr, instanceCounts[drawID], 0, 0, false)); \
|
||||
ANGLE_TRY(mRenderer->drawArrays(context, mode, firsts[drawID], counts[drawID], \
|
||||
instanceCounts[drawID], 0, true)); \
|
||||
}
|
||||
} while (0)
|
||||
#define DRAW_ARRAYS_INSTANCED_BASE_INSTANCE \
|
||||
do \
|
||||
{ \
|
||||
ANGLE_TRY(mRenderer->getStateManager()->updateState( \
|
||||
context, mode, firsts[drawID], counts[drawID], gl::DrawElementsType::InvalidEnum, \
|
||||
nullptr, instanceCounts[drawID], 0, baseInstances[drawID], false)); \
|
||||
ANGLE_TRY(mRenderer->drawArrays(context, mode, firsts[drawID], counts[drawID], \
|
||||
instanceCounts[drawID], baseInstances[drawID], true)); \
|
||||
}
|
||||
#define DRAW_ELEMENTS__ \
|
||||
{ \
|
||||
ANGLE_TRY(drawElementsImpl(context, mode, counts[drawID], type, indices[drawID], 0, 0, 0, \
|
||||
false, false)); \
|
||||
}
|
||||
#define DRAW_ELEMENTS_INSTANCED_ \
|
||||
{ \
|
||||
ANGLE_TRY(drawElementsImpl(context, mode, counts[drawID], type, indices[drawID], \
|
||||
instanceCounts[drawID], 0, 0, false, true)); \
|
||||
}
|
||||
#define DRAW_ELEMENTS_INSTANCED_BASE_VERTEX_BASE_INSTANCE \
|
||||
{ \
|
||||
ANGLE_TRY(drawElementsImpl(context, mode, counts[drawID], type, indices[drawID], \
|
||||
instanceCounts[drawID], baseVertices[drawID], \
|
||||
baseInstances[drawID], false, true)); \
|
||||
}
|
||||
} while (0)
|
||||
#define DRAW_ELEMENTS__ \
|
||||
ANGLE_TRY(drawElementsImpl(context, mode, counts[drawID], type, indices[drawID], 0, 0, 0, \
|
||||
false, false))
|
||||
#define DRAW_ELEMENTS_INSTANCED_ \
|
||||
ANGLE_TRY(drawElementsImpl(context, mode, counts[drawID], type, indices[drawID], \
|
||||
instanceCounts[drawID], 0, 0, false, true))
|
||||
#define DRAW_ELEMENTS_INSTANCED_BASE_VERTEX_BASE_INSTANCE \
|
||||
ANGLE_TRY(drawElementsImpl(context, mode, counts[drawID], type, indices[drawID], \
|
||||
instanceCounts[drawID], baseVertices[drawID], \
|
||||
baseInstances[drawID], false, true))
|
||||
|
||||
#define DRAW_CALL(drawType, instanced, bvbi) DRAW_##drawType##instanced##bvbi
|
||||
|
||||
#define MULTI_DRAW_BLOCK(drawType, instanced, bvbi, hasDrawID, hasBaseVertex, hasBaseInstance) \
|
||||
for (GLsizei drawID = 0; drawID < drawcount; ++drawID) \
|
||||
do \
|
||||
{ \
|
||||
if (ANGLE_NOOP_DRAW(instanced)) \
|
||||
for (GLsizei drawID = 0; drawID < drawcount; ++drawID) \
|
||||
{ \
|
||||
continue; \
|
||||
if (ANGLE_NOOP_DRAW(instanced)) \
|
||||
{ \
|
||||
continue; \
|
||||
} \
|
||||
ANGLE_SET_DRAW_ID_UNIFORM(hasDrawID)(drawID); \
|
||||
ANGLE_SET_BASE_VERTEX_UNIFORM(hasBaseVertex)(baseVertices[drawID]); \
|
||||
ANGLE_SET_BASE_INSTANCE_UNIFORM(hasBaseInstance)(baseInstances[drawID]); \
|
||||
ASSERT(counts[drawID] > 0); \
|
||||
DRAW_CALL(drawType, instanced, bvbi); \
|
||||
ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE(instanced); \
|
||||
gl::MarkShaderStorageUsage(context); \
|
||||
} \
|
||||
ANGLE_SET_DRAW_ID_UNIFORM(hasDrawID)(drawID); \
|
||||
ANGLE_SET_BASE_VERTEX_UNIFORM(hasBaseVertex)(baseVertices[drawID]); \
|
||||
ANGLE_SET_BASE_INSTANCE_UNIFORM(hasBaseInstance)(baseInstances[drawID]); \
|
||||
ASSERT(counts[drawID] > 0); \
|
||||
DRAW_CALL(drawType, instanced, bvbi); \
|
||||
ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE(instanced); \
|
||||
gl::MarkShaderStorageUsage(context); \
|
||||
}
|
||||
/* reset the uniform to zero for non-multi-draw uses of the program */ \
|
||||
ANGLE_SET_DRAW_ID_UNIFORM(hasDrawID)(0); \
|
||||
} while (0)
|
||||
|
||||
angle::Result Context11::multiDrawArrays(const gl::Context *context,
|
||||
gl::PrimitiveMode mode,
|
||||
@@ -551,11 +553,11 @@ angle::Result Context11::multiDrawArrays(const gl::Context *context,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -572,11 +574,11 @@ angle::Result Context11::multiDrawArraysInstanced(const gl::Context *context,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -602,11 +604,11 @@ angle::Result Context11::multiDrawElements(const gl::Context *context,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -624,11 +626,11 @@ angle::Result Context11::multiDrawElementsInstanced(const gl::Context *context,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -660,19 +662,19 @@ angle::Result Context11::multiDrawArraysInstancedBaseInstance(const gl::Context
|
||||
|
||||
if (hasDrawID && hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 1);
|
||||
}
|
||||
else if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 0);
|
||||
}
|
||||
else if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -701,22 +703,22 @@ angle::Result Context11::multiDrawElementsInstancedBaseVertexBaseInstance(
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -726,22 +728,22 @@ angle::Result Context11::multiDrawElementsInstancedBaseVertexBaseInstance(
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1172,20 +1172,25 @@ void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy)
|
||||
#define DRAW_CALL(drawType, instanced, bvbi) DRAW_##drawType##instanced##bvbi
|
||||
|
||||
#define MULTI_DRAW_BLOCK(drawType, instanced, bvbi, hasDrawID, hasBaseVertex, hasBaseInstance) \
|
||||
for (GLsizei drawID = 0; drawID < drawcount; ++drawID) \
|
||||
do \
|
||||
{ \
|
||||
if (ANGLE_NOOP_DRAW(instanced)) \
|
||||
for (GLsizei drawID = 0; drawID < drawcount; ++drawID) \
|
||||
{ \
|
||||
ANGLE_TRY(contextImpl->handleNoopDrawEvent()); \
|
||||
continue; \
|
||||
if (ANGLE_NOOP_DRAW(instanced)) \
|
||||
{ \
|
||||
ANGLE_TRY(contextImpl->handleNoopDrawEvent()); \
|
||||
continue; \
|
||||
} \
|
||||
ANGLE_SET_DRAW_ID_UNIFORM(hasDrawID)(drawID); \
|
||||
ANGLE_SET_BASE_VERTEX_UNIFORM(hasBaseVertex)(baseVertices[drawID]); \
|
||||
ANGLE_SET_BASE_INSTANCE_UNIFORM(hasBaseInstance)(baseInstances[drawID]); \
|
||||
ANGLE_TRY(DRAW_CALL(drawType, instanced, bvbi)); \
|
||||
ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE(instanced); \
|
||||
gl::MarkShaderStorageUsage(context); \
|
||||
} \
|
||||
ANGLE_SET_DRAW_ID_UNIFORM(hasDrawID)(drawID); \
|
||||
ANGLE_SET_BASE_VERTEX_UNIFORM(hasBaseVertex)(baseVertices[drawID]); \
|
||||
ANGLE_SET_BASE_INSTANCE_UNIFORM(hasBaseInstance)(baseInstances[drawID]); \
|
||||
ANGLE_TRY(DRAW_CALL(drawType, instanced, bvbi)); \
|
||||
ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE(instanced); \
|
||||
gl::MarkShaderStorageUsage(context); \
|
||||
}
|
||||
/* reset the uniform to zero for non-multi-draw uses of the program */ \
|
||||
ANGLE_SET_DRAW_ID_UNIFORM(hasDrawID)(0); \
|
||||
} while (0)
|
||||
|
||||
angle::Result MultiDrawArraysGeneral(ContextImpl *contextImpl,
|
||||
const gl::Context *context,
|
||||
@@ -1198,11 +1203,11 @@ angle::Result MultiDrawArraysGeneral(ContextImpl *contextImpl,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -1246,11 +1251,11 @@ angle::Result MultiDrawArraysInstancedGeneral(ContextImpl *contextImpl,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -1268,11 +1273,11 @@ angle::Result MultiDrawElementsGeneral(ContextImpl *contextImpl,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -1319,11 +1324,11 @@ angle::Result MultiDrawElementsInstancedGeneral(ContextImpl *contextImpl,
|
||||
const bool hasDrawID = programObject && programObject->hasDrawIDUniform();
|
||||
if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -1345,19 +1350,19 @@ angle::Result MultiDrawArraysInstancedBaseInstanceGeneral(ContextImpl *contextIm
|
||||
|
||||
if (hasDrawID && hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 1);
|
||||
}
|
||||
else if (hasDrawID)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 1, 0, 0);
|
||||
}
|
||||
else if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ARRAYS, _INSTANCED, _BASE_INSTANCE, 0, 0, 0);
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
@@ -1386,22 +1391,22 @@ angle::Result MultiDrawElementsInstancedBaseVertexBaseInstanceGeneral(ContextImp
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 1, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 1, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1411,22 +1416,22 @@ angle::Result MultiDrawElementsInstancedBaseVertexBaseInstanceGeneral(ContextImp
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 1, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasBaseInstance)
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 1)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 0)
|
||||
MULTI_DRAW_BLOCK(ELEMENTS, _INSTANCED, _BASE_VERTEX_BASE_INSTANCE, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,15 +363,24 @@ void main()
|
||||
}
|
||||
}
|
||||
|
||||
void CheckDrawResult()
|
||||
enum class DrawIDOptionOverride
|
||||
{
|
||||
Default,
|
||||
NoDrawID,
|
||||
UseDrawID,
|
||||
};
|
||||
|
||||
void CheckDrawResult(DrawIDOptionOverride overrideDrawID)
|
||||
{
|
||||
for (uint32_t y = 0; y < kCountY; ++y)
|
||||
{
|
||||
for (uint32_t x = 0; x < kCountX; ++x)
|
||||
{
|
||||
uint32_t center_x = x * kTilePixelSize[0] + kTilePixelSize[0] / 2;
|
||||
uint32_t center_y = y * kTilePixelSize[1] + kTilePixelSize[1] / 2;
|
||||
uint32_t quadID = IsDrawIDTest() ? y * kCountX + x : 0;
|
||||
uint32_t center_x = x * kTilePixelSize[0] + kTilePixelSize[0] / 2;
|
||||
uint32_t center_y = y * kTilePixelSize[1] + kTilePixelSize[1] / 2;
|
||||
uint32_t quadID = IsDrawIDTest() && overrideDrawID != DrawIDOptionOverride::NoDrawID
|
||||
? y * kCountX + x
|
||||
: 0;
|
||||
uint32_t colorID = quadID % 3u;
|
||||
std::array<GLColor, 3> colors = {GLColor(255, 0, 0, 255), GLColor(0, 255, 0, 255),
|
||||
GLColor(0, 0, 255, 255)};
|
||||
@@ -595,7 +604,7 @@ TEST_P(MultiDrawTest, MultiDrawArrays)
|
||||
SetupProgram();
|
||||
DoDrawArrays();
|
||||
EXPECT_GL_NO_ERROR();
|
||||
CheckDrawResult();
|
||||
CheckDrawResult(DrawIDOptionOverride::Default);
|
||||
}
|
||||
|
||||
// Tests basic functionality of glMultiDrawElementsANGLE
|
||||
@@ -606,7 +615,44 @@ TEST_P(MultiDrawTest, MultiDrawElements)
|
||||
SetupProgram();
|
||||
DoDrawElements();
|
||||
EXPECT_GL_NO_ERROR();
|
||||
CheckDrawResult();
|
||||
CheckDrawResult(DrawIDOptionOverride::Default);
|
||||
}
|
||||
|
||||
// Tests that glMultiDrawArraysANGLE followed by glDrawArrays works. gl_DrawID in the second call
|
||||
// must be 0.
|
||||
TEST_P(MultiDrawTest, MultiDrawArraysThenDrawArrays)
|
||||
{
|
||||
ANGLE_SKIP_TEST_IF(!requestExtensions());
|
||||
|
||||
// http://anglebug.com/5265
|
||||
ANGLE_SKIP_TEST_IF(IsInstancedTest() && IsMac() && IsIntelUHD630Mobile() && IsDesktopOpenGL());
|
||||
|
||||
SetupBuffers();
|
||||
SetupProgram();
|
||||
DoDrawArrays();
|
||||
EXPECT_GL_NO_ERROR();
|
||||
CheckDrawResult(DrawIDOptionOverride::Default);
|
||||
|
||||
if (IsInstancedTest())
|
||||
{
|
||||
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_instanced_arrays") &&
|
||||
!IsGLExtensionEnabled("GL_ANGLE_instanced_arrays"));
|
||||
if (IsGLExtensionEnabled("GL_EXT_instanced_arrays"))
|
||||
{
|
||||
glDrawArraysInstancedEXT(GL_TRIANGLES, 0, 3 * kTriCount, 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 3 * kTriCount, 4);
|
||||
}
|
||||
ASSERT_GL_NO_ERROR();
|
||||
}
|
||||
else
|
||||
{
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3 * kTriCount);
|
||||
ASSERT_GL_NO_ERROR();
|
||||
}
|
||||
CheckDrawResult(DrawIDOptionOverride::NoDrawID);
|
||||
}
|
||||
|
||||
// Tests basic functionality of glMultiDrawArraysIndirectEXT
|
||||
|
||||
Reference in New Issue
Block a user