Mesa (main): mesa/st: move st renderbuffer code into mesa renderbuffer

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


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Tue Dec 21 16:00:19 2021 +1000

mesa/st: move st renderbuffer code into mesa renderbuffer

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

---

 src/mesa/main/fbobject.c           |   2 -
 src/mesa/main/renderbuffer.c       | 266 +++++++++++++++++++++++++++++++++----
 src/mesa/main/renderbuffer.h       |   3 -
 src/mesa/state_tracker/st_cb_fbo.c | 216 ------------------------------
 src/mesa/state_tracker/st_cb_fbo.h |   6 -
 5 files changed, 242 insertions(+), 251 deletions(-)

diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 036fbc7729d..43b1cd78f90 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -532,8 +532,6 @@ new_renderbuffer(struct gl_context *ctx, GLuint name)
    if (rb) {
       assert(name != 0);
       _mesa_init_renderbuffer(rb, name);
-      rb->Delete = _mesa_delete_renderbuffer;
-      rb->AllocStorage = st_renderbuffer_alloc_storage;
       return rb;
    }
    return NULL;
diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c
index 97c7a95cda8..d7d4f477133 100644
--- a/src/mesa/main/renderbuffer.c
+++ b/src/mesa/main/renderbuffer.c
@@ -28,11 +28,251 @@
 #include "context.h"
 #include "fbobject.h"
 #include "formats.h"
+#include "glformats.h"
 #include "mtypes.h"
 #include "renderbuffer.h"
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
 
+#include "state_tracker/st_format.h"
+#include "state_tracker/st_cb_fbo.h"
+#include "state_tracker/st_context.h"
+
+/**
+ * Delete a gl_framebuffer.
+ * This is the default function for renderbuffer->Delete().
+ * Drivers which subclass gl_renderbuffer should probably implement their
+ * own delete function.  But the driver might also call this function to
+ * free the object in the end.
+ */
+static void
+delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
+{
+   if (ctx) {
+      pipe_surface_release(ctx->pipe, &rb->surface_srgb);
+      pipe_surface_release(ctx->pipe, &rb->surface_linear);
+   } else {
+      pipe_surface_release_no_context(&rb->surface_srgb);
+      pipe_surface_release_no_context(&rb->surface_linear);
+   }
+   rb->surface = NULL;
+   pipe_resource_reference(&rb->texture, NULL);
+   free(rb->data);
+   free(rb->Label);
+   free(rb);
+}
+
+static GLboolean
+renderbuffer_alloc_sw_storage(struct gl_context *ctx,
+                              struct gl_renderbuffer *rb,
+                              GLenum internalFormat,
+                              GLuint width, GLuint height)
+{
+   struct st_context *st = st_context(ctx);
+   enum pipe_format format;
+   size_t size;
+
+   free(rb->data);
+   rb->data = NULL;
+
+   if (internalFormat == GL_RGBA16_SNORM) {
+      /* Special case for software accum buffers.  Otherwise, if the
+       * call to st_choose_renderbuffer_format() fails (because the
+       * driver doesn't support signed 16-bit/channel colors) we'd
+       * just return without allocating the software accum buffer.
+       */
+      format = PIPE_FORMAT_R16G16B16A16_SNORM;
+   }
+   else {
+      format = st_choose_renderbuffer_format(st, internalFormat, 0, 0);
+
+      /* Not setting gl_renderbuffer::Format here will cause
+       * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called.
+       */
+      if (format == PIPE_FORMAT_NONE) {
+         return GL_TRUE;
+      }
+   }
+
+   rb->Format = st_pipe_format_to_mesa_format(format);
+
+   size = _mesa_format_image_size(rb->Format, width, height, 1);
+   rb->data = malloc(size);
+   return rb->data != NULL;
+}
+
+
+/**
+ * gl_renderbuffer::AllocStorage()
+ * This is called to allocate the original drawing surface, and
+ * during window resize.
+ */
+static GLboolean
+renderbuffer_alloc_storage(struct gl_context * ctx,
+                           struct gl_renderbuffer *rb,
+                           GLenum internalFormat,
+                           GLuint width, GLuint height)
+{
+   struct st_context *st = st_context(ctx);
+   struct pipe_screen *screen = ctx->screen;
+   enum pipe_format format = PIPE_FORMAT_NONE;
+   struct pipe_resource templ;
+
+   /* init renderbuffer fields */
+   rb->Width  = width;
+   rb->Height = height;
+   rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat);
+   rb->defined = GL_FALSE;  /* undefined contents now */
+
+   if (rb->software) {
+      return renderbuffer_alloc_sw_storage(ctx, rb, internalFormat,
+                                           width, height);
+   }
+
+   /* Free the old surface and texture
+    */
+   pipe_surface_reference(&rb->surface_srgb, NULL);
+   pipe_surface_reference(&rb->surface_linear, NULL);
+   rb->surface = NULL;
+   pipe_resource_reference(&rb->texture, NULL);
+
+   /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
+    * formats.
+    */
+   if (!ctx->Extensions.EXT_sRGB) {
+      internalFormat = _mesa_get_linear_internalformat(internalFormat);
+   }
+
+   /* Handle multisample renderbuffers first.
+    *
+    * From ARB_framebuffer_object:
+    *   If <samples> is zero, then RENDERBUFFER_SAMPLES is set to zero.
+    *   Otherwise <samples> represents a request for a desired minimum
+    *   number of samples. Since different implementations may support
+    *   different sample counts for multisampled rendering, the actual
+    *   number of samples allocated for the renderbuffer image is
+    *   implementation dependent.  However, the resulting value for
+    *   RENDERBUFFER_SAMPLES is guaranteed to be greater than or equal
+    *   to <samples> and no more than the next larger sample count supported
+    *   by the implementation.
+    *
+    * Find the supported number of samples >= rb->NumSamples
+    */
+   if (rb->NumSamples > 0) {
+      unsigned start, start_storage;
+
+      if (ctx->Const.MaxSamples > 1 &&  rb->NumSamples == 1) {
+         /* don't try num_samples = 1 with drivers that support real msaa */
+         start = 2;
+         start_storage = 2;
+      } else {
+         start = rb->NumSamples;
+         start_storage = rb->NumStorageSamples;
+      }
+
+      if (ctx->Extensions.AMD_framebuffer_multisample_advanced) {
+         if (rb->_BaseFormat == GL_DEPTH_COMPONENT ||
+             rb->_BaseFormat == GL_DEPTH_STENCIL ||
+             rb->_BaseFormat == GL_STENCIL_INDEX) {
+            /* Find a supported depth-stencil format. */
+            for (unsigned samples = start;
+                 samples <= ctx->Const.MaxDepthStencilFramebufferSamples;
+                 samples++) {
+               format = st_choose_renderbuffer_format(st, internalFormat,
+                                                      samples, samples);
+
+               if (format != PIPE_FORMAT_NONE) {
+                  rb->NumSamples = samples;
+                  rb->NumStorageSamples = samples;
+                  break;
+               }
+            }
+         } else {
+            /* Find a supported color format, samples >= storage_samples. */
+            for (unsigned storage_samples = start_storage;
+                 storage_samples <= ctx->Const.MaxColorFramebufferStorageSamples;
+                 storage_samples++) {
+               for (unsigned samples = MAX2(start, storage_samples);
+                    samples <= ctx->Const.MaxColorFramebufferSamples;
+                    samples++) {
+                  format = st_choose_renderbuffer_format(st, internalFormat,
+                                                         samples,
+                                                         storage_samples);
+
+                  if (format != PIPE_FORMAT_NONE) {
+                     rb->NumSamples = samples;
+                     rb->NumStorageSamples = storage_samples;
+                     goto found;
+                  }
+               }
+            }
+            found:;
+         }
+      } else {
+         for (unsigned samples = start; samples <= ctx->Const.MaxSamples;
+              samples++) {
+            format = st_choose_renderbuffer_format(st, internalFormat,
+                                                   samples, samples);
+
+            if (format != PIPE_FORMAT_NONE) {
+               rb->NumSamples = samples;
+               rb->NumStorageSamples = samples;
+               break;
+            }
+         }
+      }
+   } else {
+      format = st_choose_renderbuffer_format(st, internalFormat, 0, 0);
+   }
+
+   /* Not setting gl_renderbuffer::Format here will cause
+    * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called.
+    */
+   if (format == PIPE_FORMAT_NONE) {
+      return GL_TRUE;
+   }
+
+   rb->Format = st_pipe_format_to_mesa_format(format);
+
+   if (width == 0 || height == 0) {
+      /* if size is zero, nothing to allocate */
+      return GL_TRUE;
+   }
+
+   /* Setup new texture template.
+    */
+   memset(&templ, 0, sizeof(templ));
+   templ.target = st->internal_target;
+   templ.format = format;
+   templ.width0 = width;
+   templ.height0 = height;
+   templ.depth0 = 1;
+   templ.array_size = 1;
+   templ.nr_samples = rb->NumSamples;
+   templ.nr_storage_samples = rb->NumStorageSamples;
+
+   if (util_format_is_depth_or_stencil(format)) {
+      templ.bind = PIPE_BIND_DEPTH_STENCIL;
+   }
+   else if (rb->Name != 0) {
+      /* this is a user-created renderbuffer */
+      templ.bind = PIPE_BIND_RENDER_TARGET;
+   }
+   else {
+      /* this is a window-system buffer */
+      templ.bind = (PIPE_BIND_DISPLAY_TARGET |
+                    PIPE_BIND_RENDER_TARGET);
+   }
+
+   rb->texture = screen->resource_create(screen, &templ);
+
+   if (!rb->texture)
+      return FALSE;
+
+   st_update_renderbuffer_surface(st, rb);
+   return rb->surface != NULL;
+}
+
 /**
  * Initialize the fields of a gl_renderbuffer to default values.
  */
@@ -44,7 +284,7 @@ _mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name)
    rb->ClassID = 0;
    rb->Name = name;
    rb->RefCount = 1;
-   rb->Delete = _mesa_delete_renderbuffer;
+   rb->Delete = delete_renderbuffer;
 
    /* The rest of these should be set later by the caller of this function or
     * the AllocStorage method:
@@ -72,30 +312,8 @@ _mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name)
    }
 
    rb->Format = MESA_FORMAT_NONE;
-}
 
-/**
- * Delete a gl_framebuffer.
- * This is the default function for renderbuffer->Delete().
- * Drivers which subclass gl_renderbuffer should probably implement their
- * own delete function.  But the driver might also call this function to
- * free the object in the end.
- */
-void
-_mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
-{
-   if (ctx) {
-      pipe_surface_release(ctx->pipe, &rb->surface_srgb);
-      pipe_surface_release(ctx->pipe, &rb->surface_linear);
-   } else {
-      pipe_surface_release_no_context(&rb->surface_srgb);
-      pipe_surface_release_no_context(&rb->surface_linear);
-   }
-   rb->surface = NULL;
-   pipe_resource_reference(&rb->texture, NULL);
-   free(rb->data);
-   free(rb->Label);
-   FREE(rb);
+   rb->AllocStorage = renderbuffer_alloc_storage;
 }
 
 static void
diff --git a/src/mesa/main/renderbuffer.h b/src/mesa/main/renderbuffer.h
index 22c9a3de1b1..303d6e8ecd9 100644
--- a/src/mesa/main/renderbuffer.h
+++ b/src/mesa/main/renderbuffer.h
@@ -40,9 +40,6 @@ struct gl_renderbuffer;
 extern void
 _mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name);
 
-extern void
-_mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb);
-
 extern void
 _mesa_attach_and_own_rb(struct gl_framebuffer *fb,
                         gl_buffer_index bufferName,
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index 5eaca4ba6a9..bf73999d0fd 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -61,217 +61,6 @@
 #include "util/u_surface.h"
 #include "util/u_memory.h"
 
-static GLboolean
-st_renderbuffer_alloc_sw_storage(struct gl_context * ctx,
-                                 struct gl_renderbuffer *rb,
-                                 GLenum internalFormat,
-                                 GLuint width, GLuint height)
-{
-   struct st_context *st = st_context(ctx);
-   enum pipe_format format;
-   size_t size;
-
-   free(rb->data);
-   rb->data = NULL;
-
-   if (internalFormat == GL_RGBA16_SNORM) {
-      /* Special case for software accum buffers.  Otherwise, if the
-       * call to st_choose_renderbuffer_format() fails (because the
-       * driver doesn't support signed 16-bit/channel colors) we'd
-       * just return without allocating the software accum buffer.
-       */
-      format = PIPE_FORMAT_R16G16B16A16_SNORM;
-   }
-   else {
-      format = st_choose_renderbuffer_format(st, internalFormat, 0, 0);
-
-      /* Not setting gl_renderbuffer::Format here will cause
-       * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called.
-       */
-      if (format == PIPE_FORMAT_NONE) {
-         return GL_TRUE;
-      }
-   }
-
-   rb->Format = st_pipe_format_to_mesa_format(format);
-
-   size = _mesa_format_image_size(rb->Format, width, height, 1);
-   rb->data = malloc(size);
-   return rb->data != NULL;
-}
-
-
-/**
- * gl_renderbuffer::AllocStorage()
- * This is called to allocate the original drawing surface, and
- * during window resize.
- */
-GLboolean
-st_renderbuffer_alloc_storage(struct gl_context * ctx,
-                              struct gl_renderbuffer *rb,
-                              GLenum internalFormat,
-                              GLuint width, GLuint height)
-{
-   struct st_context *st = st_context(ctx);
-   struct pipe_screen *screen = st->screen;
-   enum pipe_format format = PIPE_FORMAT_NONE;
-   struct pipe_resource templ;
-
-   /* init renderbuffer fields */
-   rb->Width  = width;
-   rb->Height = height;
-   rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat);
-   rb->defined = GL_FALSE;  /* undefined contents now */
-
-   if (rb->software) {
-      return st_renderbuffer_alloc_sw_storage(ctx, rb, internalFormat,
-                                              width, height);
-   }
-
-   /* Free the old surface and texture
-    */
-   pipe_surface_reference(&rb->surface_srgb, NULL);
-   pipe_surface_reference(&rb->surface_linear, NULL);
-   rb->surface = NULL;
-   pipe_resource_reference(&rb->texture, NULL);
-
-   /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
-    * formats.
-    */
-   if (!ctx->Extensions.EXT_sRGB) {
-      internalFormat = _mesa_get_linear_internalformat(internalFormat);
-   }
-
-   /* Handle multisample renderbuffers first.
-    *
-    * From ARB_framebuffer_object:
-    *   If <samples> is zero, then RENDERBUFFER_SAMPLES is set to zero.
-    *   Otherwise <samples> represents a request for a desired minimum
-    *   number of samples. Since different implementations may support
-    *   different sample counts for multisampled rendering, the actual
-    *   number of samples allocated for the renderbuffer image is
-    *   implementation dependent.  However, the resulting value for
-    *   RENDERBUFFER_SAMPLES is guaranteed to be greater than or equal
-    *   to <samples> and no more than the next larger sample count supported
-    *   by the implementation.
-    *
-    * Find the supported number of samples >= rb->NumSamples
-    */
-   if (rb->NumSamples > 0) {
-      unsigned start, start_storage;
-
-      if (ctx->Const.MaxSamples > 1 &&  rb->NumSamples == 1) {
-         /* don't try num_samples = 1 with drivers that support real msaa */
-         start = 2;
-         start_storage = 2;
-      } else {
-         start = rb->NumSamples;
-         start_storage = rb->NumStorageSamples;
-      }
-
-      if (ctx->Extensions.AMD_framebuffer_multisample_advanced) {
-         if (rb->_BaseFormat == GL_DEPTH_COMPONENT ||
-             rb->_BaseFormat == GL_DEPTH_STENCIL ||
-             rb->_BaseFormat == GL_STENCIL_INDEX) {
-            /* Find a supported depth-stencil format. */
-            for (unsigned samples = start;
-                 samples <= ctx->Const.MaxDepthStencilFramebufferSamples;
-                 samples++) {
-               format = st_choose_renderbuffer_format(st, internalFormat,
-                                                      samples, samples);
-
-               if (format != PIPE_FORMAT_NONE) {
-                  rb->NumSamples = samples;
-                  rb->NumStorageSamples = samples;
-                  break;
-               }
-            }
-         } else {
-            /* Find a supported color format, samples >= storage_samples. */
-            for (unsigned storage_samples = start_storage;
-                 storage_samples <= ctx->Const.MaxColorFramebufferStorageSamples;
-                 storage_samples++) {
-               for (unsigned samples = MAX2(start, storage_samples);
-                    samples <= ctx->Const.MaxColorFramebufferSamples;
-                    samples++) {
-                  format = st_choose_renderbuffer_format(st, internalFormat,
-                                                         samples,
-                                                         storage_samples);
-
-                  if (format != PIPE_FORMAT_NONE) {
-                     rb->NumSamples = samples;
-                     rb->NumStorageSamples = storage_samples;
-                     goto found;
-                  }
-               }
-            }
-            found:;
-         }
-      } else {
-         for (unsigned samples = start; samples <= ctx->Const.MaxSamples;
-              samples++) {
-            format = st_choose_renderbuffer_format(st, internalFormat,
-                                                   samples, samples);
-
-            if (format != PIPE_FORMAT_NONE) {
-               rb->NumSamples = samples;
-               rb->NumStorageSamples = samples;
-               break;
-            }
-         }
-      }
-   } else {
-      format = st_choose_renderbuffer_format(st, internalFormat, 0, 0);
-   }
-
-   /* Not setting gl_renderbuffer::Format here will cause
-    * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called.
-    */
-   if (format == PIPE_FORMAT_NONE) {
-      return GL_TRUE;
-   }
-
-   rb->Format = st_pipe_format_to_mesa_format(format);
-
-   if (width == 0 || height == 0) {
-      /* if size is zero, nothing to allocate */
-      return GL_TRUE;
-   }
-
-   /* Setup new texture template.
-    */
-   memset(&templ, 0, sizeof(templ));
-   templ.target = st->internal_target;
-   templ.format = format;
-   templ.width0 = width;
-   templ.height0 = height;
-   templ.depth0 = 1;
-   templ.array_size = 1;
-   templ.nr_samples = rb->NumSamples;
-   templ.nr_storage_samples = rb->NumStorageSamples;
-
-   if (util_format_is_depth_or_stencil(format)) {
-      templ.bind = PIPE_BIND_DEPTH_STENCIL;
-   }
-   else if (rb->Name != 0) {
-      /* this is a user-created renderbuffer */
-      templ.bind = PIPE_BIND_RENDER_TARGET;
-   }
-   else {
-      /* this is a window-system buffer */
-      templ.bind = (PIPE_BIND_DISPLAY_TARGET |
-                    PIPE_BIND_RENDER_TARGET);
-   }
-
-   rb->texture = screen->resource_create(screen, &templ);
-
-   if (!rb->texture)
-      return FALSE;
-
-   st_update_renderbuffer_surface(st, rb);
-   return rb->surface != NULL;
-}
-
 /**
  * Allocate a renderbuffer for an on-screen window (not a user-created
  * renderbuffer).  The window system code determines the format.
@@ -394,11 +183,6 @@ st_new_renderbuffer_fb(enum pipe_format format, unsigned samples, boolean sw)
       return NULL;
    }
 
-   /* st-specific methods */
-   rb->Delete = _mesa_delete_renderbuffer;
-   rb->AllocStorage = st_renderbuffer_alloc_storage;
-
-   /* surface is allocated in st_renderbuffer_alloc_storage() */
    rb->surface = NULL;
 
    return rb;
diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h
index 58ac4330776..e4b1da5ad82 100644
--- a/src/mesa/state_tracker/st_cb_fbo.h
+++ b/src/mesa/state_tracker/st_cb_fbo.h
@@ -73,12 +73,6 @@ extern void
 st_regen_renderbuffer_surface(struct st_context *st,
                               struct gl_renderbuffer *strb);
 
-GLboolean
-st_renderbuffer_alloc_storage(struct gl_context * ctx,
-                              struct gl_renderbuffer *rb,
-                              GLenum internalFormat,
-                              GLuint width, GLuint height);
-
 void st_MapRenderbuffer(struct gl_context *ctx,
                         struct gl_renderbuffer *rb,
                         GLuint x, GLuint y, GLuint w, GLuint h,



More information about the mesa-commit mailing list