From 756e9ebbdd84018382908d3556973a62dbda09ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Thu, 13 Apr 2017 21:06:11 +0200 Subject: [PATCH] mesa: extract need_xfb_remaining_prims_check MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The same logic needs to be applied to glMultiDrawArrays. Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Timothy Arceri Reviewed-by: Marek Olšák --- src/mesa/main/api_validate.c | 48 +++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 8f834324ad4..2e1829bb13a 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -816,25 +816,10 @@ _mesa_validate_DrawRangeElements(struct gl_context *ctx, GLenum mode, "glDrawRangeElements"); } + static bool -validate_draw_arrays(struct gl_context *ctx, const char *func, - GLenum mode, GLsizei count, GLsizei numInstances) +need_xfb_remaining_prims_check(const struct gl_context *ctx) { - struct gl_transform_feedback_object *xfb_obj - = ctx->TransformFeedback.CurrentObject; - FLUSH_CURRENT(ctx, 0); - - if (count < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "%s(count)", func); - return false; - } - - if (!_mesa_valid_prim_mode(ctx, mode, func)) - return false; - - if (!check_valid_to_render(ctx, func)) - return false; - /* From the GLES3 specification, section 2.14.2 (Transform Feedback * Primitive Capture): * @@ -862,9 +847,32 @@ validate_draw_arrays(struct gl_context *ctx, const char *func, * 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) && - !_mesa_has_OES_geometry_shader(ctx) && - !_mesa_has_OES_tessellation_shader(ctx)) { + return _mesa_is_gles3(ctx) && _mesa_is_xfb_active_and_unpaused(ctx) && + !_mesa_has_OES_geometry_shader(ctx) && + !_mesa_has_OES_tessellation_shader(ctx); +} + + +static bool +validate_draw_arrays(struct gl_context *ctx, const char *func, + GLenum mode, GLsizei count, GLsizei numInstances) +{ + FLUSH_CURRENT(ctx, 0); + + if (count < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "%s(count)", func); + return false; + } + + if (!_mesa_valid_prim_mode(ctx, mode, func)) + return false; + + if (!check_valid_to_render(ctx, func)) + return false; + + if (need_xfb_remaining_prims_check(ctx)) { + struct gl_transform_feedback_object *xfb_obj + = ctx->TransformFeedback.CurrentObject; size_t prim_count = vbo_count_tessellated_primitives(mode, count, numInstances); if (xfb_obj->GlesRemainingPrims < prim_count) { _mesa_error(ctx, GL_INVALID_OPERATION, -- 2.30.2