Browse Source

gpu: fix framebuffer handling in OpenGL ES and add some sanity checks.

legacy
Sam Hocevar sam 11 years ago
parent
commit
3b90e19739
2 changed files with 20 additions and 10 deletions
  1. +19
    -9
      src/gpu/framebuffer.cpp
  2. +1
    -1
      tutorial/08_fbo.cpp

+ 19
- 9
src/gpu/framebuffer.cpp View File

@@ -91,8 +91,10 @@ uint32_t FramebufferFormat::GetFormat()
case RGBA_16_F: return GL_RGBA16F_ARB; case RGBA_16_F: return GL_RGBA16F_ARB;
case RGBA_32_F: return GL_RGBA32F_ARB; case RGBA_32_F: return GL_RGBA32F_ARB;
#elif defined HAVE_GLES_2X #elif defined HAVE_GLES_2X
/* FIXME: not implemented at all */ /* FIXME: incomplete */

case RGBA_8:
case RGBA_8_I:
case RGBA_8_UI: return GL_RGBA;
#elif defined __APPLE__ && defined __MACH__ #elif defined __APPLE__ && defined __MACH__
case R_8: case R_8:
case R_8_I: case R_8_I:
@@ -221,7 +223,12 @@ uint32_t FramebufferFormat::GetFormatOrder()
#elif defined __CELLOS_LV2__ #elif defined __CELLOS_LV2__
/* FIXME: not implemented at all */ /* FIXME: not implemented at all */
#elif defined HAVE_GLES_2X #elif defined HAVE_GLES_2X
/* FIXME: not implemented at all */ /* FIXME: incomplete */
case R_8: case RG_8: case RGB_8: case RGBA_8:
case R_8_I: case RG_8_I: case RGB_8_I: case RGBA_8_I:
return GL_BYTE;
case R_8_UI: case RG_8_UI: case RGB_8_UI: case RGBA_8_UI:
return GL_UNSIGNED_BYTE;
#elif defined __APPLE__ && defined __MACH__ #elif defined __APPLE__ && defined __MACH__
case R_8: case RG_8: case RGB_8: case RGBA_8: case R_8: case RG_8: case RGB_8: case RGBA_8:
case R_8_I: case RG_8_I: case RGB_8_I: case RGBA_8_I: case R_8_I: case RG_8_I: case RGB_8_I: case RGBA_8_I:
@@ -310,8 +317,9 @@ Framebuffer::Framebuffer(ivec2 size, FramebufferFormat fbo_format)
GLenum internal_format = fbo_format.GetFormat(); GLenum internal_format = fbo_format.GetFormat();
GLenum format = fbo_format.GetFormatOrder(); GLenum format = fbo_format.GetFormatOrder();
# else # else
/* In OpenGL ES, internal format and format must match. */
GLenum internal_format = fbo_format.GetFormat(); GLenum internal_format = fbo_format.GetFormat();
GLenum format = fbo_format.GetFormatOrder(); GLenum format = fbo_format.GetFormat();
# endif # endif
GLenum wrapmode = GL_REPEAT; GLenum wrapmode = GL_REPEAT;
GLenum filtering = GL_NEAREST; GLenum filtering = GL_NEAREST;
@@ -327,10 +335,10 @@ Framebuffer::Framebuffer(ivec2 size, FramebufferFormat fbo_format)
glGenTextures(1, &m_data->m_texture); glGenTextures(1, &m_data->m_texture);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_data->m_texture); glBindTexture(GL_TEXTURE_2D, m_data->m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (GLenum)wrapmode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (GLenum)wrapmode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLenum)filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLenum)filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size.x, size.y, 0, glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size.x, size.y, 0,
format, GL_UNSIGNED_BYTE, nullptr); format, GL_UNSIGNED_BYTE, nullptr);


@@ -357,7 +365,9 @@ Framebuffer::Framebuffer(ivec2 size, FramebufferFormat fbo_format)
# endif # endif


# if GL_VERSION_1_1 || GL_ES_VERSION_2_0 # if GL_VERSION_1_1 || GL_ES_VERSION_2_0
glCheckFramebufferStatus(GL_FRAMEBUFFER); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
ASSERT(status == GL_FRAMEBUFFER_COMPLETE,
"invalid framebuffer status 0x%x", status);
# endif # endif


Unbind(); Unbind();


+ 1
- 1
tutorial/08_fbo.cpp View File

@@ -137,7 +137,7 @@ int main(int argc, char **argv)
{ {
System::Init(argc, argv); System::Init(argc, argv);


Application app("Tutorial 08: Framebuffer Object", ivec2(640, 480), 60.0f); Application app("Tutorial 08: Framebuffer Object", ivec2(512, 512), 60.0f);


new FBO(); new FBO();




||||||
x
 
000:0
Loading…
Cancel
Save