فهرست منبع

WIP: Refactoring OpenGL RAPI in order to support (more restrictive) 4.1 and ES versions
- Fall back on old GLSL reflection interface when program query interface is not available

BearishSun 8 سال پیش
والد
کامیت
67eaa119fc
2فایلهای تغییر یافته به همراه21 افزوده شده و 2 حذف شده
  1. 1 2
      Source/BansheeGLRenderAPI/BsGLPrerequisites.h
  2. 20 0
      Source/BansheeGLRenderAPI/GLSL/BsGLSLParamParser.cpp

+ 1 - 2
Source/BansheeGLRenderAPI/BsGLPrerequisites.h

@@ -16,8 +16,7 @@
 #define BS_OPENGL_4_5 1
 #define BS_OPENGL_4_5 1
 #define BS_OPENGL_4_6 0
 #define BS_OPENGL_4_6 0
 
 
-// 3.0 is the minimum supported version for OpenGL ES
-#define BS_OPENGLES_3_0 0
+// 3.1 is the minimum supported version for OpenGL ES
 #define BS_OPENGLES_3_1 0
 #define BS_OPENGLES_3_1 0
 #define BS_OPENGLES_3_2 0
 #define BS_OPENGLES_3_2 0
 
 

+ 20 - 0
Source/BansheeGLRenderAPI/GLSL/BsGLSLParamParser.cpp

@@ -146,8 +146,11 @@ namespace bs { namespace ct
 		BS_CHECK_GL_ERROR();
 		BS_CHECK_GL_ERROR();
 
 
 		GLint maxStorageBlockNameBufferSize = 0;
 		GLint maxStorageBlockNameBufferSize = 0;
+
+#if BS_OPENGL_4_3 || BS_OPENGLES_3_1
 		glGetProgramInterfaceiv(glProgram, GL_SHADER_STORAGE_BLOCK, GL_MAX_NAME_LENGTH, &maxStorageBlockNameBufferSize);
 		glGetProgramInterfaceiv(glProgram, GL_SHADER_STORAGE_BLOCK, GL_MAX_NAME_LENGTH, &maxStorageBlockNameBufferSize);
 		BS_CHECK_GL_ERROR();
 		BS_CHECK_GL_ERROR();
+#endif
 
 
 		maxBufferSize = std::max(maxBufferSize, maxBlockNameBufferSize);
 		maxBufferSize = std::max(maxBufferSize, maxBlockNameBufferSize);
 		maxBufferSize = std::max(maxBufferSize, maxStorageBlockNameBufferSize);
 		maxBufferSize = std::max(maxBufferSize, maxStorageBlockNameBufferSize);
@@ -164,17 +167,32 @@ namespace bs { namespace ct
 		returnParamDesc.paramBlocks[newGlobalBlockDesc.name] = newGlobalBlockDesc;
 		returnParamDesc.paramBlocks[newGlobalBlockDesc.name] = newGlobalBlockDesc;
 		GpuParamBlockDesc& globalBlockDesc = returnParamDesc.paramBlocks[newGlobalBlockDesc.name];
 		GpuParamBlockDesc& globalBlockDesc = returnParamDesc.paramBlocks[newGlobalBlockDesc.name];
 
 
+		// Enumerate uniform blocks
 		GLint uniformBlockCount = 0;
 		GLint uniformBlockCount = 0;
+
+#if BS_OPENGL_4_3 || BS_OPENGLES_3_1
+		// Use program interface extension if available
 		glGetProgramInterfaceiv(glProgram, GL_UNIFORM_BLOCK, GL_ACTIVE_RESOURCES, &uniformBlockCount);
 		glGetProgramInterfaceiv(glProgram, GL_UNIFORM_BLOCK, GL_ACTIVE_RESOURCES, &uniformBlockCount);
 		BS_CHECK_GL_ERROR();
 		BS_CHECK_GL_ERROR();
+#else
+		// Fall back to old API if not available
+		glGetProgramiv(glProgram, GL_ACTIVE_UNIFORM_BLOCKS, &uniformBlockCount);
+		BS_CHECK_GL_ERROR();
+#endif
 
 
 		Map<UINT32, String> blockSlotToName;
 		Map<UINT32, String> blockSlotToName;
 		Set<String> blockNames;
 		Set<String> blockNames;
 		for (GLuint index = 0; index < (GLuint)uniformBlockCount; index++)
 		for (GLuint index = 0; index < (GLuint)uniformBlockCount; index++)
 		{
 		{
 			GLsizei unusedSize = 0;
 			GLsizei unusedSize = 0;
+
+#if BS_OPENGL_4_3 || BS_OPENGLES_3_1
 			glGetProgramResourceName(glProgram, GL_UNIFORM_BLOCK, index, maxBufferSize, &unusedSize, uniformName);
 			glGetProgramResourceName(glProgram, GL_UNIFORM_BLOCK, index, maxBufferSize, &unusedSize, uniformName);
 			BS_CHECK_GL_ERROR();
 			BS_CHECK_GL_ERROR();
+#else
+			glGetActiveUniformBlockName(glProgram, index, maxBlockNameBufferSize, &unusedSize, uniformName);
+			BS_CHECK_GL_ERROR();
+#endif
 
 
 			GpuParamBlockDesc newBlockDesc;
 			GpuParamBlockDesc newBlockDesc;
 			newBlockDesc.slot = index + 1;
 			newBlockDesc.slot = index + 1;
@@ -188,6 +206,7 @@ namespace bs { namespace ct
 			blockNames.insert(newBlockDesc.name);
 			blockNames.insert(newBlockDesc.name);
 		}
 		}
 
 
+#if BS_OPENGL_4_3 || BS_OPENGLES_3_1
 		// Scan through the shared storage blocks
 		// Scan through the shared storage blocks
 		GLint storageBlockCount = 0;
 		GLint storageBlockCount = 0;
 		glGetProgramInterfaceiv(glProgram, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &storageBlockCount);
 		glGetProgramInterfaceiv(glProgram, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &storageBlockCount);
@@ -207,6 +226,7 @@ namespace bs { namespace ct
 
 
 			returnParamDesc.buffers.insert(std::make_pair(uniformName, bufferParam));
 			returnParamDesc.buffers.insert(std::make_pair(uniformName, bufferParam));
 		}
 		}
+#endif
 
 
 		Map<String, UINT32> foundFirstArrayIndex;
 		Map<String, UINT32> foundFirstArrayIndex;
 		Map<String, GpuParamDataDesc> foundStructs;
 		Map<String, GpuParamDataDesc> foundStructs;