[Mesa-dev] [PATCH 09/13] meta/generate_mipmap: Track framebuffer using gl_framebuffer instead of GL API object handle

Ian Romanick idr at freedesktop.org
Thu Feb 11 06:13:19 UTC 2016


From: Ian Romanick <ian.d.romanick at intel.com>

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/common/meta.h                 |  2 +-
 src/mesa/drivers/common/meta_generate_mipmap.c | 38 ++++++++++----------------
 2 files changed, 16 insertions(+), 24 deletions(-)

diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
index 03d86c8..b2c550f 100644
--- a/src/mesa/drivers/common/meta.h
+++ b/src/mesa/drivers/common/meta.h
@@ -369,7 +369,7 @@ struct gen_mipmap_state
 {
    GLuint VAO;
    struct gl_buffer_object *buf_obj;
-   GLuint FBO;
+   struct gl_framebuffer *fb;
    struct gl_sampler_object *samp_obj;
 
    struct blit_shader_table shaders;
diff --git a/src/mesa/drivers/common/meta_generate_mipmap.c b/src/mesa/drivers/common/meta_generate_mipmap.c
index 3f52698..ffc2616 100644
--- a/src/mesa/drivers/common/meta_generate_mipmap.c
+++ b/src/mesa/drivers/common/meta_generate_mipmap.c
@@ -35,6 +35,7 @@
 #include "main/enums.h"
 #include "main/enable.h"
 #include "main/fbobject.h"
+#include "main/framebuffer.h"
 #include "main/macros.h"
 #include "main/mipmap.h"
 #include "main/teximage.h"
@@ -56,21 +57,11 @@ static bool
 fallback_required(struct gl_context *ctx, GLenum target,
                   struct gl_texture_object *texObj)
 {
-   const GLuint fboSave = ctx->DrawBuffer->Name;
    struct gen_mipmap_state *mipmap = &ctx->Meta->Mipmap;
    struct gl_texture_image *baseImage;
    GLuint srcLevel;
    GLenum status;
 
-   /* GL_DRAW_FRAMEBUFFER does not exist in OpenGL ES 1.x, and since
-    * _mesa_meta_begin hasn't been called yet, we have to work-around API
-    * difficulties.  The whole reason that GL_DRAW_FRAMEBUFFER is used instead
-    * of GL_FRAMEBUFFER is that the read framebuffer may be different.  This
-    * is moot in OpenGL ES 1.x.
-    */
-   const GLenum fbo_target = ctx->API == API_OPENGLES
-      ? GL_FRAMEBUFFER : GL_DRAW_FRAMEBUFFER;
-
    /* check for fallbacks */
    if (target == GL_TEXTURE_3D) {
       _mesa_perf_debug(ctx, MESA_DEBUG_SEVERITY_HIGH,
@@ -109,17 +100,18 @@ fallback_required(struct gl_context *ctx, GLenum target,
    /*
     * Test that we can actually render in the texture's format.
     */
-   if (!mipmap->FBO)
-      _mesa_CreateFramebuffers(1, &mipmap->FBO);
-   _mesa_BindFramebuffer(fbo_target, mipmap->FBO);
-
-   _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
-                                        GL_COLOR_ATTACHMENT0, baseImage, 0);
+   if (mipmap->fb == NULL) {
+      GLuint FBO;
 
-   status = _mesa_check_framebuffer_status(ctx, ctx->DrawBuffer);
+      _mesa_CreateFramebuffers(1, &FBO);
+      mipmap->fb = _mesa_lookup_framebuffer(ctx, FBO);
+      assert(mipmap->fb != NULL && mipmap->fb->Name == FBO);
+   }
 
-   _mesa_BindFramebuffer(fbo_target, fboSave);
+   _mesa_meta_framebuffer_texture_image(ctx, mipmap->fb,
+                                        GL_COLOR_ATTACHMENT0, baseImage, 0);
 
+   status = _mesa_check_framebuffer_status(ctx, mipmap->fb);
    if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
       _mesa_perf_debug(ctx, MESA_DEBUG_SEVERITY_HIGH,
                        "glGenerateMipmap() got incomplete FBO\n");
@@ -140,9 +132,9 @@ _mesa_meta_glsl_generate_mipmap_cleanup(struct gl_context *ctx,
    _mesa_reference_buffer_object(ctx, &mipmap->buf_obj, NULL);
    _mesa_reference_sampler_object(ctx, &mipmap->samp_obj, NULL);
 
-   if (mipmap->FBO != 0) {
-      _mesa_DeleteFramebuffers(1, &mipmap->FBO);
-      mipmap->FBO = 0;
+   if (mipmap->fb != NULL) {
+      _mesa_DeleteFramebuffers(1, &mipmap->fb->Name);
+      mipmap->fb = NULL;
    }
 
    _mesa_meta_blit_shader_table_cleanup(&mipmap->shaders);
@@ -252,8 +244,8 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
 
    _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit, mipmap->samp_obj);
 
-   assert(mipmap->FBO != 0);
-   _mesa_BindFramebuffer(GL_FRAMEBUFFER_EXT, mipmap->FBO);
+   assert(mipmap->fb != NULL);
+   _mesa_bind_framebuffers(ctx, mipmap->fb, mipmap->fb);
 
    _mesa_texture_parameteriv(ctx, texObj, GL_GENERATE_MIPMAP, &always_false, false);
 
-- 
2.5.0



More information about the mesa-dev mailing list