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
48 unsigned index;
49 int enabled;
50 unsigned priority;
51 uint32_t charBase;
52 int mosaic;
53 int multipalette;
54 uint32_t screenBase;
55 int overflow;
56 int size;
57 int target1;
58 int target2;
59 uint16_t x;
60 uint16_t y;
61 int32_t refx;
62 int32_t refy;
63
64 struct GBAVideoGLAffine affine;
65
66 GLint scanlineAffine[GBA_VIDEO_VERTICAL_PIXELS * 4];
67 GLint scanlineOffset[GBA_VIDEO_VERTICAL_PIXELS];
68};
69
70enum {
71 GBA_GL_FBO_OBJ = 0,
72 GBA_GL_FBO_BACKDROP,
73 GBA_GL_FBO_WINDOW,
74 GBA_GL_FBO_OUTPUT,
75 GBA_GL_FBO_MAX
76};
77
78enum {
79 GBA_GL_TEX_OBJ_COLOR = 0,
80 GBA_GL_TEX_OBJ_FLAGS,
81 GBA_GL_TEX_OBJ_DEPTH,
82 GBA_GL_TEX_BACKDROP,
83 GBA_GL_TEX_WINDOW,
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_TRANSFORM,
98 GBA_GL_BG_RANGE,
99 GBA_GL_BG_MOSAIC,
100
101 GBA_GL_OBJ_VRAM = 2,
102 GBA_GL_OBJ_PALETTE,
103 GBA_GL_OBJ_CHARBASE,
104 GBA_GL_OBJ_STRIDE,
105 GBA_GL_OBJ_LOCALPALETTE,
106 GBA_GL_OBJ_INFLAGS,
107 GBA_GL_OBJ_TRANSFORM,
108 GBA_GL_OBJ_DIMS,
109 GBA_GL_OBJ_OBJWIN,
110 GBA_GL_OBJ_MOSAIC,
111 GBA_GL_OBJ_CYCLES,
112
113 GBA_GL_WIN_DISPCNT = 2,
114 GBA_GL_WIN_BLEND,
115 GBA_GL_WIN_FLAGS,
116 GBA_GL_WIN_WIN0,
117 GBA_GL_WIN_WIN1,
118
119 GBA_GL_FINALIZE_SCALE = 2,
120 GBA_GL_FINALIZE_LAYERS,
121 GBA_GL_FINALIZE_FLAGS,
122 GBA_GL_FINALIZE_WINDOW,
123 GBA_GL_FINALIZE_PALETTE,
124 GBA_GL_FINALIZE_BACKDROP,
125
126 GBA_GL_UNIFORM_MAX = 14
127};
128
129struct GBAVideoGLShader {
130 GLuint program;
131 GLuint vao;
132 GLuint uniforms[GBA_GL_UNIFORM_MAX];
133};
134
135struct GBAVideoGLRenderer {
136 struct GBAVideoRenderer d;
137
138 uint32_t* temporaryBuffer;
139
140 struct GBAVideoGLBackground bg[4];
141
142 int oamMax;
143 bool oamDirty;
144 struct GBAVideoRendererSprite sprites[128];
145
146 GLuint fbo[GBA_GL_FBO_MAX];
147 GLuint layers[GBA_GL_TEX_MAX];
148 GLuint vbo;
149
150 GLuint outputTex;
151
152 GLuint paletteTex;
153 uint16_t shadowPalette[GBA_VIDEO_VERTICAL_PIXELS][512];
154 int nextPalette;
155 int paletteDirtyScanlines;
156 bool paletteDirty;
157
158 GLuint vramTex;
159 unsigned vramDirty;
160
161 uint16_t shadowRegs[0x30];
162 uint64_t regsDirty;
163
164 struct GBAVideoGLShader bgShader[6];
165 struct GBAVideoGLShader objShader[3];
166 struct GBAVideoGLShader windowShader;
167 struct GBAVideoGLShader finalizeShader;
168
169 GBARegisterDISPCNT dispcnt;
170
171 unsigned target1Obj;
172 unsigned target1Bd;
173 unsigned target2Obj;
174 unsigned target2Bd;
175 enum GBAVideoBlendEffect blendEffect;
176 uint16_t blda;
177 uint16_t bldb;
178 uint16_t bldy;
179
180 GBAMosaicControl mosaic;
181
182 struct GBAVideoGLWindowN {
183 struct GBAVideoWindowRegion h;
184 struct GBAVideoWindowRegion v;
185 GBAWindowControl control;
186 } winN[2];
187
188 GLint winNHistory[2][GBA_VIDEO_VERTICAL_PIXELS * 4];
189 GLint spriteCycles[GBA_VIDEO_VERTICAL_PIXELS];
190
191 GBAWindowControl winout;
192 GBAWindowControl objwin;
193
194 int firstAffine;
195 int firstY;
196
197 int scale;
198};
199
200void GBAVideoGLRendererCreate(struct GBAVideoGLRenderer* renderer);
201void GBAVideoGLRendererSetScale(struct GBAVideoGLRenderer* renderer, int scale);
202
203#endif
204
205CXX_GUARD_END
206
207#endif