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:
Shahbaz Youssefi
2023-07-06 11:38:35 -04:00
committed by Angle LUCI CQ
parent 0892420bcf
commit fede75ffbd
3 changed files with 140 additions and 87 deletions

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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