diff --git a/browser-app.cpp b/browser-app.cpp index fc046f06c..a3770db75 100644 --- a/browser-app.cpp +++ b/browser-app.cpp @@ -77,10 +77,9 @@ void BrowserApp::OnBeforeCommandLineProcessing( const CefString &, CefRefPtr command_line) { if (!shared_texture_available) { - bool enableGPU = command_line->HasSwitch("enable-gpu"); CefString type = command_line->GetSwitchValue("type"); - if (!enableGPU && type.empty()) { + if (!gpuCompositing && type.empty()) { command_line->AppendSwitch("disable-gpu-compositing"); } } diff --git a/browser-app.hpp b/browser-app.hpp index 460273c52..6c003e002 100644 --- a/browser-app.hpp +++ b/browser-app.hpp @@ -75,12 +75,15 @@ class BrowserApp : public CefApp, typedef std::map> CallbackMap; bool shared_texture_available; + bool gpuCompositing; CallbackMap callbackMap; int callbackId; public: - inline BrowserApp(bool shared_texture_available_ = false) - : shared_texture_available(shared_texture_available_) + inline BrowserApp(bool shared_texture_available_ = false, + bool gpuCompositing_ = true) + : shared_texture_available(shared_texture_available_), + gpuCompositing(gpuCompositing_) { } diff --git a/obs-browser-plugin.cpp b/obs-browser-plugin.cpp index 4118195dd..a0a08d3b7 100644 --- a/obs-browser-plugin.cpp +++ b/obs-browser-plugin.cpp @@ -69,6 +69,7 @@ static int adapterCount = 0; static std::wstring deviceId; bool hwaccel = false; +bool gpuCompositing = true; /* ========================================================================= */ @@ -298,7 +299,7 @@ static void BrowserInit(void) prod_ver << std::to_string(obs_maj) << "." << std::to_string(obs_min) << "." << std::to_string(obs_pat); -#if CHROME_VERSION_BUILD >= 4472 +#if CHROME_VERSION_BUILD >= 4430 CefString(&settings.user_agent_product) = prod_ver.str(); #else CefString(&settings.product_version) = prod_ver.str(); @@ -350,7 +351,7 @@ static void BrowserInit(void) } #endif - app = new BrowserApp(tex_sharing_avail); + app = new BrowserApp(tex_sharing_avail, gpuCompositing); #ifdef _WIN32 CefExecuteProcess(args, app, nullptr); @@ -693,7 +694,8 @@ bool obs_module_load(void) #ifdef SHARED_TEXTURE_SUPPORT_ENABLED obs_data_t *private_data = obs_get_private_data(); - hwaccel = obs_data_get_bool(private_data, "BrowserHWAccel"); + gpuCompositing = obs_data_get_bool(private_data, "BrowserHWAccel"); + hwaccel = gpuCompositing; if (hwaccel) { check_hwaccel_support(); diff --git a/obs-browser-source.cpp b/obs-browser-source.cpp index 23016150c..9d3f57485 100644 --- a/obs-browser-source.cpp +++ b/obs-browser-source.cpp @@ -134,6 +134,13 @@ bool BrowserSource::CreateBrowser() if (hwaccel) { obs_enter_graphics(); tex_sharing_avail = gs_shared_texture_available(); +#if CHROME_VERSION_BUILD >= 4430 && defined(__APPLE__) && defined(__arm64__) + // CEF 4430 doesn't seem to work correctly when init'd with shared texture on arm64: + // - we never see OnAcceleratedPaint called + // - everything is black + // so we'll disable that for the time being + tex_sharing_avail = false; +#endif obs_leave_graphics(); } #else @@ -141,7 +148,7 @@ bool BrowserSource::CreateBrowser() #endif CefRefPtr browserClient = new BrowserClient( - this, hwaccel && tex_sharing_avail, reroute_audio); + this, tex_sharing_avail, reroute_audio); CefWindowInfo windowInfo; #if CHROME_VERSION_BUILD < 3071 @@ -152,7 +159,7 @@ bool BrowserSource::CreateBrowser() windowInfo.windowless_rendering_enabled = true; #ifdef SHARED_TEXTURE_SUPPORT_ENABLED - windowInfo.shared_texture_enabled = hwaccel; + windowInfo.shared_texture_enabled = tex_sharing_avail; #endif CefBrowserSettings cefBrowserSettings; @@ -177,10 +184,10 @@ bool BrowserSource::CreateBrowser() cefBrowserSettings.default_font_size = 16; cefBrowserSettings.default_fixed_font_size = 16; -#if ENABLE_LOCAL_FILE_URL_SCHEME +#if ENABLE_LOCAL_FILE_URL_SCHEME && CHROME_VERSION_BUILD < 4430 if (is_local) { /* Disable web security for file:// URLs to allow - * local content access to remote APIs */ + * local content access to remote APIs */ cefBrowserSettings.web_security = STATE_DISABLED; } #endif @@ -550,9 +557,14 @@ void BrowserSource::Render() if (texture) { #ifdef __APPLE__ - gs_effect_t *effect = - obs_get_base_effect((hwaccel) ? OBS_EFFECT_DEFAULT_RECT - : OBS_EFFECT_DEFAULT); + bool useDefaultRect = hwaccel; +#if CHROME_VERSION_BUILD >= 4430 && defined(__APPLE__) && defined(__arm64__) + useDefaultRect = false; + flip = false; +#endif + gs_effect_t *effect = obs_get_base_effect( + (useDefaultRect) ? OBS_EFFECT_DEFAULT_RECT + : OBS_EFFECT_DEFAULT); #else gs_effect_t *effect = obs_get_base_effect(OBS_EFFECT_DEFAULT); #endif