@@ -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
5141GLRenderer2D::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
0 commit comments