Mesa (main): mesa/st: merge framebuffer objects from st to mesa

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jan 24 21:35:11 UTC 2022


Module: Mesa
Branch: main
Commit: 7645e24045b124ba2b59d481f415f004ba306b25
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7645e24045b124ba2b59d481f415f004ba306b25

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Dec 20 16:56:41 2021 +1000

mesa/st: merge framebuffer objects from st to mesa

Reviewed-by: Kristian H. Kristensen <hoegsberg at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14675>

---

 src/mesa/main/mtypes.h                  |  12 ++++
 src/mesa/state_tracker/st_cb_fbo.h      |   6 +-
 src/mesa/state_tracker/st_cb_viewport.c |   4 +-
 src/mesa/state_tracker/st_context.c     |   5 +-
 src/mesa/state_tracker/st_context.h     |  19 ------
 src/mesa/state_tracker/st_manager.c     | 109 ++++++++++++++------------------
 src/mesa/state_tracker/st_manager.h     |   4 --
 7 files changed, 69 insertions(+), 90 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 120227bc9f6..a5adc7facb2 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -60,6 +60,8 @@
 
 #include "pipe/p_state.h"
 
+#include "frontend/api.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -2731,6 +2733,16 @@ struct gl_framebuffer
 
    /** Delete this framebuffer */
    void (*Delete)(struct gl_framebuffer *fb);
+
+   struct st_framebuffer_iface *iface;
+   enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
+   unsigned num_statts;
+   int32_t stamp;
+   int32_t iface_stamp;
+   uint32_t iface_ID;
+
+   /* list of framebuffer objects */
+   struct list_head head;
 };
 
 /**
diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h
index 7415243605d..c4a6c63c912 100644
--- a/src/mesa/state_tracker/st_cb_fbo.h
+++ b/src/mesa/state_tracker/st_cb_fbo.h
@@ -46,18 +46,18 @@ st_get_renderbuffer_resource(struct gl_renderbuffer *rb)
 }
 
 /**
- * Cast wrapper to convert a struct gl_framebuffer to an st_framebuffer.
+ * Cast wrapper to convert a struct gl_framebuffer to an gl_framebuffer.
  * Return NULL if the struct gl_framebuffer is a user-created framebuffer.
  * We'll only return non-null for window system framebuffers.
  * Note that this function may fail.
  */
-static inline struct st_framebuffer *
+static inline struct gl_framebuffer *
 st_ws_framebuffer(struct gl_framebuffer *fb)
 {
    /* FBO cannot be casted.  See st_new_framebuffer */
    if (fb && _mesa_is_winsys_fbo(fb) &&
        fb != _mesa_get_incomplete_framebuffer())
-      return (struct st_framebuffer *) fb;
+      return fb;
    return NULL;
 }
 
diff --git a/src/mesa/state_tracker/st_cb_viewport.c b/src/mesa/state_tracker/st_cb_viewport.c
index b4596ab0fc3..0a53c0e8414 100644
--- a/src/mesa/state_tracker/st_cb_viewport.c
+++ b/src/mesa/state_tracker/st_cb_viewport.c
@@ -37,8 +37,8 @@
 void st_viewport(struct gl_context *ctx)
 {
    struct st_context *st = ctx->st;
-   struct st_framebuffer *stdraw;
-   struct st_framebuffer *stread;
+   struct gl_framebuffer *stdraw;
+   struct gl_framebuffer *stread;
 
    if (!st->invalidate_on_gl_viewport)
       return;
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index c70551a815f..524e1f8028d 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -29,6 +29,7 @@
 #include "main/accum.h"
 #include "main/context.h"
 #include "main/debug_output.h"
+#include "main/framebuffer.h"
 #include "main/glthread.h"
 #include "main/shaderobj.h"
 #include "main/state.h"
@@ -932,7 +933,7 @@ void
 st_destroy_context(struct st_context *st)
 {
    struct gl_context *ctx = st->ctx;
-   struct st_framebuffer *stfb, *next;
+   struct gl_framebuffer *stfb, *next;
    struct gl_framebuffer *save_drawbuffer;
    struct gl_framebuffer *save_readbuffer;
 
@@ -982,7 +983,7 @@ st_destroy_context(struct st_context *st)
 
    /* release framebuffer in the winsys buffers list */
    LIST_FOR_EACH_ENTRY_SAFE_REV(stfb, next, &st->winsys_buffers, head) {
-      st_framebuffer_reference(&stfb, NULL);
+      _mesa_reference_framebuffer(&stfb, NULL);
    }
 
    _mesa_HashWalk(ctx->Shared->FrameBuffers, destroy_framebuffer_attachment_sampler_cb, st);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 91bdc49f4f2..90651108f70 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -431,25 +431,6 @@ const struct nir_shader_compiler_options *
 st_get_nir_compiler_options(struct st_context *st, gl_shader_stage stage);
 
 
-/**
- * Wrapper for struct gl_framebuffer.
- * This is an opaque type to the outside world.
- */
-struct st_framebuffer
-{
-   struct gl_framebuffer Base;
-
-   struct st_framebuffer_iface *iface;
-   enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
-   unsigned num_statts;
-   int32_t stamp;
-   int32_t iface_stamp;
-   uint32_t iface_ID;
-
-   /* list of framebuffer objects */
-   struct list_head head;
-};
-
 void st_invalidate_state(struct gl_context *ctx);
 void st_set_background_context(struct gl_context *ctx,
                                struct util_queue_monitoring *queue_info);
diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index d49b1c7e377..7a82e2c029f 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -29,6 +29,7 @@
 #include "main/extensions.h"
 #include "main/context.h"
 #include "main/debug_output.h"
+#include "main/framebuffer.h"
 #include "main/glthread.h"
 #include "main/texobj.h"
 #include "main/teximage.h"
@@ -150,23 +151,23 @@ buffer_index_to_attachment(gl_buffer_index index)
  */
 static void
 st_context_validate(struct st_context *st,
-                    struct st_framebuffer *stdraw,
-                    struct st_framebuffer *stread)
+                    struct gl_framebuffer *stdraw,
+                    struct gl_framebuffer *stread)
 {
     if (stdraw && stdraw->stamp != st->draw_stamp) {
        st->dirty |= ST_NEW_FRAMEBUFFER;
-       _mesa_resize_framebuffer(st->ctx, &stdraw->Base,
-                                stdraw->Base.Width,
-                                stdraw->Base.Height);
+       _mesa_resize_framebuffer(st->ctx, stdraw,
+                                stdraw->Width,
+                                stdraw->Height);
        st->draw_stamp = stdraw->stamp;
     }
 
     if (stread && stread->stamp != st->read_stamp) {
        if (stread != stdraw) {
           st->dirty |= ST_NEW_FRAMEBUFFER;
-          _mesa_resize_framebuffer(st->ctx, &stread->Base,
-                                   stread->Base.Width,
-                                   stread->Base.Height);
+          _mesa_resize_framebuffer(st->ctx, stread,
+                                   stread->Width,
+                                   stread->Height);
        }
        st->read_stamp = stread->stamp;
     }
@@ -202,7 +203,7 @@ st_set_ws_renderbuffer_surface(struct gl_renderbuffer *rb,
  * context).
  */
 static void
-st_framebuffer_validate(struct st_framebuffer *stfb,
+st_framebuffer_validate(struct gl_framebuffer *stfb,
                         struct st_context *st)
 {
    struct pipe_resource *textures[ST_ATTACHMENT_COUNT];
@@ -227,8 +228,8 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
       new_stamp = p_atomic_read(&stfb->iface->stamp);
    } while(stfb->iface_stamp != new_stamp);
 
-   width = stfb->Base.Width;
-   height = stfb->Base.Height;
+   width = stfb->Width;
+   height = stfb->Height;
 
    for (i = 0; i < stfb->num_statts; i++) {
       struct gl_renderbuffer *rb;
@@ -244,7 +245,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
          continue;
       }
 
-      rb = stfb->Base.Attachment[idx].Renderbuffer;
+      rb = stfb->Attachment[idx].Renderbuffer;
       assert(rb);
       if (rb->texture == textures[i]) {
          pipe_resource_reference(&textures[i], NULL);
@@ -268,7 +269,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
 
    if (changed) {
       ++stfb->stamp;
-      _mesa_resize_framebuffer(st->ctx, &stfb->Base, width, height);
+      _mesa_resize_framebuffer(st->ctx, stfb, width, height);
    }
 }
 
@@ -277,7 +278,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
  * Update the attachments to validate by looping the existing renderbuffers.
  */
 static void
-st_framebuffer_update_attachments(struct st_framebuffer *stfb)
+st_framebuffer_update_attachments(struct gl_framebuffer *stfb)
 {
    gl_buffer_index idx;
 
@@ -290,7 +291,7 @@ st_framebuffer_update_attachments(struct st_framebuffer *stfb)
       struct gl_renderbuffer *rb;
       enum st_attachment_type statt;
 
-      rb = stfb->Base.Attachment[idx].Renderbuffer;
+      rb = stfb->Attachment[idx].Renderbuffer;
       if (!rb || rb->software)
          continue;
 
@@ -308,14 +309,14 @@ st_framebuffer_update_attachments(struct st_framebuffer *stfb)
  * corresponds to a window and is not a user-created FBO.
  */
 static bool
-st_framebuffer_add_renderbuffer(struct st_framebuffer *stfb,
+st_framebuffer_add_renderbuffer(struct gl_framebuffer *stfb,
                                 gl_buffer_index idx, bool prefer_srgb)
 {
    struct gl_renderbuffer *rb;
    enum pipe_format format;
    bool sw;
 
-   assert(_mesa_is_winsys_fbo(&stfb->Base));
+   assert(_mesa_is_winsys_fbo(stfb));
 
    /* do not distinguish depth/stencil buffers */
    if (idx == BUFFER_STENCIL)
@@ -346,21 +347,21 @@ st_framebuffer_add_renderbuffer(struct st_framebuffer *stfb,
       return false;
 
    if (idx != BUFFER_DEPTH) {
-      _mesa_attach_and_own_rb(&stfb->Base, idx, rb);
+      _mesa_attach_and_own_rb(stfb, idx, rb);
       return true;
    }
 
    bool rb_ownership_taken = false;
    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0)) {
-      _mesa_attach_and_own_rb(&stfb->Base, BUFFER_DEPTH, rb);
+      _mesa_attach_and_own_rb(stfb, BUFFER_DEPTH, rb);
       rb_ownership_taken = true;
    }
 
    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
       if (rb_ownership_taken)
-         _mesa_attach_and_reference_rb(&stfb->Base, BUFFER_STENCIL, rb);
+         _mesa_attach_and_reference_rb(stfb, BUFFER_STENCIL, rb);
       else
-         _mesa_attach_and_own_rb(&stfb->Base, BUFFER_STENCIL, rb);
+         _mesa_attach_and_own_rb(stfb, BUFFER_STENCIL, rb);
    }
 
    return true;
@@ -435,11 +436,11 @@ st_visual_to_context_mode(const struct st_visual *visual,
 /**
  * Create a framebuffer from a manager interface.
  */
-static struct st_framebuffer *
+static struct gl_framebuffer *
 st_framebuffer_create(struct st_context *st,
                       struct st_framebuffer_iface *stfbi)
 {
-   struct st_framebuffer *stfb;
+   struct gl_framebuffer *stfb;
    struct gl_config mode;
    gl_buffer_index idx;
    bool prefer_srgb = false;
@@ -447,7 +448,7 @@ st_framebuffer_create(struct st_context *st,
    if (!stfbi)
       return NULL;
 
-   stfb = CALLOC_STRUCT(st_framebuffer);
+   stfb = CALLOC_STRUCT(gl_framebuffer);
    if (!stfb)
       return NULL;
 
@@ -493,14 +494,14 @@ st_framebuffer_create(struct st_context *st,
       }
    }
 
-   _mesa_initialize_window_framebuffer(&stfb->Base, &mode);
+   _mesa_initialize_window_framebuffer(stfb, &mode);
 
    stfb->iface = stfbi;
    stfb->iface_ID = stfbi->ID;
    stfb->iface_stamp = p_atomic_read(&stfbi->stamp) - 1;
 
    /* add the color buffer */
-   idx = stfb->Base._ColorDrawBufferIndexes[0];
+   idx = stfb->_ColorDrawBufferIndexes[0];
    if (!st_framebuffer_add_renderbuffer(stfb, idx, prefer_srgb)) {
       FREE(stfb);
       return NULL;
@@ -516,18 +517,6 @@ st_framebuffer_create(struct st_context *st,
 }
 
 
-/**
- * Reference a framebuffer.
- */
-void
-st_framebuffer_reference(struct st_framebuffer **ptr,
-                         struct st_framebuffer *stfb)
-{
-   struct gl_framebuffer *fb = stfb ? &stfb->Base : NULL;
-   _mesa_reference_framebuffer((struct gl_framebuffer **) ptr, fb);
-}
-
-
 static uint32_t
 st_framebuffer_iface_hash(const void *key)
 {
@@ -627,7 +616,7 @@ st_framebuffers_purge(struct st_context *st)
 {
    struct st_context_iface *st_iface = &st->iface;
    struct st_manager *smapi = st_iface->state_manager;
-   struct st_framebuffer *stfb, *next;
+   struct gl_framebuffer *stfb, *next;
 
    assert(smapi);
 
@@ -644,7 +633,7 @@ st_framebuffers_purge(struct st_context *st)
        */
       if (!st_framebuffer_iface_lookup(smapi, stfbi)) {
          list_del(&stfb->head);
-         st_framebuffer_reference(&stfb, NULL);
+         _mesa_reference_framebuffer(&stfb, NULL);
       }
    }
 }
@@ -1023,12 +1012,12 @@ st_api_get_current(struct st_api *stapi)
 }
 
 
-static struct st_framebuffer *
+static struct gl_framebuffer *
 st_framebuffer_reuse_or_create(struct st_context *st,
                                struct gl_framebuffer *fb,
                                struct st_framebuffer_iface *stfbi)
 {
-   struct st_framebuffer *cur = NULL, *stfb = NULL;
+   struct gl_framebuffer *cur = NULL, *stfb = NULL;
 
    if (!stfbi)
       return NULL;
@@ -1038,7 +1027,7 @@ st_framebuffer_reuse_or_create(struct st_context *st,
     */
    LIST_FOR_EACH_ENTRY(cur, &st->winsys_buffers, head) {
       if (cur->iface_ID == stfbi->ID) {
-         st_framebuffer_reference(&stfb, cur);
+         _mesa_reference_framebuffer(&stfb, cur);
          break;
       }
    }
@@ -1052,14 +1041,14 @@ st_framebuffer_reuse_or_create(struct st_context *st,
           * the framebuffer interface object hash table.
           */
          if (!st_framebuffer_iface_insert(stfbi->state_manager, stfbi)) {
-            st_framebuffer_reference(&cur, NULL);
+            _mesa_reference_framebuffer(&cur, NULL);
             return NULL;
          }
 
          /* add to the context's winsys buffers list */
          list_add(&cur->head, &st->winsys_buffers);
 
-         st_framebuffer_reference(&stfb, cur);
+         _mesa_reference_framebuffer(&stfb, cur);
       }
    }
 
@@ -1073,7 +1062,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
                     struct st_framebuffer_iface *streadi)
 {
    struct st_context *st = (struct st_context *) stctxi;
-   struct st_framebuffer *stdraw, *stread;
+   struct gl_framebuffer *stdraw, *stread;
    bool ret;
 
    if (st) {
@@ -1089,7 +1078,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
          stread = NULL;
          /* reuse the draw fb for the read fb */
          if (stdraw)
-            st_framebuffer_reference(&stread, stdraw);
+            _mesa_reference_framebuffer(&stread, stdraw);
       }
 
       /* If framebuffers were asked for, we'd better have allocated them */
@@ -1101,7 +1090,7 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
          if (stread != stdraw)
             st_framebuffer_validate(stread, st);
 
-         ret = _mesa_make_current(st->ctx, &stdraw->Base, &stread->Base);
+         ret = _mesa_make_current(st->ctx, stdraw, stread);
 
          st->draw_stamp = stdraw->stamp - 1;
          st->read_stamp = stread->stamp - 1;
@@ -1112,8 +1101,8 @@ st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
          ret = _mesa_make_current(st->ctx, incomplete, incomplete);
       }
 
-      st_framebuffer_reference(&stdraw, NULL);
-      st_framebuffer_reference(&stread, NULL);
+      _mesa_reference_framebuffer(&stdraw, NULL);
+      _mesa_reference_framebuffer(&stread, NULL);
 
       /* Purge the context's winsys_buffers list in case any
        * of the referenced drawables no longer exist.
@@ -1152,7 +1141,7 @@ st_api_destroy(struct st_api *stapi)
 void
 st_manager_flush_frontbuffer(struct st_context *st)
 {
-   struct st_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer);
+   struct gl_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer);
    struct gl_renderbuffer *rb = NULL;
 
    if (!stfb)
@@ -1163,16 +1152,16 @@ st_manager_flush_frontbuffer(struct st_context *st)
     * flushing.
     */
    if (st->ctx->Visual.doubleBufferMode &&
-       !stfb->Base.Visual.doubleBufferMode)
+       !stfb->Visual.doubleBufferMode)
       return;
 
    /* Check front buffer used at the GL API level. */
    enum st_attachment_type statt = ST_ATTACHMENT_FRONT_LEFT;
-   rb = stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+   rb = stfb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
    if (!rb) {
        /* Check back buffer redirected by EGL_KHR_mutable_render_buffer. */
        statt = ST_ATTACHMENT_BACK_LEFT;
-       rb = stfb->Base.Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+       rb = stfb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
    }
 
    /* Do we have a front color buffer and has it been drawn to since last
@@ -1194,8 +1183,8 @@ st_manager_flush_frontbuffer(struct st_context *st)
 void
 st_manager_validate_framebuffers(struct st_context *st)
 {
-   struct st_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer);
-   struct st_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer);
+   struct gl_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer);
+   struct gl_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer);
 
    if (stdraw)
       st_framebuffer_validate(stdraw, st);
@@ -1214,7 +1203,7 @@ st_manager_flush_swapbuffers(void)
 {
    GET_CURRENT_CONTEXT(ctx);
    struct st_context *st = (ctx) ? ctx->st : NULL;
-   struct st_framebuffer *stfb;
+   struct gl_framebuffer *stfb;
 
    if (!st)
       return;
@@ -1236,7 +1225,7 @@ st_manager_add_color_renderbuffer(struct st_context *st,
                                   struct gl_framebuffer *fb,
                                   gl_buffer_index idx)
 {
-   struct st_framebuffer *stfb = st_ws_framebuffer(fb);
+   struct gl_framebuffer *stfb = st_ws_framebuffer(fb);
 
    /* FBO */
    if (!stfb)
@@ -1244,7 +1233,7 @@ st_manager_add_color_renderbuffer(struct st_context *st,
 
    assert(_mesa_is_winsys_fbo(fb));
 
-   if (stfb->Base.Attachment[idx].Renderbuffer)
+   if (stfb->Attachment[idx].Renderbuffer)
       return true;
 
    switch (idx) {
@@ -1258,7 +1247,7 @@ st_manager_add_color_renderbuffer(struct st_context *st,
    }
 
    if (!st_framebuffer_add_renderbuffer(stfb, idx,
-                                        stfb->Base.Visual.sRGBCapable))
+                                        stfb->Visual.sRGBCapable))
       return false;
 
    st_framebuffer_update_attachments(stfb);
diff --git a/src/mesa/state_tracker/st_manager.h b/src/mesa/state_tracker/st_manager.h
index a394d9815c0..fa1a3302c5f 100644
--- a/src/mesa/state_tracker/st_manager.h
+++ b/src/mesa/state_tracker/st_manager.h
@@ -48,10 +48,6 @@ bool
 st_manager_add_color_renderbuffer(struct st_context *st, struct gl_framebuffer *fb,
                                   gl_buffer_index idx);
 
-void
-st_framebuffer_reference(struct st_framebuffer **ptr,
-                         struct st_framebuffer *stfb);
-
 void
 st_framebuffer_interface_destroy(struct st_framebuffer_interface *stfbi);
 



More information about the mesa-commit mailing list