mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-29 15:32:54 +00:00
Convert SDL_Surface code to SDL_Renderer
This commit is contained in:
parent
61036dfdca
commit
4ae2e12cbf
1 changed files with 95 additions and 49 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue