From d435945b7c4ce058efffdc12e3d8baee5302afc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 29 Dec 2024 16:43:07 +0100 Subject: [PATCH] Simplify --- GPU/Common/DepthRaster.cpp | 55 +++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/GPU/Common/DepthRaster.cpp b/GPU/Common/DepthRaster.cpp index b9a94afcf7..e07246ac32 100644 --- a/GPU/Common/DepthRaster.cpp +++ b/GPU/Common/DepthRaster.cpp @@ -140,55 +140,50 @@ TriangleResult DepthRasterTriangle(uint16_t *depthBuf, int stride, DepthScissor int B12 = x2 - x1; int C12 = x1 * y2 - y1 * x2; - // Step deltas - Vec4S32 oneStepX12 = Vec4S32::Splat(A12 * stepXSize); - Vec4S32 oneStepY12 = Vec4S32::Splat(B12 * stepYSize); - - // x/y values for initial pixel block. Add horizontal offsets. - Vec4S32 x12 = Vec4S32::Splat(minX) + Vec4S32::LoadAligned(zero123); - Vec4S32 y12 = Vec4S32::Splat(minY); - - // Edge function values at origin - // Edge setup int A20 = y2 - y0; int B20 = x0 - x2; int C20 = x2 * y0 - y2 * x0; - // Step deltas - Vec4S32 oneStepX20 = Vec4S32::Splat(A20 * stepXSize); - Vec4S32 oneStepY20 = Vec4S32::Splat(B20 * stepYSize); - - // x/y values for initial pixel block. Add horizontal offsets. - Vec4S32 x20 = Vec4S32::Splat(minX) + Vec4S32::LoadAligned(zero123); - Vec4S32 y20 = Vec4S32::Splat(minY); - // Edge setup int A01 = y0 - y1; int B01 = x1 - x0; int C01 = x0 * y1 - y0 * x1; + // Prepare to interpolate Z + float zbase = tz[0]; + float z_20 = (tz[4] - tz[0]) * oneOverTriArea; + float z_01 = (tz[8] - tz[0]) * oneOverTriArea; + + // Step deltas + Vec4S32 oneStepX12 = Vec4S32::Splat(A12 * stepXSize); + Vec4S32 oneStepY12 = Vec4S32::Splat(B12 * stepYSize); + + // Step deltas + Vec4S32 oneStepX20 = Vec4S32::Splat(A20 * stepXSize); + Vec4S32 oneStepY20 = Vec4S32::Splat(B20 * stepYSize); + // Step deltas Vec4S32 oneStepX01 = Vec4S32::Splat(A01 * stepXSize); Vec4S32 oneStepY01 = Vec4S32::Splat(B01 * stepYSize); // x/y values for initial pixel block. Add horizontal offsets. - Vec4S32 x01 = Vec4S32::Splat(minX) + Vec4S32::LoadAligned(zero123); - Vec4S32 y01 = Vec4S32::Splat(minY); + Vec4S32 initialX = Vec4S32::Splat(minX) + Vec4S32::LoadAligned(zero123); + int initialY = minY; + + // Convert per-triangle values to wide registers. // Edge function values at origin - Vec4S32 w0_row = Vec4S32::Splat(A12) * x12 + Vec4S32::Splat(B12) * y12 + Vec4S32::Splat(C12); - Vec4S32 w1_row = Vec4S32::Splat(A20) * x20 + Vec4S32::Splat(B20) * y20 + Vec4S32::Splat(C20); - Vec4S32 w2_row = Vec4S32::Splat(A01) * x01 + Vec4S32::Splat(B01) * y01 + Vec4S32::Splat(C01); + Vec4S32 w0_row = Vec4S32::Splat(A12) * initialX + Vec4S32::Splat(B12 * initialY + C12); + Vec4S32 w1_row = Vec4S32::Splat(A20) * initialX + Vec4S32::Splat(B20 * initialY + C20); + Vec4S32 w2_row = Vec4S32::Splat(A01) * initialX + Vec4S32::Splat(B01 * initialY + C01); - // Prepare to interpolate Z - Vec4F32 zz0 = Vec4F32::Splat(tz[0]); - Vec4F32 zz1 = Vec4F32::Splat((tz[4] - tz[0]) * oneOverTriArea); - Vec4F32 zz2 = Vec4F32::Splat((tz[8] - tz[0]) * oneOverTriArea); + Vec4F32 z_20_v = Vec4F32::Splat(z_20); + Vec4F32 z_01_v = Vec4F32::Splat(z_01); - Vec4F32 zdeltaX = zz1 * Vec4F32FromS32(oneStepX20) + zz2 * Vec4F32FromS32(oneStepX01); - Vec4F32 zdeltaY = zz1 * Vec4F32FromS32(oneStepY20) + zz2 * Vec4F32FromS32(oneStepY01); - Vec4F32 zrow = zz0 + Vec4F32FromS32(w1_row) * zz1 + Vec4F32FromS32(w2_row) * zz2; + Vec4F32 zdeltaX = z_20_v * Vec4F32FromS32(oneStepX20) + z_01_v * Vec4F32FromS32(oneStepX01); + Vec4F32 zdeltaY = z_20_v * Vec4F32FromS32(oneStepY20) + z_01_v * Vec4F32FromS32(oneStepY01); + Vec4F32 zrow = Vec4F32::Splat(zbase) + Vec4F32FromS32(w1_row) * z_20 + Vec4F32FromS32(w2_row) * z_01; // Rasterize for (int y = minY; y <= maxY; y += stepYSize, w0_row += oneStepY12, w1_row += oneStepY20, w2_row += oneStepY01, zrow += zdeltaY) {