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:
@@ -91,6 +91,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
|
|||||||
|
|
||||||
/* Texture functions */
|
/* Texture functions */
|
||||||
driver->ChooseTextureFormat = _mesa_choose_tex_format;
|
driver->ChooseTextureFormat = _mesa_choose_tex_format;
|
||||||
|
driver->QuerySamplesForFormat = NULL;
|
||||||
driver->TexImage = _mesa_store_teximage;
|
driver->TexImage = _mesa_store_teximage;
|
||||||
driver->TexSubImage = _mesa_store_texsubimage;
|
driver->TexSubImage = _mesa_store_texsubimage;
|
||||||
driver->GetTexImage = _mesa_meta_GetTexImage;
|
driver->GetTexImage = _mesa_meta_GetTexImage;
|
||||||
|
@@ -200,6 +200,22 @@ struct dd_function_table {
|
|||||||
GLenum target, GLint internalFormat,
|
GLenum target, GLint internalFormat,
|
||||||
GLenum srcFormat, GLenum srcType );
|
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()
|
* Called by glTexImage[123]D() and glCopyTexImage[12]D()
|
||||||
* Allocate texture memory and copy the user's image to the buffer.
|
* Allocate texture memory and copy the user's image to the buffer.
|
||||||
|
@@ -42,6 +42,8 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(ctx->Driver.QuerySamplesForFormat != NULL);
|
||||||
|
|
||||||
/* The ARB_internalformat_query spec says:
|
/* The ARB_internalformat_query spec says:
|
||||||
*
|
*
|
||||||
* "If the <target> parameter to GetInternalformativ is not one of
|
* "If the <target> parameter to GetInternalformativ is not one of
|
||||||
@@ -91,13 +93,34 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
|
|||||||
|
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_SAMPLES:
|
case GL_SAMPLES:
|
||||||
buffer[0] = ctx->Const.MaxSamples;
|
count = ctx->Driver.QuerySamplesForFormat(ctx, internalformat, buffer);
|
||||||
count = 1;
|
break;
|
||||||
break;
|
case GL_NUM_SAMPLE_COUNTS: {
|
||||||
case GL_NUM_SAMPLE_COUNTS:
|
/* The driver can return 0, and we should pass that along to the
|
||||||
buffer[0] = 1;
|
* 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;
|
count = 1;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
_mesa_error(ctx, GL_INVALID_ENUM,
|
_mesa_error(ctx, GL_INVALID_ENUM,
|
||||||
"glGetInternalformativ(pname=%s)",
|
"glGetInternalformativ(pname=%s)",
|
||||||
|
Reference in New Issue
Block a user