Changeset 232670 in webkit
- Timestamp:
- Jun 10, 2018 11:43:14 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 10 added
- 1 deleted
- 20 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r232573 r232670 1 2018-06-10 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [WPE] Add a MiniBrowser and use it to run WebDriver tests 4 https://bugs.webkit.org/show_bug.cgi?id=186345 5 6 Reviewed by Žan Doberšek. 7 8 Add an option to enable building the MiniBrowser. 9 10 * Source/cmake/FindWaylandProtocols.cmake: Added. 11 * Source/cmake/OptionsWPE.cmake: 12 1 13 2018-06-06 Dan Bernstein <mitz@apple.com> 2 14 -
trunk/Source/WebDriver/ChangeLog
r232504 r232670 1 2018-06-10 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [WPE] Add a MiniBrowser and use it to run WebDriver tests 4 https://bugs.webkit.org/show_bug.cgi?id=186345 5 6 Reviewed by Žan Doberšek. 7 8 Use MiniBrowser instead of dyz as the default WebDriver browser for WPE. 9 10 * wpe/WebDriverServiceWPE.cpp: 11 (WebDriver::WebDriverService::platformParseCapabilities const): 12 1 13 2018-06-04 Carlos Garcia Campos <cgarcia@igalia.com> 2 14 -
trunk/Source/WebDriver/wpe/WebDriverServiceWPE.cpp
r232504 r232670 82 82 void WebDriverService::platformParseCapabilities(const JSON::Object& matchedCapabilities, Capabilities& capabilities) const 83 83 { 84 capabilities.browserBinary = String(" dyz");84 capabilities.browserBinary = String("MiniBrowser"); 85 85 capabilities.browserArguments = Vector<String> { ASCIILiteral("--automation") }; 86 86 -
trunk/Source/cmake/OptionsWPE.cmake
r232196 r232670 61 61 if (DEVELOPER_MODE) 62 62 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_API_TESTS PRIVATE ON) 63 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MINIBROWSER PUBLIC ON) 63 64 endif () 64 65 -
trunk/Tools/CMakeLists.txt
r227783 r232670 22 22 elseif ("${PORT}" STREQUAL "JSCOnly") 23 23 elseif ("${PORT}" STREQUAL "WPE") 24 if (DEVELOPER_MODE OR ENABLE_MINIBROWSER) 25 add_subdirectory(wpe/backends) 26 endif () 27 24 28 if (DEVELOPER_MODE) 25 29 add_subdirectory(ImageDiff) 26 30 add_subdirectory(WebKitTestRunner) 27 add_subdirectory(wpe/HeadlessViewBackend)28 31 if (ENABLE_API_TESTS) 29 32 add_subdirectory(TestWebKitAPI/glib) 30 33 endif () 34 endif () 35 36 if (ENABLE_MINIBROWSER) 37 add_subdirectory(MiniBrowser/wpe) 31 38 endif () 32 39 elseif ("${PORT}" STREQUAL "Win") -
trunk/Tools/ChangeLog
r232669 r232670 1 2018-06-10 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [WPE] Add a MiniBrowser and use it to run WebDriver tests 4 https://bugs.webkit.org/show_bug.cgi?id=186345 5 6 Reviewed by Žan Doberšek. 7 8 Most of the code is based on dyz and gtk MiniBrowser. This patch adds a new internal library WPEToolingBackends, 9 including the headless view backend and a new window backend to be used by the MiniBrowser. MiniBrowser can also 10 run in headless mode, by using the headless backend instead of the window one, which will allow us to run the 11 WebDriver tests in the bots. 12 13 * CMakeLists.txt: 14 * MiniBrowser/wpe/CMakeLists.txt: Added. 15 * MiniBrowser/wpe/main.cpp: Added. 16 (automationStartedCallback): 17 (createViewBackend): 18 (main): 19 * Scripts/run-minibrowser: Remove WPE specific code. 20 * Scripts/run-webdriver-tests: Add headless display-server option. 21 * Scripts/webkitdirs.pm: 22 (launcherName): Remove WPE specific code. 23 * Scripts/webkitpy/webdriver_tests/webdriver_driver_wpe.py: 24 (WebDriverWPE.browser_name): Return MiniBrowser. 25 (WebDriverWPE.browser_path): Return the path to the MiniBrowser in build dir. 26 (WebDriverWPE.browser_args): Add --headless when running in headless mode. 27 (WebDriverWPE.capabilities): Use the full browser path. 28 * Scripts/webkitpy/webdriver_tests/webdriver_test_runner_selenium.py: 29 (WebDriverTestRunnerSelenium.collect_tests): Fix early return value. 30 * TestWebKitAPI/PlatformWPE.cmake: Use WPEToolingBackends instead of HeadlessViewBackend. 31 * TestWebKitAPI/PlatformWebView.h: Ditto. 32 * TestWebKitAPI/glib/PlatformWPE.cmake: Ditto 33 * TestWebKitAPI/glib/WebKitGLib/TestMain.h: 34 (Test::createWebViewBackend): Ditto. 35 * TestWebKitAPI/wpe/PlatformWebViewWPE.cpp: 36 (TestWebKitAPI::PlatformWebView::initialize): Ditto. 37 * WebKitTestRunner/PlatformWPE.cmake: Ditto. 38 * WebKitTestRunner/PlatformWebView.h: Ditto. 39 * WebKitTestRunner/wpe/PlatformWebViewWPE.cpp: 40 (WTR::PlatformWebView::PlatformWebView): Ditto. 41 * wpe/HeadlessViewBackend/CMakeLists.txt: Removed. 42 * wpe/backends/CMakeLists.txt: Added. 43 * wpe/backends/HeadlessViewBackend.cpp: Renamed from Tools/wpe/HeadlessViewBackend/HeadlessViewBackend.cpp. 44 (WPEToolingBackends::getEGLDisplay): 45 (WPEToolingBackends::HeadlessViewBackend::HeadlessViewBackend): 46 (WPEToolingBackends::HeadlessViewBackend::~HeadlessViewBackend): 47 (WPEToolingBackends::HeadlessViewBackend::createSnapshot): 48 (WPEToolingBackends::HeadlessViewBackend::performUpdate): 49 (WPEToolingBackends::HeadlessViewBackend::displayBuffer): 50 * wpe/backends/HeadlessViewBackend.h: Renamed from Tools/wpe/HeadlessViewBackend/HeadlessViewBackend.h. 51 * wpe/backends/ViewBackend.cpp: Added. 52 (WPEToolingBackends::ViewBackend::ViewBackend): 53 (WPEToolingBackends::ViewBackend::~ViewBackend): 54 (WPEToolingBackends::ViewBackend::initialize): 55 (WPEToolingBackends::ViewBackend::setInputClient): 56 (WPEToolingBackends::ViewBackend::backend const): 57 (WPEToolingBackends::ViewBackend::dispatchInputPointerEvent): 58 (WPEToolingBackends::ViewBackend::dispatchInputAxisEvent): 59 (WPEToolingBackends::ViewBackend::dispatchInputKeyboardEvent): 60 * wpe/backends/ViewBackend.h: Added. 61 * wpe/backends/WindowViewBackend.cpp: Added. 62 (WPEToolingBackends::WindowViewBackend::WindowViewBackend): 63 (WPEToolingBackends::WindowViewBackend::~WindowViewBackend): 64 (WPEToolingBackends::WindowViewBackend::displayBuffer): 65 (WPEToolingBackends::WindowViewBackend::handleKeyEvent): 66 * wpe/backends/WindowViewBackend.h: Added. 67 * wpe/jhbuild.modules: Remove dyz and add wayland-protocols. 68 1 69 2018-06-10 Fujii Hironori <Hironori.Fujii@sony.com> 2 70 -
trunk/Tools/Scripts/run-minibrowser
r231021 r232670 45 45 setConfiguration(); 46 46 47 if (isGtk() ) {47 if (isGtk() || isWPE()) { 48 48 # Check to see that all the frameworks are built. 49 49 checkFrameworks(); … … 54 54 print "Starting MiniBrowser.\n"; 55 55 exec @jhbuildWrapper, $launcherPath, @ARGV or die; 56 } elsif (isWPE()) {57 # Check to see that all the frameworks are built.58 checkFrameworks();59 60 $launcherName = launcherName();61 @jhbuildWrapper = wrapperPrefixIfNeeded();62 $ENV{"WEBKIT_EXEC_PATH"} = catdir(productDir(), "bin");63 $ENV{"WEBKIT_INJECTED_BUNDLE_PATH"} = catdir(productDir(), "lib");64 $ENV{"LD_LIBRARY_PATH"} = catdir(productDir(), "lib") . (defined $ENV{"LD_LIBRARY_PATH"} ? ":" . $ENV{"LD_LIBRARY_PATH"} : "" );65 print "Starting $launcherName \n";66 exec @jhbuildWrapper, $launcherName, @ARGV or die;67 56 } elsif (isAppleCocoaWebKit()) { 68 57 printHelpAndExitForRunAndDebugWebKitAppIfNeeded(); -
trunk/Tools/Scripts/run-webdriver-tests
r228014 r232670 50 50 option_parser.add_option('--json-output', action='store', metavar="FILE", 51 51 help='Write results to JSON file at the given path') 52 option_parser.add_option('--display-server', choices=['xvfb', 'xorg', 'weston', 'wayland' ], default='xvfb',52 option_parser.add_option('--display-server', choices=['xvfb', 'xorg', 'weston', 'wayland', 'headless'], default='xvfb', 53 53 help='"xvfb": Use a virtualized X11 server. "xorg": Use the current X11 session. ' 54 '"weston": Use a virtualized Weston server. "wayland": Use the current wayland session.') 54 '"weston": Use a virtualized Weston server. "wayland": Use the current wayland session.' 55 '"headless": Headless mode in current session') 55 56 56 57 options, args = option_parser.parse_args() -
trunk/Tools/Scripts/webkitdirs.pm
r232583 r232670 1690 1690 sub launcherName() 1691 1691 { 1692 if (isGtk() ) {1692 if (isGtk() || isWPE()) { 1693 1693 return "MiniBrowser"; 1694 1694 } elsif (isAppleMacWebKit()) { … … 1696 1696 } elsif (isAppleWinWebKit()) { 1697 1697 return "MiniBrowser"; 1698 } elsif (isWPE()) {1699 return "dyz";1700 1698 } 1701 1699 } -
trunk/Tools/Scripts/webkitpy/webdriver_tests/webdriver_driver_wpe.py
r225390 r232670 34 34 35 35 def browser_name(self): 36 return 'dyz' 36 return 'MiniBrowser' 37 38 def browser_path(self): 39 return self._port._build_path('bin', 'MiniBrowser') 37 40 38 41 def browser_args(self): 39 return ['--automation'] 42 args = ['--automation'] 43 if self._port._display_server == 'headless': 44 args.append('--headless') 45 return args 40 46 41 47 def capabilities(self): 42 48 return {'wpe:browserOptions': { 43 'binary': self.browser_ name(),49 'binary': self.browser_path(), 44 50 'args': self.browser_args()}} 45 46 def browser_env(self):47 env = {}48 env['WEBKIT_EXEC_PATH'] = self._port._build_path('bin')49 try:50 ld_library_path = os.environ['LD_LIBRARY_PATH']51 except KeyError:52 ld_library_path = None53 env['LD_LIBRARY_PATH'] = self._port._build_path('lib')54 if ld_library_path:55 env['LD_LIBRARY_PATH'] += ':' + ld_library_path56 return env57 51 58 52 -
trunk/Tools/Scripts/webkitpy/webdriver_tests/webdriver_test_runner_selenium.py
r228014 r232670 45 45 def collect_tests(self, tests): 46 46 if self._driver.selenium_name() is None: 47 return 047 return [] 48 48 49 49 skipped = [os.path.join(self._tests_dir, test) for test in self._expectations.skipped_tests()] -
trunk/Tools/TestWebKitAPI/PlatformWPE.cmake
r231042 r232670 18 18 ${FORWARDING_HEADERS_DIR}/JavaScriptCore/glib 19 19 ${DERIVED_SOURCES_JAVASCRIPCOREWPE_DIR} 20 ${TOOLS_DIR}/wpe/ HeadlessViewBackend20 ${TOOLS_DIR}/wpe/backends 21 21 ) 22 22 … … 80 80 81 81 list(APPEND test_webkit_api_LIBRARIES 82 WPE HeadlessViewBackend82 WPEToolingBackends 83 83 ) 84 84 -
trunk/Tools/TestWebKitAPI/PlatformWebView.h
r230744 r232670 49 49 typedef GtkWidget *PlatformWindow; 50 50 #elif PLATFORM(WPE) 51 namespace WPEToolingBackends { 51 52 class HeadlessViewBackend; 53 } 52 54 struct wpe_view_backend; 53 55 typedef WKViewRef PlatformWKView; 54 typedef HeadlessViewBackend *PlatformWindow;56 typedef WPEToolingBackends::HeadlessViewBackend *PlatformWindow; 55 57 #elif PLATFORM(WIN) 56 58 typedef WKViewRef PlatformWKView; -
trunk/Tools/TestWebKitAPI/glib/PlatformWPE.cmake
r231042 r232670 11 11 ${FORWARDING_HEADERS_WPE_EXTENSION_DIR} 12 12 ${FORWARDING_HEADERS_WPE_DOM_DIR} 13 ${TOOLS_DIR}/wpe/ HeadlessViewBackend13 ${TOOLS_DIR}/wpe/backends 14 14 ) 15 15 … … 22 22 ${WPE_LIBRARIES} 23 23 ${WPEBACKEND_FDO_LIBRARIES} 24 WPE HeadlessViewBackend24 WPEToolingBackends 25 25 ) -
trunk/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h
r232010 r232670 143 143 static WebKitWebViewBackend* createWebViewBackend() 144 144 { 145 auto* headlessBackend = new HeadlessViewBackend;145 auto* headlessBackend = new WPEToolingBackends::HeadlessViewBackend(800, 600); 146 146 return webkit_web_view_backend_new(headlessBackend->backend(), [](gpointer userData) { 147 delete static_cast< HeadlessViewBackend*>(userData);147 delete static_cast<WPEToolingBackends::HeadlessViewBackend*>(userData); 148 148 }, headlessBackend); 149 149 } -
trunk/Tools/TestWebKitAPI/wpe/PlatformWebViewWPE.cpp
r230562 r232670 67 67 void PlatformWebView::initialize(WKPageConfigurationRef configuration) 68 68 { 69 m_window = new HeadlessViewBackend;69 m_window = new WPEToolingBackends::HeadlessViewBackend(800, 600); 70 70 m_view = WKViewCreate(m_window->backend(), configuration); 71 71 } -
trunk/Tools/WebKitTestRunner/PlatformWPE.cmake
r231042 r232670 20 20 ${WEBKIT_TESTRUNNER_DIR}/InjectedBundle/wpe 21 21 ${FORWARDING_HEADERS_DIR} 22 ${TOOLS_DIR}/wpe/ HeadlessViewBackend22 ${TOOLS_DIR}/wpe/backends 23 23 ) 24 24 … … 35 35 ${LIBXKBCOMMON_LIBRARIES} 36 36 ${WPEBACKEND_FDO_LIBRARIES} 37 WPE HeadlessViewBackend37 WPEToolingBackends 38 38 ) 39 39 -
trunk/Tools/WebKitTestRunner/PlatformWebView.h
r229283 r232670 52 52 typedef cairo_surface_t *PlatformImage; 53 53 #elif PLATFORM(WPE) 54 namespace WPEToolingBackends { 54 55 class HeadlessViewBackend; 56 } 55 57 typedef WKViewRef PlatformWKView; 56 typedef HeadlessViewBackend* PlatformWindow;58 typedef WPEToolingBackends::HeadlessViewBackend* PlatformWindow; 57 59 typedef cairo_surface_t* PlatformImage; 58 60 #endif -
trunk/Tools/WebKitTestRunner/wpe/PlatformWebViewWPE.cpp
r229256 r232670 40 40 , m_options(options) 41 41 { 42 m_window = new HeadlessViewBackend;42 m_window = new WPEToolingBackends::HeadlessViewBackend(800, 600); 43 43 m_view = WKViewCreate(m_window->backend(), configuration); 44 44 } -
trunk/Tools/wpe/backends/HeadlessViewBackend.cpp
r232669 r232670 29 29 #include <fcntl.h> 30 30 #include <unistd.h> 31 32 // This include order is necessary to enforce the GBM EGL platform. 33 #include <gbm.h> 34 #include <epoxy/egl.h> 31 35 #include <wpe/fdo-egl.h> 32 36 33 // Manually provide the EGL_CAST C++ definition in case eglplatform.h doesn't provide it. 34 #ifndef EGL_CAST 35 #define EGL_CAST(type, value) (static_cast<type>(value)) 37 #ifndef EGL_WL_bind_wayland_display 38 #define EGL_WL_bind_wayland_display 1 39 typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource* buffer, EGLint attribute, EGLint* value); 40 41 #define EGL_WAYLAND_BUFFER_WL 0x31D5 // eglCreateImageKHR target 42 #define EGL_WAYLAND_PLANE_WL 0x31D6 // eglCreateImageKHR target 36 43 #endif 44 45 namespace WPEToolingBackends { 46 47 static PFNEGLCREATEIMAGEKHRPROC createImage; 48 static PFNEGLDESTROYIMAGEKHRPROC destroyImage; 49 static PFNEGLQUERYWAYLANDBUFFERWL queryBuffer; 50 static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC imageTargetTexture2DOES; 37 51 38 52 // Keep this in sync with wtf/glib/RunLoopSourcePriority.h. … … 47 61 return EGL_NO_DISPLAY; 48 62 49 if (!eglInitialize(display, nullptr, nullptr))50 return EGL_NO_DISPLAY;51 52 if (!eglBindAPI(EGL_OPENGL_ES_API))53 return EGL_NO_DISPLAY;54 55 wpe_fdo_initialize_for_egl_display(display);56 63 s_display = display; 57 64 } … … 60 67 } 61 68 62 HeadlessViewBackend::HeadlessViewBackend() 63 { 64 m_egl.display = getEGLDisplay(); 65 66 static const EGLint configAttributes[13] = { 67 EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 68 EGL_RED_SIZE, 1, 69 EGL_GREEN_SIZE, 1, 70 EGL_BLUE_SIZE, 1, 71 EGL_ALPHA_SIZE, 1, 72 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 73 EGL_NONE 74 }; 75 76 EGLint numConfigs; 77 EGLBoolean ret = eglChooseConfig(m_egl.display, configAttributes, &m_egl.config, 1, &numConfigs); 78 if (!ret || !numConfigs) 79 return; 80 81 static const EGLint contextAttributes[3] = { 82 EGL_CONTEXT_CLIENT_VERSION, 2, 83 EGL_NONE 84 }; 85 86 m_egl.context = eglCreateContext(m_egl.display, m_egl.config, EGL_NO_CONTEXT, contextAttributes); 87 if (m_egl.context == EGL_NO_CONTEXT) 88 return; 89 90 if (!eglMakeCurrent(m_egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, m_egl.context)) 91 return; 92 93 m_egl.createImage = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR")); 94 m_egl.destroyImage = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR")); 95 m_egl.queryBuffer = reinterpret_cast<PFNEGLQUERYWAYLANDBUFFERWL>(eglGetProcAddress("eglQueryWaylandBufferWL")); 96 m_egl.imageTargetTexture2DOES = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES")); 97 98 m_exportable = wpe_view_backend_exportable_fdo_create(&s_exportableClient, this, 800, 600); 69 HeadlessViewBackend::HeadlessViewBackend(uint32_t width, uint32_t height) 70 : ViewBackend(width, height) 71 { 72 m_eglDisplay = getEGLDisplay(); 73 if (!initialize()) 74 return; 75 76 if (!eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, m_eglContext)) 77 return; 78 79 createImage = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR")); 80 destroyImage = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR")); 81 queryBuffer = reinterpret_cast<PFNEGLQUERYWAYLANDBUFFERWL>(eglGetProcAddress("eglQueryWaylandBufferWL")); 82 imageTargetTexture2DOES = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES")); 99 83 100 84 m_updateSource = g_timeout_source_new(m_frameRate / 1000); 101 g_source_set_callback(m_updateSource, 102 [](gpointer data) -> gboolean { 103 auto& backend = *static_cast<HeadlessViewBackend*>(data); 104 backend.performUpdate(); 105 return TRUE; 106 }, this, nullptr); 85 g_source_set_callback(m_updateSource, [](gpointer data) -> gboolean { 86 static_cast<HeadlessViewBackend*>(data)->performUpdate(); 87 return TRUE; 88 }, this, nullptr); 107 89 g_source_set_priority(m_updateSource, kRunLoopSourcePriorityDispatcher); 108 90 g_source_attach(m_updateSource, g_main_context_default()); … … 117 99 118 100 if (auto image = std::get<0>(m_pendingImage.second)) 119 m_egl.destroyImage(m_egl.display, image);101 destroyImage(m_eglDisplay, image); 120 102 if (auto image = std::get<0>(m_lockedImage.second)) 121 m_egl.destroyImage(m_egl.display, image); 122 123 if (m_egl.context) 124 eglDestroyContext(m_egl.display, m_egl.context); 125 126 wpe_view_backend_exportable_fdo_destroy(m_exportable); 127 } 128 129 struct wpe_view_backend* HeadlessViewBackend::backend() const 130 { 131 return wpe_view_backend_exportable_fdo_get_view_backend(m_exportable); 103 destroyImage(m_eglDisplay, image); 132 104 } 133 105 134 106 cairo_surface_t* HeadlessViewBackend::createSnapshot() 135 107 { 108 if (!m_eglContext) 109 return nullptr; 110 136 111 performUpdate(); 137 112 … … 146 121 bool successfulSnapshot = false; 147 122 148 if (!eglMakeCurrent(m_egl .display, EGL_NO_SURFACE, EGL_NO_SURFACE, m_egl.context))123 if (!eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, m_eglContext)) 149 124 return nullptr; 150 125 … … 158 133 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, nullptr); 159 134 160 m_egl.imageTargetTexture2DOES(GL_TEXTURE_2D, image);135 imageTargetTexture2DOES(GL_TEXTURE_2D, image); 161 136 glBindTexture(GL_TEXTURE_2D, 0); 162 137 … … 203 178 if (m_lockedImage.first) { 204 179 wpe_view_backend_exportable_fdo_dispatch_release_buffer(m_exportable, m_lockedImage.first); 205 m_egl.destroyImage(m_egl.display, std::get<0>(m_lockedImage.second));180 destroyImage(m_eglDisplay, std::get<0>(m_lockedImage.second)); 206 181 } 207 182 … … 210 185 } 211 186 212 struct wpe_view_backend_exportable_fdo_client HeadlessViewBackend::s_exportableClient = { 213 // export_buffer_resource 214 [](void* data, struct wl_resource* bufferResource) 215 { 216 auto& backend = *static_cast<HeadlessViewBackend*>(data); 217 if (backend.m_pendingImage.first) 218 std::abort(); 219 220 auto& egl = backend.m_egl; 221 222 EGLint format = 0; 223 if (!egl.queryBuffer(egl.display, bufferResource, EGL_TEXTURE_FORMAT, &format) || format != EGL_TEXTURE_RGBA) 224 return; 225 226 EGLint width, height; 227 if (!egl.queryBuffer(egl.display, bufferResource, EGL_WIDTH, &width) 228 || !egl.queryBuffer(egl.display, bufferResource, EGL_HEIGHT, &height)) 229 return; 230 231 EGLint attributes[] = { EGL_WAYLAND_PLANE_WL, 0, EGL_NONE }; 232 EGLImageKHR image = egl.createImage(egl.display, EGL_NO_CONTEXT, EGL_WAYLAND_BUFFER_WL, bufferResource, attributes); 233 backend.m_pendingImage = { bufferResource, std::make_tuple(image, width, height) }; 234 }, 235 // padding 236 nullptr, 237 nullptr, 238 nullptr, 239 nullptr 240 }; 187 void HeadlessViewBackend::displayBuffer(struct wl_resource* bufferResource) 188 { 189 if (m_pendingImage.first) 190 std::abort(); 191 192 EGLint format = 0; 193 if (!queryBuffer(m_eglDisplay, bufferResource, EGL_TEXTURE_FORMAT, &format) || format != EGL_TEXTURE_RGBA) 194 return; 195 196 EGLint width, height; 197 if (!queryBuffer(m_eglDisplay, bufferResource, EGL_WIDTH, &width) 198 || !queryBuffer(m_eglDisplay, bufferResource, EGL_HEIGHT, &height)) 199 return; 200 201 EGLint attributes[] = { EGL_WAYLAND_PLANE_WL, 0, EGL_NONE }; 202 EGLImageKHR image = createImage(m_eglDisplay, EGL_NO_CONTEXT, EGL_WAYLAND_BUFFER_WL, bufferResource, attributes); 203 m_pendingImage = { bufferResource, std::make_tuple(image, width, height) }; 204 } 205 206 } // namespace WPEToolingBackends -
trunk/Tools/wpe/backends/HeadlessViewBackend.h
r232669 r232670 26 26 #pragma once 27 27 28 // This include order is necessary to enforce the GBM EGL platform. 29 #include <gbm.h> 30 #include <epoxy/egl.h> 31 28 #include "ViewBackend.h" 32 29 #include <cairo.h> 33 30 #include <glib.h> 34 31 #include <unordered_map> 35 #include <wpe/fdo.h>36 32 37 #ifndef EGL_WL_bind_wayland_display 38 #define EGL_WL_bind_wayland_display 1 39 typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); 33 typedef void* EGLImageKHR; 40 34 41 #define EGL_WAYLAND_BUFFER_WL 0x31D5 /* eglCreateImageKHR target */ 42 #define EGL_WAYLAND_PLANE_WL 0x31D6 /* eglCreateImageKHR target */ 43 #endif 35 namespace WPEToolingBackends { 44 36 45 class HeadlessViewBackend {37 class HeadlessViewBackend final : public ViewBackend { 46 38 public: 47 HeadlessViewBackend( );39 HeadlessViewBackend(uint32_t width, uint32_t height); 48 40 ~HeadlessViewBackend(); 49 50 struct wpe_view_backend* backend() const;51 41 52 42 cairo_surface_t* createSnapshot(); 53 43 54 44 private: 45 void displayBuffer(struct wl_resource*) override; 46 55 47 void performUpdate(); 56 57 static struct wpe_view_backend_exportable_fdo_client s_exportableClient;58 59 struct {60 EGLDisplay display;61 EGLConfig config;62 EGLContext context { nullptr };63 64 PFNEGLCREATEIMAGEKHRPROC createImage;65 PFNEGLDESTROYIMAGEKHRPROC destroyImage;66 PFNEGLQUERYWAYLANDBUFFERWL queryBuffer;67 PFNGLEGLIMAGETARGETTEXTURE2DOESPROC imageTargetTexture2DOES;68 } m_egl;69 70 struct wpe_view_backend_exportable_fdo* m_exportable;71 48 72 49 std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_pendingImage { }; 73 50 std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_lockedImage { }; 74 51 75 GSource* m_updateSource ;52 GSource* m_updateSource { nullptr }; 76 53 gint64 m_frameRate { G_USEC_PER_SEC / 60 }; 77 54 }; 55 56 } // namespace WPEToolingBackends -
trunk/Tools/wpe/jhbuild.modules
r231565 r232670 24 24 <dep package="libgcrypt"/> 25 25 <dep package="libepoxy"/> 26 <dep package=" dyz"/>26 <dep package="wayland-protocols"/> 27 27 </dependencies> 28 28 </metamodule> … … 37 37 <repository type="tarball" name="freedesktop.org" 38 38 href="http://www.freedesktop.org"/> 39 <repository type="tarball" name="wayland.freedesktop.org" 40 href="http://wayland.freedesktop.org"/> 39 41 <repository type="git" name="github.com" 40 42 href="https://github.com"/> … … 203 205 </autotools> 204 206 205 <autotools id="dyz" supports-non-srcdir-builds="no"> 206 <branch repo="github.com" module="Igalia/dyz" tag="4f196778c82ed72095e72c9d401cd2ff8ba36c60"/> 207 <autotools id="wayland-protocols" autogen-sh="configure"> 208 <branch module="releases/wayland-protocols-${version}.tar.xz" 209 version="1.12" 210 repo="wayland.freedesktop.org" 211 hash="sha256:3b19e8a9e1e19474756a7069db23b90ca9b8ebb438448c6063b4a7fc89b7c8b2"/> 207 212 </autotools> 208 213
Note: See TracChangeset
for help on using the changeset viewer.