/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "display/display.h" #include "engine/engine.h" #include "display/displaygl.h" #include "error/errorgl.h" errorret_t displaySDL2Init(void) { uint32_t flags = SDL_INIT_VIDEO; #ifdef DUSK_INPUT_GAMEPAD flags |= SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK; #endif if(SDL_Init(flags) != 0) { errorThrow("SDL Failed to Initialize: %s", SDL_GetError()); } // Set OpenGL attributes (Needs to be done now or later?) SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); #ifdef DUSK_OPENGL_LEGACY #else SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE ); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); #endif // Create window with OpenGL flag. DISPLAY.window = SDL_CreateWindow( "Dusk", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DUSK_DISPLAY_WIDTH_DEFAULT, DUSK_DISPLAY_HEIGHT_DEFAULT, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_OPENGL ); if(!DISPLAY.window) { errorThrow("SDL_CreateWindow failed: %s", SDL_GetError()); } // Create OpenGL context DISPLAY.glContext = SDL_GL_CreateContext(DISPLAY.window); if(!DISPLAY.glContext) { errorThrow("SDL_GL_CreateContext failed: %s", SDL_GetError()); } errorChain(errorGLCheck()); SDL_GL_SetSwapInterval(1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); errorChain(errorGLCheck()); errorChain(displayOpenGLInit()); errorChain(errorGLCheck()); errorOk(); } errorret_t displaySDL2Update(void) { SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: { ENGINE.running = false; break; } case SDL_WINDOWEVENT: { switch(event.window.event) { case SDL_WINDOWEVENT_CLOSE: { ENGINE.running = false; break; } default: { break; } } } default: { break; } } } SDL_GL_MakeCurrent(DISPLAY.window, DISPLAY.glContext); errorChain(errorGLCheck()); // errorChain(shaderPaletteTextureBindGL(&testShader)); errorOk(); } errorret_t displaySDL2Swap(void) { SDL_GL_SwapWindow(DISPLAY.window); errorChain(errorGLCheck()); errorOk(); } void displaySDL2Dispose(void) { if(DISPLAY.glContext) { SDL_GL_DeleteContext(DISPLAY.glContext); DISPLAY.glContext = NULL; } if(DISPLAY.window) { SDL_DestroyWindow(DISPLAY.window); DISPLAY.window = NULL; } SDL_Quit(); }