mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-04-24 08:58:04 +00:00
WIP SDL3 compatibility
This commit is contained in:
@@ -95,7 +95,7 @@ void PlVkRenderer::unlockQueue(struct AVHWDeviceContext *dev_ctx, uint32_t queue
|
||||
|
||||
void PlVkRenderer::overlayUploadComplete(void* opaque)
|
||||
{
|
||||
SDL_FreeSurface((SDL_Surface*)opaque);
|
||||
SDL_DestroySurface((SDL_Surface*)opaque);
|
||||
}
|
||||
|
||||
PlVkRenderer::PlVkRenderer(bool hwaccel, IFFmpegRenderer *backendRenderer) :
|
||||
@@ -362,7 +362,11 @@ bool PlVkRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
m_Window = params->window;
|
||||
|
||||
unsigned int instanceExtensionCount = 0;
|
||||
#if SDL_VERSION_ATLEAST(3, 0, 0)
|
||||
if (!SDL_Vulkan_GetInstanceExtensions(&instanceExtensionCount, nullptr)) {
|
||||
#else
|
||||
if (!SDL_Vulkan_GetInstanceExtensions(params->window, &instanceExtensionCount, nullptr)) {
|
||||
#endif
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"SDL_Vulkan_GetInstanceExtensions() #1 failed: %s",
|
||||
SDL_GetError());
|
||||
@@ -370,7 +374,11 @@ bool PlVkRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
}
|
||||
|
||||
std::vector<const char*> instanceExtensions(instanceExtensionCount);
|
||||
#if SDL_VERSION_ATLEAST(3, 0, 0)
|
||||
if (!SDL_Vulkan_GetInstanceExtensions(&instanceExtensionCount, instanceExtensions.data())) {
|
||||
#else
|
||||
if (!SDL_Vulkan_GetInstanceExtensions(params->window, &instanceExtensionCount, instanceExtensions.data())) {
|
||||
#endif
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"SDL_Vulkan_GetInstanceExtensions() #2 failed: %s",
|
||||
SDL_GetError());
|
||||
@@ -402,7 +410,11 @@ bool PlVkRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
POPULATE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR);
|
||||
POPULATE_FUNCTION(vkEnumerateDeviceExtensionProperties);
|
||||
|
||||
#if SDL_VERSION_ATLEAST(3, 0, 0)
|
||||
if (!SDL_Vulkan_CreateSurface(params->window, m_PlVkInstance->instance, NULL, &m_VkSurface)) {
|
||||
#else
|
||||
if (!SDL_Vulkan_CreateSurface(params->window, m_PlVkInstance->instance, &m_VkSurface)) {
|
||||
#endif
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"SDL_Vulkan_CreateSurface() failed: %s",
|
||||
SDL_GetError());
|
||||
@@ -703,7 +715,7 @@ void PlVkRenderer::waitToRender()
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"GPU is in failed state. Recreating renderer.");
|
||||
SDL_Event event;
|
||||
event.type = SDL_RENDER_DEVICE_RESET;
|
||||
event.type = SDL_EVENT_RENDER_DEVICE_RESET;
|
||||
SDL_PushEvent(&event);
|
||||
return;
|
||||
}
|
||||
@@ -721,7 +733,11 @@ void PlVkRenderer::waitToRender()
|
||||
|
||||
// Handle the swapchain being resized
|
||||
int vkDrawableW, vkDrawableH;
|
||||
#if SDL_VERSION_ATLEAST(3, 0, 0)
|
||||
SDL_GetWindowSizeInPixels(m_Window, &vkDrawableW, &vkDrawableH);
|
||||
#else
|
||||
SDL_Vulkan_GetDrawableSize(m_Window, &vkDrawableW, &vkDrawableH);
|
||||
#endif
|
||||
if (!pl_swapchain_resize(m_Swapchain, &vkDrawableW, &vkDrawableH)) {
|
||||
// Swapchain (re)creation can fail if the window is occluded
|
||||
return;
|
||||
@@ -905,12 +921,12 @@ void PlVkRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_AtomicLock(&m_OverlayLock);
|
||||
SDL_LockSpinlock(&m_OverlayLock);
|
||||
// We want to clear the staging overlay flag even if a staging overlay is still present,
|
||||
// since this ensures the render thread will not read from a partially initialized pl_tex
|
||||
// as we modify or recreate the staging overlay texture outside the overlay lock.
|
||||
m_Overlays[type].hasStagingOverlay = false;
|
||||
SDL_AtomicUnlock(&m_OverlayLock);
|
||||
SDL_UnlockSpinlock(&m_OverlayLock);
|
||||
|
||||
// If there's no new staging overlay, free the old staging overlay texture.
|
||||
// NB: This is safe to do outside the overlay lock because we're guaranteed
|
||||
@@ -925,7 +941,7 @@ void PlVkRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
SDL_assert(newSurface->format->format == SDL_PIXELFORMAT_ARGB8888);
|
||||
pl_fmt texFormat = pl_find_named_fmt(m_Vulkan->gpu, "bgra8");
|
||||
if (!texFormat) {
|
||||
SDL_FreeSurface(newSurface);
|
||||
SDL_DestroySurface(newSurface);
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"pl_find_named_fmt(bgra8) failed");
|
||||
return;
|
||||
@@ -945,7 +961,7 @@ void PlVkRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
if (!pl_tex_recreate(m_Vulkan->gpu, &m_Overlays[type].stagingOverlay.tex, &texParams)) {
|
||||
pl_tex_destroy(m_Vulkan->gpu, &m_Overlays[type].stagingOverlay.tex);
|
||||
SDL_zero(m_Overlays[type].stagingOverlay);
|
||||
SDL_FreeSurface(newSurface);
|
||||
SDL_DestroySurface(newSurface);
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"pl_tex_recreate() failed");
|
||||
return;
|
||||
@@ -962,7 +978,7 @@ void PlVkRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
if (!pl_tex_upload(m_Vulkan->gpu, &xferParams)) {
|
||||
pl_tex_destroy(m_Vulkan->gpu, &m_Overlays[type].stagingOverlay.tex);
|
||||
SDL_zero(m_Overlays[type].stagingOverlay);
|
||||
SDL_FreeSurface(newSurface);
|
||||
SDL_DestroySurface(newSurface);
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"pl_tex_upload() failed");
|
||||
return;
|
||||
@@ -978,10 +994,10 @@ void PlVkRenderer::notifyOverlayUpdated(Overlay::OverlayType type)
|
||||
m_Overlays[type].stagingOverlay.color = pl_color_space_srgb;
|
||||
|
||||
// Make this staging overlay visible to the render thread
|
||||
SDL_AtomicLock(&m_OverlayLock);
|
||||
SDL_LockSpinlock(&m_OverlayLock);
|
||||
SDL_assert(!m_Overlays[type].hasStagingOverlay);
|
||||
m_Overlays[type].hasStagingOverlay = true;
|
||||
SDL_AtomicUnlock(&m_OverlayLock);
|
||||
SDL_UnlockSpinlock(&m_OverlayLock);
|
||||
}
|
||||
|
||||
bool PlVkRenderer::notifyWindowChanged(PWINDOW_STATE_CHANGE_INFO info)
|
||||
|
||||
Reference in New Issue
Block a user