mirror of
https://gitee.com/openharmony/third_party_mesa3d
synced 2024-11-27 17:40:43 +00:00
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 b684030c3a
broke a bunch of UE4 games.
Cc: 20.1 <mesa-stable@lists.freedesktop.org>
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2917
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5203>
This commit is contained in:
parent
487aa807bd
commit
a751051248
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user