mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-25 15:31:17 +01:00
581a575042
I originally added these in 2b1d1038a6acf0acf75b03ca93c85de6fe6cdf18, for both the TPipelineFunction and the size. The size was moved into the header in fdcd2b7d009cece6ad090143ce954aed713bb11c (making the size functions obsolete), but it seems that the functions themselves are no longer needed now. I think I didn't use this approach before because it would have required ComponentFormatTable and ComponentCountRow to be templated, which would end up resulting in lines that were too long and thus wrapped in awkward places. (I *think* they didn't get inferred properly.) Now that we only need TPipelineFunction, the templating is not needed, and this ends up being a more readable version of the version with the wrapper functions.
117 lines
4.2 KiB
C++
117 lines
4.2 KiB
C++
// Copyright 2008 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "VideoCommon/VertexLoader_TextCoord.h"
|
|
|
|
#include <type_traits>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "Common/Swap.h"
|
|
|
|
#include "VideoCommon/DataReader.h"
|
|
#include "VideoCommon/VertexLoader.h"
|
|
#include "VideoCommon/VertexLoaderManager.h"
|
|
#include "VideoCommon/VertexLoaderUtils.h"
|
|
|
|
namespace
|
|
{
|
|
void TexCoord_Read_Dummy(VertexLoader* loader)
|
|
{
|
|
loader->m_tcIndex++;
|
|
}
|
|
|
|
template <typename T>
|
|
constexpr float TCScale(T val, float scale)
|
|
{
|
|
return val * scale;
|
|
}
|
|
|
|
template <>
|
|
constexpr float TCScale(float val, [[maybe_unused]] float scale)
|
|
{
|
|
return val;
|
|
}
|
|
|
|
template <typename T, int N>
|
|
void TexCoord_ReadDirect(VertexLoader* loader)
|
|
{
|
|
const auto scale = loader->m_tcScale[loader->m_tcIndex];
|
|
DataReader dst(g_vertex_manager_write_ptr, nullptr);
|
|
DataReader src(g_video_buffer_read_ptr, nullptr);
|
|
|
|
for (int i = 0; i != N; ++i)
|
|
dst.Write(TCScale(src.Read<T>(), scale));
|
|
|
|
g_vertex_manager_write_ptr = dst.GetPointer();
|
|
g_video_buffer_read_ptr = src.GetPointer();
|
|
|
|
++loader->m_tcIndex;
|
|
}
|
|
|
|
template <typename I, typename T, int N>
|
|
void TexCoord_ReadIndex(VertexLoader* loader)
|
|
{
|
|
static_assert(std::is_unsigned<I>::value, "Only unsigned I is sane!");
|
|
|
|
const auto index = DataRead<I>();
|
|
const auto data = reinterpret_cast<const T*>(
|
|
VertexLoaderManager::cached_arraybases[CPArray::TexCoord0 + loader->m_tcIndex] +
|
|
(index * g_main_cp_state.array_strides[CPArray::TexCoord0 + loader->m_tcIndex]));
|
|
const auto scale = loader->m_tcScale[loader->m_tcIndex];
|
|
DataReader dst(g_vertex_manager_write_ptr, nullptr);
|
|
|
|
for (int i = 0; i != N; ++i)
|
|
dst.Write(TCScale(Common::FromBigEndian(data[i]), scale));
|
|
|
|
g_vertex_manager_write_ptr = dst.GetPointer();
|
|
++loader->m_tcIndex;
|
|
}
|
|
|
|
using ComponentCountRow = Common::EnumMap<TPipelineFunction, TexComponentCount::ST>;
|
|
using ComponentFormatTable = Common::EnumMap<ComponentCountRow, ComponentFormat::Float>;
|
|
using Table = Common::EnumMap<ComponentFormatTable, VertexComponentFormat::Index16>;
|
|
|
|
constexpr Table s_table_read_tex_coord = {
|
|
ComponentFormatTable({
|
|
ComponentCountRow(nullptr, nullptr),
|
|
ComponentCountRow(nullptr, nullptr),
|
|
ComponentCountRow(nullptr, nullptr),
|
|
ComponentCountRow(nullptr, nullptr),
|
|
ComponentCountRow(nullptr, nullptr),
|
|
}),
|
|
ComponentFormatTable({
|
|
ComponentCountRow(TexCoord_ReadDirect<u8, 1>, TexCoord_ReadDirect<u8, 2>),
|
|
ComponentCountRow(TexCoord_ReadDirect<s8, 1>, TexCoord_ReadDirect<s8, 2>),
|
|
ComponentCountRow(TexCoord_ReadDirect<u16, 1>, TexCoord_ReadDirect<u16, 2>),
|
|
ComponentCountRow(TexCoord_ReadDirect<s16, 1>, TexCoord_ReadDirect<s16, 2>),
|
|
ComponentCountRow(TexCoord_ReadDirect<float, 1>, TexCoord_ReadDirect<float, 2>),
|
|
}),
|
|
ComponentFormatTable({
|
|
ComponentCountRow(TexCoord_ReadIndex<u8, u8, 1>, TexCoord_ReadIndex<u8, u8, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u8, s8, 1>, TexCoord_ReadIndex<u8, s8, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u8, u16, 1>, TexCoord_ReadIndex<u8, u16, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u8, s16, 1>, TexCoord_ReadIndex<u8, s16, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u8, float, 1>, TexCoord_ReadIndex<u8, float, 2>),
|
|
}),
|
|
ComponentFormatTable({
|
|
ComponentCountRow(TexCoord_ReadIndex<u16, u8, 1>, TexCoord_ReadIndex<u16, u8, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u16, s8, 1>, TexCoord_ReadIndex<u16, s8, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u16, u16, 1>, TexCoord_ReadIndex<u16, u16, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u16, s16, 1>, TexCoord_ReadIndex<u16, s16, 2>),
|
|
ComponentCountRow(TexCoord_ReadIndex<u16, float, 1>, TexCoord_ReadIndex<u16, float, 2>),
|
|
}),
|
|
};
|
|
} // Anonymous namespace
|
|
|
|
TPipelineFunction VertexLoader_TextCoord::GetFunction(VertexComponentFormat type,
|
|
ComponentFormat format,
|
|
TexComponentCount elements)
|
|
{
|
|
return s_table_read_tex_coord[type][format][elements];
|
|
}
|
|
|
|
TPipelineFunction VertexLoader_TextCoord::GetDummyFunction()
|
|
{
|
|
return TexCoord_Read_Dummy;
|
|
}
|