diff --git a/examples/05-instancing/vs_instancing.sc b/examples/05-instancing/vs_instancing.sc index 598f7d61f..767aa03bf 100644 --- a/examples/05-instancing/vs_instancing.sc +++ b/examples/05-instancing/vs_instancing.sc @@ -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; } diff --git a/examples/runtime/shaders/essl/fs_instancing.bin b/examples/runtime/shaders/essl/fs_instancing.bin index 432320c41..9f1d90f47 100644 Binary files a/examples/runtime/shaders/essl/fs_instancing.bin and b/examples/runtime/shaders/essl/fs_instancing.bin differ diff --git a/examples/runtime/shaders/essl/vs_instancing.bin b/examples/runtime/shaders/essl/vs_instancing.bin index 7f1f94443..7c4eeb40f 100644 Binary files a/examples/runtime/shaders/essl/vs_instancing.bin and b/examples/runtime/shaders/essl/vs_instancing.bin differ diff --git a/examples/runtime/shaders/glsl/fs_instancing.bin b/examples/runtime/shaders/glsl/fs_instancing.bin index ee3d27b22..db3e50778 100644 Binary files a/examples/runtime/shaders/glsl/fs_instancing.bin and b/examples/runtime/shaders/glsl/fs_instancing.bin differ diff --git a/examples/runtime/shaders/glsl/vs_instancing.bin b/examples/runtime/shaders/glsl/vs_instancing.bin index 32e416d67..9c2c3df23 100644 Binary files a/examples/runtime/shaders/glsl/vs_instancing.bin and b/examples/runtime/shaders/glsl/vs_instancing.bin differ diff --git a/examples/runtime/shaders/metal/fs_instancing.bin b/examples/runtime/shaders/metal/fs_instancing.bin index 02bbc413e..3c5b19845 100644 Binary files a/examples/runtime/shaders/metal/fs_instancing.bin and b/examples/runtime/shaders/metal/fs_instancing.bin differ diff --git a/examples/runtime/shaders/metal/vs_instancing.bin b/examples/runtime/shaders/metal/vs_instancing.bin index 1d2a7f4ba..a419af980 100644 Binary files a/examples/runtime/shaders/metal/vs_instancing.bin and b/examples/runtime/shaders/metal/vs_instancing.bin differ diff --git a/examples/runtime/shaders/spirv/fs_instancing.bin b/examples/runtime/shaders/spirv/fs_instancing.bin index 1f7118854..9811c2d18 100644 Binary files a/examples/runtime/shaders/spirv/fs_instancing.bin and b/examples/runtime/shaders/spirv/fs_instancing.bin differ diff --git a/examples/runtime/shaders/spirv/vs_instancing.bin b/examples/runtime/shaders/spirv/vs_instancing.bin index 17c89726a..cd6ae49fe 100644 Binary files a/examples/runtime/shaders/spirv/vs_instancing.bin and b/examples/runtime/shaders/spirv/vs_instancing.bin differ diff --git a/src/glcontext_html5.cpp b/src/glcontext_html5.cpp index 5110e85e7..a884ab7b3 100644 --- a/src/glcontext_html5.cpp +++ b/src/glcontext_html5.cpp @@ -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; diff --git a/src/glimports.h b/src/glimports.h index cb3a33da4..dd90df7fa 100644 --- a/src/glimports.h +++ b/src/glimports.h @@ -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); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 9b4c09dcf..f3de855a5 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -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) )