Skip to content

Commit 4ce2188

Browse files
committed
fix GL renderer when using multiple instances
1 parent 4c3fae9 commit 4ce2188

3 files changed

Lines changed: 149 additions & 132 deletions

File tree

src/GPU2D_OpenGL.cpp

Lines changed: 129 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,6 @@ using Platform::LogLevel;
3737
#include "OpenGL_shaders/2DCompositorFS.h"
3838

3939

40-
int GLRenderer2D::ShaderCount = 0;
41-
GLuint GLRenderer2D::LayerPreShader = 0;
42-
GLint GLRenderer2D::LayerPreCurBGULoc = 0;
43-
GLuint GLRenderer2D::SpritePreShader = 0;
44-
GLuint GLRenderer2D::SpriteShader = 0;
45-
GLint GLRenderer2D::SpriteRenderTransULoc = 0;
46-
GLuint GLRenderer2D::CompositorShader = 0;
47-
GLint GLRenderer2D::CompositorScaleULoc = 0;
48-
GLuint GLRenderer2D::MosaicTex = 0;
49-
5040

5141
GLRenderer2D::GLRenderer2D(melonDS::GPU2D& gpu2D, GLRenderer& parent)
5242
: Renderer2D(gpu2D), Parent(parent)
@@ -60,138 +50,155 @@ GLRenderer2D::GLRenderer2D(melonDS::GPU2D& gpu2D, GLRenderer& parent)
6050
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); \
6151
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6252

63-
bool GLRenderer2D::Init()
53+
bool GLRenderer2D::InitShaders()
6454
{
6555
GLint uniloc;
6656

67-
if (ShaderCount++ == 0)
68-
{
69-
// compile shaders
70-
71-
if (!OpenGL::CompileVertexFragmentProgram(LayerPreShader,
72-
k2DLayerPreVS, k2DLayerPreFS,
73-
"2DLayerPreShader",
74-
{{"vPosition", 0}},
75-
{{"oColor", 0}}))
76-
return false;
77-
78-
if (!OpenGL::CompileVertexFragmentProgram(SpritePreShader,
79-
k2DSpritePreVS, k2DSpritePreFS,
80-
"2DSpritePreShader",
81-
{{"vPosition", 0}, {"vSpriteIndex", 1}},
82-
{{"oColor", 0}}))
83-
return false;
84-
85-
if (!OpenGL::CompileVertexFragmentProgram(SpriteShader,
86-
k2DSpriteVS, k2DSpriteFS,
87-
"2DSpriteShader",
88-
{{"vPosition", 0}, {"vTexcoord", 1}, {"vSpriteIndex", 2}},
89-
{{"oColor", 0}, {"oFlags", 1}}))
90-
return false;
91-
92-
if (!OpenGL::CompileVertexFragmentProgram(CompositorShader,
93-
k2DCompositorVS, k2DCompositorFS,
94-
"2DCompositorShader",
95-
{{"vPosition", 0}},
96-
{{"oColor", 0}}))
97-
return false;
98-
99-
// set up uniforms
57+
// compile shaders
10058

101-
glUseProgram(LayerPreShader);
59+
if (!OpenGL::CompileVertexFragmentProgram(LayerPreShader,
60+
k2DLayerPreVS, k2DLayerPreFS,
61+
"2DLayerPreShader",
62+
{{"vPosition", 0}},
63+
{{"oColor", 0}}))
64+
return false;
10265

103-
uniloc = glGetUniformLocation(LayerPreShader, "VRAMTex");
104-
glUniform1i(uniloc, 0);
105-
uniloc = glGetUniformLocation(LayerPreShader, "PalTex");
106-
glUniform1i(uniloc, 1);
66+
if (!OpenGL::CompileVertexFragmentProgram(SpritePreShader,
67+
k2DSpritePreVS, k2DSpritePreFS,
68+
"2DSpritePreShader",
69+
{{"vPosition", 0}, {"vSpriteIndex", 1}},
70+
{{"oColor", 0}}))
71+
return false;
10772

108-
uniloc = glGetUniformBlockIndex(LayerPreShader, "ubBGConfig");
109-
glUniformBlockBinding(LayerPreShader, uniloc, 20);
73+
if (!OpenGL::CompileVertexFragmentProgram(SpriteShader,
74+
k2DSpriteVS, k2DSpriteFS,
75+
"2DSpriteShader",
76+
{{"vPosition", 0}, {"vTexcoord", 1}, {"vSpriteIndex", 2}},
77+
{{"oColor", 0}, {"oFlags", 1}}))
78+
return false;
11079

111-
LayerPreCurBGULoc = glGetUniformLocation(LayerPreShader, "uCurBG");
80+
if (!OpenGL::CompileVertexFragmentProgram(CompositorShader,
81+
k2DCompositorVS, k2DCompositorFS,
82+
"2DCompositorShader",
83+
{{"vPosition", 0}},
84+
{{"oColor", 0}}))
85+
return false;
11286

87+
// set up uniforms
11388

114-
glUseProgram(SpritePreShader);
89+
glUseProgram(LayerPreShader);
11590

116-
uniloc = glGetUniformLocation(SpritePreShader, "VRAMTex");
117-
glUniform1i(uniloc, 0);
118-
uniloc = glGetUniformLocation(SpritePreShader, "PalTex");
119-
glUniform1i(uniloc, 1);
91+
uniloc = glGetUniformLocation(LayerPreShader, "VRAMTex");
92+
glUniform1i(uniloc, 0);
93+
uniloc = glGetUniformLocation(LayerPreShader, "PalTex");
94+
glUniform1i(uniloc, 1);
12095

121-
uniloc = glGetUniformBlockIndex(SpritePreShader, "ubSpriteConfig");
122-
glUniformBlockBinding(SpritePreShader, uniloc, 21);
96+
uniloc = glGetUniformBlockIndex(LayerPreShader, "ubBGConfig");
97+
glUniformBlockBinding(LayerPreShader, uniloc, 20);
12398

99+
LayerPreCurBGULoc = glGetUniformLocation(LayerPreShader, "uCurBG");
124100

125-
glUseProgram(SpriteShader);
126101

127-
uniloc = glGetUniformLocation(SpriteShader, "SpriteTex");
128-
glUniform1i(uniloc, 0);
129-
uniloc = glGetUniformLocation(SpriteShader, "Capture128Tex");
130-
glUniform1i(uniloc, 1);
131-
uniloc = glGetUniformLocation(SpriteShader, "Capture256Tex");
132-
glUniform1i(uniloc, 2);
102+
glUseProgram(SpritePreShader);
133103

134-
uniloc = glGetUniformBlockIndex(SpriteShader, "ubSpriteConfig");
135-
glUniformBlockBinding(SpriteShader, uniloc, 21);
136-
uniloc = glGetUniformBlockIndex(SpriteShader, "ubSpriteScanlineConfig");
137-
glUniformBlockBinding(SpriteShader, uniloc, 24);
104+
uniloc = glGetUniformLocation(SpritePreShader, "VRAMTex");
105+
glUniform1i(uniloc, 0);
106+
uniloc = glGetUniformLocation(SpritePreShader, "PalTex");
107+
glUniform1i(uniloc, 1);
138108

139-
SpriteRenderTransULoc = glGetUniformLocation(SpriteShader, "uRenderTransparent");
109+
uniloc = glGetUniformBlockIndex(SpritePreShader, "ubSpriteConfig");
110+
glUniformBlockBinding(SpritePreShader, uniloc, 21);
140111

141112

142-
glUseProgram(CompositorShader);
113+
glUseProgram(SpriteShader);
143114

144-
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[0]");
145-
glUniform1i(uniloc, 0);
146-
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[1]");
147-
glUniform1i(uniloc, 1);
148-
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[2]");
149-
glUniform1i(uniloc, 2);
150-
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[3]");
151-
glUniform1i(uniloc, 3);
152-
uniloc = glGetUniformLocation(CompositorShader, "OBJLayerTex");
153-
glUniform1i(uniloc, 4);
154-
uniloc = glGetUniformLocation(CompositorShader, "Capture128Tex");
155-
glUniform1i(uniloc, 5);
156-
uniloc = glGetUniformLocation(CompositorShader, "Capture256Tex");
157-
glUniform1i(uniloc, 6);
158-
uniloc = glGetUniformLocation(CompositorShader, "MosaicTex");
159-
glUniform1i(uniloc, 7);
115+
uniloc = glGetUniformLocation(SpriteShader, "SpriteTex");
116+
glUniform1i(uniloc, 0);
117+
uniloc = glGetUniformLocation(SpriteShader, "Capture128Tex");
118+
glUniform1i(uniloc, 1);
119+
uniloc = glGetUniformLocation(SpriteShader, "Capture256Tex");
120+
glUniform1i(uniloc, 2);
160121

161-
uniloc = glGetUniformBlockIndex(CompositorShader, "ubBGConfig");
162-
glUniformBlockBinding(CompositorShader, uniloc, 20);
163-
uniloc = glGetUniformBlockIndex(CompositorShader, "ubScanlineConfig");
164-
glUniformBlockBinding(CompositorShader, uniloc, 22);
165-
uniloc = glGetUniformBlockIndex(CompositorShader, "ubCompositorConfig");
166-
glUniformBlockBinding(CompositorShader, uniloc, 23);
122+
uniloc = glGetUniformBlockIndex(SpriteShader, "ubSpriteConfig");
123+
glUniformBlockBinding(SpriteShader, uniloc, 21);
124+
uniloc = glGetUniformBlockIndex(SpriteShader, "ubSpriteScanlineConfig");
125+
glUniformBlockBinding(SpriteShader, uniloc, 24);
167126

168-
CompositorScaleULoc = glGetUniformLocation(CompositorShader, "uScaleFactor");
127+
SpriteRenderTransULoc = glGetUniformLocation(SpriteShader, "uRenderTransparent");
169128

170-
// generate mosaic lookup texture
171129

172-
u8* mosaic_tex = new u8[256 * 16];
173-
for (int m = 0; m < 16; m++)
130+
glUseProgram(CompositorShader);
131+
132+
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[0]");
133+
glUniform1i(uniloc, 0);
134+
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[1]");
135+
glUniform1i(uniloc, 1);
136+
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[2]");
137+
glUniform1i(uniloc, 2);
138+
uniloc = glGetUniformLocation(CompositorShader, "BGLayerTex[3]");
139+
glUniform1i(uniloc, 3);
140+
uniloc = glGetUniformLocation(CompositorShader, "OBJLayerTex");
141+
glUniform1i(uniloc, 4);
142+
uniloc = glGetUniformLocation(CompositorShader, "Capture128Tex");
143+
glUniform1i(uniloc, 5);
144+
uniloc = glGetUniformLocation(CompositorShader, "Capture256Tex");
145+
glUniform1i(uniloc, 6);
146+
uniloc = glGetUniformLocation(CompositorShader, "MosaicTex");
147+
glUniform1i(uniloc, 7);
148+
149+
uniloc = glGetUniformBlockIndex(CompositorShader, "ubBGConfig");
150+
glUniformBlockBinding(CompositorShader, uniloc, 20);
151+
uniloc = glGetUniformBlockIndex(CompositorShader, "ubScanlineConfig");
152+
glUniformBlockBinding(CompositorShader, uniloc, 22);
153+
uniloc = glGetUniformBlockIndex(CompositorShader, "ubCompositorConfig");
154+
glUniformBlockBinding(CompositorShader, uniloc, 23);
155+
156+
CompositorScaleULoc = glGetUniformLocation(CompositorShader, "uScaleFactor");
157+
158+
// generate mosaic lookup texture
159+
160+
u8* mosaic_tex = new u8[256 * 16];
161+
for (int m = 0; m < 16; m++)
162+
{
163+
int mosx = 0;
164+
for (int x = 0; x < 256; x++)
174165
{
175-
int mosx = 0;
176-
for (int x = 0; x < 256; x++)
177-
{
178-
mosaic_tex[(m * 256) + x] = mosx;
166+
mosaic_tex[(m * 256) + x] = mosx;
179167

180-
if (mosx == m)
181-
mosx = 0;
182-
else
183-
mosx++;
184-
}
168+
if (mosx == m)
169+
mosx = 0;
170+
else
171+
mosx++;
185172
}
173+
}
174+
175+
glGenTextures(1, &MosaicTex);
176+
glBindTexture(GL_TEXTURE_2D, MosaicTex);
177+
glDefaultTexParams(GL_TEXTURE_2D);
178+
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 256, 16, 0, GL_RED_INTEGER, GL_BYTE, mosaic_tex);
186179

187-
glGenTextures(1, &MosaicTex);
188-
glBindTexture(GL_TEXTURE_2D, MosaicTex);
189-
glDefaultTexParams(GL_TEXTURE_2D);
190-
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 256, 16, 0, GL_RED_INTEGER, GL_BYTE, mosaic_tex);
180+
delete[] mosaic_tex;
181+
return true;
182+
}
191183

192-
delete[] mosaic_tex;
193-
}
184+
bool GLRenderer2D::InitShaders(GLRenderer2D& other)
185+
{
186+
LayerPreShader = other.LayerPreShader;
187+
SpritePreShader = other.SpritePreShader;
188+
SpriteShader = other.SpriteShader;
189+
CompositorShader = other.CompositorShader;
190+
191+
LayerPreCurBGULoc = other.LayerPreCurBGULoc;
192+
SpriteRenderTransULoc = other.SpriteRenderTransULoc;
193+
CompositorScaleULoc = other.CompositorScaleULoc;
194+
195+
MosaicTex = other.MosaicTex;
194196

197+
return true;
198+
}
199+
200+
bool GLRenderer2D::Init()
201+
{
195202
// sprite prerender vertex data: 2x position, 1x sprite index
196203
int sprdatasize = (3 * 6) * 128;
197204
SpritePreVtxData = new u16[sprdatasize];
@@ -348,18 +355,18 @@ bool GLRenderer2D::Init()
348355
return true;
349356
}
350357

351-
GLRenderer2D::~GLRenderer2D()
358+
void GLRenderer2D::DeleteShaders()
352359
{
353-
if (--ShaderCount == 0)
354-
{
355-
glDeleteProgram(LayerPreShader);
356-
glDeleteProgram(SpritePreShader);
357-
glDeleteProgram(SpriteShader);
358-
glDeleteProgram(CompositorShader);
360+
glDeleteProgram(LayerPreShader);
361+
glDeleteProgram(SpritePreShader);
362+
glDeleteProgram(SpriteShader);
363+
glDeleteProgram(CompositorShader);
359364

360-
glDeleteTextures(1, &MosaicTex);
361-
}
365+
glDeleteTextures(1, &MosaicTex);
366+
}
362367

368+
GLRenderer2D::~GLRenderer2D()
369+
{
363370
glDeleteBuffers(1, &SpritePreVtxBuffer);
364371
glDeleteVertexArrays(1, &SpritePreVtxArray);
365372

src/GPU2D_OpenGL.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class GLRenderer2D : public Renderer2D
3535
bool Init() override;
3636
void Reset() override;
3737

38+
bool InitShaders();
39+
bool InitShaders(GLRenderer2D& other);
40+
void DeleteShaders();
41+
3842
void PostSavestate();
3943

4044
void SetScaleFactor(int scale);
@@ -51,28 +55,26 @@ class GLRenderer2D : public Renderer2D
5155
int ScaleFactor;
5256
int ScreenW, ScreenH;
5357

54-
static int ShaderCount;
55-
56-
static GLuint LayerPreShader;
57-
static GLint LayerPreCurBGULoc;
58+
GLuint LayerPreShader;
59+
GLint LayerPreCurBGULoc;
5860

5961
GLuint ScanlineConfigUBO;
6062
GLuint SpriteScanlineConfigUBO;
6163

62-
static GLuint SpritePreShader;
64+
GLuint SpritePreShader;
6365
GLuint SpritePreVtxBuffer;
6466
GLuint SpritePreVtxArray;
6567
u16* SpritePreVtxData;
6668

67-
static GLuint SpriteShader;
68-
static GLint SpriteRenderTransULoc;
69+
GLuint SpriteShader;
70+
GLint SpriteRenderTransULoc;
6971
GLuint SpriteVtxBuffer;
7072
GLuint SpriteVtxArray;
7173
u16* SpriteVtxData;
7274

73-
static GLuint CompositorShader;
75+
GLuint CompositorShader;
7476
GLuint CompositorConfigUBO;
75-
static GLint CompositorScaleULoc;
77+
GLint CompositorScaleULoc;
7678

7779
// base index for a BG layer within the BG texture arrays
7880
// based on BG type and size
@@ -91,7 +93,7 @@ class GLRenderer2D : public Renderer2D
9193
GLuint PalTex_BG;
9294
GLuint PalTex_OBJ;
9395

94-
static GLuint MosaicTex;
96+
GLuint MosaicTex;
9597

9698
GLuint AllBGLayerFB[22];
9799
GLuint AllBGLayerTex[22];

src/GPU_OpenGL.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,11 @@ bool GLRenderer::Init()
229229
CapDownInputLayerULoc = glGetUniformLocation(CapDownShader, "uInputLayer");
230230

231231

232+
auto rend2DA = dynamic_cast<GLRenderer2D*>(Rend2D_A.get());
233+
if (!rend2DA->InitShaders()) return false;
234+
auto rend2DB = dynamic_cast<GLRenderer2D*>(Rend2D_B.get());
235+
if (!rend2DB->InitShaders(*rend2DA)) return false;
236+
232237
if (!Rend2D_A->Init()) return false;
233238
if (!Rend2D_B->Init()) return false;
234239
if (!Rend3D->Init()) return false;
@@ -269,6 +274,9 @@ GLRenderer::~GLRenderer()
269274

270275
glDeleteBuffers(1, &FPConfigUBO);
271276
glDeleteBuffers(1, &CaptureConfigUBO);
277+
278+
auto rend2D = dynamic_cast<GLRenderer2D*>(Rend2D_A.get());
279+
rend2D->DeleteShaders();
272280
}
273281

274282
void GLRenderer::Reset()

0 commit comments

Comments
 (0)