From ee8a277774008ddafb205a7d9ec5af08645b5957 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Fri, 13 Dec 2013 23:06:28 -0800 Subject: [PATCH] GLES2: Added GL_EXT_frag_depth support. --- src/renderer_gl.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 74ceef17b..99dd14014 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -251,6 +251,7 @@ namespace bgfx EXT_blend_color, EXT_blend_minmax, EXT_blend_subtract, + EXT_frag_depth, EXT_framebuffer_blit, EXT_framebuffer_sRGB, EXT_occlusion_query_boolean, @@ -276,6 +277,7 @@ namespace bgfx OES_compressed_ETC1_RGB8_texture, OES_depth24, OES_depth_texture, + OES_fragment_precision_high, OES_get_program_binary, OES_read_format, OES_rgb8_rgba8, @@ -327,6 +329,7 @@ namespace bgfx { "GL_EXT_blend_color", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, { "GL_EXT_blend_minmax", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, { "GL_EXT_blend_subtract", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, + { "GL_EXT_frag_depth", false, true }, // GLES2 extension. { "GL_EXT_framebuffer_blit", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, { "GL_EXT_framebuffer_sRGB", false, true }, { "GL_EXT_occlusion_query_boolean", false, true }, @@ -352,6 +355,7 @@ namespace bgfx { "GL_OES_compressed_ETC1_RGB8_texture", false, true }, { "GL_OES_depth24", false, true }, { "GL_OES_depth_texture", false, true }, + { "GL_OES_fragment_precision_high", false, true }, { "GL_OES_get_program_binary", false, true }, { "GL_OES_read_format", false, true }, { "GL_OES_rgb8_rgba8", false, true }, @@ -1801,6 +1805,13 @@ namespace bgfx return ptr; } + void strins(char* _str, const char* _insert) + { + size_t len = strlen(_insert); + memmove(&_str[len], _str, strlen(_str) ); + memcpy(_str, _insert, len); + } + void Shader::create(GLenum _type, Memory* _mem) { m_id = glCreateShader(_type); @@ -1826,6 +1837,8 @@ namespace bgfx || findMatch(code, "fwidth") ); + bool usesFragDepth = findMatch(code, "gl_FragDepth"); + bool usesTexture3D = s_extension[Extension::OES_texture_3D].m_supported && ( findMatch(code, "texture3D") || findMatch(code, "texture3DProj") @@ -1834,6 +1847,7 @@ namespace bgfx ); if (usesDerivatives + || usesFragDepth || usesTexture3D) { size_t codeLen = strlen(code); @@ -1846,6 +1860,28 @@ namespace bgfx writeString(&writer, "#extension GL_OES_standard_derivatives : enable\n"); } + bool insertFragDepth = false; + if (usesFragDepth) + { + if (s_extension[Extension::EXT_frag_depth].m_supported) + { + writeString(&writer + , "#extension GL_EXT_frag_depth : enable\n" + "#define gl_FragDepth gl_FragDepthEXT\n" + ); + + char str[128]; + bx::snprintf(str, BX_COUNTOF(str), "%s float gl_FragDepthEXT;\n" + , s_extension[Extension::OES_fragment_precision_high].m_supported ? "highp" : "mediump" + ); + writeString(&writer, str); + } + else + { + insertFragDepth = true; + } + } + if (usesTexture3D) { writeString(&writer, "#extension GL_OES_texture_3D : enable\n"); @@ -1855,6 +1891,23 @@ namespace bgfx bx::write(&writer, '\0'); code = temp; + + if (insertFragDepth) + { + char* entry = strstr(temp, "void main ()"); + if (NULL != entry) + { + const char* brace = strstr(entry, "{"); + if (NULL != brace) + { + const char* end = bx::strmb(brace, '{', '}'); + if (NULL != end) + { + strins(temp, "float gl_FragDepth = 0.0;\n"); + } + } + } + } } #endif // BGFX_CONFIG_RENDERER_OPENGLES2