[Mesa-dev] [RFC PATCH 13/26] mesa: implement sample mask

Ian Romanick idr at freedesktop.org
Fri Jan 4 13:42:43 PST 2013


On 12/29/2012 04:35 AM, Chris Forbes wrote:
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
>   src/mesa/main/enable.c           | 15 +++++++++++++++
>   src/mesa/main/get.c              |  9 +++++++++
>   src/mesa/main/get_hash_params.py |  2 ++
>   src/mesa/main/mtypes.h           |  6 +++++-
>   src/mesa/main/multisample.c      | 16 ++++++++++++++--
>   5 files changed, 45 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
> index b48794f..aeeab15 100644
> --- a/src/mesa/main/enable.c
> +++ b/src/mesa/main/enable.c
> @@ -988,6 +988,14 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
>            }
>            break;
>
> +      /* ARB_texture_multisample */
> +      case GL_SAMPLE_MASK:
> +         if (ctx->Multisample.SampleMask == state)
> +            return;
> +         FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
> +         ctx->Multisample.SampleMask = state;
> +         break;
> +

I agree with Paul.  This block should also have the 'if 
(!_mesa_is_desktop_gl(ctx))' check.

>         default:
>            goto invalid_enum_error;
>      }
> @@ -1556,6 +1564,13 @@ _mesa_IsEnabled( GLenum cap )
>   	 CHECK_EXTENSION(OES_EGL_image_external);
>            return is_texture_enabled(ctx, TEXTURE_EXTERNAL_BIT);
>
> +      /* ARB_texture_multisample */
> +      case GL_SAMPLE_MASK:
> +         if (!_mesa_is_desktop_gl(ctx))
> +            goto invalid_enum_error;
> +         CHECK_EXTENSION(ARB_texture_multisample);
> +         return ctx->Multisample.SampleMask;
> +
>         default:
>            goto invalid_enum_error;
>      }
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 4c227a8..e15cbf8 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -1618,6 +1618,15 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
>   	 goto invalid_enum;
>         v->value_int = ctx->UniformBufferBindings[index].Size;
>         return TYPE_INT;
> +
> +   /* ARB_texture_multisample / GL3.2 */
> +   case GL_SAMPLE_MASK_VALUE:
> +      if (index != 0)
> +    goto invalid_value;
> +      if (!ctx->Extensions.ARB_texture_multisample)
> +    goto invalid_enum;
> +      v->value_int = ctx->Multisample.SampleMaskValue;
> +      return TYPE_INT;
>      }
>
>    invalid_enum:
> diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
> index 689a7e0..8e053a4 100644
> --- a/src/mesa/main/get_hash_params.py
> +++ b/src/mesa/main/get_hash_params.py
> @@ -644,6 +644,8 @@ descriptor=[
>     [ "MAX_COLOR_TEXTURE_SAMPLES", "CONTEXT_INT(Const.MaxColorTextureSamples), extra_ARB_texture_multisample" ],
>     [ "MAX_DEPTH_TEXTURE_SAMPLES", "CONTEXT_INT(Const.MaxDepthTextureSamples), extra_ARB_texture_multisample" ],
>     [ "MAX_INTEGER_SAMPLES", "CONTEXT_INT(Const.MaxIntegerSamples), extra_ARB_texture_multisample" ],
> +  [ "SAMPLE_MASK", "CONTEXT_BOOL(Multisample.SampleMask), extra_ARB_texture_multisample" ],
> +  [ "MAX_SAMPLE_MASK_WORDS", "CONST(1), extra_ARB_texture_multisample" ],
>
>
>   # GL_ARB_sampler_objects / GL 3.3
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 6f6cdaa..dda6a3e 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -980,7 +980,6 @@ struct gl_list_attrib
>      GLuint ListBase;
>   };
>
> -
>   /**
>    * Multisample attribute group (GL_MULTISAMPLE_BIT).
>    */

Spurious whitespace change.

> @@ -993,6 +992,11 @@ struct gl_multisample_attrib
>      GLboolean SampleCoverage;
>      GLfloat SampleCoverageValue;
>      GLboolean SampleCoverageInvert;
> +
> +   /* ARB_texture_multisample / GL3.2 additions */
> +   GLboolean SampleMask;
> +   GLbitfield SampleMaskValue; /* GL spec defines this as an array but >32x MSAA is
> +                                 madness */
>   };
>
>
> diff --git a/src/mesa/main/multisample.c b/src/mesa/main/multisample.c
> index ee9e263..d277ff8 100644
> --- a/src/mesa/main/multisample.c
> +++ b/src/mesa/main/multisample.c
> @@ -59,6 +59,10 @@ _mesa_init_multisample(struct gl_context *ctx)
>      ctx->Multisample.SampleCoverage = GL_FALSE;
>      ctx->Multisample.SampleCoverageValue = 1.0;
>      ctx->Multisample.SampleCoverageInvert = GL_FALSE;
> +
> +   /* ARB_texture_multisample / GL3.2 additions */
> +   ctx->Multisample.SampleMask = GL_FALSE;
> +   ctx->Multisample.SampleMaskValue = ~(GLbitfield)0;
>   }
>
>   void GLAPIENTRY
> @@ -88,7 +92,15 @@ _mesa_GetMultisamplefv(GLenum pname, GLuint index, GLfloat * val)
>   void GLAPIENTRY
>   _mesa_SampleMaski(GLuint index, GLbitfield mask)
>   {
> -   assert(!"Not implemented");
> -   // TODO: make this work
> +   GET_CURRENT_CONTEXT(ctx);
> +   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx );
> +
> +   if (index != 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glSampleMaski(index)");
> +      return;
> +   }
> +
> +   ctx->Multisample.SampleMaskValue = mask;
> +   ctx->NewState |= _NEW_MULTISAMPLE;
>   }

Check that the extension is enabled?



More information about the mesa-dev mailing list