Просмотр исходного кода

GLES3 fixed gl_FragData patching.

Branimir Karadžić 11 лет назад
Родитель
Сommit
e907edd1eb
2 измененных файлов с 82 добавлено и 38 удалено
  1. 67 22
      src/renderer_gl.cpp
  2. 15 16
      src/renderer_gl.h

+ 67 - 22
src/renderer_gl.cpp

@@ -1313,7 +1313,7 @@ namespace bgfx
 			if (s_extension[Extension::OES_read_format].m_supported
 			if (s_extension[Extension::OES_read_format].m_supported
 			&& (s_extension[Extension::IMG_read_format].m_supported	|| s_extension[Extension::EXT_read_format_bgra].m_supported) )
 			&& (s_extension[Extension::IMG_read_format].m_supported	|| s_extension[Extension::EXT_read_format_bgra].m_supported) )
 			{
 			{
-				m_readPixelsFmt = GL_BGRA_EXT;
+				m_readPixelsFmt = GL_BGRA;
 			}
 			}
 			else
 			else
 			{
 			{
@@ -1327,10 +1327,10 @@ namespace bgfx
 			{
 			{
 				if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
 				if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
 				{
 				{
-					m_readPixelsFmt = GL_BGRA_EXT;
+					m_readPixelsFmt = GL_BGRA;
 				}
 				}
 
 
-				s_textureFormat[TextureFormat::BGRA8].m_fmt = GL_BGRA_EXT;
+				s_textureFormat[TextureFormat::BGRA8].m_fmt = GL_BGRA;
 
 
 				// Mixing GLES and GL extensions here. OpenGL EXT_bgra wants
 				// Mixing GLES and GL extensions here. OpenGL EXT_bgra wants
 				// format to be BGRA but internal format to stay RGBA, but
 				// format to be BGRA but internal format to stay RGBA, but
@@ -1342,7 +1342,7 @@ namespace bgfx
 				// https://www.opengl.org/registry/specs/EXT/bgra.txt
 				// https://www.opengl.org/registry/specs/EXT/bgra.txt
 				if (!s_extension[Extension::EXT_bgra].m_supported)
 				if (!s_extension[Extension::EXT_bgra].m_supported)
 				{
 				{
-					s_textureFormat[TextureFormat::BGRA8].m_internalFmt = GL_BGRA_EXT;
+					s_textureFormat[TextureFormat::BGRA8].m_internalFmt = GL_BGRA;
 				}
 				}
 			}
 			}
 
 
@@ -1385,8 +1385,8 @@ namespace bgfx
 			if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 31) )
 			if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL >= 31) )
 //			||  BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) )
 //			||  BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) )
 			{
 			{
-				s_textureFormat[TextureFormat::R8].m_internalFmt = GL_R8;
-				s_textureFormat[TextureFormat::R8].m_fmt         = GL_RED;
+// 				s_textureFormat[TextureFormat::R8].m_internalFmt = GL_R8;
+// 				s_textureFormat[TextureFormat::R8].m_fmt         = GL_RED;
 			}
 			}
 
 
 #if BGFX_CONFIG_RENDERER_OPENGL
 #if BGFX_CONFIG_RENDERER_OPENGL
@@ -1541,11 +1541,22 @@ namespace bgfx
 		{
 		{
 			GLENUM(GL_TEXTURE);
 			GLENUM(GL_TEXTURE);
 			GLENUM(GL_RENDERBUFFER);
 			GLENUM(GL_RENDERBUFFER);
+
+			GLENUM(GL_INVALID_ENUM);
+			GLENUM(GL_INVALID_VALUE);
+			GLENUM(GL_INVALID_OPERATION);
+			GLENUM(GL_OUT_OF_MEMORY);
+
+			GLENUM(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT);
+			GLENUM(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);
+//			GLENUM(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER);
+//			GLENUM(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER);
+			GLENUM(GL_FRAMEBUFFER_UNSUPPORTED);
 		}
 		}
 
 
 #undef GLENUM
 #undef GLENUM
 
 
-		return "UNKNOWN GLENUM!";
+		return "<GLenum?>";
 	}
 	}
 
 
 	UniformType::Enum convertGlType(GLenum _type)
 	UniformType::Enum convertGlType(GLenum _type)
@@ -1897,11 +1908,6 @@ namespace bgfx
 
 
 	static void texImage(GLenum _target, GLint _level, GLint _internalFormat, GLsizei _width, GLsizei _height, GLsizei _depth, GLint _border, GLenum _format, GLenum _type, const GLvoid* _data)
 	static void texImage(GLenum _target, GLint _level, GLint _internalFormat, GLsizei _width, GLsizei _height, GLsizei _depth, GLint _border, GLenum _format, GLenum _type, const GLvoid* _data)
 	{
 	{
-		if (BX_ENABLED(!BGFX_CONFIG_RENDERER_OPENGL) )
-		{
-			_internalFormat = _format; // GLES wants internal format to match format...
-		}
-
 		if (_target == GL_TEXTURE_3D)
 		if (_target == GL_TEXTURE_3D)
 		{
 		{
 			GL_CHECK(glTexImage3D(_target, _level, _internalFormat, _width, _height, _depth, _border, _format, _type, _data) );
 			GL_CHECK(glTexImage3D(_target, _level, _internalFormat, _width, _height, _depth, _border, _format, _type, _data) );
@@ -2429,6 +2435,18 @@ namespace bgfx
 		bx::write(_writer, _str, (int32_t)strlen(_str) );
 		bx::write(_writer, _str, (int32_t)strlen(_str) );
 	}
 	}
 
 
+	void writeStringf(bx::WriterI* _writer, const char* _format, ...)
+	{
+		char temp[512];
+
+		va_list argList;
+		va_start(argList, _format);
+		int len = bx::vsnprintf(temp, BX_COUNTOF(temp), _format, argList);
+		va_end(argList);
+
+		bx::write(_writer, temp, len);
+	}
+
 	void strins(char* _str, const char* _insert)
 	void strins(char* _str, const char* _insert)
 	{
 	{
 		size_t len = strlen(_insert);
 		size_t len = strlen(_insert);
@@ -2657,8 +2675,30 @@ namespace bgfx
 					writeString(&writer, "#define texture3DLod textureLod\n");
 					writeString(&writer, "#define texture3DLod textureLod\n");
 					writeString(&writer, "#define textureCube texture\n");
 					writeString(&writer, "#define textureCube texture\n");
 					writeString(&writer, "#define textureCubeLod textureLod\n");
 					writeString(&writer, "#define textureCubeLod textureLod\n");
-					writeString(&writer, "out vec4 bgfx_FragColor;\n");
-					writeString(&writer, "#define gl_FragColor bgfx_FragColor\n");
+
+					uint32_t fragData = 0;
+
+					if (!!bx::findIdentifierMatch(code, "gl_FragData") )
+					{
+						using namespace bx;
+						fragData = uint32_max(fragData, NULL == strstr(code, "gl_FragData[0]") ? 0 : 1);
+						fragData = uint32_max(fragData, NULL == strstr(code, "gl_FragData[1]") ? 0 : 2);
+						fragData = uint32_max(fragData, NULL == strstr(code, "gl_FragData[2]") ? 0 : 3);
+						fragData = uint32_max(fragData, NULL == strstr(code, "gl_FragData[3]") ? 0 : 4);
+
+						BGFX_FATAL(0 != fragData, Fatal::InvalidShader, "Unable to find and patch gl_FragData!");
+					}
+
+					if (0 != fragData)
+					{
+						writeStringf(&writer, "out vec4 bgfx_FragData[%d];\n", fragData);
+						writeString(&writer, "#define gl_FragData bgfx_FragData\n");
+					}
+					else
+					{
+						writeString(&writer, "out vec4 bgfx_FragColor;\n");
+						writeString(&writer, "#define gl_FragColor bgfx_FragColor\n");
+					}
 				}
 				}
 				else
 				else
 				{
 				{
@@ -2722,6 +2762,17 @@ namespace bgfx
 		}
 		}
 	}
 	}
 
 
+	static void frameBufferValidate()
+	{
+		GLenum complete = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+		BX_CHECK(GL_FRAMEBUFFER_COMPLETE == complete
+			, "glCheckFramebufferStatus failed 0x%08x: %s"
+			, complete
+			, glEnumName(complete)
+		);
+		BX_UNUSED(complete);
+	}
+
 	void FrameBuffer::create(uint8_t _num, const TextureHandle* _handles)
 	void FrameBuffer::create(uint8_t _num, const TextureHandle* _handles)
 	{
 	{
 		GL_CHECK(glGenFramebuffers(1, &m_fbo[0]) );
 		GL_CHECK(glGenFramebuffers(1, &m_fbo[0]) );
@@ -2797,10 +2848,7 @@ namespace bgfx
 			GL_CHECK(glReadBuffer(GL_NONE) );
 			GL_CHECK(glReadBuffer(GL_NONE) );
 		}
 		}
 
 
-		BX_CHECK(GL_FRAMEBUFFER_COMPLETE ==  glCheckFramebufferStatus(GL_FRAMEBUFFER)
-			, "glCheckFramebufferStatus failed 0x%08x"
-			, glCheckFramebufferStatus(GL_FRAMEBUFFER)
-			);
+		frameBufferValidate();
 
 
 		if (needResolve)
 		if (needResolve)
 		{
 		{
@@ -2831,10 +2879,7 @@ namespace bgfx
 				}
 				}
 			}
 			}
 
 
-			BX_CHECK(GL_FRAMEBUFFER_COMPLETE ==  glCheckFramebufferStatus(GL_FRAMEBUFFER)
-				, "glCheckFramebufferStatus failed 0x%08x"
-				, glCheckFramebufferStatus(GL_FRAMEBUFFER)
-				);
+			frameBufferValidate();
 		}
 		}
 
 
 		GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, s_renderCtx->m_msaaBackBufferFbo) );
 		GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, s_renderCtx->m_msaaBackBufferFbo) );

+ 15 - 16
src/renderer_gl.h

@@ -61,9 +61,6 @@ typedef uint64_t GLuint64;
 #		define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES
 #		define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES
 #		define GL_HALF_FLOAT GL_HALF_FLOAT_OES
 #		define GL_HALF_FLOAT GL_HALF_FLOAT_OES
 #		define GL_RGBA8 GL_RGBA8_OES
 #		define GL_RGBA8 GL_RGBA8_OES
-#		define GL_RGB10_A2 GL_RGB10_A2_EXT
-#		define GL_R16F GL_R16F_EXT
-#		define GL_R32F GL_R32F_EXT
 #		define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT
 #		define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT
 #		define GL_TEXTURE_3D GL_TEXTURE_3D_OES
 #		define GL_TEXTURE_3D GL_TEXTURE_3D_OES
 #		define GL_SAMPLER_3D GL_SAMPLER_3D_OES
 #		define GL_SAMPLER_3D GL_SAMPLER_3D_OES
@@ -94,9 +91,9 @@ typedef uint64_t GLuint64;
 #	define GL_LUMINANCE 0x1909
 #	define GL_LUMINANCE 0x1909
 #endif // GL_LUMINANCE
 #endif // GL_LUMINANCE
 
 
-#ifndef GL_BGRA_EXT
-#	define GL_BGRA_EXT 0x80E1
-#endif // GL_BGRA_EXT
+#ifndef GL_BGRA
+#	define GL_BGRA 0x80E1
+#endif // GL_BGRA
 
 
 #ifndef GL_R8
 #ifndef GL_R8
 #	define GL_R8 0x8229
 #	define GL_R8 0x8229
@@ -106,13 +103,13 @@ typedef uint64_t GLuint64;
 #	define GL_R16 0x822A
 #	define GL_R16 0x822A
 #endif // GL_R16
 #endif // GL_R16
 
 
-#ifndef GL_R16F_EXT
-#	define GL_R16F_EXT 0x822D
-#endif // GL_R16F_EXT
+#ifndef GL_R16F
+#	define GL_R16F 0x822D
+#endif // GL_R16F
 
 
-#ifndef GL_R32F_EXT
-#	define GL_R32F_EXT 0x822E
-#endif // GL_R32F_EXT
+#ifndef GL_R32F
+#	define GL_R32F 0x822E
+#endif // GL_R32F
 
 
 #ifndef GL_RED
 #ifndef GL_RED
 #	define GL_RED 0x1903
 #	define GL_RED 0x1903
@@ -126,9 +123,9 @@ typedef uint64_t GLuint64;
 #	define GL_BLUE 0x1905
 #	define GL_BLUE 0x1905
 #endif // GL_BLUE
 #endif // GL_BLUE
 
 
-#ifndef GL_RGB10_A2_EXT
-#	define GL_RGB10_A2_EXT 0x8059
-#endif // GL_RGB10_A2_EXT
+#ifndef GL_RGB10_A2
+#	define GL_RGB10_A2 0x8059
+#endif // GL_RGB10_A2
 
 
 #ifndef GL_RGBA16
 #ifndef GL_RGBA16
 #	define GL_RGBA16 0x805B
 #	define GL_RGBA16 0x805B
@@ -353,12 +350,14 @@ typedef uint64_t GLuint64;
 
 
 namespace bgfx
 namespace bgfx
 {
 {
+	const char* glEnumName(GLenum _enum);
+
 #define _GL_CHECK(_check, _call) \
 #define _GL_CHECK(_check, _call) \
 				do { \
 				do { \
 					/*BX_TRACE(#_call);*/ \
 					/*BX_TRACE(#_call);*/ \
 					_call; \
 					_call; \
 					GLenum err = glGetError(); \
 					GLenum err = glGetError(); \
-					_check(0 == err, #_call "; glError 0x%x %d", err, err); \
+					_check(0 == err, #_call "; GL error 0x%x: %s", err, glEnumName(err) ); \
 					BX_UNUSED(err); \
 					BX_UNUSED(err); \
 				} while (0)
 				} while (0)