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

@@ -10,13 +10,9 @@ $output v_color0
void main()
{
mat4 model;
model[0] = i_data0;
model[1] = i_data1;
model[2] = i_data2;
model[3] = i_data3;
mat4 model = mtxFromCols(i_data0, i_data1, i_data2, i_data3);
vec4 worldPos = instMul(model, vec4(a_position, 1.0) );
vec4 worldPos = mul(model, vec4(a_position, 1.0) );
gl_Position = mul(u_viewProj, worldPos);
v_color0 = a_color0*i_data4;
}

View File

@@ -112,12 +112,12 @@ namespace bgfx { namespace gl
// Work around bug https://bugs.chromium.org/p/chromium/issues/detail?id=1045643 in Chrome
// by having alpha always enabled.
s_attrs.alpha = true;
s_attrs.premultipliedAlpha = false;
s_attrs.depth = true;
s_attrs.stencil = true;
s_attrs.alpha = true;
s_attrs.premultipliedAlpha = false;
s_attrs.depth = true;
s_attrs.stencil = true;
s_attrs.enableExtensionsByDefault = true;
s_attrs.antialias = false;
s_attrs.antialias = false;
s_attrs.minorVersion = 0;
const char* canvas = (const char*) _nwh;

View File

@@ -447,6 +447,10 @@ GL_IMPORT_ARB__(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttri
GL_IMPORT_ARB__(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced);
GL_IMPORT_ARB__(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
GL_IMPORT______(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisorNV);
GL_IMPORT______(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstancedNV);
GL_IMPORT______(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstancedNV);
GL_IMPORT_ARB__(true, PFNGLDRAWBUFFERSPROC, glDrawBuffers);
GL_IMPORT_ARB__(true, PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer);
@@ -547,12 +551,20 @@ GL_IMPORT_OES__(true, PFNGLPROGRAMBINARYPROC, glProgramBina
GL_IMPORT_EXT__(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor);
GL_IMPORT_EXT__(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced);
GL_IMPORT_EXT__(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
#elif BX_PLATFORM_EMSCRIPTEN
GL_IMPORT_ANGLE(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor);
GL_IMPORT_ANGLE(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced);
GL_IMPORT_ANGLE(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
#else
GL_IMPORT_OES__(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor);
GL_IMPORT_OES__(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced);
GL_IMPORT_OES__(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
#endif // BX_PLATFORM_IOS
GL_IMPORT______(true, PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisorNV);
GL_IMPORT______(true, PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstancedNV);
GL_IMPORT______(true, PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstancedNV);
GL_IMPORT_OES__(true, PFNGLBINDVERTEXARRAYPROC, glBindVertexArray);
GL_IMPORT_OES__(true, PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays);
GL_IMPORT_OES__(true, PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays);

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