Latte+Vulkan+Metal: Improve support for little-endian indices

This commit is contained in:
Exzap committed 2026-10-31 22:35:15 +01:00
1 parent 182b0bc799
commit 4716b53cd9
2 files changed
+48 -25

No files matched your search

@@ -771,7 +771,7 @@ LatteCMDPtr LatteCP_itDrawImmediate(LatteCMDPtr cmd, uint32 nWords, DrawPassCont
// calculate size of index data in packet and read indices
uint32 numIndexU32s;
auto indexType = LatteGPUState.contextNew.VGT_DMA_INDEX_TYPE.get_INDEX_TYPE();
if (indexType == Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE::U16_BE)
if (indexType == Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE::U16_BE || indexType == Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE::U16_LE)
{
// 16bit indices
numIndexU32s = (count + 1) / 2;
@@ -786,10 +786,9 @@ LatteCMDPtr LatteCP_itDrawImmediate(LatteCMDPtr cmd, uint32 nWords, DrawPassCont
}
LatteIndices_invalidate(memory_getPointerFromVirtualOffset(_tempIndexArrayMPTR), numIndexU32s * sizeof(uint32));
}
else if (indexType == Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE::U32_BE)
else if (indexType == Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE::U32_BE || indexType == Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE::U32_LE)
{
// 32bit indices
cemu_assert_debug(false); // testing needed
numIndexU32s = count;
cemu_assert(numIndexU32s < 0x4000 && numIndexU32s <= nWords-2);
memcpy(memory_getPointerFromVirtualOffset(_tempIndexArrayMPTR), cmd, numIndexU32s * sizeof(uint32));
+46 -22
View File
@@ -168,11 +168,11 @@ void LatteIndices_convertLE(const void* indexDataInput, void* indexDataOutput, u
}
}
template<typename T>
template<typename T, typename TInput>
void LatteIndices_unpackQuadsAndConvert(const void* indexDataInput, void* indexDataOutput, uint32 count, uint32& indexMax)
{
sint32 numQuads = count / 4;
const betype<T>* src = (betype<T>*)indexDataInput;
const TInput* src = (const TInput*)indexDataInput;
T* dst = (T*)indexDataOutput;
for (sint32 i = 0; i < numQuads; i++)
{
@@ -219,13 +219,13 @@ void LatteIndices_generateAutoQuadIndices(const void* indexDataInput, void* inde
indexMax = std::max(count, 1u) - 1;
}
template<typename T>
template<typename T, typename TInput>
void LatteIndices_unpackQuadStripAndConvert(const void* indexDataInput, void* indexDataOutput, uint32 count, uint32& indexMax)
{
if (count <= 3)
return;
sint32 numQuads = (count - 2) / 2;
const betype<T>* src = (betype<T>*)indexDataInput;
const TInput* src = (const TInput*)indexDataInput;
T* dst = (T*)indexDataOutput;
for (sint32 i = 0; i < numQuads; i++)
{
@@ -248,12 +248,12 @@ void LatteIndices_unpackQuadStripAndConvert(const void* indexDataInput, void* in
}
}
template<typename T>
template<typename T, typename TInput>
void LatteIndices_unpackLineLoopAndConvert(const void* indexDataInput, void* indexDataOutput, uint32 count, uint32& indexMax)
{
if (count <= 0)
return;
const betype<T>* src = (betype<T>*)indexDataInput;
const TInput* src = (const TInput*)indexDataInput;
T firstIndex = *src;
T* dst = (T*)indexDataOutput;
for (sint32 i = 0; i < (sint32)count; i++)
@@ -308,10 +308,10 @@ void LatteIndices_generateAutoLineLoopIndices(void* indexDataOutput, uint32 coun
indexMax = std::max(count, 1u) - 1;
}
template<typename T>
template<typename T, typename TInput>
void LatteIndices_unpackTriangleFanAndConvert(const void* indexDataInput, void* indexDataOutput, uint32 count, uint32& indexMax)
{
const betype<T>* src = (betype<T>*)indexDataInput;
const TInput* src = (const TInput*)indexDataInput;
T* dst = (T*)indexDataOutput;
// TODO: check this
for (sint32 i = 0; i < count; i++)
@@ -598,12 +598,12 @@ void LatteIndices_fastConvertU32_NEON(const void* indexDataInput, void* indexDat
#endif
template<typename T>
template<typename T, typename TInput>
void _LatteIndices_alternativeCalculateIndexMax(const void* indexData, uint32 count, uint32 primitiveRestartIndex, uint32& indexMax)
{
cemu_assert_debug(count != 0);
const betype<T>* idxPtrT = (betype<T>*)indexData;
T _indexMax = *idxPtrT;
const TInput* idxPtrT = (const TInput*)indexData;
T _indexMax = 0;
cemu_assert_debug(primitiveRestartIndex <= std::numeric_limits<T>::max());
T restartIndexT = (T)primitiveRestartIndex;
while (count)
@@ -632,11 +632,19 @@ void LatteIndices_alternativeCalculateIndexMax(const void* indexData, LatteIndex
if (indexType == LatteIndexType::U16_BE)
{
_LatteIndices_alternativeCalculateIndexMax<uint16>(indexData, count, primitiveRestartIndex, indexMax);
_LatteIndices_alternativeCalculateIndexMax<uint16, uint16be>(indexData, count, primitiveRestartIndex, indexMax);
}
else if (indexType == LatteIndexType::U32_BE)
{
_LatteIndices_alternativeCalculateIndexMax<uint32>(indexData, count, primitiveRestartIndex, indexMax);
_LatteIndices_alternativeCalculateIndexMax<uint32, uint32be>(indexData, count, primitiveRestartIndex, indexMax);
}
else if (indexType == LatteIndexType::U16_LE)
{
_LatteIndices_alternativeCalculateIndexMax<uint16, uint16>(indexData, count, primitiveRestartIndex, indexMax);
}
else if (indexType == LatteIndexType::U32_LE)
{
_LatteIndices_alternativeCalculateIndexMax<uint32, uint32>(indexData, count, primitiveRestartIndex, indexMax);
}
else
{
@@ -673,7 +681,7 @@ void LatteIndices_decode(const void* indexData, LatteIndexType indexType, uint32
renderIndexType = Renderer::INDEX_TYPE::NONE;
else if (indexType == LatteIndexType::U16_BE || indexType == LatteIndexType::U16_LE)
renderIndexType = Renderer::INDEX_TYPE::U16;
else if (indexType == LatteIndexType::U32_BE)
else if (indexType == LatteIndexType::U32_BE || indexType == LatteIndexType::U32_LE)
renderIndexType = Renderer::INDEX_TYPE::U32;
else
cemu_assert_debug(false);
@@ -713,9 +721,13 @@ void LatteIndices_decode(const void* indexData, LatteIndexType indexType, uint32
}
}
else if (indexType == LatteIndexType::U16_BE)
LatteIndices_unpackQuadsAndConvert<uint16>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackQuadsAndConvert<uint16, uint16be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_BE)
LatteIndices_unpackQuadsAndConvert<uint32>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackQuadsAndConvert<uint32, uint32be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U16_LE)
LatteIndices_unpackQuadsAndConvert<uint16, uint16>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_LE)
LatteIndices_unpackQuadsAndConvert<uint32, uint32>(indexData, indexOutputPtr, count, indexMax);
else
cemu_assert_debug(false);
outputCount = count / 4 * 6;
@@ -737,9 +749,13 @@ void LatteIndices_decode(const void* indexData, LatteIndexType indexType, uint32
}
}
else if (indexType == LatteIndexType::U16_BE)
LatteIndices_unpackQuadStripAndConvert<uint16>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackQuadStripAndConvert<uint16, uint16be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_BE)
LatteIndices_unpackQuadStripAndConvert<uint32>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackQuadStripAndConvert<uint32, uint32be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U16_LE)
LatteIndices_unpackQuadStripAndConvert<uint16, uint16>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_LE)
LatteIndices_unpackQuadStripAndConvert<uint32, uint32>(indexData, indexOutputPtr, count, indexMax);
else
cemu_assert_debug(false);
if (count >= 2)
@@ -764,9 +780,13 @@ void LatteIndices_decode(const void* indexData, LatteIndexType indexType, uint32
}
}
else if (indexType == LatteIndexType::U16_BE)
LatteIndices_unpackLineLoopAndConvert<uint16>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackLineLoopAndConvert<uint16, uint16be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_BE)
LatteIndices_unpackLineLoopAndConvert<uint32>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackLineLoopAndConvert<uint32, uint32be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U16_LE)
LatteIndices_unpackLineLoopAndConvert<uint16, uint16>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_LE)
LatteIndices_unpackLineLoopAndConvert<uint32, uint32>(indexData, indexOutputPtr, count, indexMax);
else
cemu_assert_debug(false);
outputCount = count + 1;
@@ -787,9 +807,13 @@ void LatteIndices_decode(const void* indexData, LatteIndexType indexType, uint32
}
}
else if (indexType == LatteIndexType::U16_BE)
LatteIndices_unpackTriangleFanAndConvert<uint16>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackTriangleFanAndConvert<uint16, uint16be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_BE)
LatteIndices_unpackTriangleFanAndConvert<uint32>(indexData, indexOutputPtr, count, indexMax);
LatteIndices_unpackTriangleFanAndConvert<uint32, uint32be>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U16_LE)
LatteIndices_unpackTriangleFanAndConvert<uint16, uint16>(indexData, indexOutputPtr, count, indexMax);
else if (indexType == LatteIndexType::U32_LE)
LatteIndices_unpackTriangleFanAndConvert<uint32, uint32>(indexData, indexOutputPtr, count, indexMax);
else
cemu_assert_debug(false);
outputCount = count;