From 9cdb74efc7109f52a2175ceaf89dcfdd11a7046f Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Fri, 26 Feb 2016 19:51:15 +0100 Subject: [PATCH] rsx/common: Add supports for quads strip Used in Hitman 2 --- rpcs3/Emu/RSX/Common/BufferUtils.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index 8ab9262116..c166aad4ac 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -252,11 +252,11 @@ bool is_primitive_native(rsx::primitive_type draw_mode) case rsx::primitive_type::line_strip: case rsx::primitive_type::triangles: case rsx::primitive_type::triangle_strip: - case rsx::primitive_type::quad_strip: return true; case rsx::primitive_type::polygon: case rsx::primitive_type::triangle_fan: case rsx::primitive_type::quads: + case rsx::primitive_type::quad_strip: return false; } throw new EXCEPTION("Wrong primitive type"); @@ -280,6 +280,8 @@ size_t get_index_count(rsx::primitive_type draw_mode, unsigned initial_index_cou return (initial_index_count - 2) * 3; case rsx::primitive_type::quads: return (6 * initial_index_count) / 4; + case rsx::primitive_type::quad_strip: + return (6 * (initial_index_count - 2)) / 2; default: return 0; } @@ -322,14 +324,26 @@ void write_index_array_for_non_indexed_non_native_primitive_to_buffer(char* dst, typedDst[6 * i + 5] = 4 * i + first; } return; + case rsx::primitive_type::quad_strip: + for (unsigned i = 0; i < (count - 2) / 2; i++) + { + // First triangle + typedDst[6 * i] = 2 * i + first; + typedDst[6 * i + 1] = 2 * i + 1 + first; + typedDst[6 * i + 2] = 2 * i + 2 + first; + // Second triangle + typedDst[6 * i + 3] = 2 * i + 2 + first; + typedDst[6 * i + 4] = 2 * i + 3 + first; + typedDst[6 * i + 5] = 2 * i + 1 + first; + } + return; case rsx::primitive_type::points: case rsx::primitive_type::lines: case rsx::primitive_type::line_loop: case rsx::primitive_type::line_strip: case rsx::primitive_type::triangles: case rsx::primitive_type::triangle_strip: - case rsx::primitive_type::quad_strip: - throw new EXCEPTION("Native primitive type doesn't require expansion"); + throw EXCEPTION("Native primitive type doesn't require expansion"); } }