diff --git a/include/mgba/internal/ds/gx/software.h b/include/mgba/internal/ds/gx/software.h index d11b94ed4..b11e41f46 100644 --- a/include/mgba/internal/ds/gx/software.h +++ b/include/mgba/internal/ds/gx/software.h @@ -36,6 +36,7 @@ struct DSGXSoftwareEdge { int32_t x0; // 20.12 int32_t z0; // 20.12 int32_t w0; // 20.12 + int64_t wr0; uint8_t cr0; uint8_t cg0; uint8_t cb0; @@ -46,6 +47,7 @@ struct DSGXSoftwareEdge { int32_t x1; // 20.12 int32_t z1; // 20.12 int32_t w1; // 20.12 + int64_t wr1; uint8_t cr1; uint8_t cg1; uint8_t cb1; diff --git a/src/ds/gx/software.c b/src/ds/gx/software.c index fc28ed2b2..bf43d005c 100644 --- a/src/ds/gx/software.c +++ b/src/ds/gx/software.c @@ -313,8 +313,8 @@ static bool _edgeToSpan(struct DSGXSoftwareSpan* span, const struct DSGXSoftware } } - int64_t w0 = 0x7FFFFFFFFFFFFFFF / edge->w0; - int64_t w1 = 0x7FFFFFFFFFFFFFFF / edge->w1; + int64_t w0 = edge->wr0; + int64_t w1 = edge->wr1; int64_t w = w1 - w0; // Losslessly interpolate two 64-bit values @@ -526,6 +526,8 @@ static void _preparePoly(struct DSGXRenderer* renderer, struct DSGXVertex* verts edge->s1 = v0->vs; edge->t1 = v0->vt; } + edge->wr0 = 0x7FFFFFFFFFFFFFFF / edge->w0; + edge->wr1 = 0x7FFFFFFFFFFFFFFF / edge->w1; edge = DSGXSoftwareEdgeListAppend(&softwareRenderer->activeEdges); edge->polyId = poly->polyId; @@ -578,6 +580,8 @@ static void _preparePoly(struct DSGXRenderer* renderer, struct DSGXVertex* verts edge->s1 = v0->vs; edge->t1 = v0->vt; } + edge->wr0 = 0x7FFFFFFFFFFFFFFF / edge->w0; + edge->wr1 = 0x7FFFFFFFFFFFFFFF / edge->w1; if (poly->maxY >= DS_VIDEO_VERTICAL_PIXELS) { poly->maxY = DS_VIDEO_VERTICAL_PIXELS - 1;