From 032cc176597a295ea809601127616135a4419f15 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Fri, 5 Jan 2024 12:46:39 +0100 Subject: [PATCH] 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 --- core/rend/dx11/dx11_renderer.cpp | 52 ++++++++++++++++---------------- core/rend/dx11/dx11context.cpp | 4 --- core/rend/gl4/gles.cpp | 5 +-- core/rend/gles/gldraw.cpp | 2 ++ core/rend/gles/gles.cpp | 12 ++++++-- core/wsi/gl_context.cpp | 5 --- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/core/rend/dx11/dx11_renderer.cpp b/core/rend/dx11/dx11_renderer.cpp index 2c44a437f8..3eb8be72ff 100644 --- a/core/rend/dx11/dx11_renderer.cpp +++ b/core/rend/dx11/dx11_renderer.cpp @@ -26,6 +26,8 @@ #include +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 diff --git a/core/rend/dx11/dx11context.cpp b/core/rend/dx11/dx11context.cpp index 53440c6861..26f71739eb 100644 --- a/core/rend/dx11/dx11context.cpp +++ b/core/rend/dx11/dx11context.cpp @@ -212,10 +212,6 @@ void DX11Context::term() FreeLibrary(d3dcompilerHandle); d3dcompilerHandle = NULL; } -#ifdef VIDEO_ROUTING - extern void os_VideoRoutingTermDX(); - os_VideoRoutingTermDX(); -#endif } void DX11Context::Present() diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index 5b38a0a073..07fa62baac 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -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; diff --git a/core/rend/gles/gldraw.cpp b/core/rend/gles/gldraw.cpp index 16a0693471..a8d026cbb3 100644 --- a/core/rend/gles/gldraw.cpp +++ b/core/rend/gles/gldraw.cpp @@ -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(); } diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index 8add35f5d1..ad0a757019 100644 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -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 diff --git a/core/wsi/gl_context.cpp b/core/wsi/gl_context.cpp index 302e7811e4..a95db1836a 100644 --- a/core/wsi/gl_context.cpp +++ b/core/wsi/gl_context.cpp @@ -70,11 +70,6 @@ void GLGraphicsContext::preTerm() #ifndef LIBRETRO imguiDriver.reset(); #endif -#ifdef VIDEO_ROUTING - extern void os_VideoRoutingTermGL(); - os_VideoRoutingTermGL(); -#endif - instance = nullptr; }