This commit is contained in:
Henrik Rydgård committed 2024-12-31 01:41:22 +01:00
1 parent 69b35e9146
commit d435945b7c
1 file changed
+25 -30
+25 -30
View File
@@ -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) {