OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::OpenGLManager Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/OpenGLManager.hpp>

Collaboration diagram for Slic3r::GUI::OpenGLManager:

Classes

class  GLInfo

Public Types

enum class  EFramebufferType : unsigned char { Unknown , Arb , Ext }

Public Member Functions

 OpenGLManager ()=default
 ~OpenGLManager ()
bool init_gl (bool popup_error=true)
wxGLContext * init_glcontext (wxGLCanvas &canvas, const std::pair< int, int > &required_opengl_version, bool enable_compatibility_profile, bool enable_debug)
GLShaderProgram * get_shader (const std::string &shader_name)
GLShaderProgram * get_current_shader ()

Static Public Member Functions

static bool are_compressed_textures_supported ()
static bool can_multisample ()
static bool are_framebuffers_supported ()
static EFramebufferType get_framebuffers_type ()
static wxGLCanvas * create_wxglcanvas (wxWindow &parent)
static bool is_scene_canvas (const wxWindow *window)
static const GLInfo & get_gl_info ()
static bool force_power_of_two_textures ()

Private Types

enum class  EMultisampleState : unsigned char { Unknown , Enabled , Disabled }

Static Private Member Functions

static void detect_multisample (int *attribList)

Private Attributes

bool m_gl_initialized { false }
wxGLContext * m_context { nullptr }
GLShadersManager m_shaders_manager

Static Private Attributes

static GLInfo s_gl_info
static bool s_compressed_textures_supported = false
static bool s_force_power_of_two_textures = false
static EMultisampleState s_multisample = OpenGLManager::EMultisampleState::Unknown
static EFramebufferType s_framebuffers_type = OpenGLManager::EFramebufferType::Unknown

Detailed Description

Member Enumeration Documentation

◆ EFramebufferType

enum class Slic3r::GUI::OpenGLManager::EFramebufferType : unsigned char
strong
Enumerator
Unknown 
Arb 
Ext 
21 {
22 Unknown,
23 Arb,
24 Ext
25 };
@ Unknown
Definition PresetBundle.hpp:42

◆ EMultisampleState

enum class Slic3r::GUI::OpenGLManager::EMultisampleState : unsigned char
strongprivate
Enumerator
Unknown 
Enabled 
Disabled 
73 {
74 Unknown,
75 Enabled,
77 };
@ Disabled
Definition Button.hpp:27
@ Enabled
Definition PrintConfig.hpp:240

Constructor & Destructor Documentation

◆ OpenGLManager()

Slic3r::GUI::OpenGLManager::OpenGLManager ( )
default

◆ ~OpenGLManager()

Slic3r::GUI::OpenGLManager::~OpenGLManager ( )
249{
250 m_shaders_manager.shutdown();
251
252 if (m_context != nullptr)
253 delete m_context;
254}
GLShadersManager m_shaders_manager
Definition OpenGLManager.hpp:81
wxGLContext * m_context
Definition OpenGLManager.hpp:80

References m_context, and m_shaders_manager.

Member Function Documentation

◆ are_compressed_textures_supported()

bool Slic3r::GUI::OpenGLManager::are_compressed_textures_supported ( )
inlinestatic

◆ are_framebuffers_supported()

bool Slic3r::GUI::OpenGLManager::are_framebuffers_supported ( )
inlinestatic
static EFramebufferType s_framebuffers_type
Definition OpenGLManager.hpp:87
@ Unknown
Definition OpenGLManager.hpp:22

References s_framebuffers_type, and Unknown.

◆ can_multisample()

bool Slic3r::GUI::OpenGLManager::can_multisample ( )
inlinestatic
static EMultisampleState s_multisample
Definition OpenGLManager.hpp:86
@ Enabled
Definition OpenGLManager.hpp:75

References Enabled, and s_multisample.

Referenced by Slic3r::GUI::DesignCanvas::DesignCanvas(), create_wxglcanvas(), Slic3r::GUI::anonymous_namespace{UVEditorCanvas.cpp}::gl_attrib_list(), Slic3r::GUI::AssembleView::init(), Slic3r::GUI::Preview::init(), Slic3r::GUI::View3D::init(), Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer(), and Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer_ext().

Here is the caller graph for this function:

◆ create_wxglcanvas()

wxGLCanvas * Slic3r::GUI::OpenGLManager::create_wxglcanvas ( wxWindow & parent)
static
433{
434 int antialiasing_samples = 4;
435 if (const AppConfig* app_config = get_app_config(); app_config != nullptr) {
436 const std::string value = app_config->get(SETTING_OPENGL_AA_SAMPLES);
437 if (value == "0" || value == "2" || value == "4" || value == "8" || value == "16")
438 antialiasing_samples = ::atoi(value.c_str());
439 }
440
441 int attribList[] = {
442 WX_GL_RGBA,
443 WX_GL_DOUBLEBUFFER,
444 // RGB channels each should be allocated with 8 bit depth. One should almost certainly get these bit depths by default.
445 WX_GL_MIN_RED, 8,
446 WX_GL_MIN_GREEN, 8,
447 WX_GL_MIN_BLUE, 8,
448 // Requesting an 8 bit alpha channel. Interestingly, the NVIDIA drivers would most likely work with some alpha plane, but glReadPixels would not return
449 // the alpha channel on NVIDIA if not requested when the GL context is created.
450 WX_GL_MIN_ALPHA, 8,
451 WX_GL_DEPTH_SIZE, 24,
452 //BBS: turn on stencil buffer for outline
453 WX_GL_STENCIL_SIZE, 8,
454 WX_GL_SAMPLE_BUFFERS, antialiasing_samples > 0 ? GL_TRUE : GL_FALSE,
455 WX_GL_SAMPLES, antialiasing_samples,
456 0
457 };
458
459 constexpr int sample_buffers_value_idx = 15;
460 constexpr int samples_value_idx = 17;
461
462 if (antialiasing_samples <= 0)
465 detect_multisample(attribList);
466// // debug output
467// std::cout << "Multisample " << (can_multisample() ? "enabled" : "disabled") << std::endl;
468 }
469
470 if (! can_multisample()) {
471 attribList[sample_buffers_value_idx] = GL_FALSE;
472 attribList[samples_value_idx] = 0;
473 }
474
475 wxGLCanvas* canvas = new wxGLCanvas(&parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS, SCENE_CANVAS_NAME);
476 // The GL canvas paints its entire surface, so background erasing is unnecessary.
477 canvas->SetBackgroundStyle(wxBG_STYLE_PAINT);
478 return canvas;
479}
#define SETTING_OPENGL_AA_SAMPLES
Definition AppConfig.hpp:34
static bool can_multisample()
Definition OpenGLManager.hpp:100
@ Unknown
Definition OpenGLManager.hpp:74
@ Disabled
Definition OpenGLManager.hpp:76
static void detect_multisample(int *attribList)
Definition OpenGLManager.cpp:486
#define GL_TRUE
Definition gl.h:1892
#define GL_FALSE
Definition gl.h:648
static const char *const SCENE_CANVAS_NAME
Definition OpenGLManager.cpp:430
AppConfig * get_app_config()
Definition GUI.cpp:539

References can_multisample(), detect_multisample(), Disabled, Slic3r::GUI::get_app_config(), GL_FALSE, GL_TRUE, s_multisample, Slic3r::GUI::SCENE_CANVAS_NAME, SETTING_OPENGL_AA_SAMPLES, and Unknown.

Referenced by Slic3r::GUI::DesignCanvas::DesignCanvas(), Slic3r::GUI::AssembleView::init(), Slic3r::GUI::Preview::init(), and Slic3r::GUI::View3D::init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ detect_multisample()

void Slic3r::GUI::OpenGLManager::detect_multisample ( int * attribList)
staticprivate
487{
488 int wxVersion = wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + wxRELEASE_NUMBER;
489 bool enable_multisample = wxVersion >= 30003;
490
491#if defined(__WXGTK__)
492 // On Wayland, wxGLCanvas::IsDisplaySupported() requires the EGL backend.
493 // If wxWidgets was built without EGL, the GLX backend will crash trying
494 // to access a non-existent X11 display. Disable multisample in that case.
495 if (is_running_on_wayland()) {
496#if !defined(wxHAS_EGL) || !wxHAS_EGL
497 BOOST_LOG_TRIVIAL(warning) << "Wayland without EGL: disabling multisample detection";
499 return;
500#endif
501 }
502#endif
503
505 enable_multisample &&
506 // Disable multi-sampling on ChromeOS, as the OpenGL virtualization swaps Red/Blue channels with multi-sampling enabled,
507 // at least on some platforms.
509 wxGLCanvas::IsDisplaySupported(attribList)
511 // Alternative method: it was working on previous version of wxWidgets but not with the latest, at least on Windows
512 // s_multisample = enable_multisample && wxGLCanvas::IsExtensionSupported("WGL_ARB_multisample");
513}
@ LinuxOnChromium
Definition Platform.hpp:24
PlatformFlavor platform_flavor()
Definition Platform.cpp:108

References Disabled, Enabled, Slic3r::LinuxOnChromium, Slic3r::platform_flavor(), and s_multisample.

Referenced by create_wxglcanvas().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ force_power_of_two_textures()

bool Slic3r::GUI::OpenGLManager::force_power_of_two_textures ( )
inlinestatic
static bool s_force_power_of_two_textures
Definition OpenGLManager.hpp:84

References s_force_power_of_two_textures.

Referenced by Slic3r::GUI::GLTexture::load_from_png(), and Slic3r::GUI::GLTexture::load_from_svg().

Here is the caller graph for this function:

◆ get_current_shader()

GLShaderProgram * Slic3r::GUI::OpenGLManager::get_current_shader ( )
inline
97{ return m_shaders_manager.get_current_shader(); }

References m_shaders_manager.

◆ get_framebuffers_type()

EFramebufferType Slic3r::GUI::OpenGLManager::get_framebuffers_type ( )
inlinestatic

◆ get_gl_info()

const GLInfo & Slic3r::GUI::OpenGLManager::get_gl_info ( )
inlinestatic
106{ return s_gl_info; }
static GLInfo s_gl_info
Definition OpenGLManager.hpp:82

References s_gl_info.

Referenced by Slic3r::GUI::GLCanvas3D::_render_frame(), Slic3r::GUI::GLCanvas3D::_render_wireframe_overlay(), Slic3r::anonymous_namespace{PluginHostApp.cpp}::export_3mf_copy(), Slic3r::GUI::TriangleSelectorPatch::finalize_triangle_indices(), Slic3r::GUI::GLMmSegmentationGizmo3DScene::finalize_vertices(), Slic3r::GUI::PartPlateList::generate_icon_textures(), Slic3r::GUI::generate_system_info_json(), Slic3r::GUI::GUI_App::get_gl_info(), Slic3r::GUI::TroubleshootDialog::GetGPUinfo(), Slic3r::anonymous_namespace{PluginHostApp.cpp}::gl_info(), Slic3r::GLShadersManager::init(), Slic3r::GUI::GLCanvas3D::LayersEditing::init(), init_gl(), Slic3r::GUI::GLTexture::load_from_png(), Slic3r::GUI::GLTexture::load_from_raw_data(), Slic3r::GUI::GLTexture::load_from_svg(), Slic3r::GUI::logo_texture_size(), Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), Slic3r::GUI::GLGizmoScale3D::on_render(), Slic3r::GUI::GLGizmoSimplify::on_render(), Slic3r::GUI::GLMmSegmentationGizmo3DScene::release_geometry(), Slic3r::GUI::TriangleSelectorPatch::release_geometry(), Slic3r::GLVolumeCollection::render(), Slic3r::GUI::GLMmSegmentationGizmo3DScene::render(), Slic3r::GUI::GLModel::render(), Slic3r::GUI::GLSelectionRectangle::render(), Slic3r::GUI::TriangleSelectorPatch::render(), Slic3r::GUI::GLGizmoTextureDisplacement::render_adjust_texture_gizmo(), Slic3r::GUI::Selection::render_bounding_box(), Slic3r::GUI::GLGizmoBase::render_cross_mark(), Slic3r::GUI::GLGizmoPainterBase::render_cursor_circle(), Slic3r::GUI::GLGizmoPainterBase::render_cursor_height_range(), Slic3r::GUI::GLGizmoMeasure::render_dimensioning(), Slic3r::GUI::ImGuiWrapper::render_draw_data(), Slic3r::GUI::GLGizmoScale3D::render_grabbers_connection(), Slic3r::GUI::PartPlate::render_grid(), Slic3r::GUI::PartPlate::render_height_limit(), Slic3r::GUI::GLModel::render_instanced(), Slic3r::GUI::TriangleSelectorGUI::render_paint_contour(), Slic3r::GUI::GLCanvas3D::LayersEditing::render_profile(), Slic3r::GUI::GLGizmoTextureDisplacement::render_seam_overlay(), Slic3r::GUI::anonymous_namespace{SceneBenchmark.cpp}::SceneBenchmarkDialog::report(), Slic3r::GUI::DesignCanvas::request_repaint(), Slic3r::GUI::GLModel::reset(), and Slic3r::GUI::GLModel::send_to_gpu().

Here is the caller graph for this function:

◆ get_shader()

GLShaderProgram * Slic3r::GUI::OpenGLManager::get_shader ( const std::string & shader_name)
inline
96{ return m_shaders_manager.get_shader(shader_name); }

References m_shaders_manager.

Referenced by Slic3r::CLI::run().

Here is the caller graph for this function:

◆ init_gl()

bool Slic3r::GUI::OpenGLManager::init_gl ( bool popup_error = true)
257{
258 if (!m_gl_initialized) {
259 int version = 0;
260#if defined(__WXGTK__) && defined(wxHAS_EGL)
261 if (is_running_on_wayland()) {
262 // On EGL/Wayland, gladLoaderLoadGL() dlopen's libGL.so then
263 // immediately dlclose's it. Since nothing else holds libGL.so
264 // open (unlike GLX where the context keeps it loaded), the
265 // library gets unmapped and all function pointers become invalid.
266 // Use eglGetProcAddress directly to avoid this.
267 version = gladLoadGL((GLADloadfunc)eglGetProcAddress);
268 } else
269#endif
270 {
271 version = gladLoaderLoadGL();
272 }
273 if (version == 0) {
274 BOOST_LOG_TRIVIAL(error) << "Unable to init GLAD OpenGL loader";
275 return false;
276 }
277 BOOST_LOG_TRIVIAL(info) << "GLAD loaded OpenGL " << GLAD_VERSION_MAJOR(version) << "." << GLAD_VERSION_MINOR(version);
278 m_gl_initialized = true;
281 else
283
284 if (s_gl_info.is_version_greater_or_equal_to(3, 0)) {
285 // ARB framebuffer became a mandatory part of core OpenGL 3.0
287 BOOST_LOG_TRIVIAL(info) << "Opengl version >= 30, FrameBuffer Type ARB." << std::endl;
288 }
291 BOOST_LOG_TRIVIAL(info) << "Found Framebuffer Type ARB."<< std::endl;
292 }
294 BOOST_LOG_TRIVIAL(info) << "Found Framebuffer Type Ext."<< std::endl;
296 }
297 else {
299 BOOST_LOG_TRIVIAL(warning) << "Found Framebuffer Type unknown!"<< std::endl;
300 }
301
302 bool valid_version = s_gl_info.is_version_greater_or_equal_to(2, 0);
303 if (!valid_version) {
304 BOOST_LOG_TRIVIAL(error) << "Found opengl version < 2.0"<< std::endl;
305 // Complain about the OpenGL version.
306 if (popup_error) {
307 wxString message = from_u8((boost::format(
308 _utf8(L("The application cannot run normally because OpenGL version is lower than 3.2.\n")))).str());
309 message += "\n";
310 message += _L("Please upgrade your graphics card driver.");
311 wxMessageBox(message, _L("Unsupported OpenGL version"), wxOK | wxICON_ERROR);
312 }
313 }
314
315 if (valid_version)
316 {
317 // load shaders
318 auto [result, error] = m_shaders_manager.init();
319 if (!result) {
320 BOOST_LOG_TRIVIAL(error) << "Unable to load shaders: "<<error<< std::endl;
321 if (popup_error) {
322 wxString message = from_u8((boost::format(
323 _utf8(L("Unable to load shaders:\n%s"))) % error).str());
324 wxMessageBox(message, _L("Error loading shaders"), wxOK | wxICON_ERROR);
325 }
326 }
327 }
328
329#ifdef _WIN32
330 // Since AMD driver version 22.7.1, there is probably some bug in the driver that causes the issue with the missing
331 // texture of the bed (see: https://github.com/prusa3d/PrusaSlicer/issues/8417).
332 // It seems that this issue only triggers when mipmaps are generated manually
333 // (combined with a texture compression) with texture size not being power of two.
334 // When mipmaps are generated through OpenGL function glGenerateMipmap() the driver works fine,
335 // but the mipmap generation is quite slow on some machines.
336 // There is no an easy way to detect the driver version without using Win32 API because the strings returned by OpenGL
337 // have no standardized format, only some of them contain the driver version.
338 // Until we do not know that driver will be fixed (if ever) we force the use of power of two textures on all cards
339 // 1) containing the string 'Radeon' in the string returned by glGetString(GL_RENDERER)
340 // 2) containing the string 'Custom' in the string returned by glGetString(GL_RENDERER)
341 const auto& gl_info = OpenGLManager::get_gl_info();
342 if (boost::contains(gl_info.get_vendor(), "ATI Technologies Inc.") &&
343 (boost::contains(gl_info.get_renderer(), "Radeon") ||
344 boost::contains(gl_info.get_renderer(), "Custom")))
346#endif // _WIN32
347 }
348
349 return true;
350}
#define L(s)
Definition ExtrusionEntity.cpp:25
#define _L(s)
Definition OBJ.cpp:34
static const GLInfo & get_gl_info()
Definition OpenGLManager.hpp:106
bool m_gl_initialized
Definition OpenGLManager.hpp:79
@ Arb
Definition OpenGLManager.hpp:23
@ Ext
Definition OpenGLManager.hpp:24
#define GLAD_VERSION_MAJOR(version)
Definition gl.h:164
GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object
Definition gl.h:2159
GLAD_API_CALL int GLAD_GL_EXT_texture_compression_s3tc
Definition gl.h:2167
#define GLAD_VERSION_MINOR(version)
Definition gl.h:165
GLAD_API_CALL int GLAD_GL_EXT_framebuffer_object
Definition gl.h:2165
GLAD_API_CALL int gladLoadGL(GLADloadfunc load)
Definition gl.c:2478
GLAD_API_CALL int gladLoaderLoadGL(void)
Definition gl.c:2626
GLADapiproc(* GLADloadfunc)(const char *name)
Definition gl.h:171
wxString from_u8(const std::string &str)
Definition GUI.cpp:544
py::object gl_info()
Definition PluginHostApp.cpp:95
#define _utf8(s)
Definition I18N.hpp:10

References _L, _utf8, Arb, Ext, Slic3r::GUI::from_u8(), get_gl_info(), GLAD_GL_ARB_framebuffer_object, GLAD_GL_EXT_framebuffer_object, GLAD_GL_EXT_texture_compression_s3tc, GLAD_VERSION_MAJOR, GLAD_VERSION_MINOR, gladLoaderLoadGL(), gladLoadGL(), L, m_gl_initialized, m_shaders_manager, s_compressed_textures_supported, s_force_power_of_two_textures, s_framebuffers_type, s_gl_info, and Unknown.

Referenced by Slic3r::CLI::run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_glcontext()

wxGLContext * Slic3r::GUI::OpenGLManager::init_glcontext ( wxGLCanvas & canvas,
const std::pair< int, int > & required_opengl_version,
bool enable_compatibility_profile,
bool enable_debug )
354{
355 if (m_context == nullptr) {
356 // m_debug_enabled = enable_debug;
357
358 const int gl_major = required_opengl_version.first;
359 const int gl_minor = required_opengl_version.second;
360 const bool supports_core_profile =
361 std::find(OpenGLVersions::core.begin(), OpenGLVersions::core.end(), std::make_pair(gl_major, gl_minor)) != OpenGLVersions::core.end();
362
363 if (gl_major == 0 && !enable_compatibility_profile) {
364 // search for highest supported core profile version
365 // disable wxWidgets logging to avoid showing the log dialog in case the following code fails generating a valid gl context
366 wxLogNull logNo;
367 for (auto v = OpenGLVersions::core.rbegin(); v != OpenGLVersions::core.rend(); ++v) {
368 wxGLContextAttrs attrs;
369 attrs.PlatformDefaults().MajorVersion(v->first).MinorVersion(v->second).CoreProfile().ForwardCompatible();
370 // if (m_debug_enabled)
371 // attrs.DebugCtx();
372 attrs.EndList();
373 m_context = new wxGLContext(&canvas, nullptr, &attrs);
374 if (m_context->IsOK())
375 break;
376 else {
377 delete m_context;
378 m_context = nullptr;
379 }
380 }
381 }
382
383 if (m_context == nullptr) {
384 // search for requested compatibility profile version
385 if (enable_compatibility_profile) {
386 // disable wxWidgets logging to avoid showing the log dialog in case the following code fails generating a valid gl context
387 wxLogNull logNo;
388 wxGLContextAttrs attrs;
389 attrs.PlatformDefaults().CompatibilityProfile();
390 // if (m_debug_enabled)
391 // attrs.DebugCtx();
392 attrs.EndList();
393 m_context = new wxGLContext(&canvas, nullptr, &attrs);
394 if (!m_context->IsOK()) {
395 delete m_context;
396 m_context = nullptr;
397 }
398 }
399 // search for requested core profile version
400 else if (supports_core_profile) {
401 // disable wxWidgets logging to avoid showing the log dialog in case the following code fails generating a valid gl context
402 wxLogNull logNo;
403 wxGLContextAttrs attrs;
404 attrs.PlatformDefaults().MajorVersion(gl_major).MinorVersion(gl_minor).CoreProfile().ForwardCompatible();
405 // if (m_debug_enabled)
406 // attrs.DebugCtx();
407 attrs.EndList();
408 m_context = new wxGLContext(&canvas, nullptr, &attrs);
409 if (!m_context->IsOK()) {
410 delete m_context;
411 m_context = nullptr;
412 }
413 }
414 }
415
416 if (m_context == nullptr) {
417 wxGLContextAttrs attrs;
418 attrs.PlatformDefaults();
419 // if (m_debug_enabled)
420 // attrs.DebugCtx();
421 attrs.EndList();
422 // if no valid context was created use the default one
423 m_context = new wxGLContext(&canvas, nullptr, &attrs);
424 }
425
426 }
427 return m_context;
428}
T * begin(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:838
T * end(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:841
static const std::vector< std::pair< int, int > > core
Definition GUI_Init.hpp:16

References Slic3r::GUI::OpenGLVersions::core, and m_context.

◆ is_scene_canvas()

bool Slic3r::GUI::OpenGLManager::is_scene_canvas ( const wxWindow * window)
static
482{
483 return window != nullptr && window->GetName() == SCENE_CANVAS_NAME;
484}

References Slic3r::GUI::SCENE_CANVAS_NAME.

Referenced by Slic3r::GUI::anonymous_namespace{MainFrame.cpp}::focused_canvas_imgui().

Here is the caller graph for this function:

Member Data Documentation

◆ m_context

wxGLContext* Slic3r::GUI::OpenGLManager::m_context { nullptr }
private
80{ nullptr };

Referenced by ~OpenGLManager(), and init_glcontext().

◆ m_gl_initialized

bool Slic3r::GUI::OpenGLManager::m_gl_initialized { false }
private
79{ false };

Referenced by init_gl().

◆ m_shaders_manager

GLShadersManager Slic3r::GUI::OpenGLManager::m_shaders_manager
private

◆ s_compressed_textures_supported

bool Slic3r::GUI::OpenGLManager::s_compressed_textures_supported = false
staticprivate

◆ s_force_power_of_two_textures

bool Slic3r::GUI::OpenGLManager::s_force_power_of_two_textures = false
staticprivate

◆ s_framebuffers_type

OpenGLManager::EFramebufferType Slic3r::GUI::OpenGLManager::s_framebuffers_type = OpenGLManager::EFramebufferType::Unknown
staticprivate

◆ s_gl_info

OpenGLManager::GLInfo Slic3r::GUI::OpenGLManager::s_gl_info
staticprivate

Referenced by get_gl_info(), and init_gl().

◆ s_multisample


The documentation for this class was generated from the following files: