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