static void osd_sdl_info(void) { #if SDLMAME_SDL2 int i, num = SDL_GetNumVideoDrivers(); osd_printf_verbose("Available videodrivers: "); for (i=0;i<num;i++) { const char *name = SDL_GetVideoDriver(i); osd_printf_verbose("%s ", name); } osd_printf_verbose("\n"); osd_printf_verbose("Current Videodriver: %s\n", SDL_GetCurrentVideoDriver()); num = SDL_GetNumVideoDisplays(); for (i=0;i<num;i++) { SDL_DisplayMode mode; int j; osd_printf_verbose("\tDisplay #%d\n", i); if (SDL_GetDesktopDisplayMode(i, &mode)) osd_printf_verbose("\t\tDesktop Mode: %dx%d-%d@%d\n", mode.w, mode.h, SDL_BITSPERPIXEL(mode.format), mode.refresh_rate); if (SDL_GetCurrentDisplayMode(i, &mode)) osd_printf_verbose("\t\tCurrent Display Mode: %dx%d-%d@%d\n", mode.w, mode.h, SDL_BITSPERPIXEL(mode.format), mode.refresh_rate); osd_printf_verbose("\t\tRenderdrivers:\n"); for (j=0; j<SDL_GetNumRenderDrivers(); j++) { SDL_RendererInfo info; SDL_GetRenderDriverInfo(j, &info); osd_printf_verbose("\t\t\t%10s (%dx%d)\n", info.name, info.max_texture_width, info.max_texture_height); } } osd_printf_verbose("Available audio drivers: \n"); num = SDL_GetNumAudioDrivers(); for (i=0;i<num;i++) { osd_printf_verbose("\t%-20s\n", SDL_GetAudioDriver(i)); } #endif }
/** \fn initSdl */ bool initSdl(const std::string &sdlDriverName) { printf("\n[SDL] System Wide: Initializing SDL\n"); SDL_version version; SDL_version *ver=&version; SDL_GetVersion(ver); int sdl_version = (ver->major*1000)+(ver->minor*100) + (ver->patch); ADM_info("[SDL] Version: %u.%u.%u\n",ver->major, ver->minor, ver->patch); uint32_t sdlInitFlags; sdlInitFlags = SDL_INIT_AUDIO |SDL_INIT_VIDEO ; ADM_info("[SDL] Initialisation "); if (SDL_Init(sdlInitFlags)) { ADM_info("\tFAILED\n"); ADM_info("[SDL] ERROR: %s\n", SDL_GetError()); return false; } ADM_info("\tsucceeded\n"); const char *driverName=SDL_GetVideoDriver(0); if(driverName) { ADM_info("[SDL] Video Driver: %s\n", driverName); } ADM_info("[SDL] Video drivers initialization\n"); initDrivers(); setSdlDriverByName(sdlDriverName); ADM_info("[SDL] initSDL done successfully.\n"); return true; }
SDL_bool SDLTest_CommonInit(SDLTest_CommonState * state) { int i, j, m, n, w, h; SDL_DisplayMode fullscreen_mode; if (state->flags & SDL_INIT_VIDEO) { if (state->verbose & VERBOSE_VIDEO) { n = SDL_GetNumVideoDrivers(); if (n == 0) { fprintf(stderr, "No built-in video drivers\n"); } else { fprintf(stderr, "Built-in video drivers:"); for (i = 0; i < n; ++i) { if (i > 0) { fprintf(stderr, ","); } fprintf(stderr, " %s", SDL_GetVideoDriver(i)); } fprintf(stderr, "\n"); } } if (SDL_VideoInit(state->videodriver) < 0) { fprintf(stderr, "Couldn't initialize video driver: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->verbose & VERBOSE_VIDEO) { fprintf(stderr, "Video driver: %s\n", SDL_GetCurrentVideoDriver()); } /* Upload GL settings */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, state->gl_red_size); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, state->gl_green_size); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, state->gl_blue_size); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, state->gl_alpha_size); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, state->gl_double_buffer); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, state->gl_buffer_size); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, state->gl_depth_size); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, state->gl_stencil_size); SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, state->gl_accum_red_size); SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, state->gl_accum_green_size); SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, state->gl_accum_blue_size); SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, state->gl_accum_alpha_size); SDL_GL_SetAttribute(SDL_GL_STEREO, state->gl_stereo); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, state->gl_multisamplebuffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, state->gl_multisamplesamples); if (state->gl_accelerated >= 0) { SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, state->gl_accelerated); } SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, state->gl_retained_backing); if (state->gl_major_version) { SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, state->gl_major_version); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, state->gl_minor_version); } if (state->gl_debug) { SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); } if (state->verbose & VERBOSE_MODES) { SDL_Rect bounds; SDL_DisplayMode mode; int bpp; Uint32 Rmask, Gmask, Bmask, Amask; n = SDL_GetNumVideoDisplays(); fprintf(stderr, "Number of displays: %d\n", n); for (i = 0; i < n; ++i) { fprintf(stderr, "Display %d: %s\n", i, SDL_GetDisplayName(i)); SDL_zero(bounds); SDL_GetDisplayBounds(i, &bounds); fprintf(stderr, "Bounds: %dx%d at %d,%d\n", bounds.w, bounds.h, bounds.x, bounds.y); SDL_GetDesktopDisplayMode(i, &mode); SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); fprintf(stderr, " Current mode: %dx%d@%dHz, %d bits-per-pixel (%s)\n", mode.w, mode.h, mode.refresh_rate, bpp, SDL_GetPixelFormatName(mode.format)); if (Rmask || Gmask || Bmask) { fprintf(stderr, " Red Mask = 0x%.8x\n", Rmask); fprintf(stderr, " Green Mask = 0x%.8x\n", Gmask); fprintf(stderr, " Blue Mask = 0x%.8x\n", Bmask); if (Amask) fprintf(stderr, " Alpha Mask = 0x%.8x\n", Amask); } /* Print available fullscreen video modes */ m = SDL_GetNumDisplayModes(i); if (m == 0) { fprintf(stderr, "No available fullscreen video modes\n"); } else { fprintf(stderr, " Fullscreen video modes:\n"); for (j = 0; j < m; ++j) { SDL_GetDisplayMode(i, j, &mode); SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); fprintf(stderr, " Mode %d: %dx%d@%dHz, %d bits-per-pixel (%s)\n", j, mode.w, mode.h, mode.refresh_rate, bpp, SDL_GetPixelFormatName(mode.format)); if (Rmask || Gmask || Bmask) { fprintf(stderr, " Red Mask = 0x%.8x\n", Rmask); fprintf(stderr, " Green Mask = 0x%.8x\n", Gmask); fprintf(stderr, " Blue Mask = 0x%.8x\n", Bmask); if (Amask) fprintf(stderr, " Alpha Mask = 0x%.8x\n", Amask); } } } } } if (state->verbose & VERBOSE_RENDER) { SDL_RendererInfo info; n = SDL_GetNumRenderDrivers(); if (n == 0) { fprintf(stderr, "No built-in render drivers\n"); } else { fprintf(stderr, "Built-in render drivers:\n"); for (i = 0; i < n; ++i) { SDL_GetRenderDriverInfo(i, &info); SDLTest_PrintRenderer(&info); } } } SDL_zero(fullscreen_mode); switch (state->depth) { case 8: fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8; break; case 15: fullscreen_mode.format = SDL_PIXELFORMAT_RGB555; break; case 16: fullscreen_mode.format = SDL_PIXELFORMAT_RGB565; break; case 24: fullscreen_mode.format = SDL_PIXELFORMAT_RGB24; break; default: fullscreen_mode.format = SDL_PIXELFORMAT_RGB888; break; } fullscreen_mode.refresh_rate = state->refresh_rate; state->windows = (SDL_Window **) SDL_malloc(state->num_windows * sizeof(*state->windows)); state->renderers = (SDL_Renderer **) SDL_malloc(state->num_windows * sizeof(*state->renderers)); if (!state->windows || !state->renderers) { fprintf(stderr, "Out of memory!\n"); return SDL_FALSE; } for (i = 0; i < state->num_windows; ++i) { char title[1024]; if (state->num_windows > 1) { SDL_snprintf(title, SDL_arraysize(title), "%s %d", state->window_title, i + 1); } else { SDL_strlcpy(title, state->window_title, SDL_arraysize(title)); } state->windows[i] = SDL_CreateWindow(title, state->window_x, state->window_y, state->window_w, state->window_h, state->window_flags); if (!state->windows[i]) { fprintf(stderr, "Couldn't create window: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->window_minW || state->window_minH) { SDL_SetWindowMinimumSize(state->windows[i], state->window_minW, state->window_minH); } if (state->window_maxW || state->window_maxH) { SDL_SetWindowMaximumSize(state->windows[i], state->window_maxW, state->window_maxH); } SDL_GetWindowSize(state->windows[i], &w, &h); if (!(state->window_flags & SDL_WINDOW_RESIZABLE) && (w != state->window_w || h != state->window_h)) { printf("Window requested size %dx%d, got %dx%d\n", state->window_w, state->window_h, w, h); state->window_w = w; state->window_h = h; } if (SDL_SetWindowDisplayMode(state->windows[i], &fullscreen_mode) < 0) { fprintf(stderr, "Can't set up fullscreen display mode: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->window_icon) { SDL_Surface *icon = SDLTest_LoadIcon(state->window_icon); if (icon) { SDL_SetWindowIcon(state->windows[i], icon); SDL_FreeSurface(icon); } } SDL_ShowWindow(state->windows[i]); state->renderers[i] = NULL; if (!state->skip_renderer && (state->renderdriver || !(state->window_flags & SDL_WINDOW_OPENGL))) { m = -1; if (state->renderdriver) { SDL_RendererInfo info; n = SDL_GetNumRenderDrivers(); for (j = 0; j < n; ++j) { SDL_GetRenderDriverInfo(j, &info); if (SDL_strcasecmp(info.name, state->renderdriver) == 0) { m = j; break; } } if (m == n) { fprintf(stderr, "Couldn't find render driver named %s", state->renderdriver); return SDL_FALSE; } } state->renderers[i] = SDL_CreateRenderer(state->windows[i], m, state->render_flags); if (!state->renderers[i]) { fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->logical_w && state->logical_h) { SDL_RenderSetLogicalSize(state->renderers[i], state->logical_w, state->logical_h); } else if (state->scale) { SDL_RenderSetScale(state->renderers[i], state->scale, state->scale); } if (state->verbose & VERBOSE_RENDER) { SDL_RendererInfo info; fprintf(stderr, "Current renderer:\n"); SDL_GetRendererInfo(state->renderers[i], &info); SDLTest_PrintRenderer(&info); } } } } if (state->flags & SDL_INIT_AUDIO) { if (state->verbose & VERBOSE_AUDIO) { n = SDL_GetNumAudioDrivers(); if (n == 0) { fprintf(stderr, "No built-in audio drivers\n"); } else { fprintf(stderr, "Built-in audio drivers:"); for (i = 0; i < n; ++i) { if (i > 0) { fprintf(stderr, ","); } fprintf(stderr, " %s", SDL_GetAudioDriver(i)); } fprintf(stderr, "\n"); } } if (SDL_AudioInit(state->audiodriver) < 0) { fprintf(stderr, "Couldn't initialize audio driver: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->verbose & VERBOSE_VIDEO) { fprintf(stderr, "Audio driver: %s\n", SDL_GetCurrentAudioDriver()); } if (SDL_OpenAudio(&state->audiospec, NULL) < 0) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); return SDL_FALSE; } } return SDL_TRUE; }
int SDLFrontend::init (int width, int height, bool fullscreen, EventHandler &eventHandler) { if (width == -1 && height == -1) fullscreen = true; info(LOG_CLIENT, String::format("initializing: %i:%i - fullscreen: %s", width, height, fullscreen ? "true" : "false")); INIT_Subsystem(SDL_INIT_VIDEO, true); INIT_Subsystem(SDL_INIT_JOYSTICK, false); INIT_Subsystem(SDL_INIT_GAMECONTROLLER, false); INIT_Subsystem(SDL_INIT_HAPTIC, false); initJoystickAndHaptic(); SDL_DisplayMode displayMode; SDL_GetDesktopDisplayMode(0, &displayMode); const char *name = SDL_GetPixelFormatName(displayMode.format); info(LOG_CLIENT, String::format("current desktop mode: %dx%d@%dHz (%s)", displayMode.w, displayMode.h, displayMode.refresh_rate, name)); if (width == -1) width = 800;//displayMode.w; if (height == -1) height = 480; //displayMode.h; setGLAttributes(); setHints(); int doubleBuffered = 0; SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doubleBuffered); info(LOG_CLIENT, String::format("doublebuffer: %s", doubleBuffered ? "activated" : "disabled")); int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; #ifdef __IPHONEOS__ flags |= SDL_WINDOW_RESIZABLE; #endif #if 1 //defined __IPHONEOS__ || defined __ANDROID__ if (fullscreen) flags |= SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS; #else if (fullscreen) flags |= SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_BORDERLESS; #endif const int videoDrivers = SDL_GetNumVideoDrivers(); for (int i = 0; i < videoDrivers; ++i) { info(LOG_CLIENT, String::format("available driver: %s", SDL_GetVideoDriver(i))); } info(LOG_CLIENT, String::format("driver: %s", SDL_GetCurrentVideoDriver())); const int displays = SDL_GetNumVideoDisplays(); info(LOG_CLIENT, String::format("found %i display(s)", displays)); if (fullscreen && displays > 1) { width = displayMode.w; height = displayMode.h; info(LOG_CLIENT, String::format("use fake fullscreen for the first display: %i:%i", width, height)); } _window = SDL_CreateWindow(Singleton<Application>::getInstance().getName().c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags); if (!_window) { sdlCheckError(); return -1; } SDL_DisableScreenSaver(); initRenderer(); resetColor(); GLContext::get().init(); if (SDL_SetWindowBrightness(_window, 1.0f) == -1) sdlCheckError(); if (Config.isGrabMouse() && (!fullscreen || displays > 1)) { SDL_SetWindowGrab(_window, SDL_TRUE); } int screen = 0; int modes = SDL_GetNumDisplayModes(screen); info(LOG_CLIENT, "possible display modes:"); for (int i = 0; i < modes; i++) { SDL_GetDisplayMode(screen, i, &displayMode); name = SDL_GetPixelFormatName(displayMode.format); info(LOG_CLIENT, String::format("%dx%d@%dHz %s", displayMode.w, displayMode.h, displayMode.refresh_rate, name)); } // some platforms may override or hardcode the resolution - so // we have to query it here to get the actual resolution SDL_GetWindowSize(_window, &width, &height); if (SDL_SetRelativeMouseMode(SDL_TRUE) == -1) error(LOG_CLIENT, "no relative mouse mode support"); SDL_ShowCursor(0); info(LOG_CLIENT, String::format("actual resolution: %dx%d", width, height)); setVSync(ConfigManager::get().isVSync()); const int initState = IMG_Init(IMG_INIT_PNG); if (!(initState & IMG_INIT_PNG)) { sdlCheckError(); System.exit("No png support", 1); } _width = width; _height = height; updateViewport(0, 0, getWidth(), getHeight()); onInit(); _eventHandler = &eventHandler; _eventHandler->registerObserver(_console.get()); _eventHandler->registerObserver(this); info(LOG_CLIENT, "init the shader manager"); ShaderManager::get().init(); if (!Config.isSoundEnabled()) { info(LOG_CLIENT, "sound disabled"); } else if (!SoundControl.init(true)) { error(LOG_CLIENT, "sound initialization failed"); } return 0; }
SDL_bool CommonInit(CommonState * state) { int i, j, m, n; SDL_DisplayMode fullscreen_mode; if (state->flags & SDL_INIT_VIDEO) { if (state->verbose & VERBOSE_VIDEO) { n = SDL_GetNumVideoDrivers(); if (n == 0) { fprintf(stderr, "No built-in video drivers\n"); } else { fprintf(stderr, "Built-in video drivers:"); for (i = 0; i < n; ++i) { if (i > 0) { fprintf(stderr, ","); } fprintf(stderr, " %s", SDL_GetVideoDriver(i)); } fprintf(stderr, "\n"); } } if (SDL_VideoInit(state->videodriver, 0) < 0) { fprintf(stderr, "Couldn't initialize video driver: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->verbose & VERBOSE_VIDEO) { fprintf(stderr, "Video driver: %s\n", SDL_GetCurrentVideoDriver()); } if (state->verbose & VERBOSE_MODES) { SDL_DisplayMode mode; int bpp; Uint32 Rmask, Gmask, Bmask, Amask; n = SDL_GetNumVideoDisplays(); fprintf(stderr, "Number of displays: %d\n", n); for (i = 0; i < n; ++i) { fprintf(stderr, "Display %d:\n", i); SDL_SelectVideoDisplay(i); SDL_GetDesktopDisplayMode(&mode); SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); fprintf(stderr, " Current mode: %dx%d@%dHz, %d bits-per-pixel\n", mode.w, mode.h, mode.refresh_rate, bpp); if (Rmask || Gmask || Bmask) { fprintf(stderr, " Red Mask = 0x%.8x\n", Rmask); fprintf(stderr, " Green Mask = 0x%.8x\n", Gmask); fprintf(stderr, " Blue Mask = 0x%.8x\n", Bmask); if (Amask) fprintf(stderr, " Alpha Mask = 0x%.8x\n", Amask); } /* Print available fullscreen video modes */ m = SDL_GetNumDisplayModes(); if (m == 0) { fprintf(stderr, "No available fullscreen video modes\n"); } else { fprintf(stderr, " Fullscreen video modes:\n"); for (j = 0; j < m; ++j) { SDL_GetDisplayMode(j, &mode); SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); fprintf(stderr, " Mode %d: %dx%d@%dHz, %d bits-per-pixel\n", j, mode.w, mode.h, mode.refresh_rate, bpp); if (Rmask || Gmask || Bmask) { fprintf(stderr, " Red Mask = 0x%.8x\n", Rmask); fprintf(stderr, " Green Mask = 0x%.8x\n", Gmask); fprintf(stderr, " Blue Mask = 0x%.8x\n", Bmask); if (Amask) fprintf(stderr, " Alpha Mask = 0x%.8x\n", Amask); } } } } } SDL_SelectVideoDisplay(state->display); if (state->verbose & VERBOSE_RENDER) { SDL_RendererInfo info; n = SDL_GetNumRenderDrivers(); if (n == 0) { fprintf(stderr, "No built-in render drivers\n"); } else { fprintf(stderr, "Built-in render drivers:\n"); for (i = 0; i < n; ++i) { SDL_GetRenderDriverInfo(i, &info); PrintRenderer(&info); } } } switch (state->depth) { case 8: fullscreen_mode.format = SDL_PIXELFORMAT_INDEX8; break; case 15: fullscreen_mode.format = SDL_PIXELFORMAT_RGB555; break; case 16: fullscreen_mode.format = SDL_PIXELFORMAT_RGB565; break; default: fullscreen_mode.format = SDL_PIXELFORMAT_RGB888; break; } fullscreen_mode.w = state->window_w; fullscreen_mode.h = state->window_h; fullscreen_mode.refresh_rate = state->refresh_rate; SDL_SetFullscreenDisplayMode(&fullscreen_mode); state->windows = (SDL_WindowID *) SDL_malloc(state->num_windows * sizeof(*state->windows)); if (!state->windows) { fprintf(stderr, "Out of memory!\n"); return SDL_FALSE; } for (i = 0; i < state->num_windows; ++i) { char title[1024]; if (state->num_windows > 1) { SDL_snprintf(title, SDL_arraysize(title), "%s %d", state->window_title, i + 1); } else { SDL_strlcpy(title, state->window_title, SDL_arraysize(title)); } state->windows[i] = SDL_CreateWindow(title, state->window_x, state->window_y, state->window_w, state->window_h, state->window_flags); if (!state->windows[i]) { fprintf(stderr, "Couldn't create window: %s\n", SDL_GetError()); return SDL_FALSE; } if (!state->skip_renderer && (state->renderdriver || !(state->window_flags & SDL_WINDOW_OPENGL))) { m = -1; if (state->renderdriver) { SDL_RendererInfo info; n = SDL_GetNumRenderDrivers(); for (j = 0; j < n; ++j) { SDL_GetRenderDriverInfo(j, &info); if (SDL_strcasecmp(info.name, state->renderdriver) == 0) { m = j; break; } } if (m == n) { fprintf(stderr, "Couldn't find render driver named %s", state->renderdriver); return SDL_FALSE; } } if (SDL_CreateRenderer (state->windows[i], m, state->render_flags) < 0) { fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->verbose & VERBOSE_RENDER) { SDL_RendererInfo info; fprintf(stderr, "Current renderer:\n"); SDL_GetRendererInfo(&info); PrintRenderer(&info); } } } SDL_SelectRenderer(state->windows[0]); } if (state->flags & SDL_INIT_AUDIO) { if (state->verbose & VERBOSE_AUDIO) { n = SDL_GetNumAudioDrivers(); if (n == 0) { fprintf(stderr, "No built-in audio drivers\n"); } else { fprintf(stderr, "Built-in audio drivers:"); for (i = 0; i < n; ++i) { if (i > 0) { fprintf(stderr, ","); } fprintf(stderr, " %s", SDL_GetAudioDriver(i)); } fprintf(stderr, "\n"); } } if (SDL_AudioInit(state->audiodriver) < 0) { fprintf(stderr, "Couldn't initialize audio driver: %s\n", SDL_GetError()); return SDL_FALSE; } if (state->verbose & VERBOSE_VIDEO) { fprintf(stderr, "Audio driver: %s\n", SDL_GetCurrentAudioDriver()); } if (SDL_OpenAudio(&state->audiospec, NULL) < 0) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); return SDL_FALSE; } } return SDL_TRUE; }
bool GLAppSDL::initialize(int argc, char* argv[]) { if (!AppBaseSDL::initialize(argc, argv)) return false; SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, majorVersion); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minorVersion); #if defined(DEBUG) SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); #endif if (profile == SDL_GL_CONTEXT_PROFILE_ES) { #if 0 int numVideoDrivers = SDL_GetNumVideoDrivers(); int i; const char** drivers; drivers = (const char**)SDL_malloc(sizeof(const char*) * numVideoDrivers); for (i = 0; i < numVideoDrivers; i++) { drivers[i] = SDL_GetVideoDriver(i); } #endif // Only the indicated platforms pay attention to these hints // but they could be set on any platform. #if __WINDOWS__ || __LINUX__ SDL_SetHint(SDL_HINT_OPENGL_ES_DRIVER, "1"); #endif #if __WINDOWS__ // If using ANGLE copied from Chrome should set to "d3dcompiler_46.dll" // Should set value via compiler -D definition from gyp file. SDL_SetHint(SDL_HINT_VIDEO_WIN_D3DCOMPILER, "none"); #endif } #if __MACOSX__ SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1"); #endif pswMainWindow = SDL_CreateWindow( szName, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w_width, w_height, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE ); if (pswMainWindow == NULL) { (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } #if __WINDOWS__ // Set the applications own icon in place of the Windows default set by SDL. // Needs to be done here to avoid change being visible. setWindowsIcon(pswMainWindow); #endif sgcGLContext = SDL_GL_CreateContext(pswMainWindow); // Work around bug in SDL. It returns a 2.x context when 3.x is requested. // It does though internally record an error. const char* error = SDL_GetError(); if (sgcGLContext == NULL || (error[0] != '\0' && majorVersion >= 3 && (profile == SDL_GL_CONTEXT_PROFILE_CORE || profile == SDL_GL_CONTEXT_PROFILE_COMPATIBILITY)) ) { (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } #if __WINDOWS__ if (profile != SDL_GL_CONTEXT_PROFILE_ES) { // No choice but to use GLEW for GL on Windows; there is no .lib with static // bindings. For ES we use one of the hardware vendor SDKs all of which have // static bindings. // TODO: Figure out how to support {GLX,WGL}_EXT_create_context_es2_profile // were there are no static bindings. Need a GLEW equivalent for ES and // different compile options. Perhaps can borrow function loading stuff // from SDL's testgles2.c. // So one build of this library can be linked in to applications using GLEW and // applications not using GLEW, do not call any GLEW functions directly. // Call via queried function pointers. void* glewdll = SDL_LoadObject("glew32.dll"); if (glewdll == NULL) { std::string sName(szName); (void)SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } typedef GLenum(GLEWAPIENTRY PFNGLEWINIT)(void); typedef const GLubyte * GLEWAPIENTRY PFNGLEWGETERRORSTRING(GLenum error); PFNGLEWINIT* pGlewInit; PFNGLEWGETERRORSTRING* pGlewGetErrorString; bool error = true; #define STR(s) #s #if defined(_M_IX86) /* Win32 GLEW uses __stdcall. */ #define DNAMESTR(x,n) STR(_##x##@##n) #else /* x64 uses __cdecl. */ #define DNAMESTR(x,n) STR(x) #endif pGlewInit = (PFNGLEWINIT*)SDL_LoadFunction(glewdll, DNAMESTR(glewInit,0)); if (pGlewInit != NULL) { pGlewGetErrorString = (PFNGLEWGETERRORSTRING*)SDL_LoadFunction( glewdll, DNAMESTR(glewGetErrorString,4)); if (pGlewGetErrorString != NULL) { error = false; } } if (error) { std::string sName(szName); (void)SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); return false; } int iResult = pGlewInit(); if (iResult != GLEW_OK) { std::string sName(szName); (void)SDL_ShowSimpleMessageBox( SDL_MESSAGEBOX_ERROR, szName, (const char*)pGlewGetErrorString(iResult), NULL); return false; } }
/** * @brief Init the SDL window */ bool R_InitGraphics (const viddefContext_t* context) { uint32_t flags; int i; SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (context->multisample > 0) { Com_Printf("I: set multisample buffers to %i\n", context->multisample); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, context->multisample); } else { Com_Printf("I: disable multisample buffers\n"); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } #if SDL_VERSION_ATLEAST(2,0,0) /* valid values are between -1 and 1 */ i = std::min(1, std::max(-1, context->swapinterval)); Com_Printf("I: set swap control to %i\n", i); SDL_GL_SetSwapInterval(i); flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; if (context->fullscreen) flags |= SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS; const int videoDrivers = SDL_GetNumVideoDrivers(); for (int i = 0; i < videoDrivers; ++i) { Com_Printf("available driver: %s\n", SDL_GetVideoDriver(i)); } SDL_DisplayMode displayMode; SDL_GetDesktopDisplayMode(0, &displayMode); const char* name = SDL_GetPixelFormatName(displayMode.format); Com_Printf("current desktop mode: %dx%d@%dHz (%s)\n", displayMode.w, displayMode.h, displayMode.refresh_rate, name); SDL_VideoInit(nullptr); SDL_SetModState(KMOD_NONE); SDL_StopTextInput(); Com_Printf("driver: %s\n", SDL_GetCurrentVideoDriver()); const int displays = SDL_GetNumVideoDisplays(); Com_Printf("found %i display(s)\n", displays); int width = context->width; int height = context->height; if (context->fullscreen && displays > 1) { width = displayMode.w; height = displayMode.h; Com_Printf("use fake fullscreen for the first display: %i:%i\n", width, height); } cls.window = SDL_CreateWindow(GAME_TITLE_LONG, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags); if (!cls.window) { const char* error = SDL_GetError(); Com_Printf("SDL SDL_CreateWindow failed: %s\n", error); SDL_ClearError(); return -1; } cls.context = SDL_GL_CreateContext(cls.window); #else /* valid values are between 0 and 2 */ i = std::min(2, std::max(0, context->swapinterval)); Com_Printf("I: set swap control to %i\n", i); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, i); flags = SDL_OPENGL; if (context->fullscreen) flags |= SDL_FULLSCREEN; /*flags |= SDL_NOFRAME;*/ SDL_Surface* screen = SDL_SetVideoMode(context->width, context->height, 0, flags); if (!screen) { const char* error = SDL_GetError(); Com_Printf("SDL SetVideoMode failed: %s\n", error); SDL_ClearError(); return false; } #endif SDL_ShowCursor(SDL_DISABLE); return true; }
int main(int argc, char *argv[]) { const SDL_VideoInfo *info; int i, d, n; const char *driver; SDL_DisplayMode mode; int bpp; Uint32 Rmask, Gmask, Bmask, Amask; int nmodes; /* Print available video drivers */ n = SDL_GetNumVideoDrivers(); if (n == 0) { printf("No built-in video drivers\n"); } else { printf("Built-in video drivers:"); for (i = 0; i < n; ++i) { if (i > 0) { printf(","); } printf(" %s", SDL_GetVideoDriver(i)); } printf("\n"); } if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } driver = SDL_GetCurrentVideoDriver(); if (driver) { printf("Video driver: %s\n", driver); } printf("Number of displays: %d\n", SDL_GetNumVideoDisplays()); for (d = 0; d < SDL_GetNumVideoDisplays(); ++d) { printf("Display %d:\n", d); SDL_SelectVideoDisplay(d); SDL_GetDesktopDisplayMode(&mode); SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); printf(" Current mode: %dx%d@%dHz, %d bits-per-pixel\n", mode.w, mode.h, mode.refresh_rate, bpp); if (Rmask || Gmask || Bmask) { printf(" Red Mask = 0x%.8x\n", Rmask); printf(" Green Mask = 0x%.8x\n", Gmask); printf(" Blue Mask = 0x%.8x\n", Bmask); if (Amask) printf(" Alpha Mask = 0x%.8x\n", Amask); } /* Print available fullscreen video modes */ nmodes = SDL_GetNumDisplayModes(); if (nmodes == 0) { printf("No available fullscreen video modes\n"); } else { printf(" Fullscreen video modes:\n"); for (i = 0; i < nmodes; ++i) { SDL_GetDisplayMode(i, &mode); SDL_PixelFormatEnumToMasks(mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); printf(" Mode %d: %dx%d@%dHz, %d bits-per-pixel\n", i, mode.w, mode.h, mode.refresh_rate, bpp); if (Rmask || Gmask || Bmask) { printf(" Red Mask = 0x%.8x\n", Rmask); printf(" Green Mask = 0x%.8x\n", Gmask); printf(" Blue Mask = 0x%.8x\n", Bmask); if (Amask) printf(" Alpha Mask = 0x%.8x\n", Amask); } } } } info = SDL_GetVideoInfo(); if (info->wm_available) { printf("A window manager is available\n"); } if (info->hw_available) { printf("Hardware surfaces are available (%dK video memory)\n", info->video_mem); } if (info->blit_hw) { printf("Copy blits between hardware surfaces are accelerated\n"); } if (info->blit_hw_CC) { printf("Colorkey blits between hardware surfaces are accelerated\n"); } if (info->blit_hw_A) { printf("Alpha blits between hardware surfaces are accelerated\n"); } if (info->blit_sw) { printf ("Copy blits from software surfaces to hardware surfaces are accelerated\n"); } if (info->blit_sw_CC) { printf ("Colorkey blits from software surfaces to hardware surfaces are accelerated\n"); } if (info->blit_sw_A) { printf ("Alpha blits from software surfaces to hardware surfaces are accelerated\n"); } if (info->blit_fill) { printf("Color fills on hardware surfaces are accelerated\n"); } printf("Current resolution: %dx%d\n", info->current_w, info->current_h); #if 0 if (argv[1] && (strcmp(argv[1], "-benchmark") == 0)) { RunVideoTests(); } #endif SDL_Quit(); return (0); }
bool initGL() { #ifdef DEBUG_DRIVERS /************ DEBUG DRIVERS ********************************/ // Identify video drivers (this is for debug) OUTSTREAM << "\nSDL found the following video drivers:\n"; int numdrivers = SDL_GetNumVideoDrivers(); const char* drivername; for (int i = 0; i < numdrivers; ++i) { drivername = SDL_GetVideoDriver(i); if (SDL_VideoInit(drivername) == 0) { SDL_VideoQuit(); OUTSTREAM << "\t\t Driver " << drivername << " works.\n"; } else { OUTSTREAM << "\t<!>\tDriver " << drivername << " DOES NOT WORK!\n"; } } // Identify render drivers (this is for debug) OUTSTREAM << "SDL found the following render drivers: "; numdrivers = SDL_GetNumRenderDrivers(); for (int i = 0; i < numdrivers; ++i) { SDL_RendererInfo info; SDL_GetRenderDriverInfo(i, &info); OUTSTREAM << info.name << ((i < numdrivers - 1)? ", " : "\n"); } #endif /************************** DEBUG DRIVERS ********************************/ // Initialize SDL overall. if (SDL_Init(SDL_INIT_VIDEO) < 0) { OUTSTREAM << "<!> SDL did not initialize! SDL Error: " << SDL_GetError() << std::endl; return false; } // SDL_GL_CONTEXT_CORE gives us only the newer version, deprecated functions are disabled SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); // Specify OpenGL version SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, GLVERSION_MAJOR); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, GLVERSION_MINOR); // Turn on double buffering with a 24bit Z buffer. // You may need to change this to 16 or 32 for your system SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // Create the SDL window pWindow = SDL_CreateWindow("OpenGL Window", // name of window SDL_WINDOWPOS_CENTERED, // x position of window SDL_WINDOWPOS_CENTERED, // y position of window RESOLUTION_X, RESOLUTION_Y, // x and y width of window SCREENOPTIONS); // options (fullscreen, etc) // If the window couldn't be created for whatever reason if (pWindow == NULL) { OUTSTREAM << "<!> SDL window was not created! SDL Error: " << SDL_GetError() << std::endl; return false; } else { OUTSTREAM << "SDL window created.\n"; } //Create context context = SDL_GL_CreateContext(pWindow); //context is the place where openGL can draw if(context == NULL) { OUTSTREAM << "<!> OpenGL context was not created! SDL Error: " << SDL_GetError() << std::endl; return false; } else { OUTSTREAM << "GL context created.\n"; } checkGlError(__LINE__); //Initialize GLEW (openGL Extensions Wrangler) glewExperimental = GL_TRUE; // Sometimes things wont work without this line GLenum glewError = glewInit(); // GL enumerator error is thrown here when using openGL versions 3.2+ It's fine. // see https://www.opengl.org/wiki/OpenGL_Loading_Library if(glewError != GLEW_OK) { OUTSTREAM << "<!> Could not initialize GLEW! " << glewGetErrorString(glewError) << std::endl; return false; } else { OUTSTREAM << "GLEW initialized.\n"; } checkGlError(__LINE__); #ifdef USE_VSYNC /************ USE VSYNC ********************************/ if (SDL_GL_SetSwapInterval(1) < 0) { OUTSTREAM << "<!> Warning: Unable to set VSync! SDL Error: " << SDL_GetError() << std::endl; // Do not return. This is not an essential functionality. } else { OUTSTREAM << "VSync enabled.\n"; } #endif /********************** USE VSYNC ********************************/ // set openGL clear color glClearColor(CLEARCOLOR); #ifdef USE_DEPTHBUFFER // enable the occlusion of objects hidden behind other objects (using the depth buffer) glEnable(GL_DEPTH_TEST); // set the test for that occlusion to: "draw if distance of new fragment is less than or equal to old fragment" glDepthFunc(GL_LEQUAL); #endif #ifdef USE_BACKFACE_CULLING // enable the culling of back faces (back faces will not be drawn) glEnable(GL_CULL_FACE); #endif #ifdef USE_TRANSPARENCY // enable transparency glEnable (GL_BLEND); // set transparency function (this is standard transparency) glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif checkGlError(__LINE__); checkSDLError(__LINE__); return true; }