mesa: Add driver method to determine the possible sample counts

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>
This commit is contained in:
Ian Romanick
2012-12-01 11:05:00 -08:00
parent bda540d235
commit f5e7f12e4a
3 changed files with 45 additions and 5 deletions

View 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;

View 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.

View 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;
break;
case GL_NUM_SAMPLE_COUNTS:
buffer[0] = 1;
count = ctx->Driver.QuerySamplesForFormat(ctx, internalformat, buffer);
break;
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)",