On 02/17/2013 03:35 AM, Chris Forbes wrote:
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)
  }



There should be a comment on this function explaining what it does and what it returns.


+GLenum
+_mesa_check_sample_count(struct gl_context *ctx, GLenum target,
+                         GLenum internalFormat, GLsizei samples)

Can ctx be const-qualified? It looks like the context shouldn't be changed by this function.


+{
+   /* 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;
+      }

Minor style nit: I'd simply declare sample_count_error at the top of the function and get rid of the {}-block.


     }

     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);


_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to