mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-06-17 06:01:12 +00:00
Enable transparent resizing and display changes for supported renderers
This commit is contained in:
@@ -168,6 +168,12 @@ void EGLRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
}
|
||||
}
|
||||
|
||||
bool EGLRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
|
||||
{
|
||||
// We can transparently handle size and display changes
|
||||
return !(info->stateChangeFlags & ~(WINDOW_STATE_CHANGE_SIZE | WINDOW_STATE_CHANGE_DISPLAY));
|
||||
}
|
||||
|
||||
bool EGLRenderer::isPixelFormatSupported(int videoFormat, AVPixelFormat pixelFormat)
|
||||
{
|
||||
// Pixel format support should be determined by the backend renderer
|
||||
|
||||
@@ -17,6 +17,7 @@ public:
|
||||
virtual void renderFrame(AVFrame* frame) override;
|
||||
virtual bool testRenderFrame(AVFrame* frame) override;
|
||||
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
|
||||
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
|
||||
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
|
||||
virtual AVPixelFormat getPreferredPixelFormat(int videoFormat) override;
|
||||
|
||||
|
||||
@@ -320,6 +320,8 @@ bool PlVkRenderer::isExtensionSupportedByPhysicalDevice(VkPhysicalDevice device,
|
||||
|
||||
bool PlVkRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
{
|
||||
m_Window = params->window;
|
||||
|
||||
unsigned int instanceExtensionCount = 0;
|
||||
if (!SDL_Vulkan_GetInstanceExtensions(params->window, &instanceExtensionCount, nullptr)) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
@@ -429,10 +431,6 @@ bool PlVkRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
return false;
|
||||
}
|
||||
|
||||
int vkDrawableW, vkDrawableH;
|
||||
SDL_Vulkan_GetDrawableSize(params->window, &vkDrawableW, &vkDrawableH);
|
||||
pl_swapchain_resize(m_Swapchain, &vkDrawableW, &vkDrawableH);
|
||||
|
||||
m_Renderer = pl_renderer_create(m_Log, m_Vulkan->gpu);
|
||||
if (m_Renderer == nullptr) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
@@ -599,6 +597,11 @@ bool PlVkRenderer::isSurfacePresentationSupportedByPhysicalDevice(VkPhysicalDevi
|
||||
|
||||
void PlVkRenderer::waitToRender()
|
||||
{
|
||||
// Handle the swapchain being resized
|
||||
int vkDrawableW, vkDrawableH;
|
||||
SDL_Vulkan_GetDrawableSize(m_Window, &vkDrawableW, &vkDrawableH);
|
||||
pl_swapchain_resize(m_Swapchain, &vkDrawableW, &vkDrawableH);
|
||||
|
||||
// Get the next swapchain buffer for rendering. If this fails, renderFrame()
|
||||
// will try again.
|
||||
//
|
||||
@@ -866,6 +869,12 @@ void PlVkRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
SDL_AtomicUnlock(&m_OverlayLock);
|
||||
}
|
||||
|
||||
bool PlVkRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
|
||||
{
|
||||
// We can transparently handle size and display changes
|
||||
return !(info->stateChangeFlags & ~(WINDOW_STATE_CHANGE_SIZE | WINDOW_STATE_CHANGE_DISPLAY));
|
||||
}
|
||||
|
||||
int PlVkRenderer::getRendererAttributes()
|
||||
{
|
||||
int attributes = 0;
|
||||
|
||||
@@ -17,6 +17,7 @@ public:
|
||||
virtual void waitToRender() override;
|
||||
virtual void cleanupRenderContext() override;
|
||||
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
|
||||
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
|
||||
virtual int getRendererAttributes() override;
|
||||
virtual int getDecoderCapabilities() override;
|
||||
virtual bool needsTestFrame() override;
|
||||
@@ -41,6 +42,9 @@ private:
|
||||
// The backend renderer if we're frontend-only
|
||||
IFFmpegRenderer* m_Backend;
|
||||
|
||||
// SDL state
|
||||
SDL_Window* m_Window = nullptr;
|
||||
|
||||
// The libplacebo rendering state
|
||||
pl_log m_Log = nullptr;
|
||||
pl_vk_inst m_PlVkInstance = nullptr;
|
||||
|
||||
@@ -233,6 +233,11 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) {
|
||||
// Assume the renderer cannot handle window state changes
|
||||
return false;
|
||||
}
|
||||
|
||||
// Allow renderers to expose their type
|
||||
enum class RendererType {
|
||||
Unknown,
|
||||
|
||||
@@ -492,3 +492,9 @@ bool SdlRenderer::testRenderFrame(AVFrame* frame)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SdlRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
|
||||
{
|
||||
// We can transparently handle size and display changes
|
||||
return !(info->stateChangeFlags & ~(WINDOW_STATE_CHANGE_SIZE | WINDOW_STATE_CHANGE_DISPLAY));
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ public:
|
||||
virtual bool isRenderThreadSupported() override;
|
||||
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
|
||||
virtual bool testRenderFrame(AVFrame* frame) override;
|
||||
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
|
||||
|
||||
private:
|
||||
void renderOverlay(Overlay::OverlayType type);
|
||||
|
||||
@@ -681,6 +681,12 @@ void VAAPIRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
}
|
||||
}
|
||||
|
||||
bool VAAPIRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
|
||||
{
|
||||
// We can transparently handle size and display changes
|
||||
return !(info->stateChangeFlags & ~(WINDOW_STATE_CHANGE_SIZE | WINDOW_STATE_CHANGE_DISPLAY));
|
||||
}
|
||||
|
||||
void
|
||||
VAAPIRenderer::renderFrame(AVFrame* frame)
|
||||
{
|
||||
|
||||
@@ -66,6 +66,7 @@ public:
|
||||
virtual int getDecoderColorspace() override;
|
||||
virtual int getDecoderCapabilities() override;
|
||||
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
|
||||
virtual bool notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO) override;
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
virtual bool canExportEGL() override;
|
||||
|
||||
Reference in New Issue
Block a user