2013-12-19 17:10:14 +00:00
|
|
|
#include "Renderer_if.h"
|
2020-12-15 14:09:42 +00:00
|
|
|
#include "spg.h"
|
2013-12-19 17:10:14 +00:00
|
|
|
#include "hw/pvr/pvr_mem.h"
|
2020-03-28 16:58:01 +00:00
|
|
|
#include "rend/TexCache.h"
|
2021-03-01 09:13:40 +00:00
|
|
|
#include "cfg/option.h"
|
2021-09-02 15:51:23 +00:00
|
|
|
#include "network/ggpo.h"
|
2021-10-01 14:48:01 +00:00
|
|
|
#include "emulator.h"
|
2021-11-13 14:56:42 +00:00
|
|
|
#include "serialize.h"
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
#include <mutex>
|
2015-01-16 20:37:30 +00:00
|
|
|
|
2021-07-07 11:12:16 +00:00
|
|
|
void retro_rend_present();
|
|
|
|
#ifndef LIBRETRO
|
2021-09-29 08:22:58 +00:00
|
|
|
void retro_rend_present()
|
|
|
|
{
|
|
|
|
if (!config::ThreadedRendering)
|
|
|
|
sh4_cpu.Stop();
|
|
|
|
}
|
2021-07-07 11:12:16 +00:00
|
|
|
#endif
|
|
|
|
|
2013-12-19 17:10:14 +00:00
|
|
|
u32 VertexCount=0;
|
2014-05-08 01:29:14 +00:00
|
|
|
u32 FrameCount=1;
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2014-12-17 05:48:45 +00:00
|
|
|
Renderer* renderer;
|
2015-07-29 04:22:59 +00:00
|
|
|
|
2019-04-27 12:08:43 +00:00
|
|
|
cResetEvent rs, re;
|
2019-05-17 15:13:48 +00:00
|
|
|
static bool do_swap;
|
2020-12-15 14:09:42 +00:00
|
|
|
std::mutex swap_mutex;
|
2020-12-15 15:27:34 +00:00
|
|
|
u32 fb_w_cur = 1;
|
2021-09-03 09:11:46 +00:00
|
|
|
static cResetEvent vramRollback;
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
// direct framebuffer write detection
|
2018-08-26 14:58:10 +00:00
|
|
|
static bool render_called = false;
|
2019-05-19 17:45:05 +00:00
|
|
|
u32 fb_watch_addr_start;
|
|
|
|
u32 fb_watch_addr_end;
|
2018-08-26 14:58:10 +00:00
|
|
|
bool fb_dirty;
|
|
|
|
|
2021-11-13 14:56:42 +00:00
|
|
|
static bool pend_rend;
|
2020-12-15 14:09:42 +00:00
|
|
|
|
2013-12-19 17:10:14 +00:00
|
|
|
TA_context* _pvrrc;
|
|
|
|
|
2019-10-21 14:39:16 +00:00
|
|
|
static bool rend_frame(TA_context* ctx)
|
|
|
|
{
|
2015-01-16 20:37:30 +00:00
|
|
|
bool proc = renderer->Process(ctx);
|
2020-12-15 14:09:42 +00:00
|
|
|
|
2018-08-26 14:58:10 +00:00
|
|
|
if (!proc || (!ctx->rend.isRTT && !ctx->rend.isRenderFramebuffer))
|
2018-05-09 12:46:06 +00:00
|
|
|
// If rendering to texture, continue locking until the frame is rendered
|
|
|
|
re.Set();
|
2021-09-03 09:11:46 +00:00
|
|
|
rend_allow_rollback();
|
2015-01-16 20:37:30 +00:00
|
|
|
|
2019-10-21 14:39:16 +00:00
|
|
|
return proc && renderer->Render();
|
2015-01-16 20:37:30 +00:00
|
|
|
}
|
2014-12-11 01:57:23 +00:00
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
bool rend_single_frame(const bool& enabled)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2014-05-02 00:43:34 +00:00
|
|
|
do
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2021-07-07 11:12:16 +00:00
|
|
|
if (config::ThreadedRendering && !rs.Wait(50))
|
2020-12-15 14:09:42 +00:00
|
|
|
return false;
|
|
|
|
if (do_swap)
|
2019-02-06 18:57:13 +00:00
|
|
|
{
|
2020-12-15 14:09:42 +00:00
|
|
|
do_swap = false;
|
|
|
|
if (renderer->Present())
|
2019-05-17 15:13:48 +00:00
|
|
|
{
|
2020-12-15 14:09:42 +00:00
|
|
|
rs.Set(); // don't miss any render
|
2021-07-07 11:12:16 +00:00
|
|
|
retro_rend_present();
|
2020-12-15 14:09:42 +00:00
|
|
|
return true;
|
2019-05-17 15:13:48 +00:00
|
|
|
}
|
2019-02-06 18:57:13 +00:00
|
|
|
}
|
2020-12-15 14:09:42 +00:00
|
|
|
if (!enabled)
|
2018-07-23 17:47:24 +00:00
|
|
|
return false;
|
|
|
|
|
2013-12-19 17:10:14 +00:00
|
|
|
_pvrrc = DequeueRender();
|
2021-07-07 11:12:16 +00:00
|
|
|
if (!config::ThreadedRendering && _pvrrc == nullptr)
|
|
|
|
return false;
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
2021-07-07 11:12:16 +00:00
|
|
|
while (_pvrrc == nullptr);
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
bool frame_rendered = rend_frame(_pvrrc);
|
|
|
|
|
|
|
|
if (frame_rendered)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lock(swap_mutex);
|
2021-03-01 09:13:40 +00:00
|
|
|
if (config::DelayFrameSwapping && !_pvrrc->rend.isRenderFramebuffer && fb_w_cur != FB_R_SOF1 && !do_swap)
|
2020-12-15 14:09:42 +00:00
|
|
|
// Delay swap
|
|
|
|
frame_rendered = false;
|
|
|
|
else
|
|
|
|
// Swap now
|
|
|
|
do_swap = false;
|
|
|
|
}
|
|
|
|
if (frame_rendered)
|
2021-07-07 11:12:16 +00:00
|
|
|
{
|
2020-12-15 14:09:42 +00:00
|
|
|
frame_rendered = renderer->Present();
|
2021-07-07 11:12:16 +00:00
|
|
|
if (frame_rendered)
|
|
|
|
retro_rend_present();
|
|
|
|
}
|
2020-12-15 14:09:42 +00:00
|
|
|
}
|
|
|
|
|
2018-05-09 12:46:06 +00:00
|
|
|
if (_pvrrc->rend.isRTT)
|
|
|
|
re.Set();
|
|
|
|
|
2013-12-19 17:10:14 +00:00
|
|
|
//clear up & free data ..
|
2014-05-02 00:43:34 +00:00
|
|
|
FinishRender(_pvrrc);
|
2020-12-15 14:09:42 +00:00
|
|
|
_pvrrc = nullptr;
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
return frame_rendered;
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
Renderer* rend_GLES2();
|
|
|
|
Renderer* rend_GL4();
|
|
|
|
Renderer* rend_norend();
|
|
|
|
Renderer* rend_Vulkan();
|
|
|
|
Renderer* rend_OITVulkan();
|
2021-04-12 20:49:04 +00:00
|
|
|
Renderer* rend_DirectX9();
|
2021-11-26 17:08:41 +00:00
|
|
|
Renderer* rend_DirectX11();
|
2021-12-11 17:53:35 +00:00
|
|
|
Renderer* rend_OITDirectX11();
|
2020-12-15 14:09:42 +00:00
|
|
|
|
2018-10-04 17:44:52 +00:00
|
|
|
static void rend_create_renderer()
|
|
|
|
{
|
|
|
|
#ifdef NO_REND
|
|
|
|
renderer = rend_norend();
|
|
|
|
#else
|
2021-03-01 09:13:40 +00:00
|
|
|
switch (config::RendererType)
|
2018-10-04 17:44:52 +00:00
|
|
|
{
|
|
|
|
default:
|
2021-12-18 10:50:03 +00:00
|
|
|
#ifdef USE_OPENGL
|
2020-12-15 15:27:34 +00:00
|
|
|
case RenderType::OpenGL:
|
2018-10-04 17:44:52 +00:00
|
|
|
renderer = rend_GLES2();
|
|
|
|
break;
|
2020-04-26 08:03:57 +00:00
|
|
|
#if !defined(GLES) && !defined(__APPLE__)
|
2020-12-15 15:27:34 +00:00
|
|
|
case RenderType::OpenGL_OIT:
|
2018-10-04 17:44:52 +00:00
|
|
|
renderer = rend_GL4();
|
|
|
|
break;
|
2019-10-05 09:50:14 +00:00
|
|
|
#endif
|
2021-12-18 10:50:03 +00:00
|
|
|
#endif
|
2019-10-05 09:50:14 +00:00
|
|
|
#ifdef USE_VULKAN
|
2020-12-15 15:27:34 +00:00
|
|
|
case RenderType::Vulkan:
|
2019-10-05 09:50:14 +00:00
|
|
|
renderer = rend_Vulkan();
|
|
|
|
break;
|
2020-12-15 15:27:34 +00:00
|
|
|
case RenderType::Vulkan_OIT:
|
2019-11-13 19:08:14 +00:00
|
|
|
renderer = rend_OITVulkan();
|
|
|
|
break;
|
2021-04-12 20:49:04 +00:00
|
|
|
#endif
|
2021-11-19 22:18:45 +00:00
|
|
|
#ifdef USE_DX9
|
2021-04-12 20:49:04 +00:00
|
|
|
case RenderType::DirectX9:
|
|
|
|
renderer = rend_DirectX9();
|
|
|
|
break;
|
2021-11-26 17:08:41 +00:00
|
|
|
#endif
|
2021-12-13 20:02:44 +00:00
|
|
|
#if (defined(_WIN32) && !defined(LIBRETRO)) || defined(HAVE_D3D11)
|
2021-11-26 17:08:41 +00:00
|
|
|
case RenderType::DirectX11:
|
|
|
|
renderer = rend_DirectX11();
|
|
|
|
break;
|
2021-12-11 17:53:35 +00:00
|
|
|
case RenderType::DirectX11_OIT:
|
|
|
|
renderer = rend_OITDirectX11();
|
|
|
|
break;
|
2018-10-04 18:01:14 +00:00
|
|
|
#endif
|
2018-10-04 17:44:52 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-02-17 23:25:06 +00:00
|
|
|
void rend_init_renderer()
|
2018-10-04 11:37:45 +00:00
|
|
|
{
|
2021-09-29 08:22:58 +00:00
|
|
|
if (renderer == nullptr)
|
2019-02-17 23:25:06 +00:00
|
|
|
rend_create_renderer();
|
2018-10-04 11:37:45 +00:00
|
|
|
if (!renderer->Init())
|
2021-09-29 08:22:58 +00:00
|
|
|
die("Renderer initialization failed\n");
|
2018-10-04 11:37:45 +00:00
|
|
|
}
|
|
|
|
|
2019-02-17 23:25:06 +00:00
|
|
|
void rend_term_renderer()
|
2018-10-04 17:44:52 +00:00
|
|
|
{
|
2021-09-29 08:22:58 +00:00
|
|
|
if (renderer != nullptr)
|
2020-02-26 22:41:05 +00:00
|
|
|
{
|
|
|
|
renderer->Term();
|
|
|
|
delete renderer;
|
2021-09-29 08:22:58 +00:00
|
|
|
renderer = nullptr;
|
2018-10-04 17:44:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
void rend_reset()
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2020-12-15 14:09:42 +00:00
|
|
|
FinishRender(DequeueRender());
|
|
|
|
do_swap = false;
|
|
|
|
render_called = false;
|
|
|
|
pend_rend = false;
|
|
|
|
FrameCount = 1;
|
|
|
|
VertexCount = 0;
|
|
|
|
fb_w_cur = 1;
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
|
2022-01-29 17:39:38 +00:00
|
|
|
void rend_start_render(TA_context *ctx)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2018-08-26 14:58:10 +00:00
|
|
|
render_called = true;
|
2014-05-02 00:43:34 +00:00
|
|
|
pend_rend = false;
|
2022-01-29 17:39:38 +00:00
|
|
|
if (ctx == nullptr)
|
|
|
|
{
|
2022-01-31 19:40:09 +00:00
|
|
|
u32 addresses[MAX_PASSES];
|
|
|
|
int count = getTAContextAddresses(addresses);
|
|
|
|
if (count > 0)
|
|
|
|
{
|
|
|
|
ctx = tactx_Pop(addresses[0]);
|
|
|
|
if (ctx != nullptr)
|
|
|
|
{
|
|
|
|
TA_context *linkedCtx = ctx;
|
|
|
|
for (int i = 1; i < count; i++)
|
|
|
|
{
|
|
|
|
linkedCtx->nextContext = tactx_Pop(addresses[i]);
|
|
|
|
if (linkedCtx->nextContext != nullptr)
|
|
|
|
linkedCtx = linkedCtx->nextContext;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-01-29 17:39:38 +00:00
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2018-08-26 14:58:10 +00:00
|
|
|
// No end of render interrupt when rendering the framebuffer
|
|
|
|
if (!ctx || !ctx->rend.isRenderFramebuffer)
|
|
|
|
SetREP(ctx);
|
2013-12-19 17:10:14 +00:00
|
|
|
|
|
|
|
if (ctx)
|
|
|
|
{
|
2020-11-19 21:29:06 +00:00
|
|
|
if (ctx->rend.isRenderFramebuffer)
|
|
|
|
{
|
|
|
|
ctx->rend.isRTT = false;
|
|
|
|
ctx->rend.fb_X_CLIP.min = 0;
|
|
|
|
ctx->rend.fb_X_CLIP.max = 639;
|
|
|
|
ctx->rend.fb_Y_CLIP.min = 0;
|
|
|
|
ctx->rend.fb_Y_CLIP.max = 479;
|
|
|
|
|
2021-12-17 12:40:42 +00:00
|
|
|
ctx->rend.fog_clamp_min.full = 0;
|
|
|
|
ctx->rend.fog_clamp_max.full = 0xffffffff;
|
2020-11-19 21:29:06 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-03-11 16:55:13 +00:00
|
|
|
FillBGP(ctx);
|
2015-10-05 21:32:25 +00:00
|
|
|
|
2020-11-19 21:29:06 +00:00
|
|
|
ctx->rend.isRTT = (FB_W_SOF1 & 0x1000000) != 0;
|
2015-10-05 21:32:25 +00:00
|
|
|
|
2020-11-19 21:29:06 +00:00
|
|
|
ctx->rend.fb_X_CLIP = FB_X_CLIP;
|
|
|
|
ctx->rend.fb_Y_CLIP = FB_Y_CLIP;
|
2022-03-25 14:41:16 +00:00
|
|
|
ctx->rend.fb_W_LINESTRIDE = FB_W_LINESTRIDE.stride;
|
2015-10-05 21:32:25 +00:00
|
|
|
|
2020-11-19 21:29:06 +00:00
|
|
|
ctx->rend.fog_clamp_min = FOG_CLAMP_MIN;
|
|
|
|
ctx->rend.fog_clamp_max = FOG_CLAMP_MAX;
|
|
|
|
}
|
2015-10-05 21:32:25 +00:00
|
|
|
|
2022-02-01 16:37:54 +00:00
|
|
|
if (!config::DelayFrameSwapping && !ctx->rend.isRTT)
|
2021-09-29 08:22:58 +00:00
|
|
|
ggpo::endOfFrame();
|
2021-09-07 14:43:50 +00:00
|
|
|
palette_update();
|
2020-03-11 16:55:13 +00:00
|
|
|
if (QueueRender(ctx))
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2021-08-05 15:43:26 +00:00
|
|
|
pend_rend = true;
|
2021-07-07 11:12:16 +00:00
|
|
|
if (!config::ThreadedRendering)
|
|
|
|
rend_single_frame(true);
|
|
|
|
else
|
|
|
|
rs.Set();
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void rend_end_render()
|
|
|
|
{
|
2021-07-07 11:12:16 +00:00
|
|
|
if (pend_rend && config::ThreadedRendering)
|
2014-05-02 00:43:34 +00:00
|
|
|
re.Wait();
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void rend_vblank()
|
|
|
|
{
|
2018-08-26 14:58:10 +00:00
|
|
|
if (!render_called && fb_dirty && FB_R_CTRL.fb_enable)
|
|
|
|
{
|
2019-07-01 09:42:00 +00:00
|
|
|
DEBUG_LOG(PVR, "Direct framebuffer write detected");
|
2022-02-01 16:37:54 +00:00
|
|
|
TA_context *ctx = new TA_context();
|
|
|
|
ctx->Alloc();
|
|
|
|
ctx->rend.isRenderFramebuffer = true;
|
|
|
|
rend_start_render(ctx);
|
2018-08-26 14:58:10 +00:00
|
|
|
fb_dirty = false;
|
|
|
|
}
|
|
|
|
render_called = false;
|
|
|
|
check_framebuffer_write();
|
2021-10-01 14:48:01 +00:00
|
|
|
emu.vblank();
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
2018-08-26 14:58:10 +00:00
|
|
|
|
|
|
|
void check_framebuffer_write()
|
|
|
|
{
|
2018-09-07 10:55:42 +00:00
|
|
|
u32 fb_size = (FB_R_SIZE.fb_y_size + 1) * (FB_R_SIZE.fb_x_size + FB_R_SIZE.fb_modulus) * 4;
|
2019-08-09 10:03:09 +00:00
|
|
|
fb_watch_addr_start = (SPG_CONTROL.interlace ? FB_R_SOF2 : FB_R_SOF1) & VRAM_MASK;
|
2019-05-19 17:45:05 +00:00
|
|
|
fb_watch_addr_end = fb_watch_addr_start + fb_size;
|
2018-08-26 14:58:10 +00:00
|
|
|
}
|
2018-09-23 14:18:35 +00:00
|
|
|
|
|
|
|
void rend_cancel_emu_wait()
|
|
|
|
{
|
2021-07-07 11:12:16 +00:00
|
|
|
if (config::ThreadedRendering)
|
|
|
|
{
|
|
|
|
FinishRender(NULL);
|
|
|
|
re.Set();
|
2021-09-03 09:11:46 +00:00
|
|
|
rend_allow_rollback();
|
2021-07-07 11:12:16 +00:00
|
|
|
}
|
2018-09-23 14:18:35 +00:00
|
|
|
}
|
|
|
|
|
2020-12-15 14:09:42 +00:00
|
|
|
void rend_set_fb_write_addr(u32 fb_w_sof1)
|
|
|
|
{
|
|
|
|
if (fb_w_sof1 & 0x1000000)
|
|
|
|
// render to texture
|
|
|
|
return;
|
|
|
|
fb_w_cur = fb_w_sof1;
|
|
|
|
}
|
|
|
|
|
2021-08-24 09:40:53 +00:00
|
|
|
void rend_swap_frame(u32 fb_r_sof)
|
2019-05-17 15:13:48 +00:00
|
|
|
{
|
2021-07-09 14:28:28 +00:00
|
|
|
swap_mutex.lock();
|
2021-08-24 09:40:53 +00:00
|
|
|
if (fb_r_sof == fb_w_cur)
|
2019-05-17 15:13:48 +00:00
|
|
|
{
|
|
|
|
do_swap = true;
|
2021-07-07 11:12:16 +00:00
|
|
|
if (config::ThreadedRendering)
|
|
|
|
rs.Set();
|
|
|
|
else
|
2021-07-09 14:28:28 +00:00
|
|
|
{
|
|
|
|
swap_mutex.unlock();
|
2021-07-07 11:12:16 +00:00
|
|
|
rend_single_frame(true);
|
2021-07-09 14:28:28 +00:00
|
|
|
swap_mutex.lock();
|
|
|
|
}
|
2021-09-09 16:17:05 +00:00
|
|
|
if (config::DelayFrameSwapping)
|
|
|
|
ggpo::endOfFrame();
|
2019-05-17 15:13:48 +00:00
|
|
|
}
|
2021-07-09 14:28:28 +00:00
|
|
|
swap_mutex.unlock();
|
2019-05-17 15:13:48 +00:00
|
|
|
}
|
2021-09-03 09:11:46 +00:00
|
|
|
|
|
|
|
void rend_disable_rollback()
|
|
|
|
{
|
|
|
|
vramRollback.Reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
void rend_allow_rollback()
|
|
|
|
{
|
|
|
|
vramRollback.Set();
|
|
|
|
}
|
|
|
|
|
|
|
|
void rend_start_rollback()
|
|
|
|
{
|
2021-10-20 12:41:18 +00:00
|
|
|
if (config::ThreadedRendering)
|
|
|
|
vramRollback.Wait();
|
2021-09-03 09:11:46 +00:00
|
|
|
}
|
2021-09-07 14:43:50 +00:00
|
|
|
|
2021-11-13 14:56:42 +00:00
|
|
|
void rend_serialize(Serializer& ser)
|
2021-09-07 14:43:50 +00:00
|
|
|
{
|
2021-11-13 14:56:42 +00:00
|
|
|
ser << fb_w_cur;
|
|
|
|
ser << render_called;
|
|
|
|
ser << fb_dirty;
|
|
|
|
ser << fb_watch_addr_start;
|
|
|
|
ser << fb_watch_addr_end;
|
2021-09-07 14:43:50 +00:00
|
|
|
}
|
2021-11-13 14:56:42 +00:00
|
|
|
void rend_deserialize(Deserializer& deser)
|
2021-09-07 14:43:50 +00:00
|
|
|
{
|
2021-11-13 14:56:42 +00:00
|
|
|
if ((deser.version() >= Deserializer::V12_LIBRETRO && deser.version() < Deserializer::V5) || deser.version() >= Deserializer::V12)
|
|
|
|
deser >> fb_w_cur;
|
2021-09-07 14:43:50 +00:00
|
|
|
else
|
|
|
|
fb_w_cur = 1;
|
2021-11-13 14:56:42 +00:00
|
|
|
if (deser.version() >= Deserializer::V20)
|
2021-09-07 14:43:50 +00:00
|
|
|
{
|
2021-11-13 14:56:42 +00:00
|
|
|
deser >> render_called;
|
|
|
|
deser >> fb_dirty;
|
|
|
|
deser >> fb_watch_addr_start;
|
|
|
|
deser >> fb_watch_addr_end;
|
2021-09-07 14:43:50 +00:00
|
|
|
}
|
2021-11-13 14:56:42 +00:00
|
|
|
pend_rend = false;
|
2021-09-07 14:43:50 +00:00
|
|
|
}
|
2021-09-27 18:29:23 +00:00
|
|
|
|
|
|
|
void rend_resize_renderer()
|
|
|
|
{
|
|
|
|
if (renderer == nullptr)
|
|
|
|
return;
|
|
|
|
float hres;
|
|
|
|
int vres = config::RenderResolution;
|
|
|
|
if (config::Widescreen && !config::Rotate90)
|
|
|
|
{
|
|
|
|
if (config::SuperWidescreen)
|
|
|
|
hres = (float)config::RenderResolution * settings.display.width / settings.display.height;
|
|
|
|
else
|
|
|
|
hres = config::RenderResolution * 16.f / 9.f;
|
|
|
|
}
|
|
|
|
else if (config::Rotate90)
|
|
|
|
{
|
|
|
|
vres = vres * config::ScreenStretching / 100;
|
|
|
|
hres = config::RenderResolution * 4.f / 3.f;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
hres = config::RenderResolution * 4.f * config::ScreenStretching / 3.f / 100.f;
|
|
|
|
}
|
|
|
|
if (!config::Rotate90)
|
|
|
|
hres = std::roundf(hres / 2.f) * 2.f;
|
|
|
|
DEBUG_LOG(RENDERER, "rend_resize_renderer: %d x %d", (int)hres, vres);
|
|
|
|
renderer->Resize((int)hres, vres);
|
|
|
|
}
|