mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 23:40:12 +01:00
mesa: helper for checking renderbuffer sample count
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.
V2: - Tidy up spurious block.
- Move _mesa_check_sample_count() to multisample.c instead; It
doesn't really belong in fbobject.c or teximage.c.
- Inlined spec quotes
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
86b8380600
commit
90b5a2425a
3 changed files with 69 additions and 3 deletions
|
|
@ -43,6 +43,7 @@
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "mfeatures.h"
|
#include "mfeatures.h"
|
||||||
|
#include "multisample.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
#include "renderbuffer.h"
|
#include "renderbuffer.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
|
|
@ -1492,6 +1493,7 @@ renderbuffer_storage(GLenum target, GLenum internalFormat,
|
||||||
"glRenderbufferStorage" : "glRenderbufferStorageMultisample";
|
"glRenderbufferStorage" : "glRenderbufferStorageMultisample";
|
||||||
struct gl_renderbuffer *rb;
|
struct gl_renderbuffer *rb;
|
||||||
GLenum baseFormat;
|
GLenum baseFormat;
|
||||||
|
GLenum sample_count_error;
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
GET_CURRENT_CONTEXT(ctx);
|
||||||
|
|
||||||
if (MESA_VERBOSE & VERBOSE_API) {
|
if (MESA_VERBOSE & VERBOSE_API) {
|
||||||
|
|
@ -1535,9 +1537,14 @@ renderbuffer_storage(GLenum target, GLenum internalFormat,
|
||||||
/* NumSamples == 0 indicates non-multisampling */
|
/* NumSamples == 0 indicates non-multisampling */
|
||||||
samples = 0;
|
samples = 0;
|
||||||
}
|
}
|
||||||
else if (samples > (GLsizei) ctx->Const.MaxSamples) {
|
|
||||||
/* note: driver may choose to use more samples than what's requested */
|
/* check the sample count;
|
||||||
_mesa_error(ctx, GL_INVALID_VALUE, "%s(samples)", func);
|
* note: driver may choose to use more samples than what's requested
|
||||||
|
*/
|
||||||
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
#include "main/multisample.h"
|
#include "main/multisample.h"
|
||||||
#include "main/mtypes.h"
|
#include "main/mtypes.h"
|
||||||
#include "main/fbobject.h"
|
#include "main/fbobject.h"
|
||||||
|
#include "main/glformats.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -112,3 +113,56 @@ _mesa_SampleMaski(GLuint index, GLbitfield mask)
|
||||||
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
|
FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
|
||||||
ctx->Multisample.SampleMaskValue = mask;
|
ctx->Multisample.SampleMaskValue = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Helper for checking a requested sample count against the limit
|
||||||
|
* for a particular (target, internalFormat) pair. The limit imposed,
|
||||||
|
* and the error generated, both depend on which extensions are supported.
|
||||||
|
*
|
||||||
|
* Returns a GL error enum, or GL_NO_ERROR if the requested sample count is
|
||||||
|
* acceptable.
|
||||||
|
*/
|
||||||
|
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.
|
||||||
|
*
|
||||||
|
* From the ARB_internalformat_query spec:
|
||||||
|
*
|
||||||
|
* "If <samples is greater than the maximum number of samples supported
|
||||||
|
* for <internalformat> then the error INVALID_OPERATION is generated."
|
||||||
|
*/
|
||||||
|
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.
|
||||||
|
*
|
||||||
|
* From the ARB_texture_multisample spec:
|
||||||
|
*
|
||||||
|
* "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"
|
||||||
|
*/
|
||||||
|
|
||||||
|
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:
|
||||||
|
*
|
||||||
|
* On p205 of the GL3.1 spec:
|
||||||
|
*
|
||||||
|
* "... or if samples is greater than MAX_SAMPLES, then the error
|
||||||
|
* INVALID_VALUE is generated"
|
||||||
|
*/
|
||||||
|
return samples > ctx->Const.MaxSamples ? GL_INVALID_VALUE : GL_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,4 +44,9 @@ _mesa_GetMultisamplefv(GLenum pname, GLuint index, GLfloat* val);
|
||||||
extern void GLAPIENTRY
|
extern void GLAPIENTRY
|
||||||
_mesa_SampleMaski(GLuint index, GLbitfield mask);
|
_mesa_SampleMaski(GLuint index, GLbitfield mask);
|
||||||
|
|
||||||
|
|
||||||
|
extern GLenum
|
||||||
|
_mesa_check_sample_count(struct gl_context *ctx, GLenum target,
|
||||||
|
GLenum internalFormat, GLsizei samples);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue