diff options
| author | JMC47 <JMC4789@gmail.com> | 2021-12-20 14:27:14 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-20 14:27:14 -0500 |
| commit | 32fed91b0d35f06c46281f55c9f0fa4694c5334a (patch) | |
| tree | 6e47451f525329e5ba57fc615c491b0ca06088d8 /Source/Core/VideoCommon/VertexLoader_Position.cpp | |
| parent | 1714dc64bb1cc01aee9d9b52763f20aa6a44a674 (diff) | |
| parent | ffa512f5e7d24d9d9e93366bb596b9473d26d61b (diff) | |
Merge pull request #9718 from Pokechu22/better-fifo-analyzer-part-3
Fifo analyzer improvements, part 3
Diffstat (limited to 'Source/Core/VideoCommon/VertexLoader_Position.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/VertexLoader_Position.cpp | 216 |
1 files changed, 94 insertions, 122 deletions
diff --git a/Source/Core/VideoCommon/VertexLoader_Position.cpp b/Source/Core/VideoCommon/VertexLoader_Position.cpp index 273cccebc3..0fe8e7ba72 100644 --- a/Source/Core/VideoCommon/VertexLoader_Position.cpp +++ b/Source/Core/VideoCommon/VertexLoader_Position.cpp @@ -7,6 +7,7 @@ #include <type_traits> #include "Common/CommonTypes.h" +#include "Common/EnumMap.h" #include "Common/Swap.h" #include "VideoCommon/DataReader.h" @@ -59,8 +60,8 @@ void Pos_ReadIndex(VertexLoader* loader) const auto index = DataRead<I>(); loader->m_vertexSkip = index == std::numeric_limits<I>::max(); const auto data = - reinterpret_cast<const T*>(VertexLoaderManager::cached_arraybases[ARRAY_POSITION] + - (index * g_main_cp_state.array_strides[ARRAY_POSITION])); + reinterpret_cast<const T*>(VertexLoaderManager::cached_arraybases[CPArray::Position] + + (index * g_main_cp_state.array_strides[CPArray::Position])); const auto scale = loader->m_posScale; DataReader dst(g_vertex_manager_write_ptr, nullptr); @@ -76,138 +77,109 @@ void Pos_ReadIndex(VertexLoader* loader) LOG_VTX(); } -constexpr TPipelineFunction s_table_read_position[4][8][2] = { - { - { - nullptr, - nullptr, - }, - { - nullptr, - nullptr, - }, - { - nullptr, - nullptr, - }, - { - nullptr, - nullptr, - }, - { - nullptr, - nullptr, - }, - }, - { - { - Pos_ReadDirect<u8, 2>, - Pos_ReadDirect<u8, 3>, - }, - { - Pos_ReadDirect<s8, 2>, - Pos_ReadDirect<s8, 3>, - }, - { - Pos_ReadDirect<u16, 2>, - Pos_ReadDirect<u16, 3>, - }, - { - Pos_ReadDirect<s16, 2>, - Pos_ReadDirect<s16, 3>, - }, - { - Pos_ReadDirect<float, 2>, - Pos_ReadDirect<float, 3>, - }, - }, - { - { - Pos_ReadIndex<u8, u8, 2>, - Pos_ReadIndex<u8, u8, 3>, - }, - { - Pos_ReadIndex<u8, s8, 2>, - Pos_ReadIndex<u8, s8, 3>, - }, - { - Pos_ReadIndex<u8, u16, 2>, - Pos_ReadIndex<u8, u16, 3>, - }, - { - Pos_ReadIndex<u8, s16, 2>, - Pos_ReadIndex<u8, s16, 3>, - }, - { - Pos_ReadIndex<u8, float, 2>, - Pos_ReadIndex<u8, float, 3>, - }, - }, - { - { - Pos_ReadIndex<u16, u8, 2>, - Pos_ReadIndex<u16, u8, 3>, - }, - { - Pos_ReadIndex<u16, s8, 2>, - Pos_ReadIndex<u16, s8, 3>, - }, - { - Pos_ReadIndex<u16, u16, 2>, - Pos_ReadIndex<u16, u16, 3>, - }, - { - Pos_ReadIndex<u16, s16, 2>, - Pos_ReadIndex<u16, s16, 3>, - }, - { - Pos_ReadIndex<u16, float, 2>, - Pos_ReadIndex<u16, float, 3>, - }, - }, +using Common::EnumMap; + +// These functions are to work around a "too many initializer values" error with nested brackets +// C++ does not let you write std::array<std::array<u32, 2>, 2> a = {{1, 2}, {3, 4}} +// (although it does allow std::array<std::array<u32, 2>, 2> b = {1, 2, 3, 4}) +constexpr EnumMap<TPipelineFunction, CoordComponentCount::XYZ> e(TPipelineFunction xy, + TPipelineFunction xyz) +{ + return {xy, xyz}; +} +constexpr EnumMap<u32, CoordComponentCount::XYZ> e(u32 xy, u32 xyz) +{ + return {xy, xyz}; +} + +constexpr EnumMap<EnumMap<TPipelineFunction, CoordComponentCount::XYZ>, ComponentFormat::Float> +f(EnumMap<EnumMap<TPipelineFunction, CoordComponentCount::XYZ>, ComponentFormat::Float> in) +{ + return in; +} + +constexpr EnumMap<EnumMap<u32, CoordComponentCount::XYZ>, ComponentFormat::Float> +g(EnumMap<EnumMap<u32, CoordComponentCount::XYZ>, ComponentFormat::Float> in) +{ + return in; +} + +template <typename T> +using Table = EnumMap<EnumMap<EnumMap<T, CoordComponentCount::XYZ>, ComponentFormat::Float>, + VertexComponentFormat::Index16>; + +constexpr Table<TPipelineFunction> s_table_read_position = { + f({ + e(nullptr, nullptr), + e(nullptr, nullptr), + e(nullptr, nullptr), + e(nullptr, nullptr), + e(nullptr, nullptr), + }), + f({ + e(Pos_ReadDirect<u8, 2>, Pos_ReadDirect<u8, 3>), + e(Pos_ReadDirect<s8, 2>, Pos_ReadDirect<s8, 3>), + e(Pos_ReadDirect<u16, 2>, Pos_ReadDirect<u16, 3>), + e(Pos_ReadDirect<s16, 2>, Pos_ReadDirect<s16, 3>), + e(Pos_ReadDirect<float, 2>, Pos_ReadDirect<float, 3>), + }), + f({ + e(Pos_ReadIndex<u8, u8, 2>, Pos_ReadIndex<u8, u8, 3>), + e(Pos_ReadIndex<u8, s8, 2>, Pos_ReadIndex<u8, s8, 3>), + e(Pos_ReadIndex<u8, u16, 2>, Pos_ReadIndex<u8, u16, 3>), + e(Pos_ReadIndex<u8, s16, 2>, Pos_ReadIndex<u8, s16, 3>), + e(Pos_ReadIndex<u8, float, 2>, Pos_ReadIndex<u8, float, 3>), + }), + f({ + e(Pos_ReadIndex<u16, u8, 2>, Pos_ReadIndex<u16, u8, 3>), + e(Pos_ReadIndex<u16, s8, 2>, Pos_ReadIndex<u16, s8, 3>), + e(Pos_ReadIndex<u16, u16, 2>, Pos_ReadIndex<u16, u16, 3>), + e(Pos_ReadIndex<u16, s16, 2>, Pos_ReadIndex<u16, s16, 3>), + e(Pos_ReadIndex<u16, float, 2>, Pos_ReadIndex<u16, float, 3>), + }), }; -constexpr u32 s_table_read_position_vertex_size[4][8][2] = { - { - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - {0, 0}, - }, - { - {2, 3}, - {2, 3}, - {4, 6}, - {4, 6}, - {8, 12}, - }, - { - {1, 1}, - {1, 1}, - {1, 1}, - {1, 1}, - {1, 1}, - }, - { - {2, 2}, - {2, 2}, - {2, 2}, - {2, 2}, - {2, 2}, - }, +constexpr Table<u32> s_table_read_position_vertex_size = { + g({ + e(0u, 0u), + e(0u, 0u), + e(0u, 0u), + e(0u, 0u), + e(0u, 0u), + }), + g({ + e(2, 3), + e(2, 3), + e(4, 6), + e(4, 6), + e(8, 12), + }), + g({ + e(1, 1), + e(1, 1), + e(1, 1), + e(1, 1), + e(1, 1), + }), + g({ + e(2, 2), + e(2, 2), + e(2, 2), + e(2, 2), + e(2, 2), + }), }; } // Anonymous namespace u32 VertexLoader_Position::GetSize(VertexComponentFormat type, ComponentFormat format, CoordComponentCount elements) { - return s_table_read_position_vertex_size[u32(type)][u32(format)][u32(elements)]; + return s_table_read_position_vertex_size[type][format][elements]; } TPipelineFunction VertexLoader_Position::GetFunction(VertexComponentFormat type, ComponentFormat format, CoordComponentCount elements) { - return s_table_read_position[u32(type)][u32(format)][u32(elements)]; + return s_table_read_position[type][format][elements]; } |
