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:
parent
c0c6f206bf
commit
032cc17659
|
@ -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
|
||||
|
|
|
@ -212,10 +212,6 @@ void DX11Context::term()
|
|||
FreeLibrary(d3dcompilerHandle);
|
||||
d3dcompilerHandle = NULL;
|
||||
}
|
||||
#ifdef VIDEO_ROUTING
|
||||
extern void os_VideoRoutingTermDX();
|
||||
os_VideoRoutingTermDX();
|
||||
#endif
|
||||
}
|
||||
|
||||
void DX11Context::Present()
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -70,11 +70,6 @@ void GLGraphicsContext::preTerm()
|
|||
#ifndef LIBRETRO
|
||||
imguiDriver.reset();
|
||||
#endif
|
||||
#ifdef VIDEO_ROUTING
|
||||
extern void os_VideoRoutingTermGL();
|
||||
os_VideoRoutingTermGL();
|
||||
#endif
|
||||
|
||||
instance = nullptr;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue