From a751051248d445c3d726a3eab8fc999b0876364e Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Mon, 25 May 2020 19:07:08 +0300 Subject: [PATCH] i965: Work around incorrect usage of glDrawRangeElements in UE4 Unreal Engine 4 has a bug in usage of glDrawRangeElements, causing it to be called with a number of vertices in place of "end" parameter (which specifies the maximum array index contained in indices). Since there is unknown amount of games affected and we could not identify that a game is built with UE4 - we are forced to make a blanket workaround, disregarding max_index in range calculations. Fortunately all such calls look like: glDrawRangeElements(GL_TRIANGLES, 0, 3, 3, ...); So we are able to narrow down this workaround. This was uncovered after b684030c3a656ffdbc93581856034e0982db46fd broke a bunch of UE4 games. Cc: 20.1 Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2917 Signed-off-by: Danylo Piliaiev Reviewed-by: Lionel Landwerlin Part-of: --- src/mesa/drivers/dri/i965/brw_draw_upload.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index ca51f88da15..cb307301abc 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -549,6 +549,26 @@ brw_prepare_vertices(struct brw_context *brw) start = vertex_range_start + stride * min_index; range = (stride * (max_index - min_index) + vertex_size); + + /** + * Unreal Engine 4 has a bug in usage of glDrawRangeElements, + * causing it to be called with a number of vertices in place + * of "end" parameter (which specifies the maximum array index + * contained in indices). + * + * Since there is unknown amount of games affected and we + * could not identify that a game is built with UE4 - we are + * forced to make a blanket workaround, disregarding max_index + * in range calculations. Fortunately all such calls look like: + * glDrawRangeElements(GL_TRIANGLES, 0, 3, 3, ...); + * So we are able to narrow down this workaround. + * + * See: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2917 + */ + if (unlikely(max_index == 3 && min_index == 0 && + brw->draw.derived_params.is_indexed_draw)) { + range = intel_buffer->Base.Size - offset - start; + } } } -- 2.30.2