diff options
Diffstat (limited to 'src/core/ozone/gl_ozone_egl_qt.cpp')
-rw-r--r-- | src/core/ozone/gl_ozone_egl_qt.cpp | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/src/core/ozone/gl_ozone_egl_qt.cpp b/src/core/ozone/gl_ozone_egl_qt.cpp index c0348e833..26d11df31 100644 --- a/src/core/ozone/gl_ozone_egl_qt.cpp +++ b/src/core/ozone/gl_ozone_egl_qt.cpp @@ -6,57 +6,49 @@ #include "gl_ozone_egl_qt.h" #include "gl_surface_egl_qt.h" -#include "base/files/file_path.h" -#include "base/native_library.h" -#include "ui/gl/gl_context_egl.h" -#include "ui/gl/gl_implementation.h" +#include "media/gpu/buildflags.h" +#include "ui/gl/gl_bindings.h" +#include "ui/gl/gl_display.h" #include "ui/gl/gl_surface.h" -#include "ui/gl/init/gl_factory.h" -#include "ui/gl/init/gl_initializer.h" - -#include <EGL/egl.h> -#include <dlfcn.h> +#include "ui/gl/gl_utils.h" +#include "ui/ozone/common/native_pixmap_egl_binding.h" namespace ui { -bool GLOzoneEGLQt::LoadGLES2Bindings(const gl::GLImplementationParts & /*implementation*/) +bool LoadQtEGLBindings() { - base::NativeLibrary eglgles2Library = dlopen(NULL, RTLD_LAZY); - if (!eglgles2Library) { - LOG(ERROR) << "Failed to open EGL/GLES2 context " << dlerror(); - return false; - } - - gl::GLGetProcAddressProc get_proc_address = - reinterpret_cast<gl::GLGetProcAddressProc>( - base::GetFunctionPointerFromNativeLibrary(eglgles2Library, - "eglGetProcAddress")); - if (!get_proc_address) { - // QTBUG-63341 most likely libgles2 not linked with libegl -> fallback to qpa - get_proc_address = - reinterpret_cast<gl::GLGetProcAddressProc>(GLContextHelper::getEglGetProcAddress()); - } - + gl::GLGetProcAddressProc get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(GLContextHelper::getEglGetProcAddress()); if (!get_proc_address) { LOG(ERROR) << "eglGetProcAddress not found."; - base::UnloadNativeLibrary(eglgles2Library); return false; } - gl::SetGLGetProcAddressProc(get_proc_address); - gl::AddGLNativeLibrary(eglgles2Library); return true; } -gl::GLDisplay *GLOzoneEGLQt::InitializeGLOneOffPlatform(uint64_t system_device_id) +bool GLOzoneEGLQt::LoadGLES2Bindings(const gl::GLImplementationParts & /*implementation*/) { - return gl::GLSurfaceEGLQt::InitializeOneOff(system_device_id); + return LoadQtEGLBindings(); } +gl::GLDisplay *GLOzoneEGLQt::InitializeGLOneOffPlatform(bool supports_angle, + std::vector<gl::DisplayType> init_displays, + gl::GpuPreference gpu_preference) +{ + if (auto display = gl::GLSurfaceEGLQt::InitializeOneOff(gpu_preference)) { + if (!static_cast<gl::GLDisplayEGL*>(display)->Initialize(supports_angle, std::move(init_displays), GetNativeDisplay())) { + LOG(ERROR) << "GLDisplayEGL::Initialize failed."; + return nullptr; + } + return display; + } + return nullptr; +} + + bool GLOzoneEGLQt::InitializeExtensionSettingsOneOffPlatform(gl::GLDisplay *display) { - Q_UNUSED(display); - return gl::GLSurfaceEGLQt::InitializeExtensionSettingsOneOff(); + return static_cast<gl::GLDisplayEGL*>(display)->InitializeExtensionSettings(); } scoped_refptr<gl::GLSurface> GLOzoneEGLQt::CreateViewGLSurface(gl::GLDisplay* display, gfx::AcceleratedWidget window) @@ -87,6 +79,24 @@ gl::EGLDisplayPlatform GLOzoneEGLQt::GetNativeDisplay() return platform; } +bool GLOzoneEGLQt::CanImportNativePixmap() +{ + return gl::GLSurfaceEGL::GetGLDisplayEGL()->ext->b_EGL_EXT_image_dma_buf_import; +} + +std::unique_ptr<NativePixmapGLBinding> GLOzoneEGLQt::ImportNativePixmap( + scoped_refptr<gfx::NativePixmap> pixmap, + gfx::BufferFormat plane_format, + gfx::BufferPlane plane, + gfx::Size plane_size, + const gfx::ColorSpace &color_space, + GLenum target, + GLuint texture_id) +{ + return NativePixmapEGLBinding::Create(pixmap, plane_format, plane, plane_size, color_space, + target, texture_id); +} + } // namespace ui #endif // defined(USE_OZONE) |