summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp
diff options
context:
space:
mode:
authorRodolfo Osvaldo Bogado <rodolfoosvaldobogado@gmail.com>2011-01-23 15:29:57 +0000
committerRodolfo Osvaldo Bogado <rodolfoosvaldobogado@gmail.com>2011-01-23 15:29:57 +0000
commit7cd7c2838be2266c598b60cb10638fb3679ae3fc (patch)
tree2b5cd7d21198f7419124683804726c2fe66b4438 /Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp
parent9749d617d054b12a3507eba88b3e466bb913c35c (diff)
2 fixes one for dx9 and one for software plugin.
some little optimization to normal loading. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6898 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp216
1 files changed, 128 insertions, 88 deletions
diff --git a/Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp b/Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp
index dcfaf21779..c49a23031b 100644
--- a/Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp
+++ b/Source/Core/VideoCommon/Src/VertexLoader_Normal.cpp
@@ -21,14 +21,16 @@
#include "VertexLoader_Normal.h"
#include "VertexManagerBase.h"
#include "CPUDetect.h"
+#include <cmath>
-#if _M_SSE >= 0x301 && !(defined __GNUC__ && !defined __SSSE3__)
+#if _M_SSE >= 0x401
+#include <smmintrin.h>
+#include <emmintrin.h>
+#elif _M_SSE >= 0x301 && !(defined __GNUC__ && !defined __SSSE3__)
#include <tmmintrin.h>
#endif
-#define LOG_NORM8() // PRIM_LOG("norm: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[-3], ((float*)VertexManager::s_pCurBufferPointer)[-2], ((float*)VertexManager::s_pCurBufferPointer)[-1]);
-#define LOG_NORM16() // PRIM_LOG("norm: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[-3], ((float*)VertexManager::s_pCurBufferPointer)[-2], ((float*)VertexManager::s_pCurBufferPointer)[-1]);
-#define LOG_NORMF() // PRIM_LOG("norm: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[-3], ((float*)VertexManager::s_pCurBufferPointer)[-2], ((float*)VertexManager::s_pCurBufferPointer)[-1]);
+#define LOG_NORM() // PRIM_LOG("norm: %f %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[-3], ((float*)VertexManager::s_pCurBufferPointer)[-2], ((float*)VertexManager::s_pCurBufferPointer)[-1]);
VertexLoader_Normal::Set VertexLoader_Normal::m_Table[NUM_NRM_TYPE][NUM_NRM_INDICES][NUM_NRM_ELEMENTS][NUM_NRM_FORMAT];
@@ -118,98 +120,156 @@ TPipelineFunction VertexLoader_Normal::GetFunction(unsigned int _type, unsigned
#define S16FRAC 0.00006103515625f; // 1.0f / (1U << 14)
// --- Direct ---
-
-inline void ReadDirectS8()
+inline void ReadIndirectS8x3(const s8* pData)
{
- ((float*)VertexManager::s_pCurBufferPointer)[0] = DataReadS8() * S8FRAC;
- ((float*)VertexManager::s_pCurBufferPointer)[1] = DataReadS8() * S8FRAC;
- ((float*)VertexManager::s_pCurBufferPointer)[2] = DataReadS8() * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[0] = pData[0] * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[1] = pData[1] * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[2] = pData[2] * S8FRAC;
VertexManager::s_pCurBufferPointer += 12;
- LOG_NORM8();
-}
-
-inline void ReadDirectS16()
-{
- ((float*)VertexManager::s_pCurBufferPointer)[0] = ((s16)DataReadU16()) * S16FRAC;
- ((float*)VertexManager::s_pCurBufferPointer)[1] = ((s16)DataReadU16()) * S16FRAC;
- ((float*)VertexManager::s_pCurBufferPointer)[2] = ((s16)DataReadU16()) * S16FRAC;
- VertexManager::s_pCurBufferPointer += 12;
- LOG_NORM16()
+ LOG_NORM();
}
-inline void ReadDirectFloat()
-{
- ((u32*)VertexManager::s_pCurBufferPointer)[0] = DataReadU32();
- ((u32*)VertexManager::s_pCurBufferPointer)[1] = DataReadU32();
- ((u32*)VertexManager::s_pCurBufferPointer)[2] = DataReadU32();
- VertexManager::s_pCurBufferPointer += 12;
- LOG_NORMF()
-}
-
-inline void ReadIndirectS8(const s8* pData)
+inline void ReadIndirectS8x9(const s8* pData)
{
((float*)VertexManager::s_pCurBufferPointer)[0] = pData[0] * S8FRAC;
((float*)VertexManager::s_pCurBufferPointer)[1] = pData[1] * S8FRAC;
((float*)VertexManager::s_pCurBufferPointer)[2] = pData[2] * S8FRAC;
- VertexManager::s_pCurBufferPointer += 12;
- LOG_NORM8();
+ LOG_NORM();
+ ((float*)VertexManager::s_pCurBufferPointer)[3] = pData[3] * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[4] = pData[4] * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[5] = pData[5] * S8FRAC;
+ LOG_NORM();
+ ((float*)VertexManager::s_pCurBufferPointer)[6] = pData[6] * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[7] = pData[7] * S8FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[8] = pData[8] * S8FRAC;
+ LOG_NORM();
+ VertexManager::s_pCurBufferPointer += 36;
}
-inline void ReadIndirectS16(const u16* pData)
+inline void ReadIndirectS16x3(const u16* pData)
{
((float*)VertexManager::s_pCurBufferPointer)[0] = ((s16)Common::swap16(pData[0])) * S16FRAC;
((float*)VertexManager::s_pCurBufferPointer)[1] = ((s16)Common::swap16(pData[1])) * S16FRAC;
((float*)VertexManager::s_pCurBufferPointer)[2] = ((s16)Common::swap16(pData[2])) * S16FRAC;
VertexManager::s_pCurBufferPointer += 12;
- LOG_NORM16()
+ LOG_NORM()
+}
+
+inline void ReadIndirectS16x9(const u16* pData)
+{
+ ((float*)VertexManager::s_pCurBufferPointer)[0] = ((s16)Common::swap16(pData[0])) * S16FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[1] = ((s16)Common::swap16(pData[1])) * S16FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[2] = ((s16)Common::swap16(pData[2])) * S16FRAC;
+ LOG_NORM()
+ ((float*)VertexManager::s_pCurBufferPointer)[3] = ((s16)Common::swap16(pData[3])) * S16FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[4] = ((s16)Common::swap16(pData[4])) * S16FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[5] = ((s16)Common::swap16(pData[5])) * S16FRAC;
+ LOG_NORM()
+ ((float*)VertexManager::s_pCurBufferPointer)[6] = ((s16)Common::swap16(pData[6])) * S16FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[7] = ((s16)Common::swap16(pData[7])) * S16FRAC;
+ ((float*)VertexManager::s_pCurBufferPointer)[8] = ((s16)Common::swap16(pData[8])) * S16FRAC;
+ LOG_NORM()
+ VertexManager::s_pCurBufferPointer += 36;
}
-inline void ReadIndirectFloat(const u32* pData)
+inline void ReadIndirectFloatx3(const u32* pData)
{
((u32*)VertexManager::s_pCurBufferPointer)[0] = Common::swap32(pData[0]);
((u32*)VertexManager::s_pCurBufferPointer)[1] = Common::swap32(pData[1]);
((u32*)VertexManager::s_pCurBufferPointer)[2] = Common::swap32(pData[2]);
VertexManager::s_pCurBufferPointer += 12;
- LOG_NORMF();
+ LOG_NORM();
+}
+
+inline void ReadIndirectFloatx9(const u32* pData)
+{
+ ((u32*)VertexManager::s_pCurBufferPointer)[0] = Common::swap32(pData[0]);
+ ((u32*)VertexManager::s_pCurBufferPointer)[1] = Common::swap32(pData[1]);
+ ((u32*)VertexManager::s_pCurBufferPointer)[2] = Common::swap32(pData[2]);
+ LOG_NORM();
+ ((u32*)VertexManager::s_pCurBufferPointer)[3] = Common::swap32(pData[3]);
+ ((u32*)VertexManager::s_pCurBufferPointer)[4] = Common::swap32(pData[4]);
+ ((u32*)VertexManager::s_pCurBufferPointer)[5] = Common::swap32(pData[5]);
+ LOG_NORM();
+ ((u32*)VertexManager::s_pCurBufferPointer)[6] = Common::swap32(pData[6]);
+ ((u32*)VertexManager::s_pCurBufferPointer)[7] = Common::swap32(pData[7]);
+ ((u32*)VertexManager::s_pCurBufferPointer)[8] = Common::swap32(pData[8]);
+ LOG_NORM();
+ VertexManager::s_pCurBufferPointer += 36;
+}
+
+inline void ReadDirectS8x3()
+{
+ const s8* Source = (const s8*)DataGetPosition();
+ ReadIndirectS8x3(Source);
+ DataSkip(3);
+}
+
+inline void ReadDirectS8x9()
+{
+ const s8* Source = (const s8*)DataGetPosition();
+ ReadIndirectS8x9(Source);
+ DataSkip(9);
+}
+
+inline void ReadDirectS16x3()
+{
+ const u16* Source = (const u16*)DataGetPosition();
+ ReadIndirectS16x3(Source);
+ DataSkip(6);
+}
+
+inline void ReadDirectS16x9()
+{
+ const u16* Source = (const u16*)DataGetPosition();
+ ReadIndirectS16x9(Source);
+ DataSkip(18);
}
+inline void ReadDirectFloatx3()
+{
+ const u32* Source = (const u32*)DataGetPosition();
+ ReadIndirectFloatx3(Source);
+ DataSkip(12);
+}
+
+inline void ReadDirectFloatx9()
+{
+ const u32* Source = (const u32*)DataGetPosition();
+ ReadIndirectFloatx9(Source);
+ DataSkip(36);
+}
+
+
+
void LOADERDECL VertexLoader_Normal::Normal_DirectByte()
{
- ReadDirectS8();
+ ReadDirectS8x3();
}
void LOADERDECL VertexLoader_Normal::Normal_DirectShort()
{
- ReadDirectS16();
+ ReadDirectS16x3();
}
void LOADERDECL VertexLoader_Normal::Normal_DirectFloat()
{
- ReadDirectFloat();
+ ReadDirectFloatx3();
}
void LOADERDECL VertexLoader_Normal::Normal_DirectByte3()
{
- for (int i = 0; i < 3; i++)
- {
- ReadDirectS8();
- }
+ ReadDirectS8x9();
}
void LOADERDECL VertexLoader_Normal::Normal_DirectShort3()
{
- for (int i = 0; i < 3; i++)
- {
- ReadDirectS16();
- }
+ ReadDirectS16x9();
}
void LOADERDECL VertexLoader_Normal::Normal_DirectFloat3()
{
- for (int i = 0; i < 3; i++)
- {
- ReadDirectFloat();
- }
+ ReadDirectFloatx9();
}
@@ -219,51 +279,42 @@ void LOADERDECL VertexLoader_Normal::Normal_Index8_Byte()
{
u8 Index = DataReadU8();
const s8* pData = (const s8 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- ReadIndirectS8(pData);
+ ReadIndirectS8x3(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index8_Short()
{
u8 Index = DataReadU8();
const u16* pData = (const u16 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- ReadIndirectS16(pData);
+ ReadIndirectS16x3(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index8_Float()
{
u8 Index = DataReadU8();
const u32* pData = (const u32 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- ReadIndirectFloat(pData);
+ ReadIndirectFloatx3(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index8_Byte3_Indices1()
{
u8 Index = DataReadU8();
const s8* pData = (const s8 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- for (int i = 0; i < 3; i++)
- {
- ReadIndirectS8((const s8*)(&pData[3 * i]));
- }
+ ReadIndirectS8x9(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index8_Short3_Indices1()
{
u8 Index = DataReadU8();
const u16* pData = (const u16 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- for (int i = 0; i < 3; i++)
- {
- ReadIndirectS16((const u16*)(&pData[3 * i]));
- }
+ ReadIndirectS16x9(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index8_Float3_Indices1()
{
u8 Index = DataReadU8();
const u32* pData = (const u32 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- for (int i = 0; i < 3; i++)
- {
- ReadIndirectFloat((const u32*)(&pData[3 * i]));
- }
+ ReadIndirectFloatx9(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index8_Byte3_Indices3()
@@ -272,7 +323,7 @@ void LOADERDECL VertexLoader_Normal::Normal_Index8_Byte3_Indices3()
{
u8 Index = DataReadU8();
const s8* pData = (const s8*)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 1*3*i);
- ReadIndirectS8(pData);
+ ReadIndirectS8x3(pData);
}
}
@@ -283,7 +334,7 @@ void LOADERDECL VertexLoader_Normal::Normal_Index8_Short3_Indices3()
{
u8 Index = DataReadU8();
const u16* pData = (const u16 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 2*3*i);
- ReadIndirectS16(pData);
+ ReadIndirectS16x3(pData);
}
}
@@ -293,7 +344,7 @@ void LOADERDECL VertexLoader_Normal::Normal_Index8_Float3_Indices3()
{
u8 Index = DataReadU8();
const u32* pData = (const u32 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 4*3*i);
- ReadIndirectFloat(pData);
+ ReadIndirectFloatx3(pData);
}
}
@@ -305,53 +356,42 @@ void LOADERDECL VertexLoader_Normal::Normal_Index16_Byte()
{
u16 Index = DataReadU16();
const s8* pData = (const s8 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- ReadIndirectS8(pData);
+ ReadIndirectS8x3(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index16_Short()
{
u16 Index = DataReadU16();
const u16* pData = (const u16 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- ReadIndirectS16(pData);
+ ReadIndirectS16x3(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index16_Float()
{
u16 Index = DataReadU16();
const u32* pData = (const u32 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- ReadIndirectFloat(pData);
+ ReadIndirectFloatx3(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index16_Byte3_Indices1()
{
u16 Index = DataReadU16();
const s8* pData = (const s8 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
- for (int i = 0; i < 3; i++)
- {
- ReadIndirectS8((const s8 *)(&pData[3 * i]));
- }
+ ReadIndirectS8x9(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index16_Short3_Indices1()
{
u16 Index = DataReadU16();
const u16* pData = (const u16 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
-
- for (int i = 0; i < 3; i++)
- {
- ReadIndirectS16((const u16 *)(&pData[3 * i]));
- }
+ ReadIndirectS16x9(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index16_Float3_Indices1()
{
u16 Index = DataReadU16();
const u32* pData = (const u32 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]));
-
- for (int i = 0; i < 3; i++)
- {
- ReadIndirectFloat((const u32 *)(&pData[3 * i]));
- }
+ ReadIndirectFloatx9(pData);
}
void LOADERDECL VertexLoader_Normal::Normal_Index16_Byte3_Indices3()
@@ -360,7 +400,7 @@ void LOADERDECL VertexLoader_Normal::Normal_Index16_Byte3_Indices3()
{
u16 Index = DataReadU16();
const s8* pData = (const s8*)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 1*3*i);
- ReadIndirectS8(pData);
+ ReadIndirectS8x3(pData);
}
}
@@ -370,7 +410,7 @@ void LOADERDECL VertexLoader_Normal::Normal_Index16_Short3_Indices3()
{
u16 Index = DataReadU16();
const u16* pData = (const u16 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 2*3*i);
- ReadIndirectS16(pData);
+ ReadIndirectS16x3(pData);
}
}
@@ -380,6 +420,6 @@ void LOADERDECL VertexLoader_Normal::Normal_Index16_Float3_Indices3()
{
u16 Index = DataReadU16();
const u32* pData = (const u32 *)(cached_arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 4*3*i);
- ReadIndirectFloat(pData);
+ ReadIndirectFloatx3(pData);
}
}