mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-06-18 14:40:56 +00:00
Create the SystemProperties test window on the main thread
This commit is contained in:
@@ -464,7 +464,7 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
// to ensure we don't drop any important events.
|
||||
session->flushWindowEvents();
|
||||
}
|
||||
else {
|
||||
else if (!params->testOnly) {
|
||||
// If we get here prior to the start of a session, just pump and flush ourselves.
|
||||
SDL_PumpEvents();
|
||||
SDL_FlushEvent(SDL_WINDOWEVENT);
|
||||
|
||||
@@ -140,6 +140,14 @@ bool SdlRenderer::initialize(PDECODER_PARAMETERS params)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Don't create a renderer or pump events for test-only
|
||||
// renderers. Test-only renderers might be created on
|
||||
// a non-main thread where interaction with the SDL
|
||||
// render API is unsafe.
|
||||
if (params->testOnly) {
|
||||
return true;
|
||||
}
|
||||
|
||||
SDL_SysWMinfo info;
|
||||
SDL_VERSION(&info.version);
|
||||
if (!SDL_GetWindowWMInfo(params->window, &info)) {
|
||||
|
||||
@@ -100,11 +100,11 @@ public:
|
||||
|
||||
if (m_DisplayLayer != nullptr) {
|
||||
[m_DisplayLayer release];
|
||||
}
|
||||
|
||||
// It appears to be necessary to run the event loop after destroying
|
||||
// the AVSampleBufferDisplayLayer to avoid issue #973.
|
||||
SDL_PumpEvents();
|
||||
// It appears to be necessary to run the event loop after destroying
|
||||
// the AVSampleBufferDisplayLayer to avoid issue #973.
|
||||
SDL_PumpEvents();
|
||||
}
|
||||
}}
|
||||
|
||||
static
|
||||
@@ -333,7 +333,7 @@ public:
|
||||
}
|
||||
|
||||
// If we're using direct rendering, set up the AVSampleBufferDisplayLayer
|
||||
if (m_DirectRendering) {
|
||||
if (m_DirectRendering && !params->testOnly) {
|
||||
SDL_SysWMinfo info;
|
||||
|
||||
SDL_VERSION(&info.version);
|
||||
|
||||
@@ -658,30 +658,11 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
m_MetalView = SDL_Metal_CreateView(m_Window);
|
||||
if (!m_MetalView) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"SDL_Metal_CreateView() failed: %s",
|
||||
SDL_GetError());
|
||||
return false;
|
||||
}
|
||||
|
||||
m_MetalLayer = (CAMetalLayer*)SDL_Metal_GetLayer(m_MetalView);
|
||||
|
||||
// Choose a device
|
||||
m_MetalLayer.device = device;
|
||||
|
||||
// Allow EDR content if we're streaming in a 10-bit format
|
||||
m_MetalLayer.wantsExtendedDynamicRangeContent = !!(params->videoFormat & VIDEO_FORMAT_MASK_10BIT);
|
||||
|
||||
// Allow tearing if V-Sync is off (also requires direct display path)
|
||||
m_MetalLayer.displaySyncEnabled = params->enableVsync;
|
||||
|
||||
// Create the Metal texture cache for our CVPixelBuffers
|
||||
CFStringRef keys[1] = { kCVMetalTextureUsage };
|
||||
NSUInteger values[1] = { MTLTextureUsageShaderRead };
|
||||
auto cacheAttributes = CFDictionaryCreate(kCFAllocatorDefault, (const void**)keys, (const void**)values, 1, nullptr, nullptr);
|
||||
err = CVMetalTextureCacheCreate(kCFAllocatorDefault, cacheAttributes, m_MetalLayer.device, nullptr, &m_TextureCache);
|
||||
err = CVMetalTextureCacheCreate(kCFAllocatorDefault, cacheAttributes, device, nullptr, &m_TextureCache);
|
||||
CFRelease(cacheAttributes);
|
||||
|
||||
if (err != kCVReturnSuccess) {
|
||||
@@ -693,7 +674,7 @@ public:
|
||||
|
||||
// Compile our shaders
|
||||
QString shaderSource = QString::fromUtf8(Path::readDataFile("vt_renderer.metal"));
|
||||
m_ShaderLibrary = [m_MetalLayer.device newLibraryWithSource:shaderSource.toNSString() options:nullptr error:nullptr];
|
||||
m_ShaderLibrary = [device newLibraryWithSource:shaderSource.toNSString() options:nullptr error:nullptr];
|
||||
if (!m_ShaderLibrary) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Failed to compile shaders");
|
||||
@@ -701,7 +682,33 @@ public:
|
||||
}
|
||||
|
||||
// Create a command queue for submission
|
||||
m_CommandQueue = [m_MetalLayer.device newCommandQueue];
|
||||
m_CommandQueue = [device newCommandQueue];
|
||||
|
||||
// Add the Metal view to the window if we're not in test-only mode
|
||||
//
|
||||
// NB: Test-only renderers may be created on a non-main thread, so
|
||||
// we don't want to touch the view hierarchy in that context.
|
||||
if (!params->testOnly) {
|
||||
m_MetalView = SDL_Metal_CreateView(m_Window);
|
||||
if (!m_MetalView) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"SDL_Metal_CreateView() failed: %s",
|
||||
SDL_GetError());
|
||||
return false;
|
||||
}
|
||||
|
||||
m_MetalLayer = (CAMetalLayer*)SDL_Metal_GetLayer(m_MetalView);
|
||||
|
||||
// Choose a device
|
||||
m_MetalLayer.device = device;
|
||||
|
||||
// Allow EDR content if we're streaming in a 10-bit format
|
||||
m_MetalLayer.wantsExtendedDynamicRangeContent = !!(params->videoFormat & VIDEO_FORMAT_MASK_10BIT);
|
||||
|
||||
// Allow tearing if V-Sync is off (also requires direct display path)
|
||||
m_MetalLayer.displaySyncEnabled = params->enableVsync;
|
||||
}
|
||||
|
||||
return true;
|
||||
}}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user