GLES3 fixed gl_FragData patching.

This commit is contained in:
Branimir Karadžić 2014-04-01 22:31:02 -07:00
parent c49656c473
commit e907edd1eb
2 changed files with 82 additions and 38 deletions

View file

@ -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 "<GLenum?>";
}
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) );

View file

@ -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)