all repos — mgba @ 945bc8fffe99d2cca5bfc646cffcb8c19fef52bb

mGBA Game Boy Advance Emulator

include/mgba/internal/gba/renderers/gl.h (view raw)

  1/* Copyright (c) 2013-2019 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 VIDEO_GL_H
  7#define VIDEO_GL_H
  8
  9#include <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/core/core.h>
 14#include <mgba/gba/interface.h>
 15#include <mgba/internal/gba/io.h>
 16#include <mgba/internal/gba/renderers/common.h>
 17#include <mgba/internal/gba/video.h>
 18
 19#if defined(BUILD_GLES2) || defined(BUILD_GLES3)
 20
 21#ifdef USE_EPOXY
 22#include <epoxy/gl.h>
 23#elif defined(BUILD_GL)
 24#ifdef __APPLE__
 25#include <OpenGL/gl3.h>
 26#else
 27#define GL_GLEXT_PROTOTYPES
 28#include <GL/gl.h>
 29#include <GL/glext.h>
 30#endif
 31#else
 32#include <GLES3/gl3.h>
 33#endif
 34
 35struct GBAVideoGLAffine {
 36	int16_t dx;
 37	int16_t dmx;
 38	int16_t dy;
 39	int16_t dmy;
 40	int32_t sx;
 41	int32_t sy;
 42};
 43
 44struct GBAVideoGLBackground {
 45	GLuint fbo;
 46	GLuint tex;
 47	GLuint flags;
 48
 49	unsigned index;
 50	int enabled;
 51	unsigned priority;
 52	uint32_t charBase;
 53	int mosaic;
 54	int multipalette;
 55	uint32_t screenBase;
 56	int overflow;
 57	int size;
 58	int target1;
 59	int target2;
 60	uint16_t x;
 61	uint16_t y;
 62	int32_t refx;
 63	int32_t refy;
 64
 65	struct GBAVideoGLAffine affine[4];
 66};
 67
 68enum {
 69	GBA_GL_FBO_OBJ = 0,
 70	GBA_GL_FBO_COMPOSITE = 1,
 71	GBA_GL_FBO_WINDOW = 2,
 72	GBA_GL_FBO_OUTPUT = 3,
 73	GBA_GL_FBO_MAX
 74};
 75
 76enum {
 77	GBA_GL_TEX_OBJ_COLOR = 0,
 78	GBA_GL_TEX_OBJ_FLAGS = 1,
 79	GBA_GL_TEX_COMPOSITE_COLOR = 2,
 80	GBA_GL_TEX_COMPOSITE_FLAGS = 3,
 81	GBA_GL_TEX_COMPOSITE_OLD_COLOR = 4,
 82	GBA_GL_TEX_COMPOSITE_OLD_FLAGS = 5,
 83	GBA_GL_TEX_WINDOW = 6,
 84	GBA_GL_TEX_MAX
 85};
 86
 87enum {
 88	GBA_GL_VS_LOC = 0,
 89	GBA_GL_VS_MAXPOS,
 90
 91	GBA_GL_BG_VRAM = 2,
 92	GBA_GL_BG_PALETTE,
 93	GBA_GL_BG_SCREENBASE,
 94	GBA_GL_BG_CHARBASE,
 95	GBA_GL_BG_SIZE,
 96	GBA_GL_BG_OFFSET,
 97	GBA_GL_BG_INFLAGS,
 98	GBA_GL_BG_TRANSFORM,
 99
100	GBA_GL_OBJ_VRAM = 2,
101	GBA_GL_OBJ_PALETTE,
102	GBA_GL_OBJ_CHARBASE,
103	GBA_GL_OBJ_STRIDE,
104	GBA_GL_OBJ_LOCALPALETTE,
105	GBA_GL_OBJ_INFLAGS,
106	GBA_GL_OBJ_TRANSFORM,
107	GBA_GL_OBJ_DIMS,
108	GBA_GL_OBJ_OBJWIN,
109
110	GBA_GL_COMPOSITE_SCALE = 2,
111	GBA_GL_COMPOSITE_LAYERID,
112	GBA_GL_COMPOSITE_LAYER,
113	GBA_GL_COMPOSITE_LAYERFLAGS,
114	GBA_GL_COMPOSITE_OLDLAYER,
115	GBA_GL_COMPOSITE_OLDLAYERFLAGS,
116	GBA_GL_COMPOSITE_OLDOLDFLAGS,
117	GBA_GL_COMPOSITE_WINDOW,
118
119	GBA_GL_FINALIZE_SCALE = 2,
120	GBA_GL_FINALIZE_LAYER,
121	GBA_GL_FINALIZE_LAYERFLAGS,
122	GBA_GL_FINALIZE_OLDLAYER,
123	GBA_GL_FINALIZE_OLDFLAGS,
124
125	GBA_GL_UNIFORM_MAX = 12
126};
127
128struct GBAVideoGLRenderer {
129	struct GBAVideoRenderer d;
130
131	struct GBAVideoGLBackground bg[4];
132
133	int oamMax;
134	bool oamDirty;
135	struct GBAVideoRendererSprite sprites[128];
136
137	GLuint fbo[GBA_GL_FBO_MAX];
138	GLuint layers[GBA_GL_TEX_MAX];
139
140	GLuint outputTex;
141
142#ifdef BUILD_GLES3
143	uint16_t shadowPalette[512];
144#endif
145	GLuint paletteTex;
146	bool paletteDirty;
147
148	GLuint vramTex;
149	unsigned vramDirty;
150
151	GLuint bgProgram[6];
152	GLuint bgUniforms[6][GBA_GL_UNIFORM_MAX];
153	GLuint objProgram[2];
154	GLuint objUniforms[2][GBA_GL_UNIFORM_MAX];
155
156	GLuint compositeProgram;
157	GLuint compositeUniforms[GBA_GL_UNIFORM_MAX];
158	GLuint finalizeProgram;
159	GLuint finalizeUniforms[GBA_GL_UNIFORM_MAX];
160
161	GBARegisterDISPCNT dispcnt;
162
163	unsigned target1Obj;
164	unsigned target1Bd;
165	unsigned target2Obj;
166	unsigned target2Bd;
167	enum GBAVideoBlendEffect blendEffect;
168	uint16_t blda;
169	uint16_t bldb;
170	uint16_t bldy;
171
172	GBAMosaicControl mosaic;
173
174	struct GBAVideoGLWindowN {
175		struct GBAVideoWindowRegion h;
176		struct GBAVideoWindowRegion v;
177		GBAWindowControl control;
178	} winN[2];
179
180	GBAWindowControl winout;
181	GBAWindowControl objwin;
182
183	int firstAffine;
184
185	int scale;
186};
187
188void GBAVideoGLRendererCreate(struct GBAVideoGLRenderer* renderer);
189
190#endif
191
192CXX_GUARD_END
193
194#endif