summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexLoader_Position.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2021-12-20 14:27:14 -0500
committerGitHub <noreply@github.com>2021-12-20 14:27:14 -0500
commit32fed91b0d35f06c46281f55c9f0fa4694c5334a (patch)
tree6e47451f525329e5ba57fc615c491b0ca06088d8 /Source/Core/VideoCommon/VertexLoader_Position.cpp
parent1714dc64bb1cc01aee9d9b52763f20aa6a44a674 (diff)
parentffa512f5e7d24d9d9e93366bb596b9473d26d61b (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.cpp216
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];
}