mirror of https://github.com/mgba-emu/mgba.git
DS GX: Move rendering until first scanline is requested
This commit is contained in:
parent
69f21e1fb4
commit
8f58343e2b
|
@ -93,6 +93,7 @@ struct DSGXSoftwareRenderer {
|
||||||
uint8_t* stencilBuffer;
|
uint8_t* stencilBuffer;
|
||||||
color_t* scanlineCache;
|
color_t* scanlineCache;
|
||||||
int sort;
|
int sort;
|
||||||
|
bool flushPending;
|
||||||
|
|
||||||
struct DSGXVertex* verts;
|
struct DSGXVertex* verts;
|
||||||
};
|
};
|
||||||
|
|
|
@ -697,18 +697,27 @@ static void DSGXSoftwareRendererSetRAM(struct DSGXRenderer* renderer, struct DSG
|
||||||
softwareRenderer->depthBuffer[i + 2] = INT32_MAX;
|
softwareRenderer->depthBuffer[i + 2] = INT32_MAX;
|
||||||
softwareRenderer->depthBuffer[i + 3] = INT32_MAX;
|
softwareRenderer->depthBuffer[i + 3] = INT32_MAX;
|
||||||
}
|
}
|
||||||
|
softwareRenderer->flushPending = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DSGXSoftwareRendererDrawScanline(struct DSGXRenderer* renderer, int y) {
|
||||||
|
struct DSGXSoftwareRenderer* softwareRenderer = (struct DSGXSoftwareRenderer*) renderer;
|
||||||
|
if (!softwareRenderer->flushPending || y) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
size_t p;
|
size_t p;
|
||||||
for (p = 0; p < DSGXSoftwarePolygonListSize(&softwareRenderer->activePolys); ++p) {
|
for (p = 0; p < DSGXSoftwarePolygonListSize(&softwareRenderer->activePolys); ++p) {
|
||||||
struct DSGXSoftwarePolygon* poly = DSGXSoftwarePolygonListGetPointer(&softwareRenderer->activePolys, p);
|
struct DSGXSoftwarePolygon* poly = DSGXSoftwarePolygonListGetPointer(&softwareRenderer->activePolys, p);
|
||||||
DSGXSoftwareEdgeListClear(&softwareRenderer->activeEdges);
|
DSGXSoftwareEdgeListClear(&softwareRenderer->activeEdges);
|
||||||
_preparePoly(renderer, verts, poly);
|
_preparePoly(renderer, softwareRenderer->verts, poly);
|
||||||
int y;
|
int y;
|
||||||
for (y = poly->minY; y <= poly->maxY; ++y) {
|
for (y = poly->minY; y <= poly->maxY; ++y) {
|
||||||
struct DSGXSoftwareSpan span = {
|
struct DSGXSoftwareSpan span = {
|
||||||
.poly = poly,
|
.poly = poly,
|
||||||
.polyId = DSGXPolygonAttrsGetId(poly->polyParams),
|
.polyId = DSGXPolygonAttrsGetId(poly->polyParams),
|
||||||
};
|
};
|
||||||
|
size_t i;
|
||||||
for (i = 0; i < DSGXSoftwareEdgeListSize(&softwareRenderer->activeEdges); ++i) {
|
for (i = 0; i < DSGXSoftwareEdgeListSize(&softwareRenderer->activeEdges); ++i) {
|
||||||
struct DSGXSoftwareEdge* edge = DSGXSoftwareEdgeListGetPointer(&softwareRenderer->activeEdges, i);
|
struct DSGXSoftwareEdge* edge = DSGXSoftwareEdgeListGetPointer(&softwareRenderer->activeEdges, i);
|
||||||
if (edge->y1 < (y << 12)) {
|
if (edge->y1 < (y << 12)) {
|
||||||
|
@ -729,12 +738,7 @@ static void DSGXSoftwareRendererSetRAM(struct DSGXRenderer* renderer, struct DSG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
softwareRenderer->flushPending = false;
|
||||||
|
|
||||||
static void DSGXSoftwareRendererDrawScanline(struct DSGXRenderer* renderer, int y) {
|
|
||||||
struct DSGXSoftwareRenderer* softwareRenderer = (struct DSGXSoftwareRenderer*) renderer;
|
|
||||||
UNUSED(softwareRenderer);
|
|
||||||
UNUSED(y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DSGXSoftwareRendererGetScanline(struct DSGXRenderer* renderer, int y, const color_t** output) {
|
static void DSGXSoftwareRendererGetScanline(struct DSGXRenderer* renderer, int y, const color_t** output) {
|
||||||
|
|
Loading…
Reference in New Issue