all repos — mgba @ ec626d723fbb4716a697ad3cac0b0b29943dba00

mGBA Game Boy Advance Emulator

include/mgba/internal/ds/gx.h (view raw)

  1/* Copyright (c) 2013-2017 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#ifndef DS_GX_H
  7#define DS_GX_H
  8
  9#include <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/core/interface.h>
 14#include <mgba/core/log.h>
 15#include <mgba/core/timing.h>
 16#include <mgba/internal/ds/matrix.h>
 17#include <mgba-util/circle-buffer.h>
 18
 19mLOG_DECLARE_CATEGORY(DS_GX);
 20
 21#define DS_GX_POLYGON_BUFFER_SIZE 2048
 22#define DS_GX_VERTEX_BUFFER_SIZE 6144
 23
 24DECL_BITFIELD(DSRegGXSTAT, uint32_t);
 25DECL_BIT(DSRegGXSTAT, TestBusy, 0);
 26DECL_BIT(DSRegGXSTAT, BoxTestResult, 1);
 27DECL_BITS(DSRegGXSTAT, PVMatrixStackLevel, 8, 5);
 28DECL_BIT(DSRegGXSTAT, ProjMatrixStackLevel, 13);
 29DECL_BIT(DSRegGXSTAT, MatrixStackBusy, 14);
 30DECL_BIT(DSRegGXSTAT, MatrixStackError, 15);
 31DECL_BITS(DSRegGXSTAT, FIFOEntries, 16, 9);
 32DECL_BIT(DSRegGXSTAT, FIFOFull, 24);
 33DECL_BIT(DSRegGXSTAT, FIFOLtHalf, 25);
 34DECL_BIT(DSRegGXSTAT, FIFOEmpty, 26);
 35DECL_BIT(DSRegGXSTAT, Busy, 27);
 36DECL_BITS(DSRegGXSTAT, DoIRQ, 30, 2);
 37
 38DECL_BITFIELD(DSGXTexParams, uint32_t);
 39DECL_BITS(DSGXTexParams, VRAMBase, 0, 16);
 40DECL_BIT(DSGXTexParams, SRepeat, 16);
 41DECL_BIT(DSGXTexParams, TRepeat, 17);
 42DECL_BIT(DSGXTexParams, SMirror, 18);
 43DECL_BIT(DSGXTexParams, TMirror, 19);
 44DECL_BITS(DSGXTexParams, SSize, 20, 3);
 45DECL_BITS(DSGXTexParams, TSize, 23, 3);
 46DECL_BITS(DSGXTexParams, Format, 26, 3);
 47DECL_BIT(DSGXTexParams, 0Transparent, 29);
 48DECL_BITS(DSGXTexParams, CoordTfMode, 30, 2);
 49
 50DECL_BITFIELD(DSGXPolygonAttrs, uint32_t);
 51DECL_BITS(DSGXPolygonAttrs, Lights, 0, 4);
 52DECL_BITS(DSGXPolygonAttrs, Mode, 4, 2);
 53DECL_BIT(DSGXPolygonAttrs, BackFace, 6);
 54DECL_BIT(DSGXPolygonAttrs, FrontFace, 7);
 55DECL_BIT(DSGXPolygonAttrs, UpdateDepth, 11);
 56// TODO
 57DECL_BITS(DSGXPolygonAttrs, Alpha, 16, 5);
 58DECL_BITS(DSGXPolygonAttrs, Id, 24, 6);
 59
 60enum DSGXCommand {
 61	DS_GX_CMD_NOP = 0,
 62	DS_GX_CMD_MTX_MODE = 0x10,
 63	DS_GX_CMD_MTX_PUSH = 0x11,
 64	DS_GX_CMD_MTX_POP = 0x12,
 65	DS_GX_CMD_MTX_STORE = 0x13,
 66	DS_GX_CMD_MTX_RESTORE = 0x14,
 67	DS_GX_CMD_MTX_IDENTITY = 0x15,
 68	DS_GX_CMD_MTX_LOAD_4x4 = 0x16,
 69	DS_GX_CMD_MTX_LOAD_4x3 = 0x17,
 70	DS_GX_CMD_MTX_MULT_4x4 = 0x18,
 71	DS_GX_CMD_MTX_MULT_4x3 = 0x19,
 72	DS_GX_CMD_MTX_MULT_3x3 = 0x1A,
 73	DS_GX_CMD_MTX_SCALE = 0x1B,
 74	DS_GX_CMD_MTX_TRANS = 0x1C,
 75	DS_GX_CMD_COLOR = 0x20,
 76	DS_GX_CMD_NORMAL = 0x21,
 77	DS_GX_CMD_TEXCOORD = 0x22,
 78	DS_GX_CMD_VTX_16 = 0x23,
 79	DS_GX_CMD_VTX_10 = 0x24,
 80	DS_GX_CMD_VTX_XY = 0x25,
 81	DS_GX_CMD_VTX_XZ = 0x26,
 82	DS_GX_CMD_VTX_YZ = 0x27,
 83	DS_GX_CMD_VTX_DIFF = 0x28,
 84	DS_GX_CMD_POLYGON_ATTR = 0x29,
 85	DS_GX_CMD_TEXIMAGE_PARAM = 0x2A,
 86	DS_GX_CMD_PLTT_BASE = 0x2B,
 87	DS_GX_CMD_DIF_AMB = 0x30,
 88	DS_GX_CMD_SPE_EMI = 0x31,
 89	DS_GX_CMD_LIGHT_VECTOR = 0x32,
 90	DS_GX_CMD_LIGHT_COLOR = 0x33,
 91	DS_GX_CMD_SHININESS = 0x34,
 92	DS_GX_CMD_BEGIN_VTXS = 0x40,
 93	DS_GX_CMD_END_VTXS = 0x41,
 94	DS_GX_CMD_SWAP_BUFFERS = 0x50,
 95	DS_GX_CMD_VIEWPORT = 0x60,
 96	DS_GX_CMD_BOX_TEST = 0x70,
 97	DS_GX_CMD_POS_TEST = 0x71,
 98	DS_GX_CMD_VEC_TEST = 0x72,
 99
100	DS_GX_CMD_MAX
101};
102
103#pragma pack(push, 1)
104struct DSGXEntry {
105	uint8_t command;
106	uint8_t params[4];
107};
108#pragma pack(pop)
109
110struct DSGXVertex {
111	// World coords
112	int16_t coord[3]; // 4.12
113
114	// Color/Texcoords
115	uint16_t color; // 5.5.5
116	int16_t st[2]; // 12.4
117
118	// Viewport coords
119	int32_t viewCoord[4];
120	int16_t vs; // 12.4
121	int16_t vt; // 12.4
122
123	int viewportX;
124	int viewportY;
125	int viewportWidth;
126	int viewportHeight;
127};
128
129struct DSGXPolygon {
130	DSGXPolygonAttrs polyParams;
131	DSGXTexParams texParams;
132	uint32_t palBase;
133	int verts;
134	unsigned vertIds[10];
135};
136
137struct DSGXRenderer {
138	void (*init)(struct DSGXRenderer* renderer);
139	void (*reset)(struct DSGXRenderer* renderer);
140	void (*deinit)(struct DSGXRenderer* renderer);
141
142	void (*invalidateTex)(struct DSGXRenderer* renderer, int slot);
143	void (*setRAM)(struct DSGXRenderer* renderer, struct DSGXVertex* verts, struct DSGXPolygon* polys, unsigned polyCount, bool wSort);
144	void (*drawScanline)(struct DSGXRenderer* renderer, int y);
145	void (*getScanline)(struct DSGXRenderer* renderer, int y, const color_t** output);
146	void (*writeRegister)(struct DSGXRenderer* renderer, uint32_t address, uint16_t value);
147
148	const uint16_t* tex[4];
149	const uint16_t* texPal[6];
150
151	uint16_t* toonTable;
152};
153
154struct DSGXLight {
155	int16_t color;
156	int16_t x;
157	int16_t y;
158	int16_t z;
159};
160
161struct DS;
162struct DSGX {
163	struct DS* p;
164	struct DSGXRenderer* renderer;
165	struct CircleBuffer fifo;
166	struct CircleBuffer pipe;
167
168	struct mTimingEvent fifoEvent;
169	int dmaSource;
170
171	int outstandingParams[4];
172	uint8_t outstandingCommand[4];
173	struct DSGXEntry outstandingEntry;
174
175	int activeParams;
176	struct DSGXEntry activeEntries[32];
177
178	bool swapBuffers;
179	bool wSort;
180	int bufferIndex;
181	int vertexIndex;
182	int pendingVertexIndex;
183	int polygonIndex;
184	struct DSGXVertex* vertexBuffer[2];
185	struct DSGXPolygon* polygonBuffer[2];
186	struct DSGXVertex pendingVertices[8];
187	int pendingVertexIds[8];
188	bool reverseWinding;
189
190	const uint16_t* tex[4];
191	const uint16_t* texPal[6];
192
193	int mtxMode;
194	int pvMatrixPointer;
195	struct DSGXMatrix projMatrixStack;
196	struct DSGXMatrix texMatrixStack;
197	struct DSGXMatrix posMatrixStack[32];
198	struct DSGXMatrix vecMatrixStack[32];
199
200	struct DSGXMatrix projMatrix;
201	struct DSGXMatrix texMatrix;
202	struct DSGXMatrix posMatrix;
203	struct DSGXMatrix vecMatrix;
204
205	struct DSGXMatrix clipMatrix;
206
207	struct DSGXLight lights[4];
208	int16_t diffuse;
209	int16_t ambient;
210	int16_t specular;
211	int16_t emit;
212
213	int viewportX1;
214	int viewportY1;
215	int viewportX2;
216	int viewportY2;
217	int viewportWidth;
218	int viewportHeight;
219
220	int vertexMode;
221	struct DSGXVertex currentVertex;
222	struct DSGXPolygon nextPoly;
223	struct DSGXPolygon currentPoly;
224};
225
226void DSGXInit(struct DSGX*);
227void DSGXDeinit(struct DSGX*);
228void DSGXReset(struct DSGX*);
229void DSGXAssociateRenderer(struct DSGX* video, struct DSGXRenderer* renderer);
230
231uint16_t DSGXWriteRegister(struct DSGX*, uint32_t address, uint16_t value);
232uint32_t DSGXWriteRegister32(struct DSGX*, uint32_t address, uint32_t value);
233
234void DSGXFlush(struct DSGX*);
235void DSGXUpdateGXSTAT(struct DSGX*);
236
237struct GBADMA;
238struct DSCommon;
239void DSGXScheduleDMA(struct DSCommon* dscore, int number, struct GBADMA* info);
240
241CXX_GUARD_END
242
243#endif