Browse Source

Fixing WebGL + Android instancing.

Бранимир Караџић 4 years ago
parent
commit
3214539bad

+ 2 - 6
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;
 }

BIN
examples/runtime/shaders/essl/fs_instancing.bin


BIN
examples/runtime/shaders/essl/vs_instancing.bin


BIN
examples/runtime/shaders/glsl/fs_instancing.bin


BIN
examples/runtime/shaders/glsl/vs_instancing.bin


BIN
examples/runtime/shaders/metal/fs_instancing.bin


BIN
examples/runtime/shaders/metal/vs_instancing.bin


BIN
examples/runtime/shaders/spirv/fs_instancing.bin


BIN
examples/runtime/shaders/spirv/vs_instancing.bin


+ 5 - 5
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;

+ 12 - 0
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);

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