Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #9424 from Pokechu22/sw-no-special-case
Software: Remove normalization special case
  • Loading branch information
leoetlino committed Feb 11, 2021
2 parents 1fc6fbc + e825af7 commit a354814
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 34 deletions.
7 changes: 1 addition & 6 deletions Source/Core/VideoBackends/Software/SWVertexLoader.cpp
Expand Up @@ -84,7 +84,7 @@ void SWVertexLoader::DrawCurrentBatch(u32 base_index, u32 num_indices, u32 base_
&m_vertex, (VertexLoaderManager::g_current_components & VB_HAS_NRM2) != 0, outVertex);
}
TransformUnit::TransformColor(&m_vertex, outVertex);
TransformUnit::TransformTexCoord(&m_vertex, outVertex, m_tex_gen_special_case);
TransformUnit::TransformTexCoord(&m_vertex, outVertex);

// assemble and rasterize the primitive
m_setup_unit.SetupVertex();
Expand Down Expand Up @@ -120,11 +120,6 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType)
m_vertex.texMtx[5] = xfmem.MatrixIndexB.Tex5MtxIdx;
m_vertex.texMtx[6] = xfmem.MatrixIndexB.Tex6MtxIdx;
m_vertex.texMtx[7] = xfmem.MatrixIndexB.Tex7MtxIdx;

// special case if only pos and tex coord 0 and tex coord input is AB11
// http://libogc.devkitpro.org/gx_8h.html#a55a426a3ff796db584302bddd829f002
m_tex_gen_special_case = VertexLoaderManager::g_current_components == VB_HAS_UV0 &&
xfmem.texMtxInfo[0].projection == XF_TEXPROJ_ST;
}

template <typename T, typename I>
Expand Down
2 changes: 0 additions & 2 deletions Source/Core/VideoBackends/Software/SWVertexLoader.h
Expand Up @@ -28,6 +28,4 @@ class SWVertexLoader final : public VertexManagerBase

InputVertexData m_vertex;
SetupUnit m_setup_unit;

bool m_tex_gen_special_case;
};
33 changes: 8 additions & 25 deletions Source/Core/VideoBackends/Software/TransformUnit.cpp
Expand Up @@ -109,7 +109,7 @@ void TransformNormal(const InputVertexData* src, bool nbt, OutputVertexData* dst
}
}

static void TransformTexCoordRegular(const TexMtxInfo& texinfo, int coordNum, bool specialCase,
static void TransformTexCoordRegular(const TexMtxInfo& texinfo, int coordNum,
const InputVertexData* srcVertex, OutputVertexData* dstVertex)
{
Vec3 src;
Expand Down Expand Up @@ -140,15 +140,13 @@ static void TransformTexCoordRegular(const TexMtxInfo& texinfo, int coordNum, bo

if (texinfo.projection == XF_TEXPROJ_ST)
{
if (texinfo.inputform == XF_TEXINPUT_AB11 || specialCase)
if (texinfo.inputform == XF_TEXINPUT_AB11)
MultiplyVec2Mat24(src, mat, *dst);
else
MultiplyVec3Mat24(src, mat, *dst);
}
else // texinfo.projection == XF_TEXPROJ_STQ
{
ASSERT(!specialCase);

if (texinfo.inputform == XF_TEXINPUT_AB11)
MultiplyVec2Mat34(src, mat, *dst);
else
Expand All @@ -163,27 +161,12 @@ static void TransformTexCoordRegular(const TexMtxInfo& texinfo, int coordNum, bo
const PostMtxInfo& postInfo = xfmem.postMtxInfo[coordNum];
const float* postMat = &xfmem.postMatrices[postInfo.index * 4];

if (specialCase)
{
// no normalization
// q of input is 1
// q of output is unknown
tempCoord.x = dst->x;
tempCoord.y = dst->y;

dst->x = postMat[0] * tempCoord.x + postMat[1] * tempCoord.y + postMat[2] + postMat[3];
dst->y = postMat[4] * tempCoord.x + postMat[5] * tempCoord.y + postMat[6] + postMat[7];
dst->z = 1.0f;
}
if (postInfo.normalize)
tempCoord = dst->Normalized();
else
{
if (postInfo.normalize)
tempCoord = dst->Normalized();
else
tempCoord = *dst;
tempCoord = *dst;

MultiplyVec3Mat34(tempCoord, postMat, *dst);
}
MultiplyVec3Mat34(tempCoord, postMat, *dst);
}

// When q is 0, the GameCube appears to have a special case
Expand Down Expand Up @@ -406,7 +389,7 @@ void TransformColor(const InputVertexData* src, OutputVertexData* dst)
}
}

void TransformTexCoord(const InputVertexData* src, OutputVertexData* dst, bool specialCase)
void TransformTexCoord(const InputVertexData* src, OutputVertexData* dst)
{
for (u32 coordNum = 0; coordNum < xfmem.numTexGen.numTexGens; coordNum++)
{
Expand All @@ -415,7 +398,7 @@ void TransformTexCoord(const InputVertexData* src, OutputVertexData* dst, bool s
switch (texinfo.texgentype)
{
case XF_TEXGEN_REGULAR:
TransformTexCoordRegular(texinfo, coordNum, specialCase, src, dst);
TransformTexCoordRegular(texinfo, coordNum, src, dst);
break;
case XF_TEXGEN_EMBOSS_MAP:
{
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/Software/TransformUnit.h
Expand Up @@ -12,5 +12,5 @@ namespace TransformUnit
void TransformPosition(const InputVertexData* src, OutputVertexData* dst);
void TransformNormal(const InputVertexData* src, bool nbt, OutputVertexData* dst);
void TransformColor(const InputVertexData* src, OutputVertexData* dst);
void TransformTexCoord(const InputVertexData* src, OutputVertexData* dst, bool specialCase);
void TransformTexCoord(const InputVertexData* src, OutputVertexData* dst);
} // namespace TransformUnit

0 comments on commit a354814

Please sign in to comment.