From b0ffa31e6840e011e52d1dd92e03d76cff0e0641 Mon Sep 17 00:00:00 2001 From: jiangtiantian Date: Tue, 24 Dec 2024 20:58:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E5=A4=9A=E8=BF=9B=E7=A8=8B]=20adapter=20?= =?UTF-8?q?=E5=B1=82=E9=80=82=E9=85=8D=20gpu=20process?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jiangtiantian --- gpu/ipc/common/nweb_native_window_tracker.cc | 30 ++- ohos_nweb/src/nweb_render_main.cc | 184 ++++++++++++++++++- 2 files changed, 211 insertions(+), 3 deletions(-) diff --git a/gpu/ipc/common/nweb_native_window_tracker.cc b/gpu/ipc/common/nweb_native_window_tracker.cc index f95a3c7ca1..a51b51d5e8 100644 --- a/gpu/ipc/common/nweb_native_window_tracker.cc +++ b/gpu/ipc/common/nweb_native_window_tracker.cc @@ -13,8 +13,36 @@ NWebNativeWindowTracker* g_instance = nullptr; +extern void* QueryRenderWindowFromBrowserProcess(int32_t window_id); +extern void DestoryRenderWindowFromBrowserProcess(int32_t window_id); + +class BrowserClientAdapterImpl : public OHOS::NWeb::AafwkBrowserClientAdapter { +public: + BrowserClientAdapterImpl() = default; + ~BrowserClientAdapterImpl() = default; + void* QueryRenderSurface(int32_t surface_id) override { + LOG(INFO) << "BrowserClientAdapterImpl.QueryRenderSurface " << surface_id; + return QueryRenderWindowFromBrowserProcess(surface_id); + } + + void ReportThread(OHOS::NWeb::ResSchedStatusAdapter status, int32_t process_id, int32_t thread_id, OHOS::NWeb::ResSchedRoleAdapter role) override { + LOG(INFO) << "[not used] ReportThread, process_id: " << process_id << ", thread_id: " << thread_id; + } + + void PassSurface(int64_t surface_id) override { + LOG(INFO) << "[not used] PassSurface, surfaceid: " << surface_id; + } + + void DestroyRenderSurface(int32_t surface_id) override { + LOG(INFO) << "BrowserClientAdapterImpl.DestroyRenderSurface " << surface_id; + DestoryRenderWindowFromBrowserProcess(surface_id); + } +}; + NWebNativeWindowTracker::NWebNativeWindowTracker() - : next_native_window_id_(1) {} + : next_native_window_id_(1) { + g_browser_client_ = std::make_shared(); +} NWebNativeWindowTracker::~NWebNativeWindowTracker() {} diff --git a/ohos_nweb/src/nweb_render_main.cc b/ohos_nweb/src/nweb_render_main.cc index 20b26ebbed..59be31879d 100644 --- a/ohos_nweb/src/nweb_render_main.cc +++ b/ohos_nweb/src/nweb_render_main.cc @@ -21,14 +21,191 @@ #include "nweb_hilog.h" #include "base/process/process_handle.h" #include +#include +#include + +#include "base/posix/global_descriptors.h" +#include "content/public/common/content_descriptors.h" namespace { const std::string IPC_FD_NAME = "IPC_FD"; const std::string SHARED_FD_NAME = "SHARED_FD"; const std::string CRASH_FD_NAME = "CRASH_FD"; const int FD_COUNTS = 3; + +// For GPU Process +const uint32_t IPC_B2G_CODE_INIT_DATA = 10001; +const uint32_t IPC_G2B_CODE_QUERY_WINDOW = 10002; +const uint32_t IPC_G2B_CODE_DESTROY_WINDOW = 10003; +const char *GPU_IPC_DESCRIPTOR = "chromium.native.gpu"; +const int START_TIMEOUT_SEC = 3; + +int g_ipc_fd = 0, g_shared_fd = 0, g_crash_fd = 0; +std::string g_param; +std::mutex mtx; +std::condition_variable cv; + +OHIPCRemoteProxy* g_ipc_remote_proxy = nullptr; } // namespace +bool SetGlobalDescriptors(int ipcFd, int sharedFd, int crashFd) { + base::GlobalDescriptors* g_fds = base::GlobalDescriptors::GetInstance(); + if (g_fds == nullptr) { + WVLOG_E("GlobalDescriptors is null"); + return false; + } + + int new_ipc_fd; + if ((new_ipc_fd = dup(ipcFd)) < 0) { + WVLOG_E("ipcFd duplicate error"); + g_fds->Set(kMojoIPCChannel, ipcFd); + } else { + g_fds->Set(kMojoIPCChannel, new_ipc_fd); + close(ipcFd); + } + + int new_shared_fd; + if ((new_shared_fd = dup(sharedFd)) < 0) { + WVLOG_E("sharedFd duplicate error"); + g_fds->Set(kFieldTrialDescriptor, sharedFd); + } else { + g_fds->Set(kFieldTrialDescriptor, new_shared_fd); + close(sharedFd); + } + + int new_crash_fd; + if ((new_crash_fd = dup(crashFd)) < 0) { + WVLOG_E("crashFd duplicate error"); + g_fds->Set(kCrashDumpSignal, crashFd); + } else { + g_fds->Set(kCrashDumpSignal, new_crash_fd); + close(crashFd); + } + return true; +} + +void NWebRenderMainForGPU(const char* args) { + WVLOG_I("NWebRenderMain for GPU start, sandbox pid=%{public}d", getpid()); + std::string args_str = args; + + std::stringstream args_ss(args_str); + const char separator = '#'; + std::vector argv_str; + std::string arg_str; + while (std::getline(args_ss, arg_str, separator)) { + argv_str.push_back(arg_str); + } + std::vector argv_cstr; + int argc = argv_str.size(); + argv_cstr.reserve(argc + 1); + for (const auto& arg : argv_str) { + argv_cstr.push_back(const_cast(arg.c_str())); + } + argv_cstr.push_back(nullptr); + + CefMainArgs main_args(argc, const_cast(argv_cstr.data())); + + if (!SetGlobalDescriptors(g_ipc_fd, g_shared_fd, g_crash_fd)) { + WVLOG_E("failed to set global fd"); + return; + } + + (void)CefExecuteProcess(main_args, nullptr, nullptr); + WVLOG_I("NWebRenderMain end, sandbox pid=%{public}d", getpid()); +} + +int OnRemoteRequest(uint32_t code, const OHIPCParcel* data, OHIPCParcel* reply, void* user_data) { + WVLOG_I("Receive a native IPC remote request from browser process, code=%{public}d", code); + + if (code == IPC_B2G_CODE_INIT_DATA) { + std::unique_lock lock(mtx); + g_ipc_remote_proxy = OH_IPCParcel_ReadRemoteProxy(data); + g_param = std::string(OH_IPCParcel_ReadString(data)); + OH_IPCParcel_ReadFileDescriptor(data, &g_ipc_fd); + OH_IPCParcel_ReadFileDescriptor(data, &g_shared_fd); + OH_IPCParcel_ReadFileDescriptor(data, &g_crash_fd); + int pid = getpid(); + OH_IPCParcel_WriteInt32(reply, pid); + cv.notify_all(); + return 0; + } else { + WVLOG_E("unknow code from browser process, code = %{public}d", code); + return -1; + } +} + +void* QueryRenderWindowFromBrowserProcess(int32_t window_id) { + if (g_ipc_remote_proxy == nullptr) { + WVLOG_E("ipc remote proxy is null"); + return nullptr; + } + OHIPCParcel* data = OH_IPCParcel_Create(); + OHIPCParcel* reply = OH_IPCParcel_Create(); + OH_IPCParcel_WriteInt32(data, window_id); + if (OH_IPCRemoteProxy_SendRequest(g_ipc_remote_proxy, IPC_G2B_CODE_QUERY_WINDOW, data, reply, nullptr) != 0) { + WVLOG_E("failed to send QueryRenderWindow id = %{public}d", window_id); + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); + return nullptr; + } + + OHNativeWindow *window; + if (OH_NativeWindow_ReadFromParcel(reply, &window) != 0) { + WVLOG_E("failed to read window for id = %{public}d", window_id); + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); + return nullptr; + } + + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); + return (void*)window; +} + +void DestoryRenderWindowFromBrowserProcess(int32_t window_id) { + if (g_ipc_remote_proxy == nullptr) { + WVLOG_E("ipc remote proxy is null"); + return; + } + OHIPCParcel* data = OH_IPCParcel_Create(); + OHIPCParcel* reply = OH_IPCParcel_Create(); + OH_IPCParcel_WriteInt32(data, window_id); + if (OH_IPCRemoteProxy_SendRequest(g_ipc_remote_proxy, IPC_G2B_CODE_DESTROY_WINDOW, data, reply, nullptr) != 0) { + WVLOG_E("failed to send DestoryRenderWindow id = %{public}d", window_id); + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); + return; + } + + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); +} + +extern "C" OHOS_NWEB_EXPORT OHIPCRemoteStub* NativeChildProcess_OnConnect() { + WVLOG_I("NativeChildProcess_OnConnect, create IPC remote stub."); + OHIPCRemoteStub* stub = OH_IPCRemoteStub_Create(GPU_IPC_DESCRIPTOR, &OnRemoteRequest, nullptr, nullptr); + if (stub == nullptr) { + WVLOG_E("NativeChildProcess_OnConnect: create stub failed."); + return nullptr; + } + return stub; +} + +extern "C" OHOS_NWEB_EXPORT void NativeChildProcess_MainProc() { + WVLOG_I("NativeChildProcess_MainProc"); + + std::unique_lock lock(mtx); + if (!cv.wait_for(lock, std::chrono::seconds(START_TIMEOUT_SEC), [] { + return !g_param.empty() && (g_ipc_fd != 0) && (g_shared_fd != 0) && (g_crash_fd != 0) \ + && (g_ipc_remote_proxy != nullptr); + })) { + WVLOG_E("timeout for get start param"); + return; + } + + NWebRenderMainForGPU(g_param.c_str()); +} + extern "C" OHOS_NWEB_EXPORT void NWebRenderMain(NativeChildProcess_Args args) { WVLOG_I("NWebRenderMain start, sandbox pid=%{public}d", getpid()); @@ -55,7 +232,10 @@ extern "C" OHOS_NWEB_EXPORT void NWebRenderMain(NativeChildProcess_Args args) { } fdNode = fdNode->next; } - std::string fdStr = std::to_string(ipcFd) + "-" + std::to_string(sharedFd) + "-" + std::to_string(crashFd); + if (!SetGlobalDescriptors(ipcFd, sharedFd, crashFd)) { + WVLOG_E("failed to set global fd"); + return; + } std::stringstream args_ss(args_str); const char separator = '#'; @@ -73,7 +253,7 @@ extern "C" OHOS_NWEB_EXPORT void NWebRenderMain(NativeChildProcess_Args args) { argv_cstr.push_back(nullptr); CefMainArgs main_args(argc, const_cast(argv_cstr.data())); - (void)CefExecuteProcess(main_args, nullptr, static_cast(&fdStr)); + (void)CefExecuteProcess(main_args, nullptr, nullptr); WVLOG_I("NWebRenderMain end, sandbox pid=%{public}d global pid=%{public}d", getpid()); } \ No newline at end of file -- Gitee From 847a79505791d4c6136493010f05a8e65abd0590 Mon Sep 17 00:00:00 2001 From: jiangtiantian Date: Fri, 3 Jan 2025 10:57:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E5=A4=9A=E8=BF=9B=E7=A8=8B]=20adapter=20?= =?UTF-8?q?=E5=B1=82=E9=80=82=E9=85=8D=20gpu=20process?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jiangtiantian --- gpu/ipc/common/nweb_native_window_tracker.cc | 4 ++- ohos_nweb/src/nweb_render_main.cc | 29 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/gpu/ipc/common/nweb_native_window_tracker.cc b/gpu/ipc/common/nweb_native_window_tracker.cc index a51b51d5e8..2d6282688a 100644 --- a/gpu/ipc/common/nweb_native_window_tracker.cc +++ b/gpu/ipc/common/nweb_native_window_tracker.cc @@ -15,6 +15,7 @@ NWebNativeWindowTracker* g_instance = nullptr; extern void* QueryRenderWindowFromBrowserProcess(int32_t window_id); extern void DestoryRenderWindowFromBrowserProcess(int32_t window_id); +extern void PassWindow(int64_t window_id); class BrowserClientAdapterImpl : public OHOS::NWeb::AafwkBrowserClientAdapter { public: @@ -30,7 +31,8 @@ public: } void PassSurface(int64_t surface_id) override { - LOG(INFO) << "[not used] PassSurface, surfaceid: " << surface_id; + LOG(INFO) << "PassSurface, surfaceid: " << surface_id; + PassWindow(surface_id); } void DestroyRenderSurface(int32_t surface_id) override { diff --git a/ohos_nweb/src/nweb_render_main.cc b/ohos_nweb/src/nweb_render_main.cc index 59be31879d..66dce82713 100644 --- a/ohos_nweb/src/nweb_render_main.cc +++ b/ohos_nweb/src/nweb_render_main.cc @@ -37,6 +37,7 @@ const int FD_COUNTS = 3; const uint32_t IPC_B2G_CODE_INIT_DATA = 10001; const uint32_t IPC_G2B_CODE_QUERY_WINDOW = 10002; const uint32_t IPC_G2B_CODE_DESTROY_WINDOW = 10003; +const uint32_t IPC_G2B_CODE_PASS_SURFACE = 10004; const char *GPU_IPC_DESCRIPTOR = "chromium.native.gpu"; const int START_TIMEOUT_SEC = 3; @@ -181,6 +182,34 @@ void DestoryRenderWindowFromBrowserProcess(int32_t window_id) { OH_IPCParcel_Destroy(reply); } +void PassWindow(int64_t window_id) { + if (g_ipc_remote_proxy == nullptr) { + WVLOG_E("ipc remote proxy is null"); + return; + } + OHNativeWindow* window; + if (OH_NativeWindow_CreateNativeWindowFromSurfaceId(window_id, &window) != 0) { + WVLOG_E("PassWindow get window failed, id = %{public}d", window_id); + return; + } + OHIPCParcel* data = OH_IPCParcel_Create(); + OHIPCParcel* reply = OH_IPCParcel_Create(); + if (OH_NativeWindow_WriteToParcel(window, data) != 0) { + WVLOG_E("PassWindow write to window failed, id = %{public}d", window_id); + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); + return; + } + if(OH_IPCRemoteProxy_SendRequest(g_ipc_remote_proxy, IPC_G2B_CODE_PASS_SURFACE, data, reply, nullptr) != 0) { + WVLOG_E("PassWindow send request failed, id = %{public}d", window_id); + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); + return; + } + OH_IPCParcel_Destroy(data); + OH_IPCParcel_Destroy(reply); +} + extern "C" OHOS_NWEB_EXPORT OHIPCRemoteStub* NativeChildProcess_OnConnect() { WVLOG_I("NativeChildProcess_OnConnect, create IPC remote stub."); OHIPCRemoteStub* stub = OH_IPCRemoteStub_Create(GPU_IPC_DESCRIPTOR, &OnRemoteRequest, nullptr, nullptr); -- Gitee