Explorar el Código

Added stub functions for instancing when it's not supported.

bkaradzic hace 13 años
padre
commit
295f5166f4
Se han modificado 3 ficheros con 54 adiciones y 9 borrados
  1. 4 4
      src/glimports.h
  2. 38 5
      src/renderer_gl.cpp
  3. 12 0
      src/renderer_gl.h

+ 4 - 4
src/glimports.h

@@ -118,10 +118,6 @@ GL_IMPORT(true,  PFNGLGETQUERYOBJECTUI64VEXTPROC,         glGetQueryObjectui64vE
 													
 GL_IMPORT(true,  PFNGLSAMPLECOVERAGEARBPROC,              glSampleCoverageARB);
 
-GL_IMPORT(true,  PFNGLDRAWARRAYSINSTANCEDARBPROC,         glDrawArraysInstanced);
-GL_IMPORT(true,  PFNGLDRAWELEMENTSINSTANCEDARBPROC,       glDrawElementsInstanced);
-GL_IMPORT(true,  PFNGLVERTEXATTRIBDIVISORARBPROC,         glVertexAttribDivisor);
-													
 #if BGFX_CONFIG_DEBUG_GREMEDY						
 GL_IMPORT(true,  PFNGLSTRINGMARKERGREMEDYPROC,            glStringMarkerGREMEDY);
 GL_IMPORT(true,  PFNGLFRAMETERMINATORGREMEDYPROC,         glFrameTerminatorGREMEDY);
@@ -135,3 +131,7 @@ GL_IMPORT(true,  PFNGLFRAMETERMINATORGREMEDYPROC,         glFrameTerminatorGREME
 GL_IMPORT(true,  PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC, glGetTranslatedShaderSourceANGLE);
 
 #endif // BGFX_CONFIG_RENDERER_
+
+GL_IMPORT(true,  PFNGLVERTEXATTRIBDIVISORBGFXPROC,        glVertexAttribDivisor);
+GL_IMPORT(true,  PFNGLDRAWARRAYSINSTANCEDBGFXPROC,        glDrawArraysInstanced);
+GL_IMPORT(true,  PFNGLDRAWELEMENTSINSTANCEDBGFXPROC,      glDrawElementsInstanced);

+ 38 - 5
src/renderer_gl.cpp

@@ -27,6 +27,24 @@ namespace bgfx
 #include "glimports.h"
 #undef GL_IMPORT
 
+	static void GL_APIENTRY stubVertexAttribDivisor(GLuint /*_index*/, GLuint /*_divisor*/)
+	{
+	}
+
+	static void GL_APIENTRY stubDrawArraysInstanced(GLenum _mode, GLint _first, GLsizei _count, GLsizei /*_primcount*/)
+	{
+		glDrawArrays(_mode, _first, _count);
+	}
+
+	static void GL_APIENTRY stubDrawElementsInstanced(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei /*_primcount*/)
+	{
+		glDrawElements(_mode, _count, _type, _indices);
+	}
+
+	static PFNGLVERTEXATTRIBDIVISORBGFXPROC s_vertexAttribDivisor = stubVertexAttribDivisor;
+	static PFNGLDRAWARRAYSINSTANCEDBGFXPROC s_drawArraysInstanced = stubDrawArraysInstanced;
+	static PFNGLDRAWELEMENTSINSTANCEDBGFXPROC s_drawElementsInstanced = stubDrawElementsInstanced;
+
 	typedef void (*PostSwapBuffersFn)(uint32_t _width, uint32_t _height);
 
 #if BX_PLATFORM_NACL
@@ -358,6 +376,21 @@ namespace bgfx
 #endif // BX_PLATFORM_
 			}
 
+			if (NULL != glVertexAttribDivisor
+			&&  NULL != glDrawArraysInstanced
+			&&  NULL != glDrawElementsInstanced)
+			{
+				s_vertexAttribDivisor = glVertexAttribDivisor;
+				s_drawArraysInstanced = glDrawArraysInstanced;
+				s_drawElementsInstanced = glDrawElementsInstanced;
+			}
+			else
+			{
+				s_vertexAttribDivisor = stubVertexAttribDivisor;
+				s_drawArraysInstanced = stubDrawArraysInstanced;
+				s_drawElementsInstanced = stubDrawElementsInstanced;
+			}
+
 			m_flip = true;
 		}
 
@@ -1030,7 +1063,7 @@ namespace bgfx
 				GL_CHECK(glEnableVertexAttribArray(loc) );
 				enabled |= 1<<attr;
 
-				GL_CHECK(glVertexAttribDivisor(loc, 0) );
+				GL_CHECK(s_vertexAttribDivisor(loc, 0) );
 
 				uint32_t baseVertex = _baseVertex*_vertexDecl.m_stride + _vertexDecl.m_offset[attr];
 				GL_CHECK(glVertexAttribPointer(loc, num, s_attribType[type], normalized, _vertexDecl.m_stride, (void*)(uintptr_t)baseVertex) );
@@ -1073,7 +1106,7 @@ namespace bgfx
 			GLuint loc = m_instanceData[ii];
 			GL_CHECK(glEnableVertexAttribArray(loc) );
 			GL_CHECK(glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, _stride, (void*)(uintptr_t)baseVertex) );
-			GL_CHECK(glVertexAttribDivisor(loc, 1) );
+			GL_CHECK(s_vertexAttribDivisor(loc, 1) );
 			baseVertex += 16;
 		}
 	}
@@ -2381,7 +2414,7 @@ namespace bgfx
 								numInstances = state.m_numInstances;
 								numPrimsRendered = numPrimsSubmitted*state.m_numInstances;
 
-								GL_CHECK(glDrawElementsInstanced(primType
+								GL_CHECK(s_drawElementsInstanced(primType
 									, s_renderCtx.m_indexBuffers[state.m_indexBuffer.idx].m_size/2
 									, GL_UNSIGNED_SHORT
 									, (void*)0
@@ -2395,7 +2428,7 @@ namespace bgfx
 								numInstances = state.m_numInstances;
 								numPrimsRendered = numPrimsSubmitted*state.m_numInstances;
 
-								GL_CHECK(glDrawElementsInstanced(primType
+								GL_CHECK(s_drawElementsInstanced(primType
 									, numIndices
 									, GL_UNSIGNED_SHORT
 									, (void*)(uintptr_t)(state.m_startIndex*2)
@@ -2409,7 +2442,7 @@ namespace bgfx
 							numInstances = state.m_numInstances;
 							numPrimsRendered = numPrimsSubmitted*state.m_numInstances;
 
-							GL_CHECK(glDrawArraysInstanced(primType
+							GL_CHECK(s_drawArraysInstanced(primType
 								, 0
 								, state.m_numVertices
 								, state.m_numInstances

+ 12 - 0
src/renderer_gl.h

@@ -130,8 +130,20 @@ typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth);
 typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
 #endif // BGFX_USE_WGL
 
+#ifndef GL_APIENTRY
+#	define GL_APIENTRY APIENTRY
+#endif // GL_APIENTRY
+
+#ifndef GL_APIENTRYP
+#	define GL_APIENTRYP APIENTRYP
+#endif // GL_APIENTRYP
+
 namespace bgfx
 {
+	typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORBGFXPROC)(GLuint _index, GLuint _divisor);
+	typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBGFXPROC)(GLenum _mode, GLint _first, GLsizei _count, GLsizei _primcount);
+	typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBGFXPROC)(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei _primcount);
+
 #	define _GL_CHECK(_call) \
 				do { \
 					/*BX_TRACE(#_call);*/ \