Eliminate TVtxAttr

This commit is contained in:
Pokechu22 2021-03-10 22:15:43 -08:00
parent 0a71ce143a
commit cafffff75e
6 changed files with 191 additions and 163 deletions

View File

@ -317,7 +317,7 @@ union UVAT_group0
// 21:29 // 21:29
BitField<21, 1, TexComponentCount> Tex0CoordElements; BitField<21, 1, TexComponentCount> Tex0CoordElements;
BitField<22, 3, ComponentFormat> Tex0CoordFormat; BitField<22, 3, ComponentFormat> Tex0CoordFormat;
BitField<25, 5, u32> Tex0Frac; BitField<25, 5, u8, u32> Tex0Frac;
// 30:31 // 30:31
BitField<30, 1, bool, u32> ByteDequant; BitField<30, 1, bool, u32> ByteDequant;
BitField<31, 1, bool, u32> NormalIndex3; BitField<31, 1, bool, u32> NormalIndex3;
@ -363,15 +363,15 @@ union UVAT_group1
// 0:8 // 0:8
BitField<0, 1, TexComponentCount> Tex1CoordElements; BitField<0, 1, TexComponentCount> Tex1CoordElements;
BitField<1, 3, ComponentFormat> Tex1CoordFormat; BitField<1, 3, ComponentFormat> Tex1CoordFormat;
BitField<4, 5, u32> Tex1Frac; BitField<4, 5, u8, u32> Tex1Frac;
// 9:17 // 9:17
BitField<9, 1, TexComponentCount> Tex2CoordElements; BitField<9, 1, TexComponentCount> Tex2CoordElements;
BitField<10, 3, ComponentFormat> Tex2CoordFormat; BitField<10, 3, ComponentFormat> Tex2CoordFormat;
BitField<13, 5, u32> Tex2Frac; BitField<13, 5, u8, u32> Tex2Frac;
// 18:26 // 18:26
BitField<18, 1, TexComponentCount> Tex3CoordElements; BitField<18, 1, TexComponentCount> Tex3CoordElements;
BitField<19, 3, ComponentFormat> Tex3CoordFormat; BitField<19, 3, ComponentFormat> Tex3CoordFormat;
BitField<22, 5, u32> Tex3Frac; BitField<22, 5, u8, u32> Tex3Frac;
// 27:30 // 27:30
BitField<27, 1, TexComponentCount> Tex4CoordElements; BitField<27, 1, TexComponentCount> Tex4CoordElements;
BitField<28, 3, ComponentFormat> Tex4CoordFormat; BitField<28, 3, ComponentFormat> Tex4CoordFormat;
@ -410,19 +410,19 @@ union UVAT_group2
{ {
u32 Hex; u32 Hex;
// 0:4 // 0:4
BitField<0, 5, u32> Tex4Frac; BitField<0, 5, u8, u32> Tex4Frac;
// 5:13 // 5:13
BitField<5, 1, TexComponentCount> Tex5CoordElements; BitField<5, 1, TexComponentCount> Tex5CoordElements;
BitField<6, 3, ComponentFormat> Tex5CoordFormat; BitField<6, 3, ComponentFormat> Tex5CoordFormat;
BitField<9, 5, u32> Tex5Frac; BitField<9, 5, u8, u32> Tex5Frac;
// 14:22 // 14:22
BitField<14, 1, TexComponentCount> Tex6CoordElements; BitField<14, 1, TexComponentCount> Tex6CoordElements;
BitField<15, 3, ComponentFormat> Tex6CoordFormat; BitField<15, 3, ComponentFormat> Tex6CoordFormat;
BitField<18, 5, u32> Tex6Frac; BitField<18, 5, u8, u32> Tex6Frac;
// 23:31 // 23:31
BitField<23, 1, TexComponentCount> Tex7CoordElements; BitField<23, 1, TexComponentCount> Tex7CoordElements;
BitField<24, 3, ComponentFormat> Tex7CoordFormat; BitField<24, 3, ComponentFormat> Tex7CoordFormat;
BitField<27, 5, u32> Tex7Frac; BitField<27, 5, u8, u32> Tex7Frac;
}; };
template <> template <>
struct fmt::formatter<UVAT_group2> struct fmt::formatter<UVAT_group2>
@ -450,30 +450,123 @@ struct fmt::formatter<UVAT_group2>
} }
}; };
struct ColorAttr struct VAT
{ {
ColorComponentCount Elements; UVAT_group0 g0;
ColorFormat Comp; UVAT_group1 g1;
}; UVAT_group2 g2;
struct TexAttr constexpr ColorComponentCount GetColorElements(size_t idx) const
{ {
TexComponentCount Elements; switch (idx)
ComponentFormat Format; {
u8 Frac; case 0:
return g0.Color0Elements;
case 1:
return g0.Color1Elements;
default:
PanicAlertFmt("Invalid color index {}", idx);
return ColorComponentCount::RGB;
}
}
constexpr ColorFormat GetColorFormat(size_t idx) const
{
switch (idx)
{
case 0:
return g0.Color0Comp;
case 1:
return g0.Color1Comp;
default:
PanicAlertFmt("Invalid color index {}", idx);
return ColorFormat::RGB565;
}
}
constexpr TexComponentCount GetTexElements(size_t idx) const
{
switch (idx)
{
case 0:
return g0.Tex0CoordElements;
case 1:
return g1.Tex1CoordElements;
case 2:
return g1.Tex2CoordElements;
case 3:
return g1.Tex3CoordElements;
case 4:
return g1.Tex4CoordElements;
case 5:
return g2.Tex5CoordElements;
case 6:
return g2.Tex6CoordElements;
case 7:
return g2.Tex7CoordElements;
default:
PanicAlertFmt("Invalid tex coord index {}", idx);
return TexComponentCount::S;
}
}
constexpr ComponentFormat GetTexFormat(size_t idx) const
{
switch (idx)
{
case 0:
return g0.Tex0CoordFormat;
case 1:
return g1.Tex1CoordFormat;
case 2:
return g1.Tex2CoordFormat;
case 3:
return g1.Tex3CoordFormat;
case 4:
return g1.Tex4CoordFormat;
case 5:
return g2.Tex5CoordFormat;
case 6:
return g2.Tex6CoordFormat;
case 7:
return g2.Tex7CoordFormat;
default:
PanicAlertFmt("Invalid tex coord index {}", idx);
return ComponentFormat::UByte;
}
}
constexpr u8 GetTexFrac(size_t idx) const
{
switch (idx)
{
case 0:
return g0.Tex0Frac;
case 1:
return g1.Tex1Frac;
case 2:
return g1.Tex2Frac;
case 3:
return g1.Tex3Frac;
case 4:
return g2.Tex4Frac;
case 5:
return g2.Tex5Frac;
case 6:
return g2.Tex6Frac;
case 7:
return g2.Tex7Frac;
default:
PanicAlertFmt("Invalid tex coord index {}", idx);
return 0;
}
}
}; };
template <>
struct TVtxAttr struct fmt::formatter<VAT>
{ {
CoordComponentCount PosElements; constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
ComponentFormat PosFormat; template <typename FormatContext>
u8 PosFrac; auto format(const VAT& vat, FormatContext& ctx)
NormalComponentCount NormalElements; {
ComponentFormat NormalFormat; return format_to(ctx.out(), "{}\n{}\n{}", vat.g0, vat.g1, vat.g2);
ColorAttr color[2]; }
TexAttr texCoord[8];
bool ByteDequant;
u8 NormalIndex3;
}; };
// Matrix indices // Matrix indices
@ -518,23 +611,6 @@ struct fmt::formatter<TMatrixIndexB>
} }
}; };
struct VAT
{
UVAT_group0 g0;
UVAT_group1 g1;
UVAT_group2 g2;
};
template <>
struct fmt::formatter<VAT>
{
constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
template <typename FormatContext>
auto format(const VAT& vat, FormatContext& ctx)
{
return format_to(ctx.out(), "{}\n{}\n{}", vat.g0, vat.g1, vat.g2);
}
};
class VertexLoaderBase; class VertexLoaderBase;
// STATE_TO_SAVE // STATE_TO_SAVE

View File

@ -72,15 +72,14 @@ VertexLoader::VertexLoader(const TVtxDesc& vtx_desc, const VAT& vtx_attr)
CompileVertexTranslator(); CompileVertexTranslator();
// generate frac factors // generate frac factors
m_posScale = 1.0f / (1U << m_VtxAttr.PosFrac); m_posScale = 1.0f / (1U << m_VtxAttr.g0.PosFrac);
for (int i = 0; i < 8; i++) for (u32 i = 0; i < 8; i++)
m_tcScale[i] = 1.0f / (1U << m_VtxAttr.texCoord[i].Frac); m_tcScale[i] = 1.0f / (1U << m_VtxAttr.GetTexFrac(i));
} }
void VertexLoader::CompileVertexTranslator() void VertexLoader::CompileVertexTranslator()
{ {
m_VertexSize = 0; m_VertexSize = 0;
const TVtxAttr& vtx_attr = m_VtxAttr;
// Reset pipeline // Reset pipeline
m_numPipelineStages = 0; m_numPipelineStages = 0;
@ -154,12 +153,12 @@ void VertexLoader::CompileVertexTranslator()
} }
// Write vertex position loader // Write vertex position loader
WriteCall(VertexLoader_Position::GetFunction(m_VtxDesc.low.Position, m_VtxAttr.PosFormat, WriteCall(VertexLoader_Position::GetFunction(m_VtxDesc.low.Position, m_VtxAttr.g0.PosFormat,
m_VtxAttr.PosElements)); m_VtxAttr.g0.PosElements));
m_VertexSize += VertexLoader_Position::GetSize(m_VtxDesc.low.Position, m_VtxAttr.PosFormat, m_VertexSize += VertexLoader_Position::GetSize(m_VtxDesc.low.Position, m_VtxAttr.g0.PosFormat,
m_VtxAttr.PosElements); m_VtxAttr.g0.PosElements);
int pos_elements = m_VtxAttr.PosElements == CoordComponentCount::XY ? 2 : 3; int pos_elements = m_VtxAttr.g0.PosElements == CoordComponentCount::XY ? 2 : 3;
m_native_vtx_decl.position.components = pos_elements; m_native_vtx_decl.position.components = pos_elements;
m_native_vtx_decl.position.enable = true; m_native_vtx_decl.position.enable = true;
m_native_vtx_decl.position.offset = nat_offset; m_native_vtx_decl.position.offset = nat_offset;
@ -170,22 +169,23 @@ void VertexLoader::CompileVertexTranslator()
// Normals // Normals
if (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent) if (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent)
{ {
m_VertexSize += VertexLoader_Normal::GetSize(m_VtxDesc.low.Normal, m_VtxAttr.NormalFormat, m_VertexSize +=
m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3); VertexLoader_Normal::GetSize(m_VtxDesc.low.Normal, m_VtxAttr.g0.NormalFormat,
m_VtxAttr.g0.NormalElements, m_VtxAttr.g0.NormalIndex3);
TPipelineFunction pFunc = TPipelineFunction pFunc =
VertexLoader_Normal::GetFunction(m_VtxDesc.low.Normal, m_VtxAttr.NormalFormat, VertexLoader_Normal::GetFunction(m_VtxDesc.low.Normal, m_VtxAttr.g0.NormalFormat,
m_VtxAttr.NormalElements, m_VtxAttr.NormalIndex3); m_VtxAttr.g0.NormalElements, m_VtxAttr.g0.NormalIndex3);
if (pFunc == nullptr) if (pFunc == nullptr)
{ {
PanicAlertFmt("VertexLoader_Normal::GetFunction({} {} {} {}) returned zero!", PanicAlertFmt("VertexLoader_Normal::GetFunction({} {} {} {}) returned zero!",
m_VtxDesc.low.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements, m_VtxDesc.low.Normal, m_VtxAttr.g0.NormalFormat, m_VtxAttr.g0.NormalElements,
m_VtxAttr.NormalIndex3); m_VtxAttr.g0.NormalIndex3);
} }
WriteCall(pFunc); WriteCall(pFunc);
for (int i = 0; i < (vtx_attr.NormalElements == NormalComponentCount::NBT ? 3 : 1); i++) for (int i = 0; i < (m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT ? 3 : 1); i++)
{ {
m_native_vtx_decl.normals[i].components = 3; m_native_vtx_decl.normals[i].components = 3;
m_native_vtx_decl.normals[i].enable = true; m_native_vtx_decl.normals[i].enable = true;
@ -196,7 +196,7 @@ void VertexLoader::CompileVertexTranslator()
} }
components |= VB_HAS_NRM0; components |= VB_HAS_NRM0;
if (m_VtxAttr.NormalElements == NormalComponentCount::NBT) if (m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT)
components |= VB_HAS_NRM1 | VB_HAS_NRM2; components |= VB_HAS_NRM1 | VB_HAS_NRM2;
} }
@ -206,9 +206,10 @@ void VertexLoader::CompileVertexTranslator()
m_native_vtx_decl.colors[i].type = VAR_UNSIGNED_BYTE; m_native_vtx_decl.colors[i].type = VAR_UNSIGNED_BYTE;
m_native_vtx_decl.colors[i].integer = false; m_native_vtx_decl.colors[i].integer = false;
m_VertexSize += VertexLoader_Color::GetSize(m_VtxDesc.low.Color[i], m_VtxAttr.color[i].Comp); m_VertexSize +=
VertexLoader_Color::GetSize(m_VtxDesc.low.Color[i], m_VtxAttr.GetColorFormat(i));
TPipelineFunction pFunc = TPipelineFunction pFunc =
VertexLoader_Color::GetFunction(m_VtxDesc.low.Color[i], m_VtxAttr.color[i].Comp); VertexLoader_Color::GetFunction(m_VtxDesc.low.Color[i], m_VtxAttr.GetColorFormat(i));
if (pFunc != nullptr) if (pFunc != nullptr)
WriteCall(pFunc); WriteCall(pFunc);
@ -232,8 +233,8 @@ void VertexLoader::CompileVertexTranslator()
m_native_vtx_decl.texcoords[i].integer = false; m_native_vtx_decl.texcoords[i].integer = false;
const auto tc = m_VtxDesc.high.TexCoord[i].Value(); const auto tc = m_VtxDesc.high.TexCoord[i].Value();
const auto format = m_VtxAttr.texCoord[i].Format; const auto format = m_VtxAttr.GetTexFormat(i);
const auto elements = m_VtxAttr.texCoord[i].Elements; const auto elements = m_VtxAttr.GetTexElements(i);
if (tc != VertexComponentFormat::NotPresent) if (tc != VertexComponentFormat::NotPresent)
{ {
@ -257,8 +258,7 @@ void VertexLoader::CompileVertexTranslator()
// if texmtx is included, texcoord will always be 3 floats, z will be the texmtx index // if texmtx is included, texcoord will always be 3 floats, z will be the texmtx index
m_native_vtx_decl.texcoords[i].components = 3; m_native_vtx_decl.texcoords[i].components = 3;
nat_offset += 12; nat_offset += 12;
WriteCall(m_VtxAttr.texCoord[i].Elements == TexComponentCount::ST ? TexMtx_Write_Float : WriteCall(elements == TexComponentCount::ST ? TexMtx_Write_Float : TexMtx_Write_Float2);
TexMtx_Write_Float2);
} }
else else
{ {
@ -272,9 +272,8 @@ void VertexLoader::CompileVertexTranslator()
if (tc != VertexComponentFormat::NotPresent) if (tc != VertexComponentFormat::NotPresent)
{ {
m_native_vtx_decl.texcoords[i].enable = true; m_native_vtx_decl.texcoords[i].enable = true;
m_native_vtx_decl.texcoords[i].components = m_native_vtx_decl.texcoords[i].components = elements == TexComponentCount::ST ? 2 : 1;
vtx_attr.texCoord[i].Elements == TexComponentCount::ST ? 2 : 1; nat_offset += 4 * (elements == TexComponentCount::ST ? 2 : 1);
nat_offset += 4 * (vtx_attr.texCoord[i].Elements == TexComponentCount::ST ? 2 : 1);
} }
} }

View File

@ -393,10 +393,11 @@ void VertexLoaderARM64::GenerateVertexLoader()
for (size_t i = 0; i < m_VtxDesc.high.TexCoord.Size(); i++) for (size_t i = 0; i < m_VtxDesc.high.TexCoord.Size(); i++)
{ {
has_tc |= m_VtxDesc.high.TexCoord[i] != VertexComponentFormat::NotPresent; has_tc |= m_VtxDesc.high.TexCoord[i] != VertexComponentFormat::NotPresent;
has_tc_scale |= !!m_VtxAttr.texCoord[i].Frac; has_tc_scale |= (m_VtxAttr.GetTexFrac(i) != 0);
} }
bool need_scale = (m_VtxAttr.ByteDequant && m_VtxAttr.PosFrac) || (has_tc && has_tc_scale) || bool need_scale = (m_VtxAttr.g0.ByteDequant && m_VtxAttr.g0.PosFrac) ||
(has_tc && has_tc_scale) ||
(m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent); (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent);
AlignCode16(); AlignCode16();
@ -444,30 +445,30 @@ void VertexLoaderARM64::GenerateVertexLoader()
// Position // Position
{ {
int elem_size = GetElementSize(m_VtxAttr.PosFormat); int elem_size = GetElementSize(m_VtxAttr.g0.PosFormat);
int pos_elements = m_VtxAttr.PosElements == CoordComponentCount::XY ? 2 : 3; int pos_elements = m_VtxAttr.g0.PosElements == CoordComponentCount::XY ? 2 : 3;
int load_bytes = elem_size * pos_elements; int load_bytes = elem_size * pos_elements;
int load_size = GetLoadSize(load_bytes); int load_size = GetLoadSize(load_bytes);
load_size <<= 3; load_size <<= 3;
s32 offset = GetAddressImm(ARRAY_POSITION, m_VtxDesc.low.Position, EncodeRegTo64(scratch1_reg), s32 offset = GetAddressImm(ARRAY_POSITION, m_VtxDesc.low.Position, EncodeRegTo64(scratch1_reg),
load_size); load_size);
ReadVertex(m_VtxDesc.low.Position, m_VtxAttr.PosFormat, pos_elements, pos_elements, ReadVertex(m_VtxDesc.low.Position, m_VtxAttr.g0.PosFormat, pos_elements, pos_elements,
m_VtxAttr.ByteDequant, m_VtxAttr.PosFrac, &m_native_vtx_decl.position, offset); m_VtxAttr.g0.ByteDequant, m_VtxAttr.g0.PosFrac, &m_native_vtx_decl.position, offset);
} }
if (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent) if (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent)
{ {
static const u8 map[8] = {7, 6, 15, 14}; static const u8 map[8] = {7, 6, 15, 14};
const u8 scaling_exponent = map[u32(m_VtxAttr.NormalFormat)]; const u8 scaling_exponent = map[u32(m_VtxAttr.g0.NormalFormat.Value())];
const int limit = m_VtxAttr.NormalElements == NormalComponentCount::NBT ? 3 : 1; const int limit = m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT ? 3 : 1;
s32 offset = -1; s32 offset = -1;
for (int i = 0; i < (m_VtxAttr.NormalElements == NormalComponentCount::NBT ? 3 : 1); i++) for (int i = 0; i < (m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT ? 3 : 1); i++)
{ {
if (!i || m_VtxAttr.NormalIndex3) if (!i || m_VtxAttr.g0.NormalIndex3)
{ {
int elem_size = GetElementSize(m_VtxAttr.NormalFormat); int elem_size = GetElementSize(m_VtxAttr.g0.NormalFormat);
int load_bytes = elem_size * 3; int load_bytes = elem_size * 3;
int load_size = GetLoadSize(load_bytes); int load_size = GetLoadSize(load_bytes);
@ -480,7 +481,7 @@ void VertexLoaderARM64::GenerateVertexLoader()
else else
offset += i * elem_size * 3; offset += i * elem_size * 3;
} }
int bytes_read = ReadVertex(m_VtxDesc.low.Normal, m_VtxAttr.NormalFormat, 3, 3, true, int bytes_read = ReadVertex(m_VtxDesc.low.Normal, m_VtxAttr.g0.NormalFormat, 3, 3, true,
scaling_exponent, &m_native_vtx_decl.normals[i], offset); scaling_exponent, &m_native_vtx_decl.normals[i], offset);
if (offset == -1) if (offset == -1)
@ -490,7 +491,7 @@ void VertexLoaderARM64::GenerateVertexLoader()
} }
m_native_components |= VB_HAS_NRM0; m_native_components |= VB_HAS_NRM0;
if (m_VtxAttr.NormalElements == NormalComponentCount::NBT) if (m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT)
m_native_components |= VB_HAS_NRM1 | VB_HAS_NRM2; m_native_components |= VB_HAS_NRM1 | VB_HAS_NRM2;
} }
@ -503,13 +504,13 @@ void VertexLoaderARM64::GenerateVertexLoader()
if (m_VtxDesc.low.Color[i] != VertexComponentFormat::NotPresent) if (m_VtxDesc.low.Color[i] != VertexComponentFormat::NotPresent)
{ {
u32 align = 4; u32 align = 4;
if (m_VtxAttr.color[i].Comp == ColorFormat::RGB565 || if (m_VtxAttr.GetColorFormat(i) == ColorFormat::RGB565 ||
m_VtxAttr.color[i].Comp == ColorFormat::RGBA4444) m_VtxAttr.GetColorFormat(i) == ColorFormat::RGBA4444)
align = 2; align = 2;
s32 offset = GetAddressImm(ARRAY_COLOR0 + int(i), m_VtxDesc.low.Color[i], s32 offset = GetAddressImm(ARRAY_COLOR0 + int(i), m_VtxDesc.low.Color[i],
EncodeRegTo64(scratch1_reg), align); EncodeRegTo64(scratch1_reg), align);
ReadColor(m_VtxDesc.low.Color[i], m_VtxAttr.color[i].Comp, offset); ReadColor(m_VtxDesc.low.Color[i], m_VtxAttr.GetColorFormat(i), offset);
m_native_components |= VB_HAS_COL0 << i; m_native_components |= VB_HAS_COL0 << i;
m_native_vtx_decl.colors[i].components = 4; m_native_vtx_decl.colors[i].components = 4;
m_native_vtx_decl.colors[i].enable = true; m_native_vtx_decl.colors[i].enable = true;
@ -526,22 +527,22 @@ void VertexLoaderARM64::GenerateVertexLoader()
m_native_vtx_decl.texcoords[i].type = VAR_FLOAT; m_native_vtx_decl.texcoords[i].type = VAR_FLOAT;
m_native_vtx_decl.texcoords[i].integer = false; m_native_vtx_decl.texcoords[i].integer = false;
int elements = m_VtxAttr.texCoord[i].Elements == TexComponentCount::S ? 1 : 2; int elements = m_VtxAttr.GetTexElements(i) == TexComponentCount::S ? 1 : 2;
if (m_VtxDesc.high.TexCoord[i] != VertexComponentFormat::NotPresent) if (m_VtxDesc.high.TexCoord[i] != VertexComponentFormat::NotPresent)
{ {
m_native_components |= VB_HAS_UV0 << i; m_native_components |= VB_HAS_UV0 << i;
int elem_size = GetElementSize(m_VtxAttr.texCoord[i].Format); int elem_size = GetElementSize(m_VtxAttr.GetTexFormat(i));
int load_bytes = elem_size * (elements + 2); int load_bytes = elem_size * (elements + 2);
int load_size = GetLoadSize(load_bytes); int load_size = GetLoadSize(load_bytes);
load_size <<= 3; load_size <<= 3;
s32 offset = GetAddressImm(ARRAY_TEXCOORD0 + int(i), m_VtxDesc.high.TexCoord[i], s32 offset = GetAddressImm(ARRAY_TEXCOORD0 + int(i), m_VtxDesc.high.TexCoord[i],
EncodeRegTo64(scratch1_reg), load_size); EncodeRegTo64(scratch1_reg), load_size);
u8 scaling_exponent = m_VtxAttr.texCoord[i].Frac; u8 scaling_exponent = m_VtxAttr.GetTexFrac(i);
ReadVertex(m_VtxDesc.high.TexCoord[i], m_VtxAttr.texCoord[i].Format, elements, ReadVertex(m_VtxDesc.high.TexCoord[i], m_VtxAttr.GetTexFormat(i), elements,
m_VtxDesc.low.TexMatIdx[i] ? 2 : elements, m_VtxAttr.ByteDequant, scaling_exponent, m_VtxDesc.low.TexMatIdx[i] ? 2 : elements, m_VtxAttr.g0.ByteDequant,
&m_native_vtx_decl.texcoords[i], offset); scaling_exponent, &m_native_vtx_decl.texcoords[i], offset);
} }
if (m_VtxDesc.low.TexMatIdx[i]) if (m_VtxDesc.low.TexMatIdx[i])
{ {

View File

@ -26,53 +26,6 @@
#include "VideoCommon/VertexLoaderARM64.h" #include "VideoCommon/VertexLoaderARM64.h"
#endif #endif
VertexLoaderBase::VertexLoaderBase(const TVtxDesc& vtx_desc, const VAT& vtx_attr)
: m_VtxDesc{vtx_desc}, m_vat{vtx_attr}
{
SetVAT(vtx_attr);
}
void VertexLoaderBase::SetVAT(const VAT& vat)
{
m_VtxAttr.PosElements = vat.g0.PosElements;
m_VtxAttr.PosFormat = vat.g0.PosFormat;
m_VtxAttr.PosFrac = vat.g0.PosFrac;
m_VtxAttr.NormalElements = vat.g0.NormalElements;
m_VtxAttr.NormalFormat = vat.g0.NormalFormat;
m_VtxAttr.color[0].Elements = vat.g0.Color0Elements;
m_VtxAttr.color[0].Comp = vat.g0.Color0Comp;
m_VtxAttr.color[1].Elements = vat.g0.Color1Elements;
m_VtxAttr.color[1].Comp = vat.g0.Color1Comp;
m_VtxAttr.texCoord[0].Elements = vat.g0.Tex0CoordElements;
m_VtxAttr.texCoord[0].Format = vat.g0.Tex0CoordFormat;
m_VtxAttr.texCoord[0].Frac = vat.g0.Tex0Frac;
m_VtxAttr.ByteDequant = vat.g0.ByteDequant;
m_VtxAttr.NormalIndex3 = vat.g0.NormalIndex3;
m_VtxAttr.texCoord[1].Elements = vat.g1.Tex1CoordElements;
m_VtxAttr.texCoord[1].Format = vat.g1.Tex1CoordFormat;
m_VtxAttr.texCoord[1].Frac = vat.g1.Tex1Frac;
m_VtxAttr.texCoord[2].Elements = vat.g1.Tex2CoordElements;
m_VtxAttr.texCoord[2].Format = vat.g1.Tex2CoordFormat;
m_VtxAttr.texCoord[2].Frac = vat.g1.Tex2Frac;
m_VtxAttr.texCoord[3].Elements = vat.g1.Tex3CoordElements;
m_VtxAttr.texCoord[3].Format = vat.g1.Tex3CoordFormat;
m_VtxAttr.texCoord[3].Frac = vat.g1.Tex3Frac;
m_VtxAttr.texCoord[4].Elements = vat.g1.Tex4CoordElements;
m_VtxAttr.texCoord[4].Format = vat.g1.Tex4CoordFormat;
m_VtxAttr.texCoord[4].Frac = vat.g2.Tex4Frac;
m_VtxAttr.texCoord[5].Elements = vat.g2.Tex5CoordElements;
m_VtxAttr.texCoord[5].Format = vat.g2.Tex5CoordFormat;
m_VtxAttr.texCoord[5].Frac = vat.g2.Tex5Frac;
m_VtxAttr.texCoord[6].Elements = vat.g2.Tex6CoordElements;
m_VtxAttr.texCoord[6].Format = vat.g2.Tex6CoordFormat;
m_VtxAttr.texCoord[6].Frac = vat.g2.Tex6Frac;
m_VtxAttr.texCoord[7].Elements = vat.g2.Tex7CoordElements;
m_VtxAttr.texCoord[7].Format = vat.g2.Tex7CoordFormat;
m_VtxAttr.texCoord[7].Frac = vat.g2.Tex7Frac;
};
// a hacky implementation to compare two vertex loaders // a hacky implementation to compare two vertex loaders
class VertexLoaderTester : public VertexLoaderBase class VertexLoaderTester : public VertexLoaderBase
{ {
@ -130,8 +83,8 @@ public:
ERROR_LOG_FMT(VIDEO, ERROR_LOG_FMT(VIDEO,
"The two vertex loaders have loaded different data " "The two vertex loaders have loaded different data "
"(guru meditation {:#010x}, {:#010x}, {:#010x}, {:#010x}, {:#010x}).", "(guru meditation {:#010x}, {:#010x}, {:#010x}, {:#010x}, {:#010x}).",
m_VtxDesc.low.Hex, m_VtxDesc.high.Hex, m_vat.g0.Hex, m_vat.g1.Hex, m_VtxDesc.low.Hex, m_VtxDesc.high.Hex, m_VtxAttr.g0.Hex, m_VtxAttr.g1.Hex,
m_vat.g2.Hex); m_VtxAttr.g2.Hex);
} }
memcpy(dst.GetPointer(), buffer_a.data(), count_a * m_native_vtx_decl.stride); memcpy(dst.GetPointer(), buffer_a.data(), count_a * m_native_vtx_decl.stride);

View File

@ -77,11 +77,10 @@ public:
int m_numLoadedVertices = 0; int m_numLoadedVertices = 0;
protected: protected:
VertexLoaderBase(const TVtxDesc& vtx_desc, const VAT& vtx_attr); VertexLoaderBase(const TVtxDesc& vtx_desc, const VAT& vtx_attr)
void SetVAT(const VAT& vat); : m_VtxDesc{vtx_desc}, m_VtxAttr{vtx_attr} {};
// GC vertex format // GC vertex format
TVtxAttr m_VtxAttr; // VAT decoded into easy format const VAT m_VtxAttr;
TVtxDesc m_VtxDesc; // Not really used currently - or well it is, but could be easily avoided. const TVtxDesc m_VtxDesc;
VAT m_vat;
}; };

View File

@ -439,30 +439,30 @@ void VertexLoaderX64::GenerateVertexLoader()
} }
OpArg data = GetVertexAddr(ARRAY_POSITION, m_VtxDesc.low.Position); OpArg data = GetVertexAddr(ARRAY_POSITION, m_VtxDesc.low.Position);
int pos_elements = m_VtxAttr.PosElements == CoordComponentCount::XY ? 2 : 3; int pos_elements = m_VtxAttr.g0.PosElements == CoordComponentCount::XY ? 2 : 3;
ReadVertex(data, m_VtxDesc.low.Position, m_VtxAttr.PosFormat, pos_elements, pos_elements, ReadVertex(data, m_VtxDesc.low.Position, m_VtxAttr.g0.PosFormat, pos_elements, pos_elements,
m_VtxAttr.ByteDequant, m_VtxAttr.PosFrac, &m_native_vtx_decl.position); m_VtxAttr.g0.ByteDequant, m_VtxAttr.g0.PosFrac, &m_native_vtx_decl.position);
if (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent) if (m_VtxDesc.low.Normal != VertexComponentFormat::NotPresent)
{ {
static const u8 map[8] = {7, 6, 15, 14}; static const u8 map[8] = {7, 6, 15, 14};
const u8 scaling_exponent = map[u32(m_VtxAttr.NormalFormat)]; const u8 scaling_exponent = map[u32(m_VtxAttr.g0.NormalFormat.Value())];
const int limit = m_VtxAttr.NormalElements == NormalComponentCount::NBT ? 3 : 1; const int limit = m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT ? 3 : 1;
for (int i = 0; i < limit; i++) for (int i = 0; i < limit; i++)
{ {
if (!i || m_VtxAttr.NormalIndex3) if (!i || m_VtxAttr.g0.NormalIndex3)
{ {
data = GetVertexAddr(ARRAY_NORMAL, m_VtxDesc.low.Normal); data = GetVertexAddr(ARRAY_NORMAL, m_VtxDesc.low.Normal);
int elem_size = GetElementSize(m_VtxAttr.NormalFormat); int elem_size = GetElementSize(m_VtxAttr.g0.NormalFormat);
data.AddMemOffset(i * elem_size * 3); data.AddMemOffset(i * elem_size * 3);
} }
data.AddMemOffset(ReadVertex(data, m_VtxDesc.low.Normal, m_VtxAttr.NormalFormat, 3, 3, true, data.AddMemOffset(ReadVertex(data, m_VtxDesc.low.Normal, m_VtxAttr.g0.NormalFormat, 3, 3,
scaling_exponent, &m_native_vtx_decl.normals[i])); true, scaling_exponent, &m_native_vtx_decl.normals[i]));
} }
m_native_components |= VB_HAS_NRM0; m_native_components |= VB_HAS_NRM0;
if (m_VtxAttr.NormalElements == NormalComponentCount::NBT) if (m_VtxAttr.g0.NormalElements == NormalComponentCount::NBT)
m_native_components |= VB_HAS_NRM1 | VB_HAS_NRM2; m_native_components |= VB_HAS_NRM1 | VB_HAS_NRM2;
} }
@ -471,7 +471,7 @@ void VertexLoaderX64::GenerateVertexLoader()
if (m_VtxDesc.low.Color[i] != VertexComponentFormat::NotPresent) if (m_VtxDesc.low.Color[i] != VertexComponentFormat::NotPresent)
{ {
data = GetVertexAddr(ARRAY_COLOR0 + int(i), m_VtxDesc.low.Color[i]); data = GetVertexAddr(ARRAY_COLOR0 + int(i), m_VtxDesc.low.Color[i]);
ReadColor(data, m_VtxDesc.low.Color[i], m_VtxAttr.color[i].Comp); ReadColor(data, m_VtxDesc.low.Color[i], m_VtxAttr.GetColorFormat(i));
m_native_components |= VB_HAS_COL0 << i; m_native_components |= VB_HAS_COL0 << i;
m_native_vtx_decl.colors[i].components = 4; m_native_vtx_decl.colors[i].components = 4;
m_native_vtx_decl.colors[i].enable = true; m_native_vtx_decl.colors[i].enable = true;
@ -484,14 +484,14 @@ void VertexLoaderX64::GenerateVertexLoader()
for (size_t i = 0; i < m_VtxDesc.high.TexCoord.Size(); i++) for (size_t i = 0; i < m_VtxDesc.high.TexCoord.Size(); i++)
{ {
int elements = m_VtxAttr.texCoord[i].Elements == TexComponentCount::ST ? 2 : 1; int elements = m_VtxAttr.GetTexElements(i) == TexComponentCount::ST ? 2 : 1;
if (m_VtxDesc.high.TexCoord[i] != VertexComponentFormat::NotPresent) if (m_VtxDesc.high.TexCoord[i] != VertexComponentFormat::NotPresent)
{ {
data = GetVertexAddr(ARRAY_TEXCOORD0 + int(i), m_VtxDesc.high.TexCoord[i]); data = GetVertexAddr(ARRAY_TEXCOORD0 + int(i), m_VtxDesc.high.TexCoord[i]);
u8 scaling_exponent = m_VtxAttr.texCoord[i].Frac; u8 scaling_exponent = m_VtxAttr.GetTexFrac(i);
ReadVertex(data, m_VtxDesc.high.TexCoord[i], m_VtxAttr.texCoord[i].Format, elements, ReadVertex(data, m_VtxDesc.high.TexCoord[i], m_VtxAttr.GetTexFormat(i), elements,
m_VtxDesc.low.TexMatIdx[i] ? 2 : elements, m_VtxAttr.ByteDequant, scaling_exponent, m_VtxDesc.low.TexMatIdx[i] ? 2 : elements, m_VtxAttr.g0.ByteDequant,
&m_native_vtx_decl.texcoords[i]); scaling_exponent, &m_native_vtx_decl.texcoords[i]);
m_native_components |= VB_HAS_UV0 << i; m_native_components |= VB_HAS_UV0 << i;
} }
if (m_VtxDesc.low.TexMatIdx[i]) if (m_VtxDesc.low.TexMatIdx[i])