[Mesa-dev] [PATCH 8/9] mesa: Add driver method to determine the possible sample counts

Ian Romanick idr at freedesktop.org
Wed Dec 19 15:58:42 PST 2012


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

Use this method in _mesa_GetInternalformativ for both GL_SAMPLES and
GL_NUM_SAMPLE_COUNTS.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/common/driverfuncs.c |  1 +
 src/mesa/main/dd.h                    | 19 +++++++++++++++++++
 src/mesa/main/formatquery.c           | 20 +++++++++++++++++---
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c
index 93fa3c7..3de5199 100644
--- a/src/mesa/drivers/common/driverfuncs.c
+++ b/src/mesa/drivers/common/driverfuncs.c
@@ -91,6 +91,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
 
    /* Texture functions */
    driver->ChooseTextureFormat = _mesa_choose_tex_format;
+   driver->QuerySamplesForFormat = NULL;
    driver->TexImage = _mesa_store_teximage;
    driver->TexSubImage = _mesa_store_texsubimage;
    driver->GetTexImage = _mesa_meta_GetTexImage;
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 70c5324..3daf3da 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -201,6 +201,25 @@ struct dd_function_table {
                                      GLenum srcFormat, GLenum srcType );
 
    /**
+    * Determine sample counts support for a particular format
+    *
+    * \param ctx            GL context
+    * \param internalFormat GL format enum.  Must be color renderable
+    * \param samples        Buffer to hold the returned sample counts.
+    *                       Drivers \b must \b not return more than 16 counts.
+    *
+    * \note
+    * Callers of this method must not pass an invalid value for \c
+    * internalFormat.
+    *
+    * \returns
+    * The number of sample counts actually written to \c samples.
+    */
+   size_t (*QuerySamplesForFormat)(struct gl_context *ctx,
+                                   GLenum internalFormat,
+                                   int samples[16]);
+
+   /**
     * Called by glTexImage[123]D() and glCopyTexImage[12]D()
     * Allocate texture memory and copy the user's image to the buffer.
     * The gl_texture_image fields, etc. will be fully initialized.
diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
index 5a815c2..989d90b 100644
--- a/src/mesa/main/formatquery.c
+++ b/src/mesa/main/formatquery.c
@@ -86,11 +86,25 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
 
    switch (pname) {
    case GL_SAMPLES:
-      buffer[0] = ctx->Const.MaxSamples;
-      count = 1;
+      if (ctx->Driver.QuerySamplesForFormat)
+         count = ctx->Driver.QuerySamplesForFormat(ctx, internalformat,
+                                                   buffer);
+      else
+         count = 0;
       break;
    case GL_NUM_SAMPLE_COUNTS:
-      buffer[0] = 1;
+      if (ctx->Driver.QuerySamplesForFormat) {
+         const size_t num_samples =
+            ctx->Driver.QuerySamplesForFormat(ctx, internalformat, buffer);
+
+         /* QuerySamplesForFormat writes some stuff to buffer, so we have to
+          * separately over-write it with the requested value.
+          */
+         buffer[0] = (GLint) num_samples;
+      } else {
+         buffer[0] = 0;
+      }
+
       count = 1;
       break;
    default:
-- 
1.7.11.7



More information about the mesa-dev mailing list