diff options
Diffstat (limited to 'Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp')
| -rw-r--r-- | Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp | 241 |
1 files changed, 123 insertions, 118 deletions
diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp index 063e806865..44323951de 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWVertexLoader.cpp @@ -12,7 +12,7 @@ // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ -// Official SVN repository and contact information can be found at +// Official Git repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "Common.h" @@ -41,72 +41,74 @@ extern float tcScale[8]; SWVertexLoader::SWVertexLoader() : - m_VertexSize(0), - m_NumAttributeLoaders(0) + m_VertexSize(0), + m_NumAttributeLoaders(0) { - VertexLoader_Normal::Init(); - VertexLoader_Position::Init(); - VertexLoader_TextCoord::Init(); + VertexLoader_Normal::Init(); + VertexLoader_Position::Init(); + VertexLoader_TextCoord::Init(); - m_SetupUnit = new SetupUnit; + m_SetupUnit = new SetupUnit; } SWVertexLoader::~SWVertexLoader() { - delete m_SetupUnit; - m_SetupUnit = NULL; + delete m_SetupUnit; + m_SetupUnit = NULL; } void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) { - m_CurrentVat = &g_VtxAttr[attributeIndex]; - - posScale = 1.0f / float(1 << m_CurrentVat->g0.PosFrac); - tcScale[0] = 1.0f / float(1 << m_CurrentVat->g0.Tex0Frac); - tcScale[1] = 1.0f / float(1 << m_CurrentVat->g1.Tex1Frac); - tcScale[2] = 1.0f / float(1 << m_CurrentVat->g1.Tex2Frac); - tcScale[3] = 1.0f / float(1 << m_CurrentVat->g1.Tex3Frac); - tcScale[4] = 1.0f / float(1 << m_CurrentVat->g2.Tex4Frac); - tcScale[5] = 1.0f / float(1 << m_CurrentVat->g2.Tex5Frac); - tcScale[6] = 1.0f / float(1 << m_CurrentVat->g2.Tex6Frac); - tcScale[7] = 1.0f / float(1 << m_CurrentVat->g2.Tex7Frac); - - //TexMtx - const u32 tmDesc[8] = { - g_VtxDesc.Tex0MatIdx, g_VtxDesc.Tex1MatIdx, g_VtxDesc.Tex2MatIdx, g_VtxDesc.Tex3MatIdx, + m_CurrentVat = &g_VtxAttr[attributeIndex]; + + posScale = 1.0f / float(1 << m_CurrentVat->g0.PosFrac); + tcScale[0] = 1.0f / float(1 << m_CurrentVat->g0.Tex0Frac); + tcScale[1] = 1.0f / float(1 << m_CurrentVat->g1.Tex1Frac); + tcScale[2] = 1.0f / float(1 << m_CurrentVat->g1.Tex2Frac); + tcScale[3] = 1.0f / float(1 << m_CurrentVat->g1.Tex3Frac); + tcScale[4] = 1.0f / float(1 << m_CurrentVat->g2.Tex4Frac); + tcScale[5] = 1.0f / float(1 << m_CurrentVat->g2.Tex5Frac); + tcScale[6] = 1.0f / float(1 << m_CurrentVat->g2.Tex6Frac); + tcScale[7] = 1.0f / float(1 << m_CurrentVat->g2.Tex7Frac); + + //TexMtx + const u32 tmDesc[8] = { + g_VtxDesc.Tex0MatIdx, g_VtxDesc.Tex1MatIdx, g_VtxDesc.Tex2MatIdx, g_VtxDesc.Tex3MatIdx, g_VtxDesc.Tex4MatIdx, g_VtxDesc.Tex5MatIdx, g_VtxDesc.Tex6MatIdx, g_VtxDesc.Tex7MatIdx }; - // Colors + + // Colors const u32 colDesc[2] = {g_VtxDesc.Color0, g_VtxDesc.Color1}; - colElements[0] = m_CurrentVat->g0.Color0Elements; - colElements[1] = m_CurrentVat->g0.Color1Elements; - const u32 colComp[2] = {m_CurrentVat->g0.Color0Comp, m_CurrentVat->g0.Color1Comp}; + colElements[0] = m_CurrentVat->g0.Color0Elements; + colElements[1] = m_CurrentVat->g0.Color1Elements; + const u32 colComp[2] = {m_CurrentVat->g0.Color0Comp, m_CurrentVat->g0.Color1Comp}; + // TextureCoord const u32 tcDesc[8] = { g_VtxDesc.Tex0Coord, g_VtxDesc.Tex1Coord, g_VtxDesc.Tex2Coord, g_VtxDesc.Tex3Coord, g_VtxDesc.Tex4Coord, g_VtxDesc.Tex5Coord, g_VtxDesc.Tex6Coord, (const u32)((g_VtxDesc.Hex >> 31) & 3) }; - const u32 tcElements[8] = { - m_CurrentVat->g0.Tex0CoordElements, m_CurrentVat->g1.Tex1CoordElements, m_CurrentVat->g1.Tex2CoordElements, - m_CurrentVat->g1.Tex3CoordElements, m_CurrentVat->g1.Tex4CoordElements, m_CurrentVat->g2.Tex5CoordElements, - m_CurrentVat->g2.Tex6CoordElements, m_CurrentVat->g2.Tex7CoordElements - }; - - const u32 tcFormat[8] = { - m_CurrentVat->g0.Tex0CoordFormat, m_CurrentVat->g1.Tex1CoordFormat, m_CurrentVat->g1.Tex2CoordFormat, - m_CurrentVat->g1.Tex3CoordFormat, m_CurrentVat->g1.Tex4CoordFormat, m_CurrentVat->g2.Tex5CoordFormat, - m_CurrentVat->g2.Tex6CoordFormat, m_CurrentVat->g2.Tex7CoordFormat - }; - - m_VertexSize = 0; - + const u32 tcElements[8] = { + m_CurrentVat->g0.Tex0CoordElements, m_CurrentVat->g1.Tex1CoordElements, m_CurrentVat->g1.Tex2CoordElements, + m_CurrentVat->g1.Tex3CoordElements, m_CurrentVat->g1.Tex4CoordElements, m_CurrentVat->g2.Tex5CoordElements, + m_CurrentVat->g2.Tex6CoordElements, m_CurrentVat->g2.Tex7CoordElements + }; + + const u32 tcFormat[8] = { + m_CurrentVat->g0.Tex0CoordFormat, m_CurrentVat->g1.Tex1CoordFormat, m_CurrentVat->g1.Tex2CoordFormat, + m_CurrentVat->g1.Tex3CoordFormat, m_CurrentVat->g1.Tex4CoordFormat, m_CurrentVat->g2.Tex5CoordFormat, + m_CurrentVat->g2.Tex6CoordFormat, m_CurrentVat->g2.Tex7CoordFormat + }; + + m_VertexSize = 0; + // Reset pipeline m_positionLoader = NULL; - m_normalLoader = NULL; - m_NumAttributeLoaders = 0; + m_normalLoader = NULL; + m_NumAttributeLoaders = 0; - // Reset vertex - // matrix index from xf regs or cp memory? + // Reset vertex + // matrix index from xf regs or cp memory? if (swxfregs.MatrixIndexA.PosNormalMtxIdx != MatrixIndexA.PosNormalMtxIdx || swxfregs.MatrixIndexA.Tex0MtxIdx != MatrixIndexA.Tex0MtxIdx || swxfregs.MatrixIndexA.Tex1MtxIdx != MatrixIndexA.Tex1MtxIdx || @@ -126,39 +128,41 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) } #if(1) - m_Vertex.posMtx = swxfregs.MatrixIndexA.PosNormalMtxIdx; - m_Vertex.texMtx[0] = swxfregs.MatrixIndexA.Tex0MtxIdx; - m_Vertex.texMtx[1] = swxfregs.MatrixIndexA.Tex1MtxIdx; - m_Vertex.texMtx[2] = swxfregs.MatrixIndexA.Tex2MtxIdx; - m_Vertex.texMtx[3] = swxfregs.MatrixIndexA.Tex3MtxIdx; - m_Vertex.texMtx[4] = swxfregs.MatrixIndexB.Tex4MtxIdx; - m_Vertex.texMtx[5] = swxfregs.MatrixIndexB.Tex5MtxIdx; - m_Vertex.texMtx[6] = swxfregs.MatrixIndexB.Tex6MtxIdx; - m_Vertex.texMtx[7] = swxfregs.MatrixIndexB.Tex7MtxIdx; + m_Vertex.posMtx = swxfregs.MatrixIndexA.PosNormalMtxIdx; + m_Vertex.texMtx[0] = swxfregs.MatrixIndexA.Tex0MtxIdx; + m_Vertex.texMtx[1] = swxfregs.MatrixIndexA.Tex1MtxIdx; + m_Vertex.texMtx[2] = swxfregs.MatrixIndexA.Tex2MtxIdx; + m_Vertex.texMtx[3] = swxfregs.MatrixIndexA.Tex3MtxIdx; + m_Vertex.texMtx[4] = swxfregs.MatrixIndexB.Tex4MtxIdx; + m_Vertex.texMtx[5] = swxfregs.MatrixIndexB.Tex5MtxIdx; + m_Vertex.texMtx[6] = swxfregs.MatrixIndexB.Tex6MtxIdx; + m_Vertex.texMtx[7] = swxfregs.MatrixIndexB.Tex7MtxIdx; #else - m_Vertex.posMtx = MatrixIndexA.PosNormalMtxIdx; - m_Vertex.texMtx[0] = MatrixIndexA.Tex0MtxIdx; - m_Vertex.texMtx[1] = MatrixIndexA.Tex1MtxIdx; - m_Vertex.texMtx[2] = MatrixIndexA.Tex2MtxIdx; - m_Vertex.texMtx[3] = MatrixIndexA.Tex3MtxIdx; - m_Vertex.texMtx[4] = MatrixIndexB.Tex4MtxIdx; - m_Vertex.texMtx[5] = MatrixIndexB.Tex5MtxIdx; - m_Vertex.texMtx[6] = MatrixIndexB.Tex6MtxIdx; - m_Vertex.texMtx[7] = MatrixIndexB.Tex7MtxIdx; + m_Vertex.posMtx = MatrixIndexA.PosNormalMtxIdx; + m_Vertex.texMtx[0] = MatrixIndexA.Tex0MtxIdx; + m_Vertex.texMtx[1] = MatrixIndexA.Tex1MtxIdx; + m_Vertex.texMtx[2] = MatrixIndexA.Tex2MtxIdx; + m_Vertex.texMtx[3] = MatrixIndexA.Tex3MtxIdx; + m_Vertex.texMtx[4] = MatrixIndexB.Tex4MtxIdx; + m_Vertex.texMtx[5] = MatrixIndexB.Tex5MtxIdx; + m_Vertex.texMtx[6] = MatrixIndexB.Tex6MtxIdx; + m_Vertex.texMtx[7] = MatrixIndexB.Tex7MtxIdx; #endif - if (g_VtxDesc.PosMatIdx != NOT_PRESENT) { - AddAttributeLoader(LoadPosMtx); - m_VertexSize++; - } + if (g_VtxDesc.PosMatIdx != NOT_PRESENT) + { + AddAttributeLoader(LoadPosMtx); + m_VertexSize++; + } - for (int i = 0; i < 8; ++i) { - if (tmDesc[i] != NOT_PRESENT) - { - AddAttributeLoader(LoadTexMtx, i); - m_VertexSize++; - } - } + for (int i = 0; i < 8; ++i) + { + if (tmDesc[i] != NOT_PRESENT) + { + AddAttributeLoader(LoadTexMtx, i); + m_VertexSize++; + } + } // Write vertex position loader m_positionLoader = VertexLoader_Position::GetFunction(g_VtxDesc.Position, m_CurrentVat->g0.PosFormat, m_CurrentVat->g0.PosElements); @@ -178,14 +182,15 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) { ERROR_LOG(VIDEO, "VertexLoader_Normal::GetFunction returned zero!"); } - AddAttributeLoader(LoadNormal); - } + AddAttributeLoader(LoadNormal); + } - for (int i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) + { switch (colDesc[i]) { case NOT_PRESENT: - m_colorLoader[i] = NULL; + m_colorLoader[i] = NULL; break; case DIRECT: switch (colComp[i]) @@ -198,7 +203,7 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) case FORMAT_32B_8888: m_VertexSize += 4; m_colorLoader[i] = (Color_ReadDirect_32b_8888); break; default: _assert_(0); break; } - AddAttributeLoader(LoadColor, i); + AddAttributeLoader(LoadColor, i); break; case INDEX8: m_VertexSize += 1; @@ -212,7 +217,7 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) case FORMAT_32B_8888: m_colorLoader[i] = (Color_ReadIndex8_32b_8888); break; default: _assert_(0); break; } - AddAttributeLoader(LoadColor, i); + AddAttributeLoader(LoadColor, i); break; case INDEX16: m_VertexSize += 2; @@ -226,13 +231,14 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) case FORMAT_32B_8888: m_colorLoader[i] = (Color_ReadIndex16_32b_8888); break; default: _assert_(0); break; } - AddAttributeLoader(LoadColor, i); + AddAttributeLoader(LoadColor, i); break; } } // Texture matrix indices (remove if corresponding texture coordinate isn't enabled) - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 8; i++) + { const int desc = tcDesc[i]; const int format = tcFormat[i]; const int elements = tcElements[i]; @@ -244,7 +250,7 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) m_VertexSize += VertexLoader_TextCoord::GetSize(desc, format, elements); if (m_texCoordLoader[i]) AddAttributeLoader(LoadTexCoord, i); - } + } // special case if only pos and tex coord 0 and tex coord input is AB11 m_TexGenSpecialCase = @@ -252,80 +258,79 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) (g_VtxDesc.Tex0Coord != NOT_PRESENT) && (swxfregs.texMtxInfo[0].projection == XF_TEXPROJ_ST); - - m_SetupUnit->Init(primitiveType); + m_SetupUnit->Init(primitiveType); } void SWVertexLoader::LoadVertex() { - for (int i = 0; i < m_NumAttributeLoaders; i++) - m_AttributeLoaders[i].loader(this, &m_Vertex, m_AttributeLoaders[i].index); + for (int i = 0; i < m_NumAttributeLoaders; i++) + m_AttributeLoaders[i].loader(this, &m_Vertex, m_AttributeLoaders[i].index); - OutputVertexData* outVertex = m_SetupUnit->GetVertex(); + OutputVertexData* outVertex = m_SetupUnit->GetVertex(); - // transform input data - TransformUnit::TransformPosition(&m_Vertex, outVertex); + // transform input data + TransformUnit::TransformPosition(&m_Vertex, outVertex); - if (g_VtxDesc.Normal != NOT_PRESENT) - { - TransformUnit::TransformNormal(&m_Vertex, m_CurrentVat->g0.NormalElements, outVertex); - } + if (g_VtxDesc.Normal != NOT_PRESENT) + { + TransformUnit::TransformNormal(&m_Vertex, m_CurrentVat->g0.NormalElements, outVertex); + } - TransformUnit::TransformColor(&m_Vertex, outVertex); + TransformUnit::TransformColor(&m_Vertex, outVertex); - TransformUnit::TransformTexCoord(&m_Vertex, outVertex, m_TexGenSpecialCase); + TransformUnit::TransformTexCoord(&m_Vertex, outVertex, m_TexGenSpecialCase); - m_SetupUnit->SetupVertex(); + m_SetupUnit->SetupVertex(); - INCSTAT(swstats.thisFrame.numVerticesLoaded) + INCSTAT(swstats.thisFrame.numVerticesLoaded) } void SWVertexLoader::AddAttributeLoader(AttributeLoader loader, u8 index) { - _assert_msg_(VIDEO, m_NumAttributeLoaders < 21, "Too many attribute loaders"); - m_AttributeLoaders[m_NumAttributeLoaders].loader = loader; - m_AttributeLoaders[m_NumAttributeLoaders++].index = index; + _assert_msg_(VIDEO, m_NumAttributeLoaders < 21, "Too many attribute loaders"); + m_AttributeLoaders[m_NumAttributeLoaders].loader = loader; + m_AttributeLoaders[m_NumAttributeLoaders++].index = index; } void SWVertexLoader::LoadPosMtx(SWVertexLoader *vertexLoader, InputVertexData *vertex, u8 unused) { - vertex->posMtx = DataReadU8() & 0x3f; + vertex->posMtx = DataReadU8() & 0x3f; } void SWVertexLoader::LoadTexMtx(SWVertexLoader *vertexLoader, InputVertexData *vertex, u8 index) { - vertex->texMtx[index] = DataReadU8() & 0x3f; -} + vertex->texMtx[index] = DataReadU8() & 0x3f; +} void SWVertexLoader::LoadPosition(SWVertexLoader *vertexLoader, InputVertexData *vertex, u8 unused) { - VertexManager::s_pCurBufferPointer = (u8*)&vertex->position; - vertexLoader->m_positionLoader(); + VertexManager::s_pCurBufferPointer = (u8*)&vertex->position; + vertexLoader->m_positionLoader(); } void SWVertexLoader::LoadNormal(SWVertexLoader *vertexLoader, InputVertexData *vertex, u8 unused) { VertexManager::s_pCurBufferPointer = (u8*)&vertex->normal; - vertexLoader->m_normalLoader(); + vertexLoader->m_normalLoader(); } void SWVertexLoader::LoadColor(SWVertexLoader *vertexLoader, InputVertexData *vertex, u8 index) { - u32 color; - VertexManager::s_pCurBufferPointer = (u8*)&color; - colIndex = index; - vertexLoader->m_colorLoader[index](); + u32 color; + VertexManager::s_pCurBufferPointer = (u8*)&color; + colIndex = index; + vertexLoader->m_colorLoader[index](); - // rgba -> abgr - *(u32*)vertex->color[index] = Common::swap32(color); + // rgba -> abgr + *(u32*)vertex->color[index] = Common::swap32(color); } void SWVertexLoader::LoadTexCoord(SWVertexLoader *vertexLoader, InputVertexData *vertex, u8 index) { - VertexManager::s_pCurBufferPointer = (u8*)&vertex->texCoords[index]; - tcIndex = index; - vertexLoader->m_texCoordLoader[index](); + VertexManager::s_pCurBufferPointer = (u8*)&vertex->texCoords[index]; + tcIndex = index; + vertexLoader->m_texCoordLoader[index](); } void SWVertexLoader::DoState(PointerWrap &p) @@ -339,4 +344,4 @@ void SWVertexLoader::DoState(PointerWrap &p) p.Do(m_NumAttributeLoaders); m_SetupUnit->DoState(p); p.Do(m_TexGenSpecialCase); -}
\ No newline at end of file +} |
