[Mesa-dev] [PATCH v3] mesa/glsl/glapi: enable GL_EXT_draw_buffers extension
Tapani Pälli
tapani.palli at intel.com
Fri Jan 9 03:42:14 PST 2015
On 01/09/2015 12:07 PM, Kenneth Graunke wrote:
> 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.
Right, I'm aware of that. I thought this would not hurt though since we
only end up here with ES2 and ES3?
>> (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 },
More information about the mesa-dev
mailing list