Skip to content

Commit 7f38488

Browse files
authored
Merge pull request godotengine#60377 from clayjohn/GLES3-initialize
Initialize OpenGL before rasterizers in GLES3
2 parents c77bbde + 3a4b9b4 commit 7f38488

File tree

7 files changed

+64
-61
lines changed

7 files changed

+64
-61
lines changed

drivers/gles3/rasterizer_canvas_gles3.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1471,8 +1471,10 @@ RasterizerCanvasGLES3 *RasterizerCanvasGLES3::get_singleton() {
14711471
return singleton;
14721472
}
14731473

1474-
RasterizerCanvasGLES3::RasterizerCanvasGLES3() {
1474+
RasterizerCanvasGLES3::RasterizerCanvasGLES3(RasterizerStorageGLES3 *p_storage) {
14751475
singleton = this;
1476+
storage = p_storage;
1477+
initialize();
14761478
}
14771479

14781480
RasterizerCanvasGLES3::~RasterizerCanvasGLES3() {

drivers/gles3/rasterizer_canvas_gles3.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,6 @@ class RasterizerCanvasGLES3 : public RendererCanvasRender {
219219

220220
typedef void Texture;
221221

222-
RasterizerSceneGLES3 *scene_render = nullptr;
223-
224222
RasterizerStorageGLES3 *storage = nullptr;
225223

226224
void _set_uniforms();
@@ -279,7 +277,7 @@ class RasterizerCanvasGLES3 : public RendererCanvasRender {
279277
void finalize();
280278

281279
static RasterizerCanvasGLES3 *get_singleton();
282-
RasterizerCanvasGLES3();
280+
RasterizerCanvasGLES3(RasterizerStorageGLES3 *storage);
283281
~RasterizerCanvasGLES3();
284282
};
285283

drivers/gles3/rasterizer_gles3.cpp

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ void RasterizerGLES3::begin_frame(double frame_step) {
102102
texture_storage->frame.count++;
103103
texture_storage->frame.delta = frame_step;
104104

105-
storage.update_dirty_resources();
105+
storage->update_dirty_resources();
106106

107-
storage.info.render_final = storage.info.render;
108-
storage.info.render.reset();
107+
storage->info.render_final = storage->info.render;
108+
storage->info.render.reset();
109109

110110
//scene->iteration();
111111
}
@@ -196,10 +196,14 @@ typedef void (*DEBUGPROCARB)(GLenum source,
196196
typedef void (*DebugMessageCallbackARB)(DEBUGPROCARB callback, const void *userParam);
197197

198198
void RasterizerGLES3::initialize() {
199-
print_verbose("Using OpenGL video driver");
199+
print_line("OpenGL Renderer: " + RS::get_singleton()->get_video_adapter_name());
200200

201-
texture_storage.set_main_thread_id(Thread::get_caller_id());
201+
texture_storage->set_main_thread_id(Thread::get_caller_id());
202+
// make sure the OS knows to only access the renderer from the main thread
203+
OS::get_singleton()->set_render_main_thread_mode(OS::RENDER_MAIN_THREAD_ONLY);
204+
}
202205

206+
RasterizerGLES3::RasterizerGLES3() {
203207
#ifdef GLAD_ENABLED
204208
if (!gladLoadGL()) {
205209
ERR_PRINT("Error initializing GLAD");
@@ -251,21 +255,28 @@ void RasterizerGLES3::initialize() {
251255
#endif // GLES_OVER_GL
252256
#endif // CAN_DEBUG
253257

254-
print_line("OpenGL Renderer: " + RS::get_singleton()->get_video_adapter_name());
255-
storage.initialize();
256-
canvas.initialize();
257-
// scene.initialize();
258-
259-
// make sure the OS knows to only access the renderer from the main thread
260-
OS::get_singleton()->set_render_main_thread_mode(OS::RENDER_MAIN_THREAD_ONLY);
258+
// OpenGL needs to be initialized before initializing the Rasterizers
259+
config = memnew(GLES3::Config);
260+
texture_storage = memnew(GLES3::TextureStorage);
261+
material_storage = memnew(GLES3::MaterialStorage);
262+
mesh_storage = memnew(GLES3::MeshStorage);
263+
particles_storage = memnew(GLES3::ParticlesStorage);
264+
light_storage = memnew(GLES3::LightStorage);
265+
storage = memnew(RasterizerStorageGLES3);
266+
canvas = memnew(RasterizerCanvasGLES3(storage));
267+
scene = memnew(RasterizerSceneGLES3);
261268
}
262269

263-
RasterizerGLES3::RasterizerGLES3() {
264-
canvas.storage = &storage;
265-
canvas.scene_render = &scene;
266-
//storage.canvas = &canvas;
267-
//scene.storage = &storage;
268-
//storage.scene = &scene;
270+
RasterizerGLES3::~RasterizerGLES3() {
271+
memdelete(scene);
272+
memdelete(canvas);
273+
memdelete(storage);
274+
memdelete(light_storage);
275+
memdelete(particles_storage);
276+
memdelete(mesh_storage);
277+
memdelete(material_storage);
278+
memdelete(texture_storage);
279+
memdelete(config);
269280
}
270281

271282
void RasterizerGLES3::prepare_for_blitting_render_targets() {
@@ -327,12 +338,12 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c
327338
}
328339
glClear(GL_COLOR_BUFFER_BIT);
329340

330-
canvas.canvas_begin();
341+
canvas->canvas_begin();
331342

332-
RID texture = texture_storage.texture_create();
343+
RID texture = texture_storage->texture_create();
333344
//texture_storage.texture_allocate(texture, p_image->get_width(), p_image->get_height(), 0, p_image->get_format(), VS::TEXTURE_TYPE_2D, p_use_filter ? VS::TEXTURE_FLAG_FILTER : 0);
334-
texture_storage._texture_allocate_internal(texture, p_image->get_width(), p_image->get_height(), 0, p_image->get_format(), RenderingDevice::TEXTURE_TYPE_2D);
335-
texture_storage.texture_set_data(texture, p_image);
345+
texture_storage->_texture_allocate_internal(texture, p_image->get_width(), p_image->get_height(), 0, p_image->get_format(), RenderingDevice::TEXTURE_TYPE_2D);
346+
texture_storage->texture_set_data(texture, p_image);
336347

337348
Rect2 imgrect(0, 0, p_image->get_width(), p_image->get_height());
338349
Rect2 screenrect;
@@ -354,13 +365,13 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c
354365
screenrect.position += ((Size2(win_size.width, win_size.height) - screenrect.size) / 2.0).floor();
355366
}
356367

357-
GLES3::Texture *t = texture_storage.get_texture(texture);
358-
glActiveTexture(GL_TEXTURE0 + config.max_texture_image_units - 1);
368+
GLES3::Texture *t = texture_storage->get_texture(texture);
369+
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 1);
359370
glBindTexture(GL_TEXTURE_2D, t->tex_id);
360371
glBindTexture(GL_TEXTURE_2D, 0);
361-
canvas.canvas_end();
372+
canvas->canvas_end();
362373

363-
texture_storage.texture_free(texture);
374+
texture_storage->texture_free(texture);
364375

365376
end_frame(true);
366377
}

drivers/gles3/rasterizer_gles3.h

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,27 +52,27 @@ class RasterizerGLES3 : public RendererCompositor {
5252
double time_total = 0.0;
5353

5454
protected:
55-
GLES3::Config config;
56-
GLES3::TextureStorage texture_storage;
57-
GLES3::MaterialStorage material_storage;
58-
GLES3::MeshStorage mesh_storage;
59-
GLES3::ParticlesStorage particles_storage;
60-
GLES3::LightStorage light_storage;
61-
RasterizerStorageGLES3 storage;
62-
RasterizerCanvasGLES3 canvas;
63-
RasterizerSceneGLES3 scene;
55+
GLES3::Config *config = nullptr;
56+
GLES3::TextureStorage *texture_storage = nullptr;
57+
GLES3::MaterialStorage *material_storage = nullptr;
58+
GLES3::MeshStorage *mesh_storage = nullptr;
59+
GLES3::ParticlesStorage *particles_storage = nullptr;
60+
GLES3::LightStorage *light_storage = nullptr;
61+
RasterizerStorageGLES3 *storage = nullptr;
62+
RasterizerCanvasGLES3 *canvas = nullptr;
63+
RasterizerSceneGLES3 *scene = nullptr;
6464

6565
void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect);
6666

6767
public:
68-
RendererLightStorage *get_light_storage() { return &light_storage; }
69-
RendererMaterialStorage *get_material_storage() { return &material_storage; }
70-
RendererMeshStorage *get_mesh_storage() { return &mesh_storage; }
71-
RendererParticlesStorage *get_particles_storage() { return &particles_storage; }
72-
RendererTextureStorage *get_texture_storage() { return &texture_storage; }
73-
RendererStorage *get_storage() { return &storage; }
74-
RendererCanvasRender *get_canvas() { return &canvas; }
75-
RendererSceneRender *get_scene() { return &scene; }
68+
RendererLightStorage *get_light_storage() { return light_storage; }
69+
RendererMaterialStorage *get_material_storage() { return material_storage; }
70+
RendererMeshStorage *get_mesh_storage() { return mesh_storage; }
71+
RendererParticlesStorage *get_particles_storage() { return particles_storage; }
72+
RendererTextureStorage *get_texture_storage() { return texture_storage; }
73+
RendererStorage *get_storage() { return storage; }
74+
RendererCanvasRender *get_canvas() { return canvas; }
75+
RendererSceneRender *get_scene() { return scene; }
7676

7777
void set_boot_image(const Ref<Image> &p_image, const Color &p_color, bool p_scale, bool p_use_filter = true);
7878

@@ -99,7 +99,7 @@ class RasterizerGLES3 : public RendererCompositor {
9999
double get_frame_delta_time() const { return delta; }
100100

101101
RasterizerGLES3();
102-
~RasterizerGLES3() {}
102+
~RasterizerGLES3();
103103
};
104104

105105
#endif // GLES3_ENABLED

drivers/gles3/rasterizer_storage_gles3.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,6 @@ RenderingDevice::DeviceType RasterizerStorageGLES3::get_video_adapter_type() con
651651

652652
void RasterizerStorageGLES3::initialize() {
653653
config = GLES3::Config::get_singleton();
654-
// config->initialize();
655654

656655
//picky requirements for these
657656
config->support_shadow_cubemaps = config->support_depth_texture && config->support_write_depth && config->support_depth_cubemaps;
@@ -824,6 +823,7 @@ void RasterizerStorageGLES3::update_dirty_resources() {
824823
}
825824

826825
RasterizerStorageGLES3::RasterizerStorageGLES3() {
826+
initialize();
827827
}
828828

829829
RasterizerStorageGLES3::~RasterizerStorageGLES3() {

drivers/gles3/storage/config.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,7 @@ Config *Config::singleton = nullptr;
3939

4040
Config::Config() {
4141
singleton = this;
42-
should_orphan = true;
4342

44-
// If this is to early we need to change our code similar to what we're doing in RendererRD,
45-
// and instantiate our storage classes when we are ready to do so in the order we want.
46-
initialize();
47-
}
48-
49-
Config::~Config() {
50-
singleton = nullptr;
51-
}
52-
53-
void Config::initialize() {
5443
{
5544
const GLubyte *extension_string = glGetString(GL_EXTENSIONS);
5645

@@ -157,4 +146,8 @@ void Config::initialize() {
157146
// should_orphan = GLOBAL_GET("rendering/options/api_usage_legacy/orphan_buffers");
158147
}
159148

149+
Config::~Config() {
150+
singleton = nullptr;
151+
}
152+
160153
#endif // GLES3_ENABLED

drivers/gles3/storage/config.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ class Config {
103103

104104
Config();
105105
~Config();
106-
void initialize();
107106
};
108107

109108
} // namespace GLES3

0 commit comments

Comments
 (0)