From 0454a30b2e599728c1955022736cba841be9577c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 28 Feb 2017 17:21:59 -0800 Subject: [PATCH] DS GX: Do not allocate memory every scanline --- include/mgba/internal/ds/gx/software.h | 2 +- src/ds/gx/software.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/mgba/internal/ds/gx/software.h b/include/mgba/internal/ds/gx/software.h index 32edb07fa..a54eb2384 100644 --- a/include/mgba/internal/ds/gx/software.h +++ b/include/mgba/internal/ds/gx/software.h @@ -71,7 +71,7 @@ struct DSGXSoftwareRenderer { 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; diff --git a/src/ds/gx/software.c b/src/ds/gx/software.c index a60d1ef54..777778f90 100644 --- a/src/ds/gx/software.c +++ b/src/ds/gx/software.c @@ -144,7 +144,7 @@ static void DSGXSoftwareRendererInit(struct DSGXRenderer* 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 @@ static void DSGXSoftwareRendererDeinit(struct DSGXRenderer* 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 DSGXSoftwareRendererSetRAM(struct DSGXRenderer* renderer, struct DSG 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 @@ static void DSGXSoftwareRendererDrawScanline(struct DSGXRenderer* renderer, int } 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; } } }