From 3214539bad5e9c3c15d6c31cd8b6fbfbb54e0920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Tue, 18 May 2021 20:22:46 -0700 Subject: [PATCH] Fixing WebGL + Android instancing. --- examples/05-instancing/vs_instancing.sc | 8 ++--- .../runtime/shaders/essl/fs_instancing.bin | Bin 93 -> 93 bytes .../runtime/shaders/essl/vs_instancing.bin | Bin 608 -> 616 bytes .../runtime/shaders/glsl/fs_instancing.bin | Bin 87 -> 87 bytes .../runtime/shaders/glsl/vs_instancing.bin | Bin 542 -> 550 bytes .../runtime/shaders/metal/fs_instancing.bin | Bin 386 -> 386 bytes .../runtime/shaders/metal/vs_instancing.bin | Bin 1123 -> 950 bytes .../runtime/shaders/spirv/fs_instancing.bin | Bin 466 -> 466 bytes .../runtime/shaders/spirv/vs_instancing.bin | Bin 1547 -> 1485 bytes src/glcontext_html5.cpp | 10 +++--- src/glimports.h | 12 +++++++ src/renderer_gl.cpp | 34 ++++++++++++++---- 12 files changed, 46 insertions(+), 18 deletions(-) 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 432320c41590625803131b47f5cf60675b796926..9f1d90f476ea73c88facaee1aff1f4710bf765f6 100644 GIT binary patch delta 10 Rcma!zWpNAk;GW152>=e20+|2+ delta 10 Rcma!zWpNAk;GD=32>=d_0+#>) diff --git a/examples/runtime/shaders/essl/vs_instancing.bin b/examples/runtime/shaders/essl/vs_instancing.bin index 7f1f94443ccd78a5d104e53678e1e25f05372373..7c4eeb40f6e1625d15a04a72325228a38311e04f 100644 GIT binary patch delta 160 zcmaFB@`6P@EZBpa0SK0KzxQNh;3|zT%S(^b delta 152 zcmaFC@_-9qMQjjLCqHAf006KLFPi`W delta 145 zcmZ3+GLJlm~6x-yzz_# z)8sA8>hWng`H3Ya8ku=|iSY&b#hE3U`FT1DhI$5?3R(&!MTvREK+#kUh_VW>!p!)T a#F9h<9R;8!2-^^eZG^-&)|~vCIRgMkKQRIT delta 298 zcmdnS{+L5KEZBpS0SK0KzxQNh;3|zT%SCm&+cWd}(pXems7&m=Y3pE(@>iPTQS diff --git a/examples/runtime/shaders/spirv/fs_instancing.bin b/examples/runtime/shaders/spirv/fs_instancing.bin index 1f7118854c8a4644bc5817169445ad8e418d05a9..9811c2d18b0b360437db19b0076e52147a64c2cc 100644 GIT binary patch delta 13 Ucmcb_e2JOGE!cy5Bg;8P03PfF9{>OV delta 13 Ucmcb_e2JOGE!cx|Bg;8P03PB59RL6T diff --git a/examples/runtime/shaders/spirv/vs_instancing.bin b/examples/runtime/shaders/spirv/vs_instancing.bin index 17c89726aa793829a8bbbd262cfd68e86c3a9e3c..cd6ae49fee93de03a648904dda6432a3ae2c3495 100644 GIT binary patch literal 1485 zcmZXTO=}ZT6o!vUr?oAprTDQbX}c6c)mj9xRyT=IFjC{!W*FL9N0UrQCefk`H?Blc z@F(~e{6N%&f5iF=+_-Qf`aXB&#u0CLXU==hx#ynq-pRF%`m|}ie)|2=KAReZ!+86C zqnF$rlM|S|3e3u-#R)Sd*na!wyk;|2lE-Y?#@)NNzOi2Ir(4zK(@Ufru(Hb}=b#vi zitQ-wVBZm1LL&5pf$%_hC_EQl3T6Fty!}v-K)Z|k1D$(av1TW}o%GrlTgm16*;-jA^>?ZvtY-`({w71(x;!b*bkah=Yb*B|JM#m~|(#`*W-f+}$UA-|s3tj5k z<@uuX{_E2P+99DP9mp#=d(3IFAe&WFB{Z6MEaT`jSKw#_=U&N2AGoiFK5%ZIIQqcp z5sp4^?iG$c@bR2;_wJj_Io|A#`V(DbW7P3o|h z{Hr>f*q%WAiaO+u-w5=>^1ipS@u7$Jy~};f$~nySUSL1@#217Ys!QyHKzvWQARl-B zQQ$jh3iM7tp9K7V-)GtE#s4I)^+h%sGUuuk<}S#?<{pUuQnzR5cp}jA_h_xzA5nLn AegFUf literal 1547 zcmZXTOKVe66opT6bJG|2KzxiOwbDr;RIMV2+O$F<6igdhQIy*>P2_5tThg0WapJ_0 z6a5GE0qVe+zd=OQk^jSq11F;EJNKR#?FlPquf6v%cXJtIateI&jq$P*L&hjn5%XP$)5h>zOYW}BV3`=A9DH!wUGMxC7<@Awg$DIYm=Csp8Nw|=5^utH|N@~0OMRDrT z5BYHP#Yg^fYSSZeIC>Lz`RF~!(R+}i_aI;UkE1tn>g{Mp2iFfA{qa!`p8O9v<5?}g z$ahY!$BbyoBLAm6yy-=GxvwTL8=QHr3(Vr;H)S)6$mv+1yQ>xt;%$>{Wp{vpD}}+0-J=T#K42uYFfw2A1nn3^n 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) )