swr: [rasterizer core] track guardbands per viewport rect
Signed-off-by: Tim Rowley <timothy.o.rowley@intel.com>
This commit is contained in:
@@ -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(
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user