From 7314007925a25f65d178345dfc6d086c82e9a71e Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Thu, 29 Oct 2015 00:21:18 -0700 Subject: [PATCH] mesa: Skip ES 3.0/3.1 transform feedback primitive counting error. This error condition is not implementable when using tessellation or geometry shaders. The text was also removed from the ES 3.2 spec. I believe the intended behavior is to remove the error condition when either OES_geometry_shader or OES_tessellation_shader are exposed. v2: Quote a better part of issue 13 (suggested by Ian). Signed-off-by: Kenneth Graunke Reviewed-by: Ian Romanick --- src/mesa/main/api_validate.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 2ee2cd8df5a..ec3cc1b9853 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -546,8 +546,24 @@ validate_draw_arrays(struct gl_context *ctx, const char *func, * * This is in contrast to the behaviour of desktop GL, where the extra * primitives are silently dropped from the transform feedback buffer. + * + * This text is removed in ES 3.2, presumably because it's not really + * implementable with geometry and tessellation shaders. In fact, + * the OES_geometry_shader spec says: + * + * "(13) Does this extension change how transform feedback operates + * compared to unextended OpenGL ES 3.0 or 3.1? + * + * RESOLVED: Yes. Because dynamic geometry amplification in a geometry + * shader can make it difficult if not impossible to predict the amount + * of geometry that may be generated in advance of executing the shader, + * the draw-time error for transform feedback buffer overflow conditions + * is removed and replaced with the GL behavior (primitives are not + * written and the corresponding counter is not updated)..." */ - if (_mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx)) { + if (_mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx) && + !_mesa_has_OES_geometry_shader(ctx) && + !_mesa_has_OES_tessellation_shader(ctx)) { size_t prim_count = vbo_count_tessellated_primitives(mode, count, 1); if (xfb_obj->GlesRemainingPrims < prim_count) { _mesa_error(ctx, GL_INVALID_OPERATION, -- 2.30.2