Convert SDL_Surface code to SDL_Renderer

This commit is contained in:
Braden Obrzut 2019-12-08 21:31:16 -05:00
parent 61036dfdca
commit 4ae2e12cbf

View file

@ -42,6 +42,7 @@
#include "v_video.h" #include "v_video.h"
#include "version.h" #include "version.h"
#include "c_console.h" #include "c_console.h"
#include "c_dispatch.h"
#include "s_sound.h" #include "s_sound.h"
#include "hardware.h" #include "hardware.h"
@ -89,27 +90,25 @@ CUSTOM_CVAR(Bool, gl_es, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCA
Printf("This won't take effect until " GAMENAME " is restarted.\n"); Printf("This won't take effect until " GAMENAME " is restarted.\n");
} }
CUSTOM_CVAR (Int, polysdl_acceleration, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL)
{
if (self == 0)
Printf("Disabling softpoly acceleration!...\n");
else if (self == 1)
Printf("Selecting OpenGL acceleration...\n");
else if (self == 2)
Printf("Selecting Vulkan acceleration...\n");
else
{
Printf("Incorrect value selected! Selecting OpenGL acceleration...\n");
self = 1;
}
Printf("This won't take effect until " GAMENAME " is restarted.\n");
}
CVAR(Bool, i_soundinbackground, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, i_soundinbackground, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR (Int, vid_adapter, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR (Int, vid_adapter, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CUSTOM_CVAR(String, vid_sdl_render_driver, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL)
{
Printf("This won't take effect until " GAMENAME " is restarted.\n");
}
CCMD(vid_list_sdl_render_drivers)
{
for (int i = 0; i < SDL_GetNumRenderDrivers(); ++i)
{
SDL_RendererInfo info;
if (SDL_GetRenderDriverInfo(i, &info) == 0)
Printf("%s\n", info.name);
}
}
// PRIVATE DATA DEFINITIONS ------------------------------------------------ // PRIVATE DATA DEFINITIONS ------------------------------------------------
namespace Priv namespace Priv
@ -252,40 +251,88 @@ bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface)
namespace namespace
{ {
SDL_Surface* polysurface = nullptr; SDL_Renderer* polyrendertarget = nullptr;
SDL_Texture* polytexture = nullptr;
int polytexturew = 0;
int polytextureh = 0;
bool polyvsync = false;
bool polyfirstinit = true;
} }
void I_PolyPresentInit() void I_PolyPresentInit()
{ {
assert(Priv::softpolyEnabled); assert(Priv::softpolyEnabled);
assert(Priv::window != nullptr); assert(Priv::window != nullptr);
if (strcmp(vid_sdl_render_driver, "") != 0)
{
SDL_SetHint(SDL_HINT_RENDER_DRIVER, vid_sdl_render_driver);
}
} }
uint8_t *I_PolyPresentLock(int w, int h, bool vsync, int &pitch) uint8_t *I_PolyPresentLock(int w, int h, bool vsync, int &pitch)
{ {
if (!polysurface || polysurface->w != w || polysurface->h != h) // When vsync changes we need to reinitialize
if (polyrendertarget && polyvsync != vsync)
{ {
if (polysurface) I_PolyPresentDeinit();
{
SDL_FreeSurface(polysurface);
polysurface = nullptr;
}
polysurface = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
SDL_SetSurfaceBlendMode(polysurface, SDL_BLENDMODE_NONE);
} }
SDL_LockSurface(polysurface); if (!polyrendertarget)
pitch = polysurface->pitch; {
return (uint8_t*)polysurface->pixels; polyvsync = vsync;
if ((polyrendertarget = SDL_CreateRenderer(Priv::window, -1, vsync ? SDL_RENDERER_PRESENTVSYNC : 0)) == nullptr)
{
I_Error("Could not create render target for softpoly.");
}
// Tell the user which render driver is being used, but don't repeat
// outselves if we're just changing vsync.
if (polyfirstinit)
{
polyfirstinit = false;
SDL_RendererInfo rendererInfo;
if (SDL_GetRendererInfo(polyrendertarget, &rendererInfo) == 0)
{
Printf("Using render driver %s\n", rendererInfo.name);
}
else
{
Printf("Failed to query render driver\n");
}
}
// Mask color
SDL_SetRenderDrawColor(polyrendertarget, 0, 0, 0, 255);
}
if (!polytexture || polytexturew != w || polytextureh != h)
{
if (polytexture)
{
SDL_DestroyTexture(polytexture);
polytexture = nullptr;
polytexturew = polytextureh = 0;
}
if ((polytexture = SDL_CreateTexture(polyrendertarget, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h)) == nullptr)
I_Error("Failed to create %dx%d render target texture.", w, h);
polytexturew = w;
polytextureh = h;
}
uint8_t* pixels;
SDL_LockTexture(polytexture, nullptr, (void**)&pixels, &pitch);
return pixels;
} }
void I_PolyPresentUnlock(int x, int y, int width, int height) void I_PolyPresentUnlock(int x, int y, int width, int height)
{ {
SDL_UnlockSurface(polysurface); SDL_UnlockTexture(polytexture);
SDL_Surface* windowsurface = SDL_GetWindowSurface(Priv::window); int ClientWidth, ClientHeight;
int ClientWidth = windowsurface->w; SDL_GetRendererOutputSize(polyrendertarget, &ClientWidth, &ClientHeight);
int ClientHeight = windowsurface->h;
SDL_Rect clearrects[4]; SDL_Rect clearrects[4];
int count = 0; int count = 0;
@ -323,24 +370,30 @@ void I_PolyPresentUnlock(int x, int y, int width, int height)
} }
if (count > 0) if (count > 0)
SDL_FillRects(windowsurface, clearrects, count, SDL_MapRGBA(windowsurface->format, 0, 0, 0, 255)); SDL_RenderFillRects(polyrendertarget, clearrects, count);
SDL_Rect dstrect; SDL_Rect dstrect;
dstrect.x = x; dstrect.x = x;
dstrect.y = y; dstrect.y = y;
dstrect.w = width; dstrect.w = width;
dstrect.h = height; dstrect.h = height;
SDL_BlitScaled(polysurface, nullptr, windowsurface, &dstrect); SDL_RenderCopy(polyrendertarget, polytexture, nullptr, &dstrect);
SDL_UpdateWindowSurface(Priv::window); SDL_RenderPresent(polyrendertarget);
} }
void I_PolyPresentDeinit() void I_PolyPresentDeinit()
{ {
if (polysurface) if (polytexture)
{ {
SDL_FreeSurface(polysurface); SDL_DestroyTexture(polytexture);
polysurface = nullptr; polytexture = nullptr;
}
if (polyrendertarget)
{
SDL_DestroyRenderer(polyrendertarget);
polyrendertarget = nullptr;
} }
} }
@ -376,14 +429,7 @@ SDLVideo::SDLVideo ()
} }
else if (Priv::softpolyEnabled) else if (Priv::softpolyEnabled)
{ {
uint32_t win_flags = SDL_WINDOW_HIDDEN; Priv::CreateWindow(SDL_WINDOW_HIDDEN);
if (polysdl_acceleration == 1)
win_flags |= SDL_WINDOW_OPENGL;
#if 0 // this currently does not work - it crashes
else if (polysdl_acceleration == 2)
win_flags |= SDL_WINDOW_VULKAN;
#endif
Priv::CreateWindow(win_flags);
} }
#endif #endif
} }