Fixing WebGL + Android instancing.

This commit is contained in:
Бранимир Караџић
2021-05-18 20:22:46 -07:00
parent 6ca5060ce8
commit 3214539bad
12 changed files with 46 additions and 18 deletions

View File

@@ -626,6 +626,8 @@ namespace bgfx { namespace gl
NV_conservative_raster,
NV_copy_image,
NV_draw_buffers,
NV_draw_instanced,
NV_instanced_arrays,
NV_occlusion_query,
NV_texture_border_clamp,
NVX_gpu_memory_info,
@@ -841,6 +843,8 @@ namespace bgfx { namespace gl
{ "NV_conservative_raster", false, true },
{ "NV_copy_image", false, true },
{ "NV_draw_buffers", false, true }, // GLES2 extension.
{ "NV_draw_instanced", false, true }, // GLES2 extension.
{ "NV_instanced_arrays", false, true }, // GLES2 extension.
{ "NV_occlusion_query", false, true },
{ "NV_texture_border_clamp", false, true }, // GLES2 extension.
{ "NVX_gpu_memory_info", false, true },
@@ -2223,17 +2227,20 @@ namespace bgfx { namespace gl
int glVersion;
int majorGlVersion = 0;
int minorGlVersion = 0;
const char *version = m_version;
const char* version = m_version;
while(*version && (*version < '0' || *version > '9') )
while (*version && !bx::isNumeric(*version) )
{
++version;
}
majorGlVersion = atoi(version);
minorGlVersion = atoi(version + 2);
bx::fromString(&majorGlVersion, version);
bx::fromString(&minorGlVersion, version + 2);
glVersion = majorGlVersion*10 + minorGlVersion;
BX_TRACE("Parsed version %d (%d.%d).", glVersion, majorGlVersion, minorGlVersion);
for (uint32_t ii = 0; ii < BX_COUNTOF(s_vendorIds); ++ii)
{
const VendorId& vendorId = s_vendorIds[ii];
@@ -2967,15 +2974,18 @@ namespace bgfx { namespace gl
m_readPixelsFmt = GL_RGBA;
}
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) )
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30)
|| (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) && glVersion >= 30) )
{
g_caps.supported |= BGFX_CAPS_INSTANCING;
}
else
{
if (s_extension[Extension::ANGLE_instanced_arrays].m_supported
|| s_extension[Extension::ARB_instanced_arrays].m_supported
|| s_extension[Extension::EXT_instanced_arrays].m_supported)
|| s_extension[Extension:: ARB_instanced_arrays].m_supported
|| s_extension[Extension:: EXT_instanced_arrays].m_supported
|| (s_extension[Extension:: NV_instanced_arrays].m_supported && s_extension[Extension::NV_draw_instanced].m_supported)
)
{
if (NULL != glVertexAttribDivisor
&& NULL != glDrawArraysInstanced
@@ -2983,6 +2993,16 @@ namespace bgfx { namespace gl
{
g_caps.supported |= BGFX_CAPS_INSTANCING;
}
else if (NULL != glVertexAttribDivisorNV
&& NULL != glDrawArraysInstancedNV
&& NULL != glDrawElementsInstancedNV)
{
glVertexAttribDivisor = glVertexAttribDivisorNV;
glDrawArraysInstanced = glDrawArraysInstancedNV;
glDrawElementsInstanced = glDrawElementsInstancedNV;
g_caps.supported |= BGFX_CAPS_INSTANCING;
}
}
if (0 == (g_caps.supported & BGFX_CAPS_INSTANCING) )