Changeset 230562 in webkit
- Timestamp:
- Apr 12, 2018 1:19:35 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 1 deleted
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r230540 r230562 1 2018-04-12 Zan Dobersek <zdobersek@igalia.com> 2 3 [WPE] Switch testing process to using WPEBackend-fdo 4 https://bugs.webkit.org/show_bug.cgi?id=184357 5 6 Reviewed by Carlos Alberto Lopez Perez. 7 8 * Source/cmake/FindWPEBackend-fdo.cmake: Renamed from Source/cmake/FindWPEBackend-mesa.cmake. 9 1 10 2018-04-11 Thibault Saunier <tsaunier@igalia.com> 2 11 -
trunk/Tools/ChangeLog
r230559 r230562 1 2018-04-12 Zan Dobersek <zdobersek@igalia.com> 2 3 [WPE] Switch testing process to using WPEBackend-fdo 4 https://bugs.webkit.org/show_bug.cgi?id=184357 5 6 Reviewed by Carlos Alberto Lopez Perez. 7 8 Switch WPE testing to using the WPEBackend-fdo implementation that 9 depends on the WL_bind_wayland_display EGL extension, as defined under 10 the freedesktop.org project. 11 https://cgit.freedesktop.org/mesa/mesa/tree/docs/specs/WL_bind_wayland_display.spec 12 13 HeadlessViewBackend is refactored to use the WPEBackend-fdo API, but 14 otherwise is not changed in functionality. 15 16 Unit tests now have to unconditionally use HeadlessViewBackend as a 17 wpe_view_backend provider, since WPEBackend-fdo does not provide a 18 default wpe_view_backend implementation. Unit tests covering that are 19 adjusted to instead use a mock wpe_view_backend interface. 20 21 * Scripts/webkitdirs.pm: 22 (builtDylibPathForName): Fix the libWPEWebKit.so name to also include 23 the API version that was added in r230449. 24 * Scripts/webkitpy/port/waylanddriver.py: 25 (WaylandDriver._setup_environ_for_test): Export EGL_PLATFORM=wayland. 26 * Scripts/webkitpy/port/wpe.py: 27 (WPEPort._driver_class): Use WaylandDriver by default. 28 * TestWebKitAPI/PlatformWebView.h: 29 (): Deleted. 30 * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp: 31 (testWebViewWebBackend): 32 * TestWebKitAPI/glib/WebKitGLib/TestMain.h: 33 (Test::createWebViewBackend): 34 * TestWebKitAPI/wpe/PlatformWebViewWPE.cpp: 35 (TestWebKitAPI::PlatformWebView::~PlatformWebView): 36 (TestWebKitAPI::PlatformWebView::initialize): 37 * wpe/HeadlessViewBackend/CMakeLists.txt: 38 * wpe/HeadlessViewBackend/HeadlessViewBackend.cpp: 39 (getEGLDisplay): 40 (HeadlessViewBackend::HeadlessViewBackend): 41 (HeadlessViewBackend::~HeadlessViewBackend): 42 (HeadlessViewBackend::backend const): 43 (HeadlessViewBackend::createSnapshot): 44 (HeadlessViewBackend::performUpdate): 45 (HeadlessViewBackend::makeCurrent): Deleted. 46 * wpe/HeadlessViewBackend/HeadlessViewBackend.h: 47 * wpe/jhbuild.modules: Module name cleanup. Dyz version is bumped. 48 1 49 2018-04-12 Carlos Garcia Campos <cgarcia@igalia.com> 2 50 -
trunk/Tools/Scripts/webkitdirs.pm
r229711 r230562 1037 1037 } 1038 1038 if (isWPE()) { 1039 return "$configurationProductDir/lib/libWPEWebKit .so";1039 return "$configurationProductDir/lib/libWPEWebKit-0.1.so"; 1040 1040 } 1041 1041 -
trunk/Tools/Scripts/webkitpy/port/waylanddriver.py
r225740 r230562 50 50 self._port._copy_value_from_environ_if_set(driver_environment, 'WAYLAND_SOCKET') 51 51 driver_environment['GDK_BACKEND'] = 'wayland' 52 driver_environment['EGL_PLATFORM'] = 'wayland' 52 53 driver_environment['LOCAL_RESOURCE_ROOT'] = self._port.layout_tests_dir() 53 54 if self._driver_tempdir is not None: -
trunk/Tools/Scripts/webkitpy/port/wpe.py
r228881 r230562 67 67 @memoized 68 68 def _driver_class(self): 69 if self._display_server == "wayland": 70 return WaylandDriver 71 return HeadlessDriver 69 return WaylandDriver 72 70 73 71 def setup_environ_for_server(self, server_name=None): -
trunk/Tools/TestWebKitAPI/PlatformWebView.h
r225046 r230562 89 89 PlatformWKView m_view; 90 90 PlatformWindow m_window; 91 #if PLATFORM(WPE)92 struct wpe_view_backend* m_backend { nullptr };93 #endif94 91 }; 95 92 -
trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp
r230557 r230562 109 109 static void testWebViewWebBackend(Test* test, gconstpointer) 110 110 { 111 static struct wpe_view_backend_interface s_testingInterface = { 112 // create 113 [](void*, struct wpe_view_backend*) -> void* { return nullptr; }, 114 // destroy 115 [](void*) { }, 116 // initialize 117 [](void*) { }, 118 // get_renderer_host_fd 119 [](void*) -> int { return -1; } 120 }; 121 111 122 // User provided backend with default deleter (we don't have a way to check the backend will be actually freed). 112 GRefPtr<WebKitWebView> webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(wpe_view_backend_create (), nullptr, nullptr)));123 GRefPtr<WebKitWebView> webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(wpe_view_backend_create_with_backend_interface(&s_testingInterface, nullptr), nullptr, nullptr))); 113 124 test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webView.get())); 114 125 auto* viewBackend = webkit_web_view_get_backend(webView.get()); … … 119 130 120 131 // User provided backend with destroy notify. 121 wpeBackend = wpe_view_backend_create ();132 wpeBackend = wpe_view_backend_create_with_backend_interface(&s_testingInterface, nullptr); 122 133 webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(wpeBackend, [](gpointer userData) { 123 134 auto* backend = *static_cast<struct wpe_view_backend**>(userData); … … 146 157 struct wpe_view_backend* backend; 147 158 }; 148 auto* owner = new BackendOwner(wpe_view_backend_create ());159 auto* owner = new BackendOwner(wpe_view_backend_create_with_backend_interface(&s_testingInterface, nullptr)); 149 160 g_assert(hasInstance); 150 161 webView = adoptGRef(webkit_web_view_new(webkit_web_view_backend_new(owner->backend, [](gpointer userData) { -
trunk/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h
r230557 r230562 144 144 static WebKitWebViewBackend* createWebViewBackend() 145 145 { 146 const char* useHeadlessViewBackend = g_getenv("WPE_USE_HEADLESS_VIEW_BACKEND");147 if (!useHeadlessViewBackend || !strcmp(useHeadlessViewBackend, "0")) {148 auto* backend = wpe_view_backend_create();149 return webkit_web_view_backend_new(backend, reinterpret_cast<GDestroyNotify>(wpe_view_backend_destroy), backend);150 }151 146 auto* headlessBackend = new HeadlessViewBackend; 152 147 return webkit_web_view_backend_new(headlessBackend->backend(), [](gpointer userData) { -
trunk/Tools/TestWebKitAPI/wpe/PlatformWebViewWPE.cpp
r225046 r230562 62 62 PlatformWebView::~PlatformWebView() 63 63 { 64 if (m_backend)65 wpe_view_backend_destroy(m_backend);66 67 64 delete m_window; 68 65 } … … 70 67 void PlatformWebView::initialize(WKPageConfigurationRef configuration) 71 68 { 72 const char* useHeadlessViewBackend = g_getenv("WPE_USE_HEADLESS_VIEW_BACKEND"); 73 if (useHeadlessViewBackend && strcmp(useHeadlessViewBackend, "0")) 74 m_window = new HeadlessViewBackend; 75 else 76 m_backend = wpe_view_backend_create(); 77 78 m_view = WKViewCreate(m_window ? m_window->backend() : m_backend, configuration); 69 m_window = new HeadlessViewBackend; 70 m_view = WKViewCreate(m_window->backend(), configuration); 79 71 } 80 72 -
trunk/Tools/wpe/HeadlessViewBackend/CMakeLists.txt
r225045 r230562 1 1 find_package(LibGBM REQUIRED) 2 find_package(WPEBackend- mesaREQUIRED)2 find_package(WPEBackend-fdo REQUIRED) 3 3 4 4 set(WPEHeadlessViewBackend_SOURCES … … 10 10 ${GLIB_INCLUDE_DIRS} 11 11 ${LIBGBM_INCLUDE_DIRS} 12 ${WPE _MESA_INCLUDE_DIRS}12 ${WPEBACKEND_FDO_INCLUDE_DIRS} 13 13 ) 14 14 … … 17 17 ${GLIB_LIBRARIES} 18 18 ${LIBGBM_LIBRARIES} 19 ${WPE _MESA_LIBRARIES}19 ${WPEBACKEND_FDO_LIBRARIES} 20 20 ) 21 21 -
trunk/Tools/wpe/HeadlessViewBackend/HeadlessViewBackend.cpp
r225045 r230562 29 29 #include <fcntl.h> 30 30 #include <unistd.h> 31 #include <wpe-fdo/initialize-egl.h> 31 32 32 33 // Manually provide the EGL_CAST C++ definition in case eglplatform.h doesn't provide it. … … 38 39 static int kRunLoopSourcePriorityDispatcher = -70; 39 40 40 // FIXME: Deploy good practices and clean up GBM resources at process exit.41 41 static EGLDisplay getEGLDisplay() 42 42 { 43 43 static EGLDisplay s_display = EGL_NO_DISPLAY; 44 44 if (s_display == EGL_NO_DISPLAY) { 45 int fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK); 46 if (fd < 0) 47 return EGL_NO_DISPLAY; 48 49 struct gbm_device* device = gbm_create_device(fd); 50 if (!device) 51 return EGL_NO_DISPLAY; 52 53 EGLDisplay display = eglGetDisplay(device); 45 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 54 46 if (display == EGL_NO_DISPLAY) 55 47 return EGL_NO_DISPLAY; … … 61 53 return EGL_NO_DISPLAY; 62 54 55 wpe_fdo_initialize_for_egl_display(display); 63 56 s_display = display; 64 57 } … … 100 93 m_egl.createImage = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR")); 101 94 m_egl.destroyImage = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR")); 95 m_egl.queryBuffer = reinterpret_cast<PFNEGLQUERYWAYLANDBUFFERWL>(eglGetProcAddress("eglQueryWaylandBufferWL")); 102 96 m_egl.imageTargetTexture2DOES = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES")); 103 97 104 m_exportable = wpe_ mesa_view_backend_exportable_dma_buf_create(&s_exportableClient, this);98 m_exportable = wpe_view_backend_exportable_fdo_create(&s_exportableClient, this, 800, 600); 105 99 106 100 m_updateSource = g_timeout_source_new(m_frameRate / 1000); … … 117 111 HeadlessViewBackend::~HeadlessViewBackend() 118 112 { 119 if (m_updateSource) 113 if (m_updateSource) { 120 114 g_source_destroy(m_updateSource); 115 g_source_unref(m_updateSource); 116 } 121 117 122 118 if (auto image = std::get<0>(m_pendingImage.second)) … … 125 121 m_egl.destroyImage(m_egl.display, image); 126 122 127 for (auto it : m_exportMap) {128 int fd = it.second;129 if (fd >= 0)130 close(fd);131 }132 133 123 if (m_egl.context) 134 124 eglDestroyContext(m_egl.display, m_egl.context); 135 125 136 wpe_ mesa_view_backend_exportable_dma_buf_destroy(m_exportable);126 wpe_view_backend_exportable_fdo_destroy(m_exportable); 137 127 } 138 128 139 129 struct wpe_view_backend* HeadlessViewBackend::backend() const 140 130 { 141 return wpe_ mesa_view_backend_exportable_dma_buf_get_view_backend(m_exportable);131 return wpe_view_backend_exportable_fdo_get_view_backend(m_exportable); 142 132 } 143 133 … … 156 146 bool successfulSnapshot = false; 157 147 158 makeCurrent(); 148 if (!eglMakeCurrent(m_egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, m_egl.context)) 149 return nullptr; 159 150 160 151 GLuint imageTexture; … … 204 195 } 205 196 206 bool HeadlessViewBackend::makeCurrent()207 {208 return eglMakeCurrent(m_egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, m_egl.context);209 }210 211 197 void HeadlessViewBackend::performUpdate() 212 198 { … … 214 200 return; 215 201 216 wpe_ mesa_view_backend_exportable_dma_buf_dispatch_frame_complete(m_exportable);202 wpe_view_backend_exportable_fdo_dispatch_frame_complete(m_exportable); 217 203 if (m_lockedImage.first) { 218 wpe_ mesa_view_backend_exportable_dma_buf_dispatch_release_buffer(m_exportable, m_lockedImage.first);204 wpe_view_backend_exportable_fdo_dispatch_release_buffer(m_exportable, m_lockedImage.first); 219 205 m_egl.destroyImage(m_egl.display, std::get<0>(m_lockedImage.second)); 220 206 } 221 207 222 208 m_lockedImage = m_pendingImage; 223 m_pendingImage = std::pair< uint32_t, std::tuple<EGLImageKHR, uint32_t, uint32_t>> { };224 } 225 226 struct wpe_ mesa_view_backend_exportable_dma_buf_client HeadlessViewBackend::s_exportableClient = {227 // export_ dma_buf228 [](void* data, struct w pe_mesa_view_backend_exportable_dma_buf_data* imageData)209 m_pendingImage = std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> { }; 210 } 211 212 struct wpe_view_backend_exportable_fdo_client HeadlessViewBackend::s_exportableClient = { 213 // export_buffer_resource 214 [](void* data, struct wl_resource* bufferResource) 229 215 { 230 216 auto& backend = *static_cast<HeadlessViewBackend*>(data); 231 232 auto it = backend.m_exportMap.end(); 233 if (imageData->fd >= 0) { 234 assert(backend.m_exportMap.find(imageData->handle) == backend.m_exportMap.end()); 235 236 it = backend.m_exportMap.insert({ imageData->handle, imageData->fd }).first; 237 } else { 238 assert(backend.m_exportMap.find(imageData->handle) != backend.m_exportMap.end()); 239 it = backend.m_exportMap.find(imageData->handle); 240 } 241 242 assert(it != backend.m_exportMap.end()); 243 int32_t fd = it->second; 244 245 backend.makeCurrent(); 246 247 EGLint attributes[] = { 248 EGL_WIDTH, static_cast<EGLint>(imageData->width), 249 EGL_HEIGHT, static_cast<EGLint>(imageData->height), 250 EGL_LINUX_DRM_FOURCC_EXT, static_cast<EGLint>(imageData->format), 251 EGL_DMA_BUF_PLANE0_FD_EXT, fd, 252 EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, 253 EGL_DMA_BUF_PLANE0_PITCH_EXT, static_cast<EGLint>(imageData->stride), 254 EGL_NONE, 255 }; 256 EGLImageKHR image = backend.m_egl.createImage(backend.m_egl.display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, nullptr, attributes); 257 backend.m_pendingImage = { imageData->handle, std::make_tuple(image, imageData->width, imageData->height) }; 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) }; 258 234 }, 259 235 }; -
trunk/Tools/wpe/HeadlessViewBackend/HeadlessViewBackend.h
r225045 r230562 33 33 #include <glib.h> 34 34 #include <unordered_map> 35 #include <wpe-mesa/view-backend-exportable-dma-buf.h> 35 #include <wpe-fdo/view-backend-exportable.h> 36 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 */ 43 #endif 36 44 37 45 class HeadlessViewBackend { … … 45 53 46 54 private: 47 bool makeCurrent();48 55 void performUpdate(); 49 56 50 static struct wpe_ mesa_view_backend_exportable_dma_buf_client s_exportableClient;57 static struct wpe_view_backend_exportable_fdo_client s_exportableClient; 51 58 52 59 struct { 53 60 EGLDisplay display; 54 61 EGLConfig config; 55 EGLContext context ;62 EGLContext context { nullptr }; 56 63 57 64 PFNEGLCREATEIMAGEKHRPROC createImage; 58 65 PFNEGLDESTROYIMAGEKHRPROC destroyImage; 66 PFNEGLQUERYWAYLANDBUFFERWL queryBuffer; 59 67 PFNGLEGLIMAGETARGETTEXTURE2DOESPROC imageTargetTexture2DOES; 60 68 } m_egl; 61 69 62 struct wpe_ mesa_view_backend_exportable_dma_buf* m_exportable;70 struct wpe_view_backend_exportable_fdo* m_exportable; 63 71 64 std::unordered_map<uint32_t, int32_t> m_exportMap; 65 std::pair<uint32_t, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_pendingImage { }; 66 std::pair<uint32_t, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_lockedImage { }; 72 std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_pendingImage { }; 73 std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_lockedImage { }; 67 74 68 75 GSource* m_updateSource; -
trunk/Tools/wpe/jhbuild.modules
r229866 r230562 20 20 <dep package="webkit-gstreamer-testing-dependencies"/> 21 21 <dep package="woff2"/> 22 <dep package="wpe "/>23 <dep package="wpe -mesa"/>22 <dep package="wpebackend"/> 23 <dep package="wpebackend-fdo"/> 24 24 <dep package="libgpg-error"/> 25 25 <dep package="libgcrypt"/> … … 173 173 </autotools> 174 174 175 <cmake id="wpe ">175 <cmake id="wpebackend"> 176 176 <branch repo="github.com" module="WebPlatformForEmbedded/WPEBackend.git" 177 177 tag="3013faaebab42e7ef7497b3850a2902978eb3d6f" /> 178 178 </cmake> 179 179 180 <cmake id="wpe -mesa">181 <dependencies> 182 <dep package="wpe "/>183 <dep package="glib" 184 <dep package="xkbcommon" 185 </dependencies> 186 <branch repo="github.com" module=" WebPlatformForEmbedded/WPEBackend-mesa.git"187 tag=" 8e159832dc55164758f68fad02f52e6ad7c70642"/>180 <cmake id="wpebackend-fdo"> 181 <dependencies> 182 <dep package="wpebackend"/> 183 <dep package="glib"/> 184 <dep package="xkbcommon"/> 185 </dependencies> 186 <branch repo="github.com" module="Igalia/WPEBackend-fdo.git" 187 tag="064c60806422ff1bb32cef7fb1de68923aecba82"/> 188 188 </cmake> 189 189 … … 214 214 215 215 <autotools id="dyz" supports-non-srcdir-builds="no"> 216 <branch repo="github.com" module="Igalia/dyz" tag=" 203a1ebd1481e44aa8105e862c02f317e6653627"/>216 <branch repo="github.com" module="Igalia/dyz" tag="74a368cc63a0ff9bba675182affa3a3fd13aad80"/> 217 217 </autotools> 218 218
Note: See TracChangeset
for help on using the changeset viewer.