DS GX: Do not allocate memory every scanline
Vicki Pfau vi@endrift.com
Tue, 28 Feb 2017 17:21:59 -0800
2 files changed,
7 insertions(+),
7 deletions(-)
M
include/mgba/internal/ds/gx/software.h
→
include/mgba/internal/ds/gx/software.h
@@ -71,7 +71,7 @@
struct DSGXSoftwarePolygonList activePolys; struct DSGXSoftwareEdgeList activeEdges; struct DSGXSoftwareSpanList activeSpans; - struct Table bucket; + struct DSGXSoftwareSpan** bucket; uint16_t depthBuffer[DS_VIDEO_HORIZONTAL_PIXELS]; color_t* scanlineCache;
M
src/ds/gx/software.c
→
src/ds/gx/software.c
@@ -144,7 +144,7 @@ struct DSGXSoftwareRenderer* softwareRenderer = (struct DSGXSoftwareRenderer*) renderer;
DSGXSoftwarePolygonListInit(&softwareRenderer->activePolys, DS_GX_POLYGON_BUFFER_SIZE / 4); DSGXSoftwareEdgeListInit(&softwareRenderer->activeEdges, DS_GX_POLYGON_BUFFER_SIZE); DSGXSoftwareSpanListInit(&softwareRenderer->activeSpans, DS_GX_POLYGON_BUFFER_SIZE / 2); - TableInit(&softwareRenderer->bucket, DS_GX_POLYGON_BUFFER_SIZE / 8, NULL); + softwareRenderer->bucket = anonymousMemoryMap(sizeof(*softwareRenderer->bucket) * DS_GX_POLYGON_BUFFER_SIZE); softwareRenderer->scanlineCache = anonymousMemoryMap(sizeof(color_t) * DS_VIDEO_HORIZONTAL_PIXELS * 48); }@@ -158,7 +158,7 @@ struct DSGXSoftwareRenderer* softwareRenderer = (struct DSGXSoftwareRenderer*) renderer;
DSGXSoftwarePolygonListDeinit(&softwareRenderer->activePolys); DSGXSoftwareEdgeListDeinit(&softwareRenderer->activeEdges); DSGXSoftwareSpanListDeinit(&softwareRenderer->activeSpans); - TableDeinit(&softwareRenderer->bucket); + mappedMemoryFree(softwareRenderer->bucket, sizeof(*softwareRenderer->bucket) * DS_GX_POLYGON_BUFFER_SIZE); mappedMemoryFree(softwareRenderer->scanlineCache, sizeof(color_t) * DS_VIDEO_HORIZONTAL_PIXELS * 48); }@@ -253,7 +253,7 @@
static void DSGXSoftwareRendererDrawScanline(struct DSGXRenderer* renderer, int y) { struct DSGXSoftwareRenderer* softwareRenderer = (struct DSGXSoftwareRenderer*) renderer; DSGXSoftwareSpanListClear(&softwareRenderer->activeSpans); - TableClear(&softwareRenderer->bucket); + memset(softwareRenderer->bucket, 0, sizeof(*softwareRenderer->bucket) * DS_GX_POLYGON_BUFFER_SIZE); size_t i; for (i = DSGXSoftwareEdgeListSize(&softwareRenderer->activeEdges); i; --i) { size_t idx = i - 1;@@ -266,17 +266,17 @@ continue;
} unsigned poly = edge->polyId; - struct DSGXSoftwareSpan* span = TableLookup(&softwareRenderer->bucket, poly); + struct DSGXSoftwareSpan* span = softwareRenderer->bucket[poly]; if (span) { _edgeToSpan(span, edge, 1, y); - TableRemove(&softwareRenderer->bucket, poly); + softwareRenderer->bucket[poly] = NULL; } else { span = DSGXSoftwareSpanListAppend(&softwareRenderer->activeSpans); if (!_edgeToSpan(span, edge, 0, y)) { // Horizontal line DSGXSoftwareSpanListShift(&softwareRenderer->activeSpans, DSGXSoftwareSpanListSize(&softwareRenderer->activeSpans) - 1, 1); } else { - TableInsert(&softwareRenderer->bucket, poly, span); + softwareRenderer->bucket[poly] = span; } } }