Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #269 from magumagu/swbackend-xfregisters
SW backend: use VideoCommon XFRegisters struct.
  • Loading branch information
neobrain committed May 17, 2014
2 parents d0de0c1 + 6fbf6fa commit 0fac17d
Show file tree
Hide file tree
Showing 25 changed files with 203 additions and 270 deletions.
4 changes: 2 additions & 2 deletions Source/Core/VideoBackends/D3D/LineGeometryShader.cpp
Expand Up @@ -176,10 +176,10 @@ bool LineGeometryShader::SetShader(u32 components, float lineWidth,
code.Write("\n%s", LINE_GS_COMMON);

std::stringstream numTexCoordsStream;
numTexCoordsStream << xfregs.numTexGen.numTexGens;
numTexCoordsStream << xfmem.numTexGen.numTexGens;

INFO_LOG(VIDEO, "Compiling line geometry shader for components 0x%.08X (num texcoords %d)",
components, xfregs.numTexGen.numTexGens);
components, xfmem.numTexGen.numTexGens);

const std::string& numTexCoordsStr = numTexCoordsStream.str();
D3D_SHADER_MACRO macros[] = {
Expand Down
4 changes: 2 additions & 2 deletions Source/Core/VideoBackends/D3D/PointGeometryShader.cpp
Expand Up @@ -170,10 +170,10 @@ bool PointGeometryShader::SetShader(u32 components, float pointSize,
code.Write("\n%s", POINT_GS_COMMON);

std::stringstream numTexCoordsStream;
numTexCoordsStream << xfregs.numTexGen.numTexGens;
numTexCoordsStream << xfmem.numTexGen.numTexGens;

INFO_LOG(VIDEO, "Compiling point geometry shader for components 0x%.08X (num texcoords %d)",
components, xfregs.numTexGen.numTexGens);
components, xfmem.numTexGen.numTexGens);

const std::string& numTexCoordsStr = numTexCoordsStream.str();
D3D_SHADER_MACRO macros[] = {
Expand Down
14 changes: 7 additions & 7 deletions Source/Core/VideoBackends/D3D/Render.cpp
Expand Up @@ -487,16 +487,16 @@ void Renderer::SetViewport()
// [5] = 16777215 * farz

// D3D crashes for zero viewports
if (xfregs.viewport.wd == 0 || xfregs.viewport.ht == 0)
if (xfmem.viewport.wd == 0 || xfmem.viewport.ht == 0)
return;

int scissorXOff = bpmem.scissorOffset.x * 2;
int scissorYOff = bpmem.scissorOffset.y * 2;

float X = Renderer::EFBToScaledXf(xfregs.viewport.xOrig - xfregs.viewport.wd - scissorXOff);
float Y = Renderer::EFBToScaledYf(xfregs.viewport.yOrig + xfregs.viewport.ht - scissorYOff);
float Wd = Renderer::EFBToScaledXf(2.0f * xfregs.viewport.wd);
float Ht = Renderer::EFBToScaledYf(-2.0f * xfregs.viewport.ht);
float X = Renderer::EFBToScaledXf(xfmem.viewport.xOrig - xfmem.viewport.wd - scissorXOff);
float Y = Renderer::EFBToScaledYf(xfmem.viewport.yOrig + xfmem.viewport.ht - scissorYOff);
float Wd = Renderer::EFBToScaledXf(2.0f * xfmem.viewport.wd);
float Ht = Renderer::EFBToScaledYf(-2.0f * xfmem.viewport.ht);
if (Wd < 0.0f)
{
X += Wd;
Expand All @@ -516,8 +516,8 @@ void Renderer::SetViewport()

// Some games set invalid values for z-min and z-max so fix them to the max and min allowed and let the shaders do this work
D3D11_VIEWPORT vp = CD3D11_VIEWPORT(X, Y, Wd, Ht,
0.f, // (xfregs.viewport.farZ - xfregs.viewport.zRange) / 16777216.0f;
1.f); // xfregs.viewport.farZ / 16777216.0f;
0.f, // (xfmem.viewport.farZ - xfmem.viewport.zRange) / 16777216.0f;
1.f); // xfmem.viewport.farZ / 16777216.0f;
D3D::context->RSSetViewports(1, &vp);
}

Expand Down
8 changes: 4 additions & 4 deletions Source/Core/VideoBackends/D3D/VertexManager.cpp
Expand Up @@ -151,8 +151,8 @@ void VertexManager::Draw(UINT stride)
{
float lineWidth = float(bpmem.lineptwidth.linesize) / 6.f;
float texOffset = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff];
float vpWidth = 2.0f * xfregs.viewport.wd;
float vpHeight = -2.0f * xfregs.viewport.ht;
float vpWidth = 2.0f * xfmem.viewport.wd;
float vpHeight = -2.0f * xfmem.viewport.ht;

bool texOffsetEnable[8];

Expand All @@ -175,8 +175,8 @@ void VertexManager::Draw(UINT stride)
{
float pointSize = float(bpmem.lineptwidth.pointsize) / 6.f;
float texOffset = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff];
float vpWidth = 2.0f * xfregs.viewport.wd;
float vpHeight = -2.0f * xfregs.viewport.ht;
float vpWidth = 2.0f * xfmem.viewport.wd;
float vpHeight = -2.0f * xfmem.viewport.ht;

bool texOffsetEnable[8];

Expand Down
14 changes: 7 additions & 7 deletions Source/Core/VideoBackends/OGL/Render.cpp
Expand Up @@ -1160,12 +1160,12 @@ void Renderer::SetViewport()
int scissorYOff = bpmem.scissorOffset.y * 2;

// TODO: ceil, floor or just cast to int?
float X = EFBToScaledXf(xfregs.viewport.xOrig - xfregs.viewport.wd - (float)scissorXOff);
float Y = EFBToScaledYf((float)EFB_HEIGHT - xfregs.viewport.yOrig + xfregs.viewport.ht + (float)scissorYOff);
float Width = EFBToScaledXf(2.0f * xfregs.viewport.wd);
float Height = EFBToScaledYf(-2.0f * xfregs.viewport.ht);
float GLNear = (xfregs.viewport.farZ - xfregs.viewport.zRange) / 16777216.0f;
float GLFar = xfregs.viewport.farZ / 16777216.0f;
float X = EFBToScaledXf(xfmem.viewport.xOrig - xfmem.viewport.wd - (float)scissorXOff);
float Y = EFBToScaledYf((float)EFB_HEIGHT - xfmem.viewport.yOrig + xfmem.viewport.ht + (float)scissorYOff);
float Width = EFBToScaledXf(2.0f * xfmem.viewport.wd);
float Height = EFBToScaledYf(-2.0f * xfmem.viewport.ht);
float GLNear = (xfmem.viewport.farZ - xfmem.viewport.zRange) / 16777216.0f;
float GLFar = xfmem.viewport.farZ / 16777216.0f;
if (Width < 0)
{
X += Width;
Expand Down Expand Up @@ -1807,7 +1807,7 @@ void Renderer::SetDitherMode()

void Renderer::SetLineWidth()
{
float fratio = xfregs.viewport.wd != 0 ?
float fratio = xfmem.viewport.wd != 0 ?
((float)Renderer::GetTargetWidth() / EFB_WIDTH) : 1.0f;
if (bpmem.lineptwidth.linesize > 0)
// scale by ratio of widths
Expand Down
10 changes: 5 additions & 5 deletions Source/Core/VideoBackends/Software/Clipper.cpp
Expand Up @@ -67,8 +67,8 @@ namespace Clipper

void SetViewOffset()
{
m_ViewOffset[0] = swxfregs.viewport.xOrig - 342;
m_ViewOffset[1] = swxfregs.viewport.yOrig - 342;
m_ViewOffset[0] = xfmem.viewport.xOrig - 342;
m_ViewOffset[1] = xfmem.viewport.yOrig - 342;
}


Expand Down Expand Up @@ -430,9 +430,9 @@ namespace Clipper
Vec3 &screen = vertex->screenPosition;

float wInverse = 1.0f/projected.w;
screen.x = projected.x * wInverse * swxfregs.viewport.wd + m_ViewOffset[0];
screen.y = projected.y * wInverse * swxfregs.viewport.ht + m_ViewOffset[1];
screen.z = projected.z * wInverse * swxfregs.viewport.zRange + swxfregs.viewport.farZ;
screen.x = projected.x * wInverse * xfmem.viewport.wd + m_ViewOffset[0];
screen.y = projected.y * wInverse * xfmem.viewport.ht + m_ViewOffset[1];
screen.z = projected.z * wInverse * xfmem.viewport.zRange + xfmem.viewport.farZ;
}

}
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/Software/Rasterizer.cpp
Expand Up @@ -270,7 +270,7 @@ void BuildBlock(s32 blockX, s32 blockY)
for (unsigned int i = 0; i < bpmem.genMode.numtexgens; i++)
{
float projection = invW;
if (swxfregs.texMtxInfo[i].projection)
if (xfmem.texMtxInfo[i].projection)
{
float q = TexSlopes[i][2].GetValue(dx, dy) * invW;
if (q != 0.0f)
Expand Down
38 changes: 19 additions & 19 deletions Source/Core/VideoBackends/Software/SWVertexLoader.cpp
Expand Up @@ -95,15 +95,15 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType)

// 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 ||
swxfregs.MatrixIndexA.Tex2MtxIdx != MatrixIndexA.Tex2MtxIdx ||
swxfregs.MatrixIndexA.Tex3MtxIdx != MatrixIndexA.Tex3MtxIdx ||
swxfregs.MatrixIndexB.Tex4MtxIdx != MatrixIndexB.Tex4MtxIdx ||
swxfregs.MatrixIndexB.Tex5MtxIdx != MatrixIndexB.Tex5MtxIdx ||
swxfregs.MatrixIndexB.Tex6MtxIdx != MatrixIndexB.Tex6MtxIdx ||
swxfregs.MatrixIndexB.Tex7MtxIdx != MatrixIndexB.Tex7MtxIdx)
if (xfmem.MatrixIndexA.PosNormalMtxIdx != MatrixIndexA.PosNormalMtxIdx ||
xfmem.MatrixIndexA.Tex0MtxIdx != MatrixIndexA.Tex0MtxIdx ||
xfmem.MatrixIndexA.Tex1MtxIdx != MatrixIndexA.Tex1MtxIdx ||
xfmem.MatrixIndexA.Tex2MtxIdx != MatrixIndexA.Tex2MtxIdx ||
xfmem.MatrixIndexA.Tex3MtxIdx != MatrixIndexA.Tex3MtxIdx ||
xfmem.MatrixIndexB.Tex4MtxIdx != MatrixIndexB.Tex4MtxIdx ||
xfmem.MatrixIndexB.Tex5MtxIdx != MatrixIndexB.Tex5MtxIdx ||
xfmem.MatrixIndexB.Tex6MtxIdx != MatrixIndexB.Tex6MtxIdx ||
xfmem.MatrixIndexB.Tex7MtxIdx != MatrixIndexB.Tex7MtxIdx)
{
WARN_LOG(VIDEO, "Matrix indices don't match");

Expand All @@ -114,15 +114,15 @@ 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 = xfmem.MatrixIndexA.PosNormalMtxIdx;
m_Vertex.texMtx[0] = xfmem.MatrixIndexA.Tex0MtxIdx;
m_Vertex.texMtx[1] = xfmem.MatrixIndexA.Tex1MtxIdx;
m_Vertex.texMtx[2] = xfmem.MatrixIndexA.Tex2MtxIdx;
m_Vertex.texMtx[3] = xfmem.MatrixIndexA.Tex3MtxIdx;
m_Vertex.texMtx[4] = xfmem.MatrixIndexB.Tex4MtxIdx;
m_Vertex.texMtx[5] = xfmem.MatrixIndexB.Tex5MtxIdx;
m_Vertex.texMtx[6] = xfmem.MatrixIndexB.Tex6MtxIdx;
m_Vertex.texMtx[7] = xfmem.MatrixIndexB.Tex7MtxIdx;
#else
m_Vertex.posMtx = MatrixIndexA.PosNormalMtxIdx;
m_Vertex.texMtx[0] = MatrixIndexA.Tex0MtxIdx;
Expand Down Expand Up @@ -242,7 +242,7 @@ void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType)
m_TexGenSpecialCase =
((g_VtxDesc.Hex & 0x60600L) == g_VtxDesc.Hex) && // only pos and tex coord 0
(g_VtxDesc.Tex0Coord != NOT_PRESENT) &&
(swxfregs.texMtxInfo[0].projection == XF_TEXPROJ_ST);
(xfmem.texMtxInfo[0].projection == XF_TEXPROJ_ST);

m_SetupUnit->Init(primitiveType);
}
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/Software/SWmain.cpp
Expand Up @@ -115,7 +115,7 @@ void VideoSoftware::DoState(PointerWrap& p)
EfbInterface::DoState(p);
OpcodeDecoder::DoState(p);
Clipper::DoState(p);
p.Do(swxfregs);
p.Do(xfmem);
p.Do(bpmem);
p.DoPOD(swstats);

Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/Software/Tev.cpp
Expand Up @@ -699,7 +699,7 @@ void Tev::Draw()
// - scaling of the "k" coefficient isn't clear either.

// First, calculate the offset from the viewport center (normalized to 0..1)
float offset = (Position[0] - (bpmem.fogRange.Base.Center - 342)) / (float)swxfregs.viewport.wd;
float offset = (Position[0] - (bpmem.fogRange.Base.Center - 342)) / (float)xfmem.viewport.wd;

// Based on that, choose the index such that points which are far away from the z-axis use the 10th "k" value and such that central points use the first value.
float floatindex = 9.f - std::abs(offset) * 9.f;
Expand Down
46 changes: 23 additions & 23 deletions Source/Core/VideoBackends/Software/TransformUnit.cpp
Expand Up @@ -70,22 +70,22 @@ void MultipleVec3Ortho(const Vec3 &vec, const float *proj, Vec4 &result)

void TransformPosition(const InputVertexData *src, OutputVertexData *dst)
{
const float* mat = (const float*)&swxfregs.posMatrices[src->posMtx * 4];
const float* mat = (const float*)&xfmem.posMatrices[src->posMtx * 4];
MultiplyVec3Mat34(src->position, mat, dst->mvPosition);

if (swxfregs.projection.type == GX_PERSPECTIVE)
if (xfmem.projection.type == GX_PERSPECTIVE)
{
MultipleVec3Perspective(dst->mvPosition, swxfregs.projection.rawProjection, dst->projectedPosition);
MultipleVec3Perspective(dst->mvPosition, xfmem.projection.rawProjection, dst->projectedPosition);
}
else
{
MultipleVec3Ortho(dst->mvPosition, swxfregs.projection.rawProjection, dst->projectedPosition);
MultipleVec3Ortho(dst->mvPosition, xfmem.projection.rawProjection, dst->projectedPosition);
}
}

void TransformNormal(const InputVertexData *src, bool nbt, OutputVertexData *dst)
{
const float* mat = (const float*)&swxfregs.normalMatrices[(src->posMtx & 31) * 3];
const float* mat = (const float*)&xfmem.normalMatrices[(src->posMtx & 31) * 3];

if (nbt)
{
Expand Down Expand Up @@ -124,7 +124,7 @@ void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, bool spec
break;
}

const float *mat = (const float*)&swxfregs.posMatrices[srcVertex->texMtx[coordNum] * 4];
const float *mat = (const float*)&xfmem.posMatrices[srcVertex->texMtx[coordNum] * 4];
Vec3 *dst = &dstVertex->texCoords[coordNum];

if (texinfo.projection == XF_TEXPROJ_ST)
Expand All @@ -144,13 +144,13 @@ void TransformTexCoordRegular(const TexMtxInfo &texinfo, int coordNum, bool spec
MultiplyVec3Mat34(*src, mat, *dst);
}

if (swxfregs.dualTexTrans)
if (xfmem.dualTexTrans.enabled)
{
Vec3 tempCoord;

// normalize
const PostMtxInfo &postInfo = swxfregs.postMtxInfo[coordNum];
const float *postMat = (const float*)&swxfregs.postMatrices[postInfo.index * 4];
const PostMtxInfo &postInfo = xfmem.postMtxInfo[coordNum];
const float *postMat = (const float*)&xfmem.postMatrices[postInfo.index * 4];

if (specialCase)
{
Expand Down Expand Up @@ -212,7 +212,7 @@ inline float SafeDivide(float n, float d)

void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, Vec3 &lightCol)
{
const LightPointer *light = (const LightPointer*)&swxfregs.lights[0x10*lightNum];
const LightPointer *light = (const LightPointer*)&xfmem.lights[0x10*lightNum];

if (!(chan.attnfunc & 1))
{
Expand Down Expand Up @@ -297,7 +297,7 @@ void LightColor(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChann

void LightAlpha(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChannel &chan, float &lightCol)
{
const LightPointer *light = (const LightPointer*)&swxfregs.lights[0x10*lightNum];
const LightPointer *light = (const LightPointer*)&xfmem.lights[0x10*lightNum];

if (!(chan.attnfunc & 1))
{
Expand Down Expand Up @@ -376,18 +376,18 @@ void LightAlpha(const Vec3 &pos, const Vec3 &normal, u8 lightNum, const LitChann

void TransformColor(const InputVertexData *src, OutputVertexData *dst)
{
for (u32 chan = 0; chan < swxfregs.nNumChans; chan++)
for (u32 chan = 0; chan < xfmem.numChan.numColorChans; chan++)
{
// abgr
u8 matcolor[4];
u8 chancolor[4];

// color
LitChannel &colorchan = swxfregs.color[chan];
LitChannel &colorchan = xfmem.color[chan];
if (colorchan.matsource)
*(u32*)matcolor = *(u32*)src->color[chan]; // vertex
else
*(u32*)matcolor = swxfregs.matColor[chan];
*(u32*)matcolor = xfmem.matColor[chan];

if (colorchan.enablelighting)
{
Expand All @@ -401,7 +401,7 @@ void TransformColor(const InputVertexData *src, OutputVertexData *dst)
}
else
{
u8 *ambColor = (u8*)&swxfregs.ambColor[chan];
u8 *ambColor = (u8*)&xfmem.ambColor[chan];
lightCol.x = ambColor[1];
lightCol.y = ambColor[2];
lightCol.z = ambColor[3];
Expand All @@ -425,19 +425,19 @@ void TransformColor(const InputVertexData *src, OutputVertexData *dst)
}

// alpha
LitChannel &alphachan = swxfregs.alpha[chan];
LitChannel &alphachan = xfmem.alpha[chan];
if (alphachan.matsource)
matcolor[0] = src->color[chan][0]; // vertex
else
matcolor[0] = swxfregs.matColor[chan] & 0xff;
matcolor[0] = xfmem.matColor[chan] & 0xff;

if (swxfregs.alpha[chan].enablelighting)
if (xfmem.alpha[chan].enablelighting)
{
float lightCol;
if (alphachan.ambsource)
lightCol = src->color[chan][0]; // vertex
else
lightCol = (float)(swxfregs.ambColor[chan] & 0xff);
lightCol = (float)(xfmem.ambColor[chan] & 0xff);

u8 mask = alphachan.GetFullLightMask();
for (int i = 0; i < 8; ++i)
Expand All @@ -460,9 +460,9 @@ void TransformColor(const InputVertexData *src, OutputVertexData *dst)

void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool specialCase)
{
for (u32 coordNum = 0; coordNum < swxfregs.numTexGens; coordNum++)
for (u32 coordNum = 0; coordNum < xfmem.numTexGen.numTexGens; coordNum++)
{
const TexMtxInfo &texinfo = swxfregs.texMtxInfo[coordNum];
const TexMtxInfo &texinfo = xfmem.texMtxInfo[coordNum];

switch (texinfo.texgentype)
{
Expand All @@ -471,7 +471,7 @@ void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool s
break;
case XF_TEXGEN_EMBOSS_MAP:
{
const LightPointer *light = (const LightPointer*)&swxfregs.lights[0x10*texinfo.embosslightshift];
const LightPointer *light = (const LightPointer*)&xfmem.lights[0x10*texinfo.embosslightshift];

Vec3 ldir = (light->pos - dst->mvPosition).normalized();
float d1 = ldir * dst->normal[1];
Expand Down Expand Up @@ -501,7 +501,7 @@ void TransformTexCoord(const InputVertexData *src, OutputVertexData *dst, bool s
}
}

for (u32 coordNum = 0; coordNum < swxfregs.numTexGens; coordNum++)
for (u32 coordNum = 0; coordNum < xfmem.numTexGen.numTexGens; coordNum++)
{
dst->texCoords[coordNum][0] *= (bpmem.texcoords[coordNum].s.scale_minus_1 + 1);
dst->texCoords[coordNum][1] *= (bpmem.texcoords[coordNum].t.scale_minus_1 + 1);
Expand Down

0 comments on commit 0fac17d

Please sign in to comment.