diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index e5a058e81..9384864a8 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -1313,7 +1313,7 @@ namespace bgfx 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) ) { - m_readPixelsFmt = GL_BGRA_EXT; + m_readPixelsFmt = GL_BGRA; } else { @@ -1327,10 +1327,10 @@ namespace bgfx { 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 // 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 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) ) // || 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 @@ -1541,11 +1541,22 @@ namespace bgfx { GLENUM(GL_TEXTURE); 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 - return "UNKNOWN GLENUM!"; + return ""; } 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) { - if (BX_ENABLED(!BGFX_CONFIG_RENDERER_OPENGL) ) - { - _internalFormat = _format; // GLES wants internal format to match format... - } - if (_target == GL_TEXTURE_3D) { 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) ); } + 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) { size_t len = strlen(_insert); @@ -2657,8 +2675,30 @@ namespace bgfx writeString(&writer, "#define texture3DLod textureLod\n"); writeString(&writer, "#define textureCube texture\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 { @@ -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) { GL_CHECK(glGenFramebuffers(1, &m_fbo[0]) ); @@ -2797,10 +2848,7 @@ namespace bgfx GL_CHECK(glReadBuffer(GL_NONE) ); } - BX_CHECK(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER) - , "glCheckFramebufferStatus failed 0x%08x" - , glCheckFramebufferStatus(GL_FRAMEBUFFER) - ); + frameBufferValidate(); 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) ); diff --git a/src/renderer_gl.h b/src/renderer_gl.h index bb7a1d25c..d46d8c177 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -61,9 +61,6 @@ typedef uint64_t GLuint64; # define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES # define GL_HALF_FLOAT GL_HALF_FLOAT_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_TEXTURE_3D GL_TEXTURE_3D_OES # define GL_SAMPLER_3D GL_SAMPLER_3D_OES @@ -94,9 +91,9 @@ typedef uint64_t GLuint64; # define GL_LUMINANCE 0x1909 #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 # define GL_R8 0x8229 @@ -106,13 +103,13 @@ typedef uint64_t GLuint64; # define GL_R16 0x822A #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 # define GL_RED 0x1903 @@ -126,9 +123,9 @@ typedef uint64_t GLuint64; # define GL_BLUE 0x1905 #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 # define GL_RGBA16 0x805B @@ -353,12 +350,14 @@ typedef uint64_t GLuint64; namespace bgfx { + const char* glEnumName(GLenum _enum); + #define _GL_CHECK(_check, _call) \ do { \ /*BX_TRACE(#_call);*/ \ _call; \ 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); \ } while (0)