diff options
author | Chris Forbes <[email protected]> | 2013-03-03 21:46:12 +1300 |
---|---|---|
committer | Chris Forbes <[email protected]> | 2013-03-24 16:38:18 +1300 |
commit | 2405da174ed52cd1b164a6f16cb32964879348a3 (patch) | |
tree | 0dff631510216f1e2f001e1819ecbe9ecef95729 /src/mesa | |
parent | 90b5a2425a5f362ef51ae7bb4d296fc682b92f46 (diff) |
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 <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/multisample.c | 29 | ||||
-rw-r--r-- | src/mesa/main/teximage.c | 34 |
2 files changed, 33 insertions, 30 deletions
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 <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" + * + * And when describing the operation of TexImage*Multisample: + * + * "The error INVALID_OPERATION may be generated if any of the following are true: + * + * * <internalformat> is a depth/stencil-renderable format and <samples> + * is greater than the value of MAX_DEPTH_TEXTURE_SAMPLES + * * <internalformat> is a color-renderable format and <samples> is + * grater than the value of MAX_COLOR_TEXTURE_SAMPLES + * * <internalformat> is a signed or unsigned integer format and + * <samples> 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: diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 4042e7969e0..bc755ae796c 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -40,6 +40,7 @@ #include "imports.h" #include "macros.h" #include "mfeatures.h" +#include "multisample.h" #include "state.h" #include "texcompress.h" #include "texcompress_cpal.h" @@ -4199,6 +4200,7 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, struct gl_texture_image *texImage; GLboolean sizeOK, dimensionsOK; gl_format texFormat; + GLenum sample_count_error; GET_CURRENT_CONTEXT(ctx); @@ -4225,35 +4227,13 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, return; } - if (_mesa_is_enum_format_integer(internalformat)) { - if (samples > ctx->Const.MaxIntegerSamples) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glTexImage%uDMultisample(samples>GL_MAX_INTEGER_SAMPLES)", - dims); - return; - } - } - else if (_mesa_is_depth_or_stencil_format(internalformat)) { - if (samples > ctx->Const.MaxDepthTextureSamples) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glTexImage%uDMultisample(samples>GL_MAX_DEPTH_TEXTURE_SAMPLES)", - dims); - return; - } - } - else { - if (samples > ctx->Const.MaxColorTextureSamples) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glTexImage%uDMultisample(samples>GL_MAX_COLOR_TEXTURE_SAMPLES)", - dims); - return; - } + sample_count_error = _mesa_check_sample_count(ctx, target, + internalformat, samples); + if (sample_count_error != GL_NO_ERROR) { + _mesa_error(ctx, sample_count_error, "glTexImage%uDMultisample(samples)", dims); + return; } - /* TODO: should ask the driver for the exact limit for this internalformat - * once IDR's internalformat_query bits land - */ - texObj = _mesa_get_current_tex_object(ctx, target); texImage = _mesa_get_tex_image(ctx, texObj, 0, 0); |