Browse Source

Get FBO's working correctly with OpenGL ES

rdb 16 years ago
parent
commit
09c229f2a9

+ 1 - 1
panda/src/egldisplay/eglGraphicsPipe.cxx

@@ -306,7 +306,7 @@ make_output(const string &name,
                                  flags, gsg, host);
   }
 
-  // Third thing to try: an eglGraphicsPixmap.
+  // Fourth thing to try: an eglGraphicsPixmap.
   if (retry == 3) {
     if (((flags&BF_require_parasite)!=0)||
         ((flags&BF_require_window)!=0)||

+ 0 - 1
panda/src/gles2gsg/Sources.pp

@@ -10,7 +10,6 @@
     
   #define SOURCES \
     config_gles2gsg.h config_gles2gsg.cxx \
-    gles2ext_shadow.h \
     gles2gsg.h gles2gsg.cxx
 
   #define INSTALL_HEADERS \

+ 0 - 1
panda/src/glesgsg/Sources.pp

@@ -10,7 +10,6 @@
     
   #define SOURCES \
     config_glesgsg.h config_glesgsg.cxx \
-    glesext_shadow.h \
     glesgsg.h glesgsg.cxx
 
   #define INSTALL_HEADERS \

+ 95 - 90
panda/src/glstuff/glGraphicsBuffer_src.cxx

@@ -457,8 +457,10 @@ bind_slot(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum atta
   CLP(GraphicsStateGuardian) *glgsg;
   DCAST_INTO_V(glgsg, _gsg);
 
+#ifdef OPENGLES
+  GLuint glFormat = GL_RGBA4;
+#else
   GLuint glFormat = GL_RGBA;
-#ifndef OPENGLES
   switch (slot) {
     case RTP_aux_rgba_0:
     case RTP_aux_rgba_1:
@@ -520,7 +522,7 @@ bind_slot(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum atta
       }
     } else {
 #ifdef OPENGLES
-      tex->set_format(Texture::F_rgba);
+      tex->set_format(Texture::F_rgba4);
 #else
       if (glFormat == GL_RGBA16F_ARB) {
         tex->set_format(Texture::F_rgba16);
@@ -588,8 +590,13 @@ bind_slot(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum atta
                                           GL_RENDERBUFFER_EXT, rb);
       } else {
 #endif
+#ifdef OPENGLES
+        glgsg->_glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16,
+                                      _rb_size_x, _rb_size_y);
+#else
         glgsg->_glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
                                       _rb_size_x, _rb_size_y);
+#endif
         glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
 
         GLuint rb;
@@ -627,108 +634,108 @@ bind_slot(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum atta
 ////////////////////////////////////////////////////////////////////
 void CLP(GraphicsBuffer)::
 bind_slot_multisample(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum attachpoint) {
-    CLP(GraphicsStateGuardian) *glgsg;
-    DCAST_INTO_V(glgsg, _gsg);
+  CLP(GraphicsStateGuardian) *glgsg;
+  DCAST_INTO_V(glgsg, _gsg);
 
-    if ((_rbm[slot] != 0)&&(!rb_resize)) {
-      return;
-    }
-    if (_rbm[slot] != 0) {
-      glgsg->_glDeleteRenderbuffers(1, &(_rbm[slot]));
-      _rbm[slot] = 0;
-    }
-    glgsg->_glBindFramebuffer(GL_FRAMEBUFFER_EXT, _fbo_multisample);
-    glgsg->_glGenRenderbuffers(1, &(_rbm[slot]));
-    // Allocate and bind the renderbuffer.
-    Texture *tex = attach[slot];// if there is a texture map, use it's format as needed.
+  if ((_rbm[slot] != 0)&&(!rb_resize)) {
+    return;
+  }
+  if (_rbm[slot] != 0) {
+    glgsg->_glDeleteRenderbuffers(1, &(_rbm[slot]));
+    _rbm[slot] = 0;
+  }
+  glgsg->_glBindFramebuffer(GL_FRAMEBUFFER_EXT, _fbo_multisample);
+  glgsg->_glGenRenderbuffers(1, &(_rbm[slot]));
+  // Allocate and bind the renderbuffer.
+  Texture *tex = attach[slot]; // If there is a texture map, use it's format as needed.
 
-    if (attachpoint == GL_DEPTH_ATTACHMENT_EXT) {
+  if (attachpoint == GL_DEPTH_ATTACHMENT_EXT) {
 #ifndef OPENGLES_2
-      if (_gsg->get_supports_depth_stencil() && _use_depth_stencil) {
-        glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, _rbm[slot]);
-        if (_requested_coverage_samples) {
-          glgsg->_glRenderbufferStorageMultisampleCoverage(GL_RENDERBUFFER_EXT, _requested_coverage_samples,
-                                                             _requested_multisamples, GL_DEPTH_STENCIL_EXT,
-                                                             _rb_size_x, _rb_size_y);
-        } else {
-          glgsg->_glRenderbufferStorageMultisample(GL_RENDERBUFFER_EXT, _requested_multisamples, GL_DEPTH_STENCIL_EXT,
-                                      _rb_size_x, _rb_size_y);
-        }
-#ifndef OPENGLES
-        GLint givenSamples = -1;
-        glgsg->_glGetRenderbufferParameteriv( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &givenSamples);
-#endif
-        glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
-        glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
-                                          GL_RENDERBUFFER_EXT, _rbm[slot]);
-        glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
-                                          GL_RENDERBUFFER_EXT, _rbm[slot]);
+    if (_gsg->get_supports_depth_stencil() && _use_depth_stencil) {
+      glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, _rbm[slot]);
+      if (_requested_coverage_samples) {
+        glgsg->_glRenderbufferStorageMultisampleCoverage(GL_RENDERBUFFER_EXT, _requested_coverage_samples,
+                                                         _requested_multisamples, GL_DEPTH_STENCIL_EXT,
+                                                         _rb_size_x, _rb_size_y);
       } else {
-#endif
-        glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, _rbm[slot]);
-        GLuint format = GL_DEPTH_COMPONENT;
-        if (tex) {
-          if (tex->get_format() == Texture::F_depth_component16)
-              format = GL_DEPTH_COMPONENT16;
-          if (tex->get_format() == Texture::F_depth_component24)
-              format = GL_DEPTH_COMPONENT24;
-          if (tex->get_format() == Texture::F_depth_component32)
-              format = GL_DEPTH_COMPONENT32;
-        }
-        if (_requested_coverage_samples) {
-          glgsg->_glRenderbufferStorageMultisampleCoverage(GL_RENDERBUFFER_EXT, _requested_coverage_samples,
-                                                             _requested_multisamples, format,
-                                                             _rb_size_x, _rb_size_y);
-        } else {
-          glgsg->_glRenderbufferStorageMultisample(GL_RENDERBUFFER_EXT, _requested_multisamples, format,
-                                        _rb_size_x, _rb_size_y);
-#ifndef OPENGLES_2
-        }
-#endif
+        glgsg->_glRenderbufferStorageMultisample(GL_RENDERBUFFER_EXT, _requested_multisamples, GL_DEPTH_STENCIL_EXT,
+                                                 _rb_size_x, _rb_size_y);
+      }
 #ifndef OPENGLES
-        GLint givenSamples = -1;
-        glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &givenSamples);
+      GLint givenSamples = -1;
+      glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &givenSamples);
 #endif
-        glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
-        glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
-                                          GL_RENDERBUFFER_EXT, _rbm[slot]);
-      }
+      glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
+      glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+                                        GL_RENDERBUFFER_EXT, _rbm[slot]);
+      glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
+                                        GL_RENDERBUFFER_EXT, _rbm[slot]);
     } else {
-      Texture *Tex = attach[slot];
-      GLuint glFormat = GL_RGBA;
-#ifndef OPENGLES
-      switch (slot) {
-        case RTP_aux_rgba_0:
-        case RTP_aux_rgba_1:
-        case RTP_aux_rgba_2:
-        case RTP_aux_rgba_3:
-          glFormat = GL_RGBA;
-          break;
-        case RTP_aux_hrgba_0:
-        case RTP_aux_hrgba_1:
-        case RTP_aux_hrgba_2:
-        case RTP_aux_hrgba_3:
-          glFormat = GL_RGBA16F_ARB;
-          break;
-      };
 #endif
       glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, _rbm[slot]);
+      GLuint format = GL_DEPTH_COMPONENT;
+      if (tex) {
+        if (tex->get_format() == Texture::F_depth_component16)
+            format = GL_DEPTH_COMPONENT16;
+        if (tex->get_format() == Texture::F_depth_component24)
+            format = GL_DEPTH_COMPONENT24;
+        if (tex->get_format() == Texture::F_depth_component32)
+            format = GL_DEPTH_COMPONENT32;
+      }
       if (_requested_coverage_samples) {
         glgsg->_glRenderbufferStorageMultisampleCoverage(GL_RENDERBUFFER_EXT, _requested_coverage_samples,
-                                      _requested_multisamples, glFormat, _rb_size_x, _rb_size_y);
+                                                         _requested_multisamples, format,
+                                                         _rb_size_x, _rb_size_y);
       } else {
-        glgsg->_glRenderbufferStorageMultisample(GL_RENDERBUFFER_EXT, _requested_multisamples, glFormat,
-                                      _rb_size_x, _rb_size_y);
+        glgsg->_glRenderbufferStorageMultisample(GL_RENDERBUFFER_EXT, _requested_multisamples, format,
+                                                 _rb_size_x, _rb_size_y);
+#ifndef OPENGLES_2
       }
+#endif
 #ifndef OPENGLES
       GLint givenSamples = -1;
-      glgsg->_glGetRenderbufferParameteriv( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &givenSamples);
+      glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &givenSamples);
 #endif
       glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
-      glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, attachpoint,
-                                      GL_RENDERBUFFER_EXT, _rbm[slot]);
+      glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+                                        GL_RENDERBUFFER_EXT, _rbm[slot]);
     }
-    glgsg->report_my_gl_errors();
+  } else {
+    Texture *Tex = attach[slot];
+    GLuint glFormat = GL_RGBA;
+#ifndef OPENGLES
+    switch (slot) {
+      case RTP_aux_rgba_0:
+      case RTP_aux_rgba_1:
+      case RTP_aux_rgba_2:
+      case RTP_aux_rgba_3:
+        glFormat = GL_RGBA;
+        break;
+      case RTP_aux_hrgba_0:
+      case RTP_aux_hrgba_1:
+      case RTP_aux_hrgba_2:
+      case RTP_aux_hrgba_3:
+        glFormat = GL_RGBA16F_ARB;
+        break;
+    };
+#endif
+    glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, _rbm[slot]);
+    if (_requested_coverage_samples) {
+      glgsg->_glRenderbufferStorageMultisampleCoverage(GL_RENDERBUFFER_EXT, _requested_coverage_samples,
+                                    _requested_multisamples, glFormat, _rb_size_x, _rb_size_y);
+    } else {
+      glgsg->_glRenderbufferStorageMultisample(GL_RENDERBUFFER_EXT, _requested_multisamples, glFormat,
+                                               _rb_size_x, _rb_size_y);
+    }
+#ifndef OPENGLES
+    GLint givenSamples = -1;
+    glgsg->_glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &givenSamples);
+#endif
+    glgsg->_glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
+    glgsg->_glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, attachpoint,
+                                      GL_RENDERBUFFER_EXT, _rbm[slot]);
+  }
+  glgsg->report_my_gl_errors();
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -917,9 +924,7 @@ open_buffer() {
   // Check for support of relevant extensions.
   CLP(GraphicsStateGuardian) *glgsg;
   DCAST_INTO_R(glgsg, _gsg, false);
-  if ((!glgsg->_supports_framebuffer_object)||
-      (glgsg->_glDrawBuffers == 0)||
-      (glgsg->_max_draw_buffers < totalcolor)) {
+  if (!glgsg->_supports_framebuffer_object) {
     return false;
   }
   
@@ -934,7 +939,7 @@ open_buffer() {
 
   _fb_properties.set_depth_bits(1);
   _fb_properties.set_color_bits(1);
-  _fb_properties.set_alpha_bits(1);
+  _fb_properties.set_alpha_bits(_host->get_fb_properties().get_alpha_bits());
   if (_gsg->get_supports_depth_stencil()) {
     _fb_properties.set_stencil_bits(1);
   } else {

+ 1 - 1
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -969,8 +969,8 @@ reset() {
       get_extension_func(GLPREFIX_QUOTED, "BlitFramebufferEXT");
   }
 
-#ifndef OPENGLES
   _glDrawBuffers = NULL;
+#ifndef OPENGLES
   if (is_at_least_gl_version(2, 0)) {
     _glDrawBuffers = (PFNGLDRAWBUFFERSPROC)
       get_extension_func(GLPREFIX_QUOTED, "DrawBuffers");