swr: [rasterizer core] track guardbands per viewport rect

Signed-off-by: Tim Rowley <timothy.o.rowley@intel.com>
This commit is contained in:
Tim Rowley
2016-08-18 13:12:48 -05:00
parent b473bec878
commit 9e4a482d46
3 changed files with 26 additions and 18 deletions

View File

@@ -639,13 +639,18 @@ void SwrSetBlendFunc(
} }
// update guardband multipliers for the viewport // update guardband multipliers for the viewport
void updateGuardband(API_STATE *pState) void updateGuardbands(API_STATE *pState)
{ {
// guardband center is viewport center uint32_t numGbs = pState->gsState.emitsRenderTargetArrayIndex ? KNOB_NUM_VIEWPORTS_SCISSORS : 1;
pState->gbState.left = KNOB_GUARDBAND_WIDTH / pState->vp[0].width;
pState->gbState.right = KNOB_GUARDBAND_WIDTH / pState->vp[0].width; for(uint32_t i = 0; i < numGbs; ++i)
pState->gbState.top = KNOB_GUARDBAND_HEIGHT / pState->vp[0].height; {
pState->gbState.bottom = KNOB_GUARDBAND_HEIGHT / pState->vp[0].height; // guardband center is viewport center
pState->gbState.left[i] = KNOB_GUARDBAND_WIDTH / pState->vp[i].width;
pState->gbState.right[i] = KNOB_GUARDBAND_WIDTH / pState->vp[i].width;
pState->gbState.top[i] = KNOB_GUARDBAND_HEIGHT / pState->vp[i].height;
pState->gbState.bottom[i] = KNOB_GUARDBAND_HEIGHT / pState->vp[i].height;
}
} }
void SwrSetRastState( void SwrSetRastState(
@@ -709,7 +714,7 @@ void SwrSetViewports(
} }
} }
updateGuardband(pState); updateGuardbands(pState);
} }
void SwrSetScissorRects( void SwrSetScissorRects(

View File

@@ -63,7 +63,7 @@ void Clip(const float *pTriangle, const float *pAttribs, int numAttribs, float *
int *numVerts, float *pOutAttribs); int *numVerts, float *pOutAttribs);
INLINE INLINE
void ComputeClipCodes(DRIVER_TYPE type, const API_STATE& state, const simdvector& vertex, simdscalar& clipCodes) void ComputeClipCodes(DRIVER_TYPE type, const API_STATE& state, const simdvector& vertex, simdscalar& clipCodes, simdscalari viewportIndexes)
{ {
clipCodes = _simd_setzero_ps(); clipCodes = _simd_setzero_ps();
@@ -110,22 +110,22 @@ void ComputeClipCodes(DRIVER_TYPE type, const API_STATE& state, const simdvector
clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(NEGW)))); clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(NEGW))));
// GUARDBAND_LEFT // GUARDBAND_LEFT
simdscalar gbMult = _simd_mul_ps(vNegW, _simd_set1_ps(state.gbState.left)); simdscalar gbMult = _simd_mul_ps(vNegW, _simd_i32gather_ps(&state.gbState.left[0], viewportIndexes, 4));
vRes = _simd_cmplt_ps(vertex.x, gbMult); vRes = _simd_cmplt_ps(vertex.x, gbMult);
clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_LEFT)))); clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_LEFT))));
// GUARDBAND_TOP // GUARDBAND_TOP
gbMult = _simd_mul_ps(vNegW, _simd_set1_ps(state.gbState.top)); gbMult = _simd_mul_ps(vNegW, _simd_i32gather_ps(&state.gbState.top[0], viewportIndexes, 4));
vRes = _simd_cmplt_ps(vertex.y, gbMult); vRes = _simd_cmplt_ps(vertex.y, gbMult);
clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_TOP)))); clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_TOP))));
// GUARDBAND_RIGHT // GUARDBAND_RIGHT
gbMult = _simd_mul_ps(vertex.w, _simd_set1_ps(state.gbState.right)); gbMult = _simd_mul_ps(vertex.w, _simd_i32gather_ps(&state.gbState.right[0], viewportIndexes, 4));
vRes = _simd_cmpgt_ps(vertex.x, gbMult); vRes = _simd_cmpgt_ps(vertex.x, gbMult);
clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_RIGHT)))); clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_RIGHT))));
// GUARDBAND_BOTTOM // GUARDBAND_BOTTOM
gbMult = _simd_mul_ps(vertex.w, _simd_set1_ps(state.gbState.bottom)); gbMult = _simd_mul_ps(vertex.w, _simd_i32gather_ps(&state.gbState.bottom[0], viewportIndexes, 4));
vRes = _simd_cmpgt_ps(vertex.y, gbMult); vRes = _simd_cmpgt_ps(vertex.y, gbMult);
clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_BOTTOM)))); clipCodes = _simd_or_ps(clipCodes, _simd_and_ps(vRes, _simd_castsi_ps(_simd_set1_epi32(GUARDBAND_BOTTOM))));
} }
@@ -140,11 +140,11 @@ public:
static_assert(NumVertsPerPrim >= 1 && NumVertsPerPrim <= 3, "Invalid NumVertsPerPrim"); static_assert(NumVertsPerPrim >= 1 && NumVertsPerPrim <= 3, "Invalid NumVertsPerPrim");
} }
void ComputeClipCodes(simdvector vertex[]) void ComputeClipCodes(simdvector vertex[], simdscalari viewportIndexes)
{ {
for (uint32_t i = 0; i < NumVertsPerPrim; ++i) for (uint32_t i = 0; i < NumVertsPerPrim; ++i)
{ {
::ComputeClipCodes(this->driverType, this->state, vertex[i], this->clipCodes[i]); ::ComputeClipCodes(this->driverType, this->state, vertex[i], this->clipCodes[i], viewportIndexes);
} }
} }
@@ -524,7 +524,7 @@ public:
uint32_t numInvoc = _mm_popcnt_u32(primMask); uint32_t numInvoc = _mm_popcnt_u32(primMask);
UPDATE_STAT_FE(CInvocations, numInvoc); UPDATE_STAT_FE(CInvocations, numInvoc);
ComputeClipCodes(prim); ComputeClipCodes(prim, viewportIdx);
// cull prims with NAN coords // cull prims with NAN coords
primMask &= ~ComputeNaNMask(prim); primMask &= ~ComputeNaNMask(prim);

View File

@@ -209,9 +209,12 @@ struct FE_WORK
} desc; } desc;
}; };
struct GUARDBAND struct GUARDBANDS
{ {
float left, right, top, bottom; float left[KNOB_NUM_VIEWPORTS_SCISSORS];
float right[KNOB_NUM_VIEWPORTS_SCISSORS];
float top[KNOB_NUM_VIEWPORTS_SCISSORS];
float bottom[KNOB_NUM_VIEWPORTS_SCISSORS];
}; };
struct PA_STATE; struct PA_STATE;
@@ -269,7 +272,7 @@ OSALIGNLINE(struct) API_STATE
// floating point multisample offsets // floating point multisample offsets
float samplePos[SWR_MAX_NUM_MULTISAMPLES * 2]; float samplePos[SWR_MAX_NUM_MULTISAMPLES * 2];
GUARDBAND gbState; GUARDBANDS gbState;
SWR_VIEWPORT vp[KNOB_NUM_VIEWPORTS_SCISSORS]; SWR_VIEWPORT vp[KNOB_NUM_VIEWPORTS_SCISSORS];
SWR_VIEWPORT_MATRICES vpMatrices; SWR_VIEWPORT_MATRICES vpMatrices;