graphics_context::graphics_context(window & target_window) { // Set GL context attributes auto LE_SDL_GL_SetAttribute = [](SDL_GLattr attrib, int val)->void { int set_attrib_res = SDL_GL_SetAttribute(attrib, val); if(set_attrib_res != 0) { log_error(log_scope::ENGINE, "Unable to set attribute {:#x} to value {}: {}", (int)attrib, val, SDL_GetError()); SDL_ClearError(); throw fatal_construction_exception{}; } }; int const LE_GL_version_major = 3; int const LE_GL_version_minor = 2; LE_SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, LE_GL_version_major); LE_SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, LE_GL_version_minor); #ifdef LE_MODERN_OPENGL_ONLY LE_SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); #else LE_SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); #endif LE_SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1); LE_SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); // Create GL context p_raw_context = SDL_GL_CreateContext(target_window.get_raw()); if(p_raw_context == nullptr) { log_error(log_scope::ENGINE, "Error creating OpenGL context: {}", SDL_GetError()); SDL_ClearError(); throw fatal_construction_exception{}; } // 1 = v-sync, 0 = no v-sync, -1 = dynamic SDL_GL_SetSwapInterval(0); // Check GL context attributes log_status(log_scope::ENGINE, log_line_seperator); log_status(log_scope::ENGINE, "OpenGL Context Successfully Created"); log_status(log_scope::ENGINE, "Attributes"); log_status(log_scope::ENGINE, log_line_seperator_sub_1); int context_attrib_val; SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &context_attrib_val); log_status(log_scope::ENGINE, "Major Version: {}", context_attrib_val); SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &context_attrib_val); log_status(log_scope::ENGINE, "Minor Version: {}", context_attrib_val); SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &context_attrib_val); log_status(log_scope::ENGINE, "Context Profile: {}", (context_attrib_val == SDL_GL_CONTEXT_PROFILE_CORE) ? "Core" : (context_attrib_val == SDL_GL_CONTEXT_PROFILE_COMPATIBILITY) ? "Compatibility" : "unknown"); SDL_GL_GetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, &context_attrib_val); log_status(log_scope::ENGINE, "Framebuffer sRGB: {}", (context_attrib_val == 1) ? "Enabled" : "Disabled"); SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &context_attrib_val); log_status(log_scope::ENGINE, "Framebuffer Depth: {}", context_attrib_val); context_attrib_val = SDL_GL_GetSwapInterval(); log_status(log_scope::ENGINE, "Swap Interval: {}", (context_attrib_val == 0) ? "Immediate" : (context_attrib_val == 1) ? "Synchronized" : (context_attrib_val == -1) ? "Dynamic" : "Unknown"); log_status(log_scope::ENGINE, log_line_seperator); }