video routing fixes

dx11: terminate video routing in DX11Renderer::Term. Don't use
DX11Context.
dx11: avoid using local static vars
gl: don't send rendered frame when full FB is on
gl: send rendered framebuffer
gl: terminate video routing in termGLCommon. Don't use GLGraphicsContext

gl: avoid crash on quick exit during test automation
This commit is contained in:
Flyinghead 2024-01-05 12:46:39 +01:00
parent c0c6f206bf
commit 032cc17659
6 changed files with 40 additions and 40 deletions

View File

@ -26,6 +26,8 @@
#include <memory>
void os_VideoRoutingTermDX();
const D3D11_INPUT_ELEMENT_DESC MainLayout[]
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, (UINT)offsetof(Vertex, x), D3D11_INPUT_PER_VERTEX_DATA, 0 },
@ -173,6 +175,9 @@ bool DX11Renderer::Init()
void DX11Renderer::Term()
{
NOTICE_LOG(RENDERER, "DX11 renderer terminating");
#ifdef VIDEO_ROUTING
os_VideoRoutingTermDX();
#endif
n2Helper.term();
vtxConstants.reset();
pxlConstants.reset();
@ -1342,7 +1347,7 @@ void DX11Renderer::renderVideoRouting()
ID3D11RenderTargetView* pRenderTargetView = theDX11Context.getRenderTarget().get();
// Backbuffer texture would be different after reszing, fetching new address everytime
// Backbuffer texture would be different after resizing, fetching new address everytime
ID3D11Resource* pResource = nullptr;
pRenderTargetView->GetResource(&pResource);
ID3D11Texture2D* backBufferTexture = nullptr;
@ -1350,28 +1355,14 @@ void DX11Renderer::renderVideoRouting()
if (config::VideoRoutingScale)
{
static int targetWidth, targetHeight, vrStagingWidth, vrStagingHeight;
static D3D11_VIEWPORT scaledViewPort{};
auto updateScaledTexture = [this]() -> void {
targetWidth = config::VideoRoutingVRes * settings.display.width / settings.display.height;
targetHeight = config::VideoRoutingVRes;
vrScaledTexture.reset();
vrScaledRenderTarget.reset();
createTexAndRenderTarget(vrScaledTexture, vrScaledRenderTarget, targetWidth, targetHeight);
scaledViewPort.Width = targetWidth;
scaledViewPort.Height = targetHeight;
scaledViewPort.MinDepth = 0.f;
scaledViewPort.MaxDepth = 1.f;
};
D3D11_TEXTURE2D_DESC bbDesc = {};
backBufferTexture->GetDesc(&bbDesc);
D3D11_TEXTURE2D_DESC vrsDesc = {};
if (vrStagingTexture)
vrStagingTexture->GetDesc(&vrsDesc);
// Window resized
if (bbDesc.Width != vrStagingWidth || bbDesc.Height != vrStagingHeight)
// Window resized?
if (!vrStagingTexture || bbDesc.Width != vrsDesc.Width || bbDesc.Height != vrsDesc.Height)
{
vrStagingTexture.reset();
vrStagingTextureSRV.reset();
@ -1387,15 +1378,25 @@ void DX11Renderer::renderVideoRouting()
viewDesc.Texture2D.MipLevels = 1;
device->CreateShaderResourceView(vrStagingTexture.get(), &viewDesc, &vrStagingTextureSRV.get());
updateScaledTexture();
}
// Scale down value changed
if (targetHeight != config::VideoRoutingVRes)
// Scale down value changed?
D3D11_TEXTURE2D_DESC vrscDesc = {};
if (vrScaledTexture)
vrScaledTexture->GetDesc(&vrscDesc);
int targetWidth = config::VideoRoutingVRes * settings.display.width / settings.display.height;
if (!vrScaledTexture || (int)vrscDesc.Height != config::VideoRoutingVRes)
{
updateScaledTexture();
vrScaledTexture.reset();
vrScaledRenderTarget.reset();
createTexAndRenderTarget(vrScaledTexture, vrScaledRenderTarget, targetWidth, config::VideoRoutingVRes);
}
D3D11_VIEWPORT scaledViewPort{};
scaledViewPort.Width = targetWidth;
scaledViewPort.Height = config::VideoRoutingVRes;
scaledViewPort.MinDepth = 0.f;
scaledViewPort.MaxDepth = 1.f;
deviceContext->OMSetRenderTargets(1, &vrScaledRenderTarget.get(), nullptr);
deviceContext->RSSetViewports(1, &scaledViewPort);
@ -1414,7 +1415,6 @@ void DX11Renderer::renderVideoRouting()
}
else
{
extern void os_VideoRoutingTermDX();
os_VideoRoutingTermDX();
}
#endif

View File

@ -212,10 +212,6 @@ void DX11Context::term()
FreeLibrary(d3dcompilerHandle);
d3dcompilerHandle = NULL;
}
#ifdef VIDEO_ROUTING
extern void os_VideoRoutingTermDX();
os_VideoRoutingTermDX();
#endif
}
void DX11Context::Present()

View File

@ -671,8 +671,8 @@ struct OpenGL4Renderer : OpenGLRenderer
{
DrawOSD(false);
frameRendered = true;
renderVideoRouting();
}
renderVideoRouting();
restoreCurrentFramebuffer();
return true;
@ -781,7 +781,8 @@ static void resize(int w, int h)
bool OpenGL4Renderer::renderFrame(int width, int height)
{
initVideoRoutingFrameBuffer();
if (!config::EmulateFramebuffer)
initVideoRoutingFrameBuffer();
const bool is_rtt = pvrrc.isRTT;

View File

@ -619,6 +619,7 @@ void DrawStrips()
void OpenGLRenderer::RenderFramebuffer(const FramebufferInfo& info)
{
initVideoRoutingFrameBuffer();
glReadFramebuffer(info);
saveCurrentFramebuffer();
getVideoShift(gl.ofbo.shiftX, gl.ofbo.shiftY);
@ -663,6 +664,7 @@ void OpenGLRenderer::RenderFramebuffer(const FramebufferInfo& info)
DrawOSD(false);
frameRendered = true;
renderVideoRouting();
restoreCurrentFramebuffer();
}

View File

@ -379,6 +379,7 @@ void main()
}
)";
void os_VideoRoutingTermGL();
static void gl_free_osd_resources();
GLCache glcache;
@ -420,6 +421,8 @@ void do_swap_automation()
dump_screenshot(img, framebuffer->getWidth(), framebuffer->getHeight());
delete[] img;
dc_exit();
void sdl_window_destroy();
sdl_window_destroy(); // avoid crash
flycast_term();
exit(0);
}
@ -443,6 +446,9 @@ static void gl_delete_shaders()
void termGLCommon()
{
#ifdef VIDEO_ROUTING
os_VideoRoutingTermGL();
#endif
termQuad();
// palette, fog
@ -1170,7 +1176,8 @@ static void upload_vertex_indices()
bool OpenGLRenderer::renderFrame(int width, int height)
{
initVideoRoutingFrameBuffer();
if (!config::EmulateFramebuffer)
initVideoRoutingFrameBuffer();
bool is_rtt = pvrrc.isRTT;
@ -1448,9 +1455,9 @@ bool OpenGLRenderer::Render()
{
DrawOSD(false);
frameRendered = true;
renderVideoRouting();
}
renderVideoRouting();
restoreCurrentFramebuffer();
return true;
@ -1474,7 +1481,6 @@ void OpenGLRenderer::renderVideoRouting()
}
else
{
extern void os_VideoRoutingTermGL();
os_VideoRoutingTermGL();
}
#endif

View File

@ -70,11 +70,6 @@ void GLGraphicsContext::preTerm()
#ifndef LIBRETRO
imguiDriver.reset();
#endif
#ifdef VIDEO_ROUTING
extern void os_VideoRoutingTermGL();
os_VideoRoutingTermGL();
#endif
instance = nullptr;
}