Skip to content
Permalink
Browse files
No need for persistent mpXformedPos in TransformedAABBoxSSE, just kee…
…p them on the stack.
  • Loading branch information
rygorous committed Feb 24, 2013
1 parent 2411249 commit 0fad7d4
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 19 deletions.
@@ -93,6 +93,8 @@ void AABBoxRasterizerSSEMT::TransformAABBoxAndDepthTest(UINT taskId)
BoxTestSetup setup;
setup.Init(mViewMatrix, mProjMatrix, mpCamera, mOccludeeSizeThreshold);

__m128 xformedPos[AABB_VERTICES];

static const UINT kChunkSize = 64;
for(UINT base = taskId*kChunkSize; base < mNumModels; base += mNumDepthTestTasks * kChunkSize)
{
@@ -103,8 +105,8 @@ void AABBoxRasterizerSSEMT::TransformAABBoxAndDepthTest(UINT taskId)

if(mpBBoxVisible[i] && !mpTransformedAABBox[i].IsTooSmall(setup))
{
if(mpTransformedAABBox[i].TransformAABBox())
mpVisible[i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels);
if(mpTransformedAABBox[i].TransformAABBox(xformedPos))
mpVisible[i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels, xformedPos);
else
mpVisible[i] = true;
}
@@ -50,14 +50,16 @@ void AABBoxRasterizerSSEST::TransformAABBoxAndDepthTest()
BoxTestSetup setup;
setup.Init(mViewMatrix, mProjMatrix, mpCamera, mOccludeeSizeThreshold);

__m128 xformedPos[AABB_VERTICES];

for(UINT i = 0; i < mNumModels; i++)
{
mpVisible[i] = false;

if(mpBBoxVisible[i] && !mpTransformedAABBox[i].IsTooSmall(setup))
{
if(mpTransformedAABBox[i].TransformAABBox())
mpVisible[i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels);
if(mpTransformedAABBox[i].TransformAABBox(xformedPos))
mpVisible[i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels, xformedPos);
else
mpVisible[i] = true;
}
@@ -65,15 +65,13 @@ TransformedAABBoxSSE::TransformedAABBoxSSE()
{
mWorldMatrix = (__m128*)_aligned_malloc(sizeof(float) * 4 * 4, 16);
mpBBVertexList = (__m128*)_aligned_malloc(sizeof(float) * 4 * AABB_VERTICES, 16);
mpXformedPos = (__m128*)_aligned_malloc(sizeof(float) * 4 * AABB_VERTICES, 16);
mCumulativeMatrix = (__m128*)_aligned_malloc(sizeof(float) * 4 * 4, 16);
}

TransformedAABBoxSSE::~TransformedAABBoxSSE()
{
_aligned_free(mWorldMatrix);
_aligned_free(mpBBVertexList);
_aligned_free(mpXformedPos);
_aligned_free(mCumulativeMatrix);
}

@@ -131,7 +129,7 @@ bool TransformedAABBoxSSE::IsTooSmall(const BoxTestSetup &setup)
//----------------------------------------------------------------
// Trasforms the AABB vertices to screen space once every frame
//----------------------------------------------------------------
bool TransformedAABBoxSSE::TransformAABBox()
bool TransformedAABBoxSSE::TransformAABBox(__m128 xformedPos[])
{
__m128 zAllIn = _mm_castsi128_ps(_mm_set1_epi32(~0));

@@ -146,24 +144,24 @@ bool TransformedAABBoxSSE::TransformAABBox()
zAllIn = _mm_and_ps(zAllIn, zIn);

// project
mpXformedPos[i] = _mm_div_ps(vert, vertW);
xformedPos[i] = _mm_div_ps(vert, vertW);
}

// return true if and only if none of the verts are z-clipped
return _mm_movemask_ps(zAllIn) == 0xf;
}

void TransformedAABBoxSSE::Gather(vFloat4 pOut[3], UINT triId)
void TransformedAABBoxSSE::Gather(vFloat4 pOut[3], UINT triId, const __m128 xformedPos[])
{
for(int lane = 0; lane < SSE; lane++)
{
for(int i = 0; i < 3; i++)
{
UINT index = sBBIndexList[(triId * 3) + (lane * 3) + i];
pOut[i].X.lane[lane] = mpXformedPos[index].m128_f32[0];
pOut[i].Y.lane[lane] = mpXformedPos[index].m128_f32[1];
pOut[i].Z.lane[lane] = mpXformedPos[index].m128_f32[2];
pOut[i].W.lane[lane] = mpXformedPos[index].m128_f32[3];
pOut[i].X.lane[lane] = xformedPos[index].m128_f32[0];
pOut[i].Y.lane[lane] = xformedPos[index].m128_f32[1];
pOut[i].Z.lane[lane] = xformedPos[index].m128_f32[2];
pOut[i].W.lane[lane] = xformedPos[index].m128_f32[3];
}
}
}
@@ -173,7 +171,7 @@ void TransformedAABBoxSSE::Gather(vFloat4 pOut[3], UINT triId)
// If any of the rasterized AABB pixels passes the depth test exit early and mark the occludee
// as visible. If all rasterized AABB pixels are occluded then the occludee is culled
//-----------------------------------------------------------------------------------------
bool TransformedAABBoxSSE::RasterizeAndDepthTestAABBox(UINT *pRenderTargetPixels)
bool TransformedAABBoxSSE::RasterizeAndDepthTestAABBox(UINT *pRenderTargetPixels, const __m128 pXformedPos[])
{
// Set DAZ and FZ MXCSR bits to flush denormals to zero (i.e., make it faster)
// Denormal are zero (DAZ) is bit 6 and Flush to zero (FZ) is bit 15.
@@ -189,7 +187,7 @@ bool TransformedAABBoxSSE::RasterizeAndDepthTestAABBox(UINT *pRenderTargetPixels
for(UINT i = 0; i < AABB_TRIANGLES; i += SSE)
{
vFloat4 xformedPos[3];
Gather(xformedPos, i);
Gather(xformedPos, i, pXformedPos);

// use fixed-point only for X and Y.
VecS32 fixX[3], fixY[3];
@@ -41,21 +41,20 @@ class TransformedAABBoxSSE : public HelperSSE

bool IsTooSmall(const BoxTestSetup &setup);

bool TransformAABBox();
bool TransformAABBox(__m128 xformedPos[]);

bool RasterizeAndDepthTestAABBox(UINT *pRenderTargetPixels);
bool RasterizeAndDepthTestAABBox(UINT *pRenderTargetPixels, const __m128 xformedPos[]);

private:
CPUTModelDX11 *mpCPUTModel;
__m128 *mWorldMatrix;
__m128 *mpBBVertexList;
__m128 *mpXformedPos;
__m128 *mCumulativeMatrix;

float3 mBBCenter;
float mRadiusSq;

void Gather(vFloat4 pOut[3], UINT triId);
void Gather(vFloat4 pOut[3], UINT triId, const __m128 xformedPos[]);
};


0 comments on commit 0fad7d4

Please sign in to comment.