diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 27a2df6725..5a8be5090a 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -51,6 +51,7 @@ namespace rsx template<> struct vertex_data_type_from_element_type { static const vertex_base_type type = vertex_base_type::sf; }; template<> struct vertex_data_type_from_element_type { static const vertex_base_type type = vertex_base_type::ub; }; template<> struct vertex_data_type_from_element_type { static const vertex_base_type type = vertex_base_type::s32k; }; + template<> struct vertex_data_type_from_element_type { static const vertex_base_type type = vertex_base_type::s1; }; namespace nv406e { @@ -149,10 +150,16 @@ namespace rsx sema.semaphore[index].timestamp = rsx->timestamp(); } - template + /** + * id = base method register + * index = register index in method + * count = element count per attribute + * register_count = number of registers consumed per attribute. E.g 3-element methods have padding + */ + template void set_vertex_data_impl(thread* rsx, u32 arg) { - static const size_t increment_per_array_index = (count * sizeof(type)) / sizeof(u32); + static const size_t increment_per_array_index = (register_count * sizeof(type)) / sizeof(u32); static const size_t attribute_index = index / increment_per_array_index; static const size_t vertex_subreg = index % increment_per_array_index; @@ -176,7 +183,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } }; @@ -185,7 +192,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } }; @@ -194,7 +201,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } }; @@ -203,8 +210,8 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - //NOTE: attributes are 16-byte aligned (Rachet & Clank 2) - set_vertex_data_impl(rsx, arg); + //Register alignment is only 1, 2, or 4 (Rachet & Clank 2) + set_vertex_data_impl(rsx, arg); } }; @@ -213,7 +220,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } }; @@ -222,7 +229,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } }; @@ -231,7 +238,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } }; @@ -240,8 +247,7 @@ namespace rsx { static void impl(thread* rsx, u32 _reg, u32 arg) { - LOG_ERROR(RSX, "SCALED_4S vertex data format is not properly implemented"); - set_vertex_data_impl(rsx, arg); + set_vertex_data_impl(rsx, arg); } };