mesa: Add driver method to determine the possible sample counts
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 1 Dec 2012 19:05:00 +0000 (11:05 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 16 Jan 2013 05:34:45 +0000 (21:34 -0800)
Use this method in _mesa_GetInternalformativ for both GL_SAMPLES and
GL_NUM_SAMPLE_COUNTS.

v2: internalFormat may not be color renderable by the driver, so zero
can be returned as a sample count.  Require that drivers supporting the
extension provide a QuerySamplesForFormat function.  The later was
suggested by Eric Anholt.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/drivers/common/driverfuncs.c
src/mesa/main/dd.h
src/mesa/main/formatquery.c

index 93fa3c745e7225d79cca9caeec8817b27110f1cc..3de5199b477f5c6d407f26cf75ca7771750c7554 100644 (file)
@@ -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;
index 70c53240e73da2e97d308369849b093a795e56e7..07787d41dd9495c0d5ec1dd5542b32aef5f6c2c9 100644 (file)
@@ -200,6 +200,22 @@ struct dd_function_table {
                                      GLenum target, GLint internalFormat,
                                      GLenum srcFormat, GLenum srcType );
 
+   /**
+    * Determine sample counts support for a particular format
+    *
+    * \param ctx            GL context
+    * \param internalFormat GL format enum
+    * \param samples        Buffer to hold the returned sample counts.
+    *                       Drivers \b must \b not return more than 16 counts.
+    *
+    * \returns
+    * The number of sample counts actually written to \c samples.  If
+    * \c internaFormat is not renderable, zero is returned.
+    */
+   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.
index 64f10cdf4947250038e98df9cc03868c8a0e248e..f08ab66f040572f2601523288700503dad813c2f 100644 (file)
@@ -42,6 +42,8 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
       return;
    }
 
+   assert(ctx->Driver.QuerySamplesForFormat != NULL);
+
    /* The ARB_internalformat_query spec says:
     *
     *     "If the <target> parameter to GetInternalformativ is not one of
@@ -91,13 +93,34 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
 
    switch (pname) {
    case GL_SAMPLES:
-      buffer[0] = ctx->Const.MaxSamples;
-      count = 1;
+      count = ctx->Driver.QuerySamplesForFormat(ctx, internalformat, buffer);
       break;
-   case GL_NUM_SAMPLE_COUNTS:
-      buffer[0] = 1;
+   case GL_NUM_SAMPLE_COUNTS: {
+      /* The driver can return 0, and we should pass that along to the
+       * application.  The ARB decided that ARB_internalformat_query should
+       * behave as ARB_internalformat_query2 in this situation.
+       *
+       * The ARB_internalformat_query2 spec says:
+       *
+       *     "- NUM_SAMPLE_COUNTS: The number of sample counts that would be
+       *        returned by querying SAMPLES is returned in <params>.
+       *        * If <internalformat> is not color-renderable,
+       *          depth-renderable, or stencil-renderable (as defined in
+       *          section 4.4.4), or if <target> does not support multiple
+       *          samples (ie other than TEXTURE_2D_MULTISAMPLE,
+       *          TEXTURE_2D_MULTISAMPLE_ARRAY, or RENDERBUFFER), 0 is
+       *          returned."
+       */
+      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;
       count = 1;
       break;
+   }
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
                   "glGetInternalformativ(pname=%s)",