X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=ebfd6a5c48b279fc7ff84abd233f241b2ade0d9a;hb=ae3b4e39699426588abeb16a6114819652aa2cdb;hp=bf00eadbcc4c422e3401a81a1f08dfbebe4bad70;hpb=f3df9df1084ac74e3f7c0be0560bea46517316fd;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index bf00eadb..ebfd6a5c 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -106,6 +106,12 @@ static void UpdateScreenExt(SDL_Rect *rect, boolean with_frame_delay) #if defined(TARGET_SDL2) SDL_Texture *sdl_texture = sdl_texture_stream; + // deactivate use of target texture if render targets are not supported + if ((video.screen_rendering_mode == SPECIAL_RENDERING_TARGET || + video.screen_rendering_mode == SPECIAL_RENDERING_DOUBLE) && + sdl_texture_target == NULL) + video.screen_rendering_mode = SPECIAL_RENDERING_OFF; + if (video.screen_rendering_mode == SPECIAL_RENDERING_TARGET) sdl_texture = sdl_texture_target; @@ -385,13 +391,8 @@ void SDLInitVideoBuffer(boolean fullscreen) { video.window_scaling_percent = setup.window_scaling_percent; video.window_scaling_quality = setup.window_scaling_quality; - video.screen_rendering_mode = - (strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? - SPECIAL_RENDERING_BITMAP : - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? - SPECIAL_RENDERING_TARGET: - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? - SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); + + SDLSetScreenRenderingMode(setup.screen_rendering_mode); #if defined(TARGET_SDL2) // SDL 2.0: support for (desktop) fullscreen mode available @@ -445,6 +446,18 @@ static boolean SDLCreateScreen(boolean fullscreen) int surface_flags_fullscreen = SURFACE_FLAGS; // (no fullscreen in SDL 1.2) #endif +#if defined(TARGET_SDL2) +#if 1 + int renderer_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE; +#else + /* If SDL_CreateRenderer() is called from within a VirtualBox Windows VM + _without_ enabling 2D/3D acceleration and/or guest additions installed, + it will crash if flags are *not* set to SDL_RENDERER_SOFTWARE (because + it will try to use accelerated graphics and apparently fails miserably) */ + int renderer_flags = SDL_RENDERER_SOFTWARE; +#endif +#endif + int width = video.width; int height = video.height; int surface_flags = (fullscreen ? surface_flags_fullscreen : @@ -501,17 +514,8 @@ static boolean SDLCreateScreen(boolean fullscreen) if (sdl_window != NULL) { -#if 0 - /* if SDL_CreateRenderer() is called from within a VirtualBox Windows VM - *without* enabling 2D/3D acceleration and/or guest additions installed, - it will crash if flags are *not* set to SDL_RENDERER_SOFTWARE (because - it will try to use accelerated graphics and apparently fails miserably) */ if (sdl_renderer == NULL) - sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_SOFTWARE); -#else - if (sdl_renderer == NULL) - sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); -#endif + sdl_renderer = SDL_CreateRenderer(sdl_window, -1, renderer_flags); if (sdl_renderer != NULL) { @@ -524,13 +528,13 @@ static boolean SDLCreateScreen(boolean fullscreen) SDL_TEXTUREACCESS_STREAMING, width, height); - sdl_texture_target = SDL_CreateTexture(sdl_renderer, - SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_TARGET, - width, height); + if (SDL_RenderTargetSupported(sdl_renderer)) + sdl_texture_target = SDL_CreateTexture(sdl_renderer, + SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_TARGET, + width, height); - if (sdl_texture_stream != NULL && - sdl_texture_target != NULL) + if (sdl_texture_stream != NULL) { // use SDL default values for RGB masks and no alpha channel new_surface = SDL_CreateRGBSurface(0, width, height, 32, 0,0,0, 0); @@ -640,13 +644,8 @@ boolean SDLSetVideoMode(boolean fullscreen) video.fullscreen_enabled = FALSE; video.window_scaling_percent = setup.window_scaling_percent; video.window_scaling_quality = setup.window_scaling_quality; - video.screen_rendering_mode = - (strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? - SPECIAL_RENDERING_BITMAP : - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? - SPECIAL_RENDERING_TARGET: - strEqual(setup.screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? - SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); + + SDLSetScreenRenderingMode(setup.screen_rendering_mode); } } @@ -722,8 +721,7 @@ void SDLSetWindowScalingQuality(char *window_scaling_quality) { SDL_Texture *new_texture; - if (sdl_texture_stream == NULL || - sdl_texture_target == NULL) + if (sdl_texture_stream == NULL) return; SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, window_scaling_quality); @@ -740,10 +738,13 @@ void SDLSetWindowScalingQuality(char *window_scaling_quality) sdl_texture_stream = new_texture; } - new_texture = SDL_CreateTexture(sdl_renderer, - SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_TARGET, - video.width, video.height); + if (SDL_RenderTargetSupported(sdl_renderer)) + new_texture = SDL_CreateTexture(sdl_renderer, + SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_TARGET, + video.width, video.height); + else + new_texture = NULL; if (new_texture != NULL) { @@ -757,17 +758,6 @@ void SDLSetWindowScalingQuality(char *window_scaling_quality) video.window_scaling_quality = window_scaling_quality; } -void SDLSetScreenRenderingMode(char *screen_rendering_mode) -{ - video.screen_rendering_mode = - (strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? - SPECIAL_RENDERING_BITMAP : - strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? - SPECIAL_RENDERING_TARGET: - strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? - SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); -} - void SDLSetWindowFullscreen(boolean fullscreen) { if (sdl_window == NULL) @@ -788,12 +778,27 @@ void SDLSetWindowFullscreen(boolean fullscreen) video.fullscreen_initial = FALSE; } } +#endif + +void SDLSetScreenRenderingMode(char *screen_rendering_mode) +{ +#if defined(TARGET_SDL2) + video.screen_rendering_mode = + (strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_BITMAP) ? + SPECIAL_RENDERING_BITMAP : + strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_TARGET) ? + SPECIAL_RENDERING_TARGET: + strEqual(screen_rendering_mode, STR_SPECIAL_RENDERING_DOUBLE) ? + SPECIAL_RENDERING_DOUBLE : SPECIAL_RENDERING_OFF); +#else + video.screen_rendering_mode = SPECIAL_RENDERING_BITMAP; +#endif +} void SDLRedrawWindow() { UpdateScreen_WithoutFrameDelay(NULL); } -#endif void SDLCreateBitmapContent(Bitmap *bitmap, int width, int height, int depth)