From ad153189ec3fb16fdca2666e0bfe2b88d31ebb70 Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Fri, 5 Aug 2016 16:42:24 -0600 Subject: [PATCH] swr: [rasterizer core] viewport array support Change viewport matrix storage from AOS to SOA to support viewport arrays. Signed-off-by: Tim Rowley --- src/gallium/drivers/swr/rasterizer/core/api.cpp | 30 ++++++++++++---------- src/gallium/drivers/swr/rasterizer/core/api.h | 2 +- src/gallium/drivers/swr/rasterizer/core/context.h | 2 +- .../drivers/swr/rasterizer/core/frontend.cpp | 6 ++--- src/gallium/drivers/swr/rasterizer/core/frontend.h | 14 +++++----- src/gallium/drivers/swr/rasterizer/core/state.h | 13 ++++++++++ src/gallium/drivers/swr/swr_state.cpp | 14 +++++----- src/gallium/drivers/swr/swr_state.h | 2 +- 8 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp index 5ebefab..3e1bb33 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp @@ -663,7 +663,7 @@ void SwrSetViewports( HANDLE hContext, uint32_t numViewports, const SWR_VIEWPORT* pViewports, - const SWR_VIEWPORT_MATRIX* pMatrices) + const SWR_VIEWPORT_MATRICES* pMatrices) { SWR_ASSERT(numViewports <= KNOB_NUM_VIEWPORTS_SCISSORS, "Invalid number of viewports."); @@ -675,7 +675,9 @@ void SwrSetViewports( if (pMatrices != nullptr) { - memcpy(&pState->vpMatrix[0], pMatrices, sizeof(SWR_VIEWPORT_MATRIX) * numViewports); + //memcpy(&pState->vpMatrix[0], pMatrices, sizeof(SWR_VIEWPORT_MATRIX) * numViewports); + // @todo Faster to copy portions of the SOA or just copy all of it? + memcpy(&pState->vpMatrices, pMatrices, sizeof(SWR_VIEWPORT_MATRICES)); } else { @@ -684,22 +686,22 @@ void SwrSetViewports( { if (pContext->driverType == DX) { - pState->vpMatrix[i].m00 = pState->vp[i].width / 2.0f; - pState->vpMatrix[i].m11 = -pState->vp[i].height / 2.0f; - pState->vpMatrix[i].m22 = pState->vp[i].maxZ - pState->vp[i].minZ; - pState->vpMatrix[i].m30 = pState->vp[i].x + pState->vpMatrix[i].m00; - pState->vpMatrix[i].m31 = pState->vp[i].y - pState->vpMatrix[i].m11; - pState->vpMatrix[i].m32 = pState->vp[i].minZ; + pState->vpMatrices.m00[i] = pState->vp[i].width / 2.0f; + pState->vpMatrices.m11[i] = -pState->vp[i].height / 2.0f; + pState->vpMatrices.m22[i] = pState->vp[i].maxZ - pState->vp[i].minZ; + pState->vpMatrices.m30[i] = pState->vp[i].x + pState->vpMatrices.m00[i]; + pState->vpMatrices.m31[i] = pState->vp[i].y - pState->vpMatrices.m11[i]; + pState->vpMatrices.m32[i] = pState->vp[i].minZ; } else { // Standard, with the exception that Y is inverted. - pState->vpMatrix[i].m00 = (pState->vp[i].width - pState->vp[i].x) / 2.0f; - pState->vpMatrix[i].m11 = (pState->vp[i].y - pState->vp[i].height) / 2.0f; - pState->vpMatrix[i].m22 = (pState->vp[i].maxZ - pState->vp[i].minZ) / 2.0f; - pState->vpMatrix[i].m30 = pState->vp[i].x + pState->vpMatrix[i].m00; - pState->vpMatrix[i].m31 = pState->vp[i].height + pState->vpMatrix[i].m11; - pState->vpMatrix[i].m32 = pState->vp[i].minZ + pState->vpMatrix[i].m22; + pState->vpMatrices.m00[i] = (pState->vp[i].width - pState->vp[i].x) / 2.0f; + pState->vpMatrices.m11[i] = (pState->vp[i].y - pState->vp[i].height) / 2.0f; + pState->vpMatrices.m22[i] = (pState->vp[i].maxZ - pState->vp[i].minZ) / 2.0f; + pState->vpMatrices.m30[i] = pState->vp[i].x + pState->vpMatrices.m00[i]; + pState->vpMatrices.m31[i] = pState->vp[i].height + pState->vpMatrices.m11[i]; + pState->vpMatrices.m32[i] = pState->vp[i].minZ + pState->vpMatrices.m22[i]; // Now that the matrix is calculated, clip the view coords to screen size. // OpenGL allows for -ve x,y in the viewport. diff --git a/src/gallium/drivers/swr/rasterizer/core/api.h b/src/gallium/drivers/swr/rasterizer/core/api.h index 9c80526..304169e 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.h +++ b/src/gallium/drivers/swr/rasterizer/core/api.h @@ -495,7 +495,7 @@ void SWR_API SwrSetViewports( HANDLE hContext, uint32_t numViewports, const SWR_VIEWPORT* pViewports, - const SWR_VIEWPORT_MATRIX* pMatrices); + const SWR_VIEWPORT_MATRICES* pMatrices); ////////////////////////////////////////////////////////////////////////// /// @brief SwrSetScissorRects diff --git a/src/gallium/drivers/swr/rasterizer/core/context.h b/src/gallium/drivers/swr/rasterizer/core/context.h index b38ec46..163ee5b 100644 --- a/src/gallium/drivers/swr/rasterizer/core/context.h +++ b/src/gallium/drivers/swr/rasterizer/core/context.h @@ -277,7 +277,7 @@ OSALIGNLINE(struct) API_STATE GUARDBAND gbState; SWR_VIEWPORT vp[KNOB_NUM_VIEWPORTS_SCISSORS]; - SWR_VIEWPORT_MATRIX vpMatrix[KNOB_NUM_VIEWPORTS_SCISSORS]; + SWR_VIEWPORT_MATRICES vpMatrices; BBOX scissorRects[KNOB_NUM_VIEWPORTS_SCISSORS]; BBOX scissorInFixedPoint; diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp index 24b217d..0f0adf4 100644 --- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp @@ -1793,7 +1793,7 @@ void BinTriangles( tri[2].v[2] = _simd_mul_ps(tri[2].v[2], vRecipW2); // viewport transform to screen coords - viewportTransform<3>(tri, state.vpMatrix[0]); + viewportTransform<3>(tri, state.vpMatrices); } // adjust for pixel center location @@ -2166,7 +2166,7 @@ void BinPoints( primVerts.z = _simd_mul_ps(primVerts.z, vRecipW0); // viewport transform to screen coords - viewportTransform<1>(&primVerts, state.vpMatrix[0]); + viewportTransform<1>(&primVerts, state.vpMatrices); } // adjust for pixel center location @@ -2484,7 +2484,7 @@ void BinLines( prim[1].v[2] = _simd_mul_ps(prim[1].v[2], vRecipW1); // viewport transform to screen coords - viewportTransform<2>(prim, state.vpMatrix[0]); + viewportTransform<2>(prim, state.vpMatrices); } // adjust for pixel center location diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.h b/src/gallium/drivers/swr/rasterizer/core/frontend.h index 9142101..b4e6f9a 100644 --- a/src/gallium/drivers/swr/rasterizer/core/frontend.h +++ b/src/gallium/drivers/swr/rasterizer/core/frontend.h @@ -202,14 +202,14 @@ void viewportTransform(__m128 &vX, __m128 &vY, __m128 &vZ, const SWR_VIEWPORT_MA template INLINE -void viewportTransform(simdvector *v, const SWR_VIEWPORT_MATRIX & vpMatrix) +void viewportTransform(simdvector *v, const SWR_VIEWPORT_MATRICES & vpMatrices) { - simdscalar m00 = _simd_load1_ps(&vpMatrix.m00); - simdscalar m30 = _simd_load1_ps(&vpMatrix.m30); - simdscalar m11 = _simd_load1_ps(&vpMatrix.m11); - simdscalar m31 = _simd_load1_ps(&vpMatrix.m31); - simdscalar m22 = _simd_load1_ps(&vpMatrix.m22); - simdscalar m32 = _simd_load1_ps(&vpMatrix.m32); + simdscalar m00 = _simd_load1_ps(&vpMatrices.m00[0]); + simdscalar m30 = _simd_load1_ps(&vpMatrices.m30[0]); + simdscalar m11 = _simd_load1_ps(&vpMatrices.m11[0]); + simdscalar m31 = _simd_load1_ps(&vpMatrices.m31[0]); + simdscalar m22 = _simd_load1_ps(&vpMatrices.m22[0]); + simdscalar m32 = _simd_load1_ps(&vpMatrices.m32[0]); for (uint32_t i = 0; i < NumVerts; ++i) { diff --git a/src/gallium/drivers/swr/rasterizer/core/state.h b/src/gallium/drivers/swr/rasterizer/core/state.h index a3616bc..fdf5d7e 100644 --- a/src/gallium/drivers/swr/rasterizer/core/state.h +++ b/src/gallium/drivers/swr/rasterizer/core/state.h @@ -834,6 +834,19 @@ struct SWR_VIEWPORT_MATRIX }; ////////////////////////////////////////////////////////////////////////// +/// VIEWPORT_MATRIXES +///////////////////////////////////////////////////////////////////////// +struct SWR_VIEWPORT_MATRICES +{ + float m00[KNOB_NUM_VIEWPORTS_SCISSORS]; + float m11[KNOB_NUM_VIEWPORTS_SCISSORS]; + float m22[KNOB_NUM_VIEWPORTS_SCISSORS]; + float m30[KNOB_NUM_VIEWPORTS_SCISSORS]; + float m31[KNOB_NUM_VIEWPORTS_SCISSORS]; + float m32[KNOB_NUM_VIEWPORTS_SCISSORS]; +}; + +////////////////////////////////////////////////////////////////////////// /// SWR_VIEWPORT ///////////////////////////////////////////////////////////////////////// struct SWR_VIEWPORT diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp index 2df7985..de41ddc 100644 --- a/src/gallium/drivers/swr/swr_state.cpp +++ b/src/gallium/drivers/swr/swr_state.cpp @@ -944,7 +944,7 @@ swr_update_derived(struct pipe_context *pipe, pipe_rasterizer_state *rasterizer = ctx->rasterizer; SWR_VIEWPORT *vp = &ctx->derived.vp; - SWR_VIEWPORT_MATRIX *vpm = &ctx->derived.vpm; + SWR_VIEWPORT_MATRICES *vpm = &ctx->derived.vpm; vp->x = state->translate[0] - state->scale[0]; vp->width = state->translate[0] + state->scale[0]; @@ -958,12 +958,12 @@ swr_update_derived(struct pipe_context *pipe, vp->maxZ = state->translate[2] + state->scale[2]; } - vpm->m00 = state->scale[0]; - vpm->m11 = state->scale[1]; - vpm->m22 = state->scale[2]; - vpm->m30 = state->translate[0]; - vpm->m31 = state->translate[1]; - vpm->m32 = state->translate[2]; + vpm->m00[0] = state->scale[0]; + vpm->m11[0] = state->scale[1]; + vpm->m22[0] = state->scale[2]; + vpm->m30[0] = state->translate[0]; + vpm->m31[0] = state->translate[1]; + vpm->m32[0] = state->translate[2]; /* Now that the matrix is calculated, clip the view coords to screen * size. OpenGL allows for -ve x,y in the viewport. */ diff --git a/src/gallium/drivers/swr/swr_state.h b/src/gallium/drivers/swr/swr_state.h index dcb1145..0e3b49d 100644 --- a/src/gallium/drivers/swr/swr_state.h +++ b/src/gallium/drivers/swr/swr_state.h @@ -87,7 +87,7 @@ struct swr_blend_state { struct swr_derived_state { SWR_RASTSTATE rastState; SWR_VIEWPORT vp; - SWR_VIEWPORT_MATRIX vpm; + SWR_VIEWPORT_MATRICES vpm; }; void swr_update_derived(struct pipe_context *, -- 2.7.4