VertexLoader_TextCoord.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright 2008 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "VideoCommon/VertexLoader_TextCoord.h"
  4. #include <type_traits>
  5. #include "Common/CommonTypes.h"
  6. #include "Common/Swap.h"
  7. #include "VideoCommon/VertexLoader.h"
  8. #include "VideoCommon/VertexLoaderManager.h"
  9. #include "VideoCommon/VertexLoaderUtils.h"
  10. namespace
  11. {
  12. void TexCoord_Read_Dummy(VertexLoader* loader)
  13. {
  14. loader->m_tcIndex++;
  15. }
  16. template <typename T>
  17. constexpr float TCScale(T val, float scale)
  18. {
  19. return val * scale;
  20. }
  21. template <>
  22. constexpr float TCScale(float val, [[maybe_unused]] float scale)
  23. {
  24. return val;
  25. }
  26. template <typename T, int N>
  27. void TexCoord_ReadDirect(VertexLoader* loader)
  28. {
  29. const auto scale = loader->m_tcScale[loader->m_tcIndex];
  30. for (int i = 0; i != N; ++i)
  31. DataWrite(TCScale(DataRead<T>(), scale));
  32. ++loader->m_tcIndex;
  33. }
  34. template <typename I, typename T, int N>
  35. void TexCoord_ReadIndex(VertexLoader* loader)
  36. {
  37. static_assert(std::is_unsigned<I>::value, "Only unsigned I is sane!");
  38. const auto index = DataRead<I>();
  39. const auto data = reinterpret_cast<const T*>(
  40. VertexLoaderManager::cached_arraybases[CPArray::TexCoord0 + loader->m_tcIndex] +
  41. (index * g_main_cp_state.array_strides[CPArray::TexCoord0 + loader->m_tcIndex]));
  42. const auto scale = loader->m_tcScale[loader->m_tcIndex];
  43. for (int i = 0; i != N; ++i)
  44. DataWrite(TCScale(Common::FromBigEndian(data[i]), scale));
  45. ++loader->m_tcIndex;
  46. }
  47. using ComponentCountRow = Common::EnumMap<TPipelineFunction, TexComponentCount::ST>;
  48. using ComponentFormatTable = Common::EnumMap<ComponentCountRow, ComponentFormat::InvalidFloat7>;
  49. using Table = Common::EnumMap<ComponentFormatTable, VertexComponentFormat::Index16>;
  50. constexpr Table s_table_read_tex_coord = {
  51. ComponentFormatTable({
  52. ComponentCountRow(nullptr, nullptr),
  53. ComponentCountRow(nullptr, nullptr),
  54. ComponentCountRow(nullptr, nullptr),
  55. ComponentCountRow(nullptr, nullptr),
  56. ComponentCountRow(nullptr, nullptr),
  57. ComponentCountRow(nullptr, nullptr),
  58. ComponentCountRow(nullptr, nullptr),
  59. ComponentCountRow(nullptr, nullptr),
  60. }),
  61. ComponentFormatTable({
  62. ComponentCountRow(TexCoord_ReadDirect<u8, 1>, TexCoord_ReadDirect<u8, 2>),
  63. ComponentCountRow(TexCoord_ReadDirect<s8, 1>, TexCoord_ReadDirect<s8, 2>),
  64. ComponentCountRow(TexCoord_ReadDirect<u16, 1>, TexCoord_ReadDirect<u16, 2>),
  65. ComponentCountRow(TexCoord_ReadDirect<s16, 1>, TexCoord_ReadDirect<s16, 2>),
  66. ComponentCountRow(TexCoord_ReadDirect<float, 1>, TexCoord_ReadDirect<float, 2>),
  67. ComponentCountRow(TexCoord_ReadDirect<float, 1>, TexCoord_ReadDirect<float, 2>),
  68. ComponentCountRow(TexCoord_ReadDirect<float, 1>, TexCoord_ReadDirect<float, 2>),
  69. ComponentCountRow(TexCoord_ReadDirect<float, 1>, TexCoord_ReadDirect<float, 2>),
  70. }),
  71. ComponentFormatTable({
  72. ComponentCountRow(TexCoord_ReadIndex<u8, u8, 1>, TexCoord_ReadIndex<u8, u8, 2>),
  73. ComponentCountRow(TexCoord_ReadIndex<u8, s8, 1>, TexCoord_ReadIndex<u8, s8, 2>),
  74. ComponentCountRow(TexCoord_ReadIndex<u8, u16, 1>, TexCoord_ReadIndex<u8, u16, 2>),
  75. ComponentCountRow(TexCoord_ReadIndex<u8, s16, 1>, TexCoord_ReadIndex<u8, s16, 2>),
  76. ComponentCountRow(TexCoord_ReadIndex<u8, float, 1>, TexCoord_ReadIndex<u8, float, 2>),
  77. ComponentCountRow(TexCoord_ReadIndex<u8, float, 1>, TexCoord_ReadIndex<u8, float, 2>),
  78. ComponentCountRow(TexCoord_ReadIndex<u8, float, 1>, TexCoord_ReadIndex<u8, float, 2>),
  79. ComponentCountRow(TexCoord_ReadIndex<u8, float, 1>, TexCoord_ReadIndex<u8, float, 2>),
  80. }),
  81. ComponentFormatTable({
  82. ComponentCountRow(TexCoord_ReadIndex<u16, u8, 1>, TexCoord_ReadIndex<u16, u8, 2>),
  83. ComponentCountRow(TexCoord_ReadIndex<u16, s8, 1>, TexCoord_ReadIndex<u16, s8, 2>),
  84. ComponentCountRow(TexCoord_ReadIndex<u16, u16, 1>, TexCoord_ReadIndex<u16, u16, 2>),
  85. ComponentCountRow(TexCoord_ReadIndex<u16, s16, 1>, TexCoord_ReadIndex<u16, s16, 2>),
  86. ComponentCountRow(TexCoord_ReadIndex<u16, float, 1>, TexCoord_ReadIndex<u16, float, 2>),
  87. ComponentCountRow(TexCoord_ReadIndex<u16, float, 1>, TexCoord_ReadIndex<u16, float, 2>),
  88. ComponentCountRow(TexCoord_ReadIndex<u16, float, 1>, TexCoord_ReadIndex<u16, float, 2>),
  89. ComponentCountRow(TexCoord_ReadIndex<u16, float, 1>, TexCoord_ReadIndex<u16, float, 2>),
  90. }),
  91. };
  92. } // Anonymous namespace
  93. TPipelineFunction VertexLoader_TextCoord::GetFunction(VertexComponentFormat type,
  94. ComponentFormat format,
  95. TexComponentCount elements)
  96. {
  97. return s_table_read_tex_coord[type][format][elements];
  98. }
  99. TPipelineFunction VertexLoader_TextCoord::GetDummyFunction()
  100. {
  101. return TexCoord_Read_Dummy;
  102. }