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