[Mesa-dev] [PATCH v3] mesa/glsl/glapi: enable GL_EXT_draw_buffers extension

Kenneth Graunke kenneth at whitecape.org
Fri Jan 9 02:07:28 PST 2015


On Friday, January 09, 2015 11:25:18 AM Tapani Pälli wrote:
> Patch enables ES2 extension that utilizes existing ES3 functionality.
> 
> Changes make all the subtests to run and pass in WebGL conformance
> test 'webgl-draw-buffers' when running Chrome on OpenGL ES, also
> Piglit test 'draw_buffers_gles2' passes.
> 
> v2: remove unused boolean (Ilia Mirkin)
> v3: proper error checking for invalid values (Chad Versace)
> 
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
>  src/glsl/glcpp/glcpp-parse.y    | 1 +
>  src/glsl/glsl_parser_extras.cpp | 1 +
>  src/glsl/glsl_parser_extras.h   | 2 ++
>  src/mapi/glapi/gen/es_EXT.xml   | 9 +++++++++
>  src/mesa/main/buffers.c         | 6 ++++--
>  src/mesa/main/extensions.c      | 1 +
>  6 files changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
> index f1119eb..3dd2ebc 100644
> --- a/src/glsl/glcpp/glcpp-parse.y
> +++ b/src/glsl/glcpp/glcpp-parse.y
> @@ -2374,6 +2374,7 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
>  	if (parser->is_gles) {
>  	   add_builtin_define(parser, "GL_ES", 1);
>             add_builtin_define(parser, "GL_EXT_separate_shader_objects", 1);
> +           add_builtin_define(parser, "GL_EXT_draw_buffers", 1);
>  
>  	   if (extensions != NULL) {
>  	      if (extensions->OES_EGL_image_external)
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index 27e3301..2d49c3e 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -556,6 +556,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>     EXT(AMD_shader_trinary_minmax,      true,  false,     dummy_true),
>     EXT(AMD_vertex_shader_layer,        true,  false,     AMD_vertex_shader_layer),
>     EXT(AMD_vertex_shader_viewport_index, true,  false,   AMD_vertex_shader_viewport_index),
> +   EXT(EXT_draw_buffers,               false,  true,     dummy_true),
>     EXT(EXT_separate_shader_objects,    false, true,      dummy_true),
>     EXT(EXT_shader_integer_mix,         true,  true,      EXT_shader_integer_mix),
>     EXT(EXT_texture_array,              true,  false,     EXT_texture_array),
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index c14d74c..7a13875 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -470,6 +470,8 @@ struct _mesa_glsl_parse_state {
>     bool AMD_vertex_shader_layer_warn;
>     bool AMD_vertex_shader_viewport_index_enable;
>     bool AMD_vertex_shader_viewport_index_warn;
> +   bool EXT_draw_buffers_enable;
> +   bool EXT_draw_buffers_warn;
>     bool EXT_separate_shader_objects_enable;
>     bool EXT_separate_shader_objects_warn;
>     bool EXT_shader_integer_mix_enable;
> diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
> index e2dc390..3a2adeb 100644
> --- a/src/mapi/glapi/gen/es_EXT.xml
> +++ b/src/mapi/glapi/gen/es_EXT.xml
> @@ -837,4 +837,13 @@
>      </function>
>  </category>
>  
> +<!-- 151. GL_EXT_draw_buffers -->
> +<category name="GL_EXT_draw_buffers" number="151">
> +    <function name="DrawBuffersEXT" alias="DrawBuffers"
> +              static_dispatch="false" es2="2.0">
> +        <param name="n" type="GLsizei" counter="true"/>
> +        <param name="bufs" type="const GLenum *" count="n"/>
> +    </function>
> +</category>
> +
>  </OpenGLAPI>
> diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
> index 1ee2009..d53f44d 100644
> --- a/src/mesa/main/buffers.c
> +++ b/src/mesa/main/buffers.c
> @@ -326,8 +326,9 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
>     /* From the ES 3.0 specification, page 180:
>      * "If the GL is bound to the default framebuffer, then n must be 1
>      *  and the constant must be BACK or NONE."
> +    * (same restriction applies with GL_EXT_draw_buffers specification)
>      */
> -   if (_mesa_is_gles3(ctx) && _mesa_is_winsys_fbo(ctx->DrawBuffer) &&
> +   if (_mesa_is_gles(ctx) && _mesa_is_winsys_fbo(ctx->DrawBuffer) &&

The extension says it requires ES 2.0.  _mesa_is_gles checks for ES 1/2/3.

I think you want:

if (ctx->API == API_OPENGLES2 && ...

Note that API will be API_OPENGLES2 for both ES2 and ES3.  API_OPENGLES is ES1.

>         (n != 1 || (buffers[0] != GL_NONE && buffers[0] != GL_BACK))) {
>        _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffers(buffer)");
>        return;
> @@ -399,8 +400,9 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
>           /* ES 3.0 is even more restrictive.  From the ES 3.0 spec, page 180:
>            * "If the GL is bound to a framebuffer object, the ith buffer listed
>            *  in bufs must be COLOR_ATTACHMENTi or NONE. [...] INVALID_OPERATION."
> +          * (same restriction applies with GL_EXT_draw_buffers specification)
>            */
> -         if (_mesa_is_gles3(ctx) && _mesa_is_user_fbo(ctx->DrawBuffer) &&
> +         if (_mesa_is_gles(ctx) && _mesa_is_user_fbo(ctx->DrawBuffer) &&

Same concern here.

>               buffers[output] != GL_NONE &&
>               buffers[output] != GL_COLOR_ATTACHMENT0 + output) {
>              _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffers(buffer)");
> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
> index 0df04c2..3b206bf 100644
> --- a/src/mesa/main/extensions.c
> +++ b/src/mesa/main/extensions.c
> @@ -212,6 +212,7 @@ static const struct extension extension_table[] = {
>     { "GL_EXT_compiled_vertex_array",               o(dummy_true),                              GLL,            1996 },
>     { "GL_EXT_copy_texture",                        o(dummy_true),                              GLL,            1995 },
>     { "GL_EXT_depth_bounds_test",                   o(EXT_depth_bounds_test),                   GL,             2002 },
> +   { "GL_EXT_draw_buffers",                        o(dummy_true),                                          ES2, 2012 },
>     { "GL_EXT_draw_buffers2",                       o(EXT_draw_buffers2),                       GL,             2006 },
>     { "GL_EXT_draw_instanced",                      o(ARB_draw_instanced),                      GL,             2006 },
>     { "GL_EXT_draw_range_elements",                 o(dummy_true),                              GLL,            1997 },
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150109/1bc8d22a/attachment.sig>


More information about the mesa-dev mailing list