Pulls the checking of the sample count into a helper function, and extends the existing logic to include the interactions with both ARB_texture_multisample and ARB_internalformat_query.
_mesa_check_sample_count() checks a desired sample count against a a combination of target/internalformat, and returns the error enum to be produced, if any. Unfortunately the conditions are messy and the errors vary: On p205 of the GL3.1 spec: "... or if samples is greater than MAX_SAMPLES, then the error INVALID_VALUE is generated." Or with ARB_texture_multisample (or GL3.2): "... or if <samples> is greater than the value of MAX_SAMPLES, then the error INVALID_VALUE is generated. If <internalformat> is a signed or unsigned integer format and <samples> is greater than the value of MAX_INTEGER_SAMPLES, then the error INVALID_OPERATION is generated. Or with ARB_internalformat_query (or GL4.2): "If <samples> is greater than the maximum number of samples supported for <internalformat> then the error INVALID_OPERATION is generated (see GetInternalformativ in section 6.X)." Signed-off-by: Chris Forbes <[email protected]> --- src/mesa/main/fbobject.c | 43 +++++++++++++++++++++++++++++++++++++++---- src/mesa/main/fbobject.h | 4 ++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index c89e728..50339c2 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -1449,6 +1449,35 @@ invalidate_rb(GLuint key, void *data, void *userData) } +GLenum +_mesa_check_sample_count(struct gl_context *ctx, GLenum target, + GLenum internalFormat, GLsizei samples) +{ + /* If ARB_internalformat_query is supported, then treat its highest returned sample + * count as the absolute maximum for this format; it is allowed to exceed MAX_SAMPLES. + */ + if (ctx->Extensions.ARB_internalformat_query) { + GLint buffer[16]; + int count = ctx->Driver.QuerySamplesForFormat(ctx, target, internalFormat, buffer); + int limit = count ? buffer[0] : -1; + + return (samples > limit) ? GL_INVALID_OPERATION : GL_NO_ERROR; + } + + /* If ARB_texture_multisample is supported, we have separate limits for + * integer formats. + */ + + if (ctx->Extensions.ARB_texture_multisample) { + if (_mesa_is_enum_format_integer(internalFormat)) + return samples > ctx->Const.MaxIntegerSamples ? GL_INVALID_OPERATION : GL_NO_ERROR; + } + + /* No more specific limit is available, so just use MAX_SAMPLES */ + return samples > ctx->Const.MaxSamples ? GL_INVALID_VALUE : GL_NO_ERROR; +} + + /** sentinal value, see below */ #define NO_SAMPLES 1000 @@ -1509,10 +1538,16 @@ renderbuffer_storage(GLenum target, GLenum internalFormat, /* NumSamples == 0 indicates non-multisampling */ samples = 0; } - else if (samples > (GLsizei) ctx->Const.MaxSamples) { - /* note: driver may choose to use more samples than what's requested */ - _mesa_error(ctx, GL_INVALID_VALUE, "%s(samples)", func); - return; + + { /* check the sample count; + * note: driver may choose to use more samples than what's requested + */ + GLenum sample_count_error = _mesa_check_sample_count(ctx, target, + internalFormat, samples); + if (sample_count_error != GL_NO_ERROR) { + _mesa_error(ctx, sample_count_error, "%s(samples)", func); + return; + } } rb = ctx->CurrentRenderbuffer; diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h index 9207f59..9adee3a 100644 --- a/src/mesa/main/fbobject.h +++ b/src/mesa/main/fbobject.h @@ -123,6 +123,10 @@ _mesa_is_legal_color_format(const struct gl_context *ctx, GLenum baseFormat); extern GLenum _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat); +extern GLenum +_mesa_check_sample_count(struct gl_context *ctx, GLenum target, + GLenum internalFormat, GLsizei samples); + extern GLboolean GLAPIENTRY _mesa_IsRenderbuffer(GLuint renderbuffer); -- 1.8.1.3 _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
