From 45b6d0c8f731a277e091fc91b510b0aeed3572d5 Mon Sep 17 00:00:00 2001 From: Swift Kim Date: Fri, 3 Dec 2021 22:55:04 +0900 Subject: [PATCH] Refactor TizenRenderers --- shell/platform/tizen/tizen_renderer.h | 1 + .../tizen/tizen_renderer_ecore_wl2.cc | 269 +++++++++--------- .../platform/tizen/tizen_renderer_ecore_wl2.h | 30 +- .../platform/tizen/tizen_renderer_evas_gl.cc | 141 +++++---- shell/platform/tizen/tizen_renderer_evas_gl.h | 32 +-- 5 files changed, 221 insertions(+), 252 deletions(-) diff --git a/shell/platform/tizen/tizen_renderer.h b/shell/platform/tizen/tizen_renderer.h index 18e391daa9fe3..0c05e8ade4d9a 100644 --- a/shell/platform/tizen/tizen_renderer.h +++ b/shell/platform/tizen/tizen_renderer.h @@ -57,6 +57,7 @@ class TizenRenderer { int32_t height, int32_t degree) = 0; virtual void SetPreferredOrientations(const std::vector& rotations) = 0; + virtual bool IsSupportedExtension(const char* name) = 0; protected: diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc index 69517e4cf4a4a..d2fee4d0b5f74 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.cc @@ -17,11 +17,22 @@ TizenRendererEcoreWl2::TizenRendererEcoreWl2(Geometry geometry, bool top_level, Delegate& delegate) : TizenRenderer(geometry, transparent, focusable, top_level, delegate) { - InitializeRenderer(); + if (!SetupEcoreWl2()) { + FT_LOG(Error) << "Could not set up Ecore Wl2."; + return; + } + if (!SetupEGL()) { + FT_LOG(Error) << "Could not set up EGL."; + return; + } + Show(); + + is_valid_ = true; } TizenRendererEcoreWl2::~TizenRendererEcoreWl2() { - DestroyRenderer(); + DestroyEGL(); + DestroyEcoreWl2(); } bool TizenRendererEcoreWl2::OnMakeCurrent() { @@ -31,6 +42,7 @@ bool TizenRendererEcoreWl2::OnMakeCurrent() { if (eglMakeCurrent(egl_display_, egl_surface_, egl_surface_, egl_context_) != EGL_TRUE) { PrintEGLError(); + FT_LOG(Error) << "Could not make the onscreen context current."; return false; } return true; @@ -43,6 +55,7 @@ bool TizenRendererEcoreWl2::OnClearCurrent() { if (eglMakeCurrent(egl_display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) != EGL_TRUE) { PrintEGLError(); + FT_LOG(Error) << "Could not clear the context."; return false; } return true; @@ -55,6 +68,7 @@ bool TizenRendererEcoreWl2::OnMakeResourceCurrent() { if (eglMakeCurrent(egl_display_, egl_resource_surface_, egl_resource_surface_, egl_resource_context_) != EGL_TRUE) { PrintEGLError(); + FT_LOG(Error) << "Could not make the offscreen context current."; return false; } return true; @@ -72,13 +86,14 @@ bool TizenRendererEcoreWl2::OnPresent() { if (eglSwapBuffers(egl_display_, egl_surface_) != EGL_TRUE) { PrintEGLError(); + FT_LOG(Error) << "Could not swap EGL buffers."; return false; } return true; } uint32_t TizenRendererEcoreWl2::OnGetFBO() { - if (!is_valid_) { + if (!IsValid()) { return 999; } return 0; @@ -232,77 +247,40 @@ uintptr_t TizenRendererEcoreWl2::GetWindowId() { return ecore_wl2_window_id_get(ecore_wl2_window_); } -void* TizenRendererEcoreWl2::GetWindowHandle() { - return ecore_wl2_window_; -} - -bool TizenRendererEcoreWl2::InitializeRenderer() { - int32_t width, height; - if (!SetupDisplay(&width, &height)) { - FT_LOG(Error) << "SetupDisplay() failed."; - return false; - } - if (!SetupEcoreWlWindow(width, height)) { - FT_LOG(Error) << "SetupEcoreWlWindow() failed."; - return false; - } - if (!SetupEglWindow(width, height)) { - FT_LOG(Error) << "SetupEglWindow() failed."; - return false; - } - if (!SetupEglSurface()) { - FT_LOG(Error) << "SetupEglSurface() failed."; - return false; - } - Show(); - is_valid_ = true; - return true; -} - void TizenRendererEcoreWl2::Show() { ecore_wl2_window_show(ecore_wl2_window_); } -void TizenRendererEcoreWl2::DestroyRenderer() { - DestroyEglSurface(); - DestroyEglWindow(); - DestroyEcoreWlWindow(); - ShutdownDisplay(); -} - -bool TizenRendererEcoreWl2::SetupDisplay(int32_t* width, int32_t* height) { +bool TizenRendererEcoreWl2::SetupEcoreWl2() { if (!ecore_wl2_init()) { - FT_LOG(Error) << "Could not initialize ecore_wl2."; + FT_LOG(Error) << "Could not initialize Ecore Wl2."; return false; } + ecore_wl2_display_ = ecore_wl2_display_connect(nullptr); - if (ecore_wl2_display_ == nullptr) { - FT_LOG(Error) << "Display not found."; + if (!ecore_wl2_display_) { + FT_LOG(Error) << "Ecore Wl2 display not found."; return false; } ecore_wl2_sync(); - ecore_wl2_display_screen_size_get(ecore_wl2_display_, width, height); - if (*width == 0 || *height == 0) { - FT_LOG(Error) << "Invalid screen size: " << *width << " x " << *height; + int32_t width, height; + ecore_wl2_display_screen_size_get(ecore_wl2_display_, &width, &height); + if (width == 0 || height == 0) { + FT_LOG(Error) << "Invalid screen size: " << width << " x " << height; return false; } - if (initial_geometry_.w > 0) { - *width = initial_geometry_.w; + + if (initial_geometry_.w == 0) { + initial_geometry_.w = width; } - if (initial_geometry_.h > 0) { - *height = initial_geometry_.h; + if (initial_geometry_.h == 0) { + initial_geometry_.h = height; } - return true; -} - -bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { - int32_t x = initial_geometry_.x; - int32_t y = initial_geometry_.y; - - ecore_wl2_window_ = - ecore_wl2_window_new(ecore_wl2_display_, nullptr, x, y, width, height); + ecore_wl2_window_ = ecore_wl2_window_new( + ecore_wl2_display_, nullptr, initial_geometry_.x, initial_geometry_.y, + initial_geometry_.w, initial_geometry_.h); // Change the window type to use the tizen policy for notification window // according to top_level_. @@ -315,7 +293,8 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { SetTizenPolicyNotificationLevel(TIZEN_POLICY_LEVEL_TOP); } - ecore_wl2_window_position_set(ecore_wl2_window_, x, y); + ecore_wl2_window_position_set(ecore_wl2_window_, initial_geometry_.x, + initial_geometry_.y); ecore_wl2_window_aux_hint_add(ecore_wl2_window_, 0, "wm.policy.win.user.geometry", "1"); @@ -324,6 +303,7 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { } else { ecore_wl2_window_alpha_set(ecore_wl2_window_, EINA_FALSE); } + if (!focusable_) { ecore_wl2_window_focus_skip_set(ecore_wl2_window_, EINA_TRUE); } @@ -343,85 +323,69 @@ bool TizenRendererEcoreWl2::SetupEcoreWlWindow(int32_t width, int32_t height) { return true; } -bool TizenRendererEcoreWl2::SetupEglWindow(int32_t width, int32_t height) { - ecore_wl2_egl_window_ = - ecore_wl2_egl_window_create(ecore_wl2_window_, width, height); - return ecore_wl2_egl_window_ != nullptr; -} - -EGLDisplay TizenRendererEcoreWl2::GetEGLDisplay() { - return eglGetDisplay(ecore_wl2_display_get(ecore_wl2_display_)); -} - -EGLNativeWindowType TizenRendererEcoreWl2::GetEGLNativeWindowType() { - return ecore_wl2_egl_window_native_get(ecore_wl2_egl_window_); -} - -void TizenRendererEcoreWl2::DestroyEglWindow() { - if (ecore_wl2_egl_window_) { - ecore_wl2_egl_window_destroy(ecore_wl2_egl_window_); - ecore_wl2_egl_window_ = nullptr; - } -} - -void TizenRendererEcoreWl2::DestroyEcoreWlWindow() { - if (ecore_wl2_window_) { - ecore_wl2_window_free(ecore_wl2_window_); - ecore_wl2_window_ = nullptr; - } -} - -void TizenRendererEcoreWl2::ShutdownDisplay() { - if (ecore_wl2_display_) { - ecore_wl2_display_disconnect(ecore_wl2_display_); - ecore_wl2_display_ = nullptr; +bool TizenRendererEcoreWl2::SetupEGL() { + ecore_wl2_egl_window_ = ecore_wl2_egl_window_create( + ecore_wl2_window_, initial_geometry_.w, initial_geometry_.h); + if (!ecore_wl2_egl_window_) { + FT_LOG(Error) << "Could not create an EGL window."; + return false; } - ecore_wl2_shutdown(); -} -bool TizenRendererEcoreWl2::SetupEglSurface() { if (!ChooseEGLConfiguration()) { - FT_LOG(Error) << "ChooseEGLConfiguration() failed."; + FT_LOG(Error) << "Could not choose an EGL configuration."; return false; } + egl_extension_str_ = eglQueryString(egl_display_, EGL_EXTENSIONS); - const EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; - egl_context_ = eglCreateContext(egl_display_, egl_config_, EGL_NO_CONTEXT, - context_attribs); - if (EGL_NO_CONTEXT == egl_context_) { - PrintEGLError(); - return false; - } + { + const EGLint attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; - egl_resource_context_ = eglCreateContext(egl_display_, egl_config_, - egl_context_, context_attribs); - if (EGL_NO_CONTEXT == egl_resource_context_) { - PrintEGLError(); - return false; + egl_context_ = + eglCreateContext(egl_display_, egl_config_, EGL_NO_CONTEXT, attribs); + if (egl_context_ == EGL_NO_CONTEXT) { + PrintEGLError(); + FT_LOG(Error) << "Could not create an onscreen context."; + return false; + } + + egl_resource_context_ = + eglCreateContext(egl_display_, egl_config_, egl_context_, attribs); + if (egl_resource_context_ == EGL_NO_CONTEXT) { + PrintEGLError(); + FT_LOG(Error) << "Could not create an offscreen context."; + return false; + } } - EGLint* ptr = nullptr; - egl_surface_ = eglCreateWindowSurface(egl_display_, egl_config_, - GetEGLNativeWindowType(), ptr); - if (egl_surface_ == EGL_NO_SURFACE) { - FT_LOG(Error) << "eglCreateWindowSurface() failed."; - return false; + { + const EGLint attribs[] = {EGL_NONE}; + + auto* egl_window = static_cast( + ecore_wl2_egl_window_native_get(ecore_wl2_egl_window_)); + egl_surface_ = + eglCreateWindowSurface(egl_display_, egl_config_, egl_window, attribs); + if (egl_surface_ == EGL_NO_SURFACE) { + FT_LOG(Error) << "Could not create an onscreen window surface."; + return false; + } } - const EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE}; - egl_resource_surface_ = - eglCreatePbufferSurface(egl_display_, egl_config_, attribs); - if (egl_resource_surface_ == EGL_NO_SURFACE) { - FT_LOG(Error) << "eglCreatePbufferSurface() failed."; - return false; + { + const EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE}; + + egl_resource_surface_ = + eglCreatePbufferSurface(egl_display_, egl_config_, attribs); + if (egl_resource_surface_ == EGL_NO_SURFACE) { + FT_LOG(Error) << "Could not create an offscreen window surface."; + return false; + } } return true; } bool TizenRendererEcoreWl2::ChooseEGLConfiguration() { - // egl CONTEXT EGLint config_attribs[] = { // clang-format off EGL_SURFACE_TYPE, EGL_WINDOW_BIT, @@ -436,45 +400,45 @@ bool TizenRendererEcoreWl2::ChooseEGLConfiguration() { // clang-format on }; - EGLint major = 0; - EGLint minor = 0; - int buffer_size = 32; - egl_display_ = GetEGLDisplay(); + egl_display_ = eglGetDisplay(ecore_wl2_display_get(ecore_wl2_display_)); if (EGL_NO_DISPLAY == egl_display_) { - FT_LOG(Error) << "eglGetDisplay() failed."; + PrintEGLError(); + FT_LOG(Error) << "Could not get EGL display."; return false; } - if (!eglInitialize(egl_display_, &major, &minor)) { + if (!eglInitialize(egl_display_, nullptr, nullptr)) { PrintEGLError(); + FT_LOG(Error) << "Could not initialize the EGL display."; return false; } if (!eglBindAPI(EGL_OPENGL_ES_API)) { PrintEGLError(); + FT_LOG(Error) << "Could not bind the ES API."; return false; } - EGLint num_config = 0; - // Query all framebuffer configurations. - if (!eglGetConfigs(egl_display_, NULL, 0, &num_config)) { + EGLint config_size = 0; + if (!eglGetConfigs(egl_display_, nullptr, 0, &config_size)) { PrintEGLError(); + FT_LOG(Error) << "Could not query framebuffer configurations."; return false; } - EGLConfig* configs = (EGLConfig*)calloc(num_config, sizeof(EGLConfig)); - EGLint num; - // Get the List of EGL framebuffer configuration matches with config_attribs - // in list "configs". - if (!eglChooseConfig(egl_display_, config_attribs, configs, num_config, - &num)) { + + EGLConfig* configs = (EGLConfig*)calloc(config_size, sizeof(EGLConfig)); + EGLint num_config; + if (!eglChooseConfig(egl_display_, config_attribs, configs, config_size, + &num_config)) { free(configs); - configs = NULL; PrintEGLError(); + FT_LOG(Error) << "No matching configurations found."; return false; } + int buffer_size = 32; EGLint size; - for (int i = 0; i < num; i++) { + for (int i = 0; i < num_config; i++) { eglGetConfigAttrib(egl_display_, configs[i], EGL_BUFFER_SIZE, &size); if (buffer_size == size) { egl_config_ = configs[i]; @@ -482,7 +446,11 @@ bool TizenRendererEcoreWl2::ChooseEGLConfiguration() { } } free(configs); - configs = NULL; + if (!egl_config_) { + FT_LOG(Error) << "No matching configuration found."; + return false; + } + return true; } @@ -515,8 +483,21 @@ void TizenRendererEcoreWl2::PrintEGLError() { } } -void TizenRendererEcoreWl2::DestroyEglSurface() { - if (EGL_NO_DISPLAY != egl_display_) { +void TizenRendererEcoreWl2::DestroyEcoreWl2() { + if (ecore_wl2_window_) { + ecore_wl2_window_free(ecore_wl2_window_); + ecore_wl2_window_ = nullptr; + } + + if (ecore_wl2_display_) { + ecore_wl2_display_disconnect(ecore_wl2_display_); + ecore_wl2_display_ = nullptr; + } + ecore_wl2_shutdown(); +} + +void TizenRendererEcoreWl2::DestroyEGL() { + if (egl_display_) { eglMakeCurrent(egl_display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); @@ -543,14 +524,20 @@ void TizenRendererEcoreWl2::DestroyEglSurface() { eglTerminate(egl_display_); egl_display_ = EGL_NO_DISPLAY; } + + if (ecore_wl2_egl_window_) { + ecore_wl2_egl_window_destroy(ecore_wl2_egl_window_); + ecore_wl2_egl_window_ = nullptr; + } } Eina_Bool TizenRendererEcoreWl2::RotationEventCb(void* data, int type, void* event) { auto* self = reinterpret_cast(data); - auto* ev = reinterpret_cast(event); - self->delegate_.OnOrientationChange(ev->angle); + auto* rotation_event = + reinterpret_cast(event); + self->delegate_.OnOrientationChange(rotation_event->angle); return ECORE_CALLBACK_PASS_ON; } diff --git a/shell/platform/tizen/tizen_renderer_ecore_wl2.h b/shell/platform/tizen/tizen_renderer_ecore_wl2.h index 46cdc1403001e..94ad5782536af 100644 --- a/shell/platform/tizen/tizen_renderer_ecore_wl2.h +++ b/shell/platform/tizen/tizen_renderer_ecore_wl2.h @@ -36,7 +36,8 @@ class TizenRendererEcoreWl2 : public TizenRenderer { Geometry GetScreenGeometry() override; int32_t GetDpi() override; uintptr_t GetWindowId() override; - void* GetWindowHandle() override; + + void* GetWindowHandle() override { return ecore_wl2_window_; } void SetRotate(int angle) override; void SetGeometry(int32_t x, @@ -49,36 +50,31 @@ class TizenRendererEcoreWl2 : public TizenRenderer { int32_t height, int32_t angle) override; void SetPreferredOrientations(const std::vector& rotations) override; + bool IsSupportedExtension(const char* name) override; private: - bool InitializeRenderer(); void Show(); - void DestroyRenderer(); - - bool SetupDisplay(int32_t* width, int32_t* height); - bool SetupEcoreWlWindow(int32_t width, int32_t height); - bool SetupEglWindow(int32_t width, int32_t height); - EGLDisplay GetEGLDisplay(); - EGLNativeWindowType GetEGLNativeWindowType(); - void DestroyEglWindow(); - void DestroyEcoreWlWindow(); - void ShutdownDisplay(); - - bool SetupEglSurface(); + + bool SetupEcoreWl2(); + bool SetupEGL(); + bool ChooseEGLConfiguration(); void PrintEGLError(); - void DestroyEglSurface(); - void SetTizenPolicyNotificationLevel(int level); + + void DestroyEcoreWl2(); + void DestroyEGL(); static Eina_Bool RotationEventCb(void* data, int type, void* event); void SendRotationChangeDone(); + void SetTizenPolicyNotificationLevel(int level); + Ecore_Wl2_Display* ecore_wl2_display_ = nullptr; Ecore_Wl2_Window* ecore_wl2_window_ = nullptr; Ecore_Wl2_Egl_Window* ecore_wl2_egl_window_ = nullptr; - EGLConfig egl_config_; + EGLConfig egl_config_ = nullptr; EGLDisplay egl_display_ = EGL_NO_DISPLAY; EGLContext egl_context_ = EGL_NO_CONTEXT; EGLSurface egl_surface_ = EGL_NO_SURFACE; diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index 4d03ed7d9f5e0..131330568624c 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -22,21 +22,28 @@ TizenRendererEvasGL::TizenRendererEvasGL(Geometry geometry, bool top_level, Delegate& delegate) : TizenRenderer(geometry, transparent, focusable, top_level, delegate) { - InitializeRenderer(); + if (!SetupEvasWindow()) { + FT_LOG(Error) << "Could not set up Evas window."; + return; + } + if (!SetupEvasGL()) { + FT_LOG(Error) << "Could not set up Evas GL."; + return; + } + Show(); + + is_valid_ = true; // Clear once to remove noise. OnMakeCurrent(); - ClearColor(0, 0, 0, 0); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); OnPresent(); } TizenRendererEvasGL::~TizenRendererEvasGL() { - DestroyRenderer(); -} - -void TizenRendererEvasGL::ClearColor(float r, float g, float b, float a) { - glClearColor(r, g, b, a); - glClear(GL_COLOR_BUFFER_BIT); + DestroyEvasGL(); + DestroyEvasWindow(); } bool TizenRendererEvasGL::OnMakeCurrent() { @@ -44,9 +51,9 @@ bool TizenRendererEvasGL::OnMakeCurrent() { return false; } if (evas_gl_make_current(evas_gl_, gl_surface_, gl_context_) != EINA_TRUE) { + FT_LOG(Error) << "Could not make the onscreen context current."; return false; } - return true; } @@ -54,7 +61,8 @@ bool TizenRendererEvasGL::OnClearCurrent() { if (!IsValid()) { return false; } - if (evas_gl_make_current(evas_gl_, NULL, NULL) != EINA_TRUE) { + if (evas_gl_make_current(evas_gl_, nullptr, nullptr) != EINA_TRUE) { + FT_LOG(Error) << "Could not clear the context."; return false; } return true; @@ -66,6 +74,7 @@ bool TizenRendererEvasGL::OnMakeResourceCurrent() { } if (evas_gl_make_current(evas_gl_, gl_resource_surface_, gl_resource_context_) != EINA_TRUE) { + FT_LOG(Error) << "Could not make the offscreen context current."; return false; } return true; @@ -85,7 +94,7 @@ bool TizenRendererEvasGL::OnPresent() { } uint32_t TizenRendererEvasGL::OnGetFBO() { - if (!is_valid_) { + if (!IsValid()) { return 999; } return 0; @@ -554,7 +563,7 @@ TizenRenderer::Geometry TizenRendererEvasGL::GetWindowGeometry() { } TizenRenderer::Geometry TizenRendererEvasGL::GetScreenGeometry() { - Geometry result; + Geometry result = {}; auto* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_)); ecore_evas_screen_geometry_get(ecore_evas, nullptr, nullptr, &result.w, @@ -575,44 +584,19 @@ uintptr_t TizenRendererEvasGL::GetWindowId() { ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_))); } -void* TizenRendererEvasGL::GetWindowHandle() { - return evas_window_; -} - -Evas_Object* TizenRendererEvasGL::GetImageHandle() { - return graphics_adapter_; -} - -bool TizenRendererEvasGL::InitializeRenderer() { - if (!SetupEvasGL()) { - FT_LOG(Error) << "SetupEvasGL() failed."; - return false; - } - Show(); - is_valid_ = true; - return true; -} - void TizenRendererEvasGL::Show() { - evas_object_show(GetImageHandle()); + evas_object_show(graphics_adapter_); evas_object_show(evas_window_); } -void TizenRendererEvasGL::DestroyRenderer() { - DestroyEvasGL(); - DestroyEvasWindow(); -} - bool TizenRendererEvasGL::SetupEvasGL() { - int32_t width, height; - evas_gl_ = - evas_gl_new(evas_object_evas_get(SetupEvasWindow(&width, &height))); + evas_gl_ = evas_gl_new(evas_object_evas_get(evas_window_)); if (!evas_gl_) { - FT_LOG(Error) << "Could not set up an Evas window object."; + FT_LOG(Error) << "Could not create an Evas GL object."; return false; } - g_evas_gl = evas_gl_; + gl_config_ = evas_gl_config_new(); gl_config_->color_format = EVAS_GL_RGBA_8888; gl_config_->depth_bits = EVAS_GL_DEPTH_NONE; @@ -620,43 +604,45 @@ bool TizenRendererEvasGL::SetupEvasGL() { #ifndef __X64_SHELL__ gl_context_ = - evas_gl_context_version_create(evas_gl_, NULL, EVAS_GL_GLES_3_X); + evas_gl_context_version_create(evas_gl_, nullptr, EVAS_GL_GLES_3_X); gl_resource_context_ = evas_gl_context_version_create(evas_gl_, gl_context_, EVAS_GL_GLES_3_X); #endif - if (gl_context_ == nullptr) { + if (!gl_context_) { FT_LOG(Error) << "Failed to create an Evas GL context with " "EVAS_GL_GLES_3_X; trying with EVAS_GL_GLES_2_X."; gl_context_ = - evas_gl_context_version_create(evas_gl_, NULL, EVAS_GL_GLES_2_X); + evas_gl_context_version_create(evas_gl_, nullptr, EVAS_GL_GLES_2_X); gl_resource_context_ = evas_gl_context_version_create(evas_gl_, gl_context_, EVAS_GL_GLES_2_X); } - if (gl_context_ == nullptr) { + if (!gl_context_) { FT_LOG(Fatal) << "Failed to create an Evas GL context."; + return false; } EVAS_GL_GLOBAL_GLES3_USE(g_evas_gl, gl_context_); - gl_surface_ = evas_gl_surface_create(evas_gl_, gl_config_, width, height); - gl_resource_surface_ = - evas_gl_pbuffer_surface_create(evas_gl_, gl_config_, width, height, NULL); + gl_surface_ = evas_gl_surface_create( + evas_gl_, gl_config_, initial_geometry_.w, initial_geometry_.h); + gl_resource_surface_ = evas_gl_pbuffer_surface_create( + evas_gl_, gl_config_, initial_geometry_.w, initial_geometry_.h, nullptr); - Evas_Native_Surface ns; - evas_gl_native_surface_get(evas_gl_, gl_surface_, &ns); - evas_object_image_native_surface_set(GetImageHandle(), &ns); + Evas_Native_Surface native_surface; + evas_gl_native_surface_get(evas_gl_, gl_surface_, &native_surface); + evas_object_image_native_surface_set(graphics_adapter_, &native_surface); return true; } -Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, - int32_t* height) { +bool TizenRendererEvasGL::SetupEvasWindow() { elm_config_accel_preference_set("hw:opengl"); - evas_window_ = elm_win_add(NULL, NULL, + evas_window_ = elm_win_add(nullptr, nullptr, top_level_ ? ELM_WIN_NOTIFICATION : ELM_WIN_BASIC); if (!evas_window_) { - return nullptr; + FT_LOG(Error) << "Could not create an Evas window."; + return false; } #ifndef __X64_SHELL__ if (top_level_) { @@ -671,23 +657,23 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, auto* ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(evas_window_)); - ecore_evas_screen_geometry_get(ecore_evas, nullptr, nullptr, width, height); - if (*width == 0 || *height == 0) { - FT_LOG(Error) << "Invalid screen size: " << *width << " x " << *height; - return nullptr; + int32_t width, height; + ecore_evas_screen_geometry_get(ecore_evas, nullptr, nullptr, &width, &height); + if (width == 0 || height == 0) { + FT_LOG(Error) << "Invalid screen size: " << width << " x " << height; + return false; } - if (initial_geometry_.w > 0) { - *width = initial_geometry_.w; + + if (initial_geometry_.w == 0) { + initial_geometry_.w = width; } - if (initial_geometry_.h > 0) { - *height = initial_geometry_.h; + if (initial_geometry_.h == 0) { + initial_geometry_.h = height; } - int32_t x = initial_geometry_.x; - int32_t y = initial_geometry_.y; elm_win_alpha_set(evas_window_, EINA_FALSE); - evas_object_move(evas_window_, x, y); - evas_object_resize(evas_window_, *width, *height); + evas_object_move(evas_window_, initial_geometry_.x, initial_geometry_.y); + evas_object_resize(evas_window_, initial_geometry_.w, initial_geometry_.h); evas_object_raise(evas_window_); elm_win_indicator_mode_set(evas_window_, ELM_WIN_INDICATOR_SHOW); @@ -701,9 +687,11 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, graphics_adapter_ = evas_object_image_filled_add(evas_object_evas_get(evas_window_)); - evas_object_resize(graphics_adapter_, *width, *height); - evas_object_move(graphics_adapter_, x, y); - evas_object_image_size_set(graphics_adapter_, *width, *height); + evas_object_resize(graphics_adapter_, initial_geometry_.w, + initial_geometry_.h); + evas_object_move(graphics_adapter_, initial_geometry_.x, initial_geometry_.y); + evas_object_image_size_set(graphics_adapter_, initial_geometry_.w, + initial_geometry_.h); evas_object_image_alpha_set(graphics_adapter_, EINA_TRUE); elm_win_resize_object_add(evas_window_, graphics_adapter_); @@ -711,7 +699,13 @@ Evas_Object* TizenRendererEvasGL::SetupEvasWindow(int32_t* width, elm_win_wm_rotation_available_rotations_set(evas_window_, &rotations[0], 4); evas_object_smart_callback_add(evas_window_, "rotation,changed", RotationEventCb, this); - return evas_window_; + + return true; +} + +void TizenRendererEvasGL::DestroyEvasWindow() { + evas_object_del(evas_window_); + evas_object_del(graphics_adapter_); } void TizenRendererEvasGL::DestroyEvasGL() { @@ -725,11 +719,6 @@ void TizenRendererEvasGL::DestroyEvasGL() { evas_gl_free(evas_gl_); } -void TizenRendererEvasGL::DestroyEvasWindow() { - evas_object_del(evas_window_); - evas_object_del(graphics_adapter_); -} - void TizenRendererEvasGL::RotationEventCb(void* data, Evas_Object* obj, void* event_info) { diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.h b/shell/platform/tizen/tizen_renderer_evas_gl.h index 242939e08a484..f38e1420f97fe 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -34,7 +34,8 @@ class TizenRendererEvasGL : public TizenRenderer { Geometry GetScreenGeometry() override; int32_t GetDpi() override; uintptr_t GetWindowId() override; - void* GetWindowHandle() override; + + void* GetWindowHandle() override { return evas_window_; } void SetRotate(int angle) override; void SetGeometry(int32_t x, @@ -47,36 +48,31 @@ class TizenRendererEvasGL : public TizenRenderer { int32_t height, int32_t angle) override; void SetPreferredOrientations(const std::vector& rotations) override; + bool IsSupportedExtension(const char* name) override; - Evas_Object* GetImageHandle(); + Evas_Object* GetImageHandle() { return graphics_adapter_; } private: - void ClearColor(float r, float g, float b, float a); - - bool InitializeRenderer(); void Show(); - void DestroyRenderer(); + bool SetupEvasWindow(); bool SetupEvasGL(); - Evas_Object* SetupEvasWindow(int32_t* width, int32_t* height); - void DestroyEvasGL(); void DestroyEvasWindow(); + void DestroyEvasGL(); static void RotationEventCb(void* data, Evas_Object* obj, void* event_info); void SendRotationChangeDone(); - Evas_Object* evas_window_{nullptr}; - Evas_Object* graphics_adapter_{nullptr}; - - Evas_GL_Config* gl_config_{nullptr}; - Evas_GL* evas_gl_{nullptr}; - - Evas_GL_Context* gl_context_{nullptr}; - Evas_GL_Context* gl_resource_context_{nullptr}; + Evas_Object* evas_window_ = nullptr; + Evas_Object* graphics_adapter_ = nullptr; - Evas_GL_Surface* gl_surface_{nullptr}; - Evas_GL_Surface* gl_resource_surface_{nullptr}; + Evas_GL* evas_gl_ = nullptr; + Evas_GL_Config* gl_config_ = nullptr; + Evas_GL_Context* gl_context_ = nullptr; + Evas_GL_Context* gl_resource_context_ = nullptr; + Evas_GL_Surface* gl_surface_ = nullptr; + Evas_GL_Surface* gl_resource_surface_ = nullptr; }; } // namespace flutter