From 2405da174ed52cd1b164a6f16cb32964879348a3 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 3 Mar 2013 21:46:12 +1300 Subject: mesa: use _mesa_check_sample_count() for multisample textures Extends _mesa_check_sample_count() to properly support the TEXTURE_2D_MULTISAMPLE and TEXTURE_2D_MULTISAMPLE_ARRAY targets, which have subtly different limits than renderbuffers. This resolves the remaining TODO in the implementation of TexImage*DMultisample. V2: - Don't introduce spurious block. - Do this in multisample.c instead. - Fix typo in error message. - Inline spec quotes Signed-off-by: Chris Forbes Reviewed-by: Brian Paul Reviewed-by: Kenneth Graunke --- src/mesa/main/multisample.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'src/mesa/main/multisample.c') diff --git a/src/mesa/main/multisample.c b/src/mesa/main/multisample.c index 8e5a969e3a8..b0f45d9332a 100644 --- a/src/mesa/main/multisample.c +++ b/src/mesa/main/multisample.c @@ -142,19 +142,42 @@ _mesa_check_sample_count(struct gl_context *ctx, GLenum target, return samples > limit ? GL_INVALID_OPERATION : GL_NO_ERROR; } - /* If ARB_texture_multisample is supported, we have separate limits for - * integer formats. + /* If ARB_texture_multisample is supported, we have separate limits, + * which may be lower than MAX_SAMPLES: * - * From the ARB_texture_multisample spec: + * From the ARB_texture_multisample spec, when describing the operation + * of RenderbufferStorageMultisample: * * "If is a signed or unsigned integer format and * is greater than the value of MAX_INTEGER_SAMPLES, then the * error INVALID_OPERATION is generated" + * + * And when describing the operation of TexImage*Multisample: + * + * "The error INVALID_OPERATION may be generated if any of the following are true: + * + * * is a depth/stencil-renderable format and + * is greater than the value of MAX_DEPTH_TEXTURE_SAMPLES + * * is a color-renderable format and is + * grater than the value of MAX_COLOR_TEXTURE_SAMPLES + * * is a signed or unsigned integer format and + * is greater than the value of MAX_INTEGER_SAMPLES */ if (ctx->Extensions.ARB_texture_multisample) { if (_mesa_is_enum_format_integer(internalFormat)) return samples > ctx->Const.MaxIntegerSamples ? GL_INVALID_OPERATION : GL_NO_ERROR; + + if (target == GL_TEXTURE_2D_MULTISAMPLE || + target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) { + + if (_mesa_is_depth_or_stencil_format(internalFormat)) + return samples > ctx->Const.MaxDepthTextureSamples + ? GL_INVALID_OPERATION : GL_NO_ERROR; + else + return samples > ctx->Const.MaxColorTextureSamples + ? GL_INVALID_OPERATION : GL_NO_ERROR; + } } /* No more specific limit is available, so just use MAX_SAMPLES: -- cgit v1.2.3