/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "sdl2.h" void displaySDL2Init(void) { uint32_t flags = SDL_INIT_VIDEO; #if INPUT_GAMEPAD == 1 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); // Create window with OpenGL flag. DISPLAY.window = SDL_CreateWindow( "Dusk", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DISPLAY_WINDOW_WIDTH_DEFAULT, DISPLAY_WINDOW_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()); } SDL_GL_SetSwapInterval(1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING);// PSP defaults this on? glShadeModel(GL_SMOOTH); // Fixes color on PSP? glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glClearDepth(1.0f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glEnableClientState(GL_COLOR_ARRAY);// To confirm: every frame on PSP? glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); // Get and validate GL state. GLenum err = glGetError(); if(err != GL_NO_ERROR) { assertUnreachable("GL Error before checking support"); } #if PSP displayInitPSP(); #else #endif } void 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); } void displaySDL2Swap(void) { SDL_GL_SwapWindow(DISPLAY.window); GLenum err; while((err = glGetError()) != GL_NO_ERROR) { debugPrint("GL Error: %d\n", err); } } 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(); }