Changeset 232670 in webkit


Ignore:
Timestamp:
Jun 10, 2018 11:43:14 PM (6 years ago)
Author:
Carlos Garcia Campos
Message:

[WPE] Add a MiniBrowser and use it to run WebDriver tests
https://bugs.webkit.org/show_bug.cgi?id=186345

Reviewed by Žan Doberšek.

.:

Add an option to enable building the MiniBrowser.

  • Source/cmake/FindWaylandProtocols.cmake: Added.
  • Source/cmake/OptionsWPE.cmake:

Source/WebDriver:

Use MiniBrowser instead of dyz as the default WebDriver browser for WPE.

  • wpe/WebDriverServiceWPE.cpp:

(WebDriver::WebDriverService::platformParseCapabilities const):

Tools:

Most of the code is based on dyz and gtk MiniBrowser. This patch adds a new internal library WPEToolingBackends,
including the headless view backend and a new window backend to be used by the MiniBrowser. MiniBrowser can also
run in headless mode, by using the headless backend instead of the window one, which will allow us to run the
WebDriver tests in the bots.

  • CMakeLists.txt:
  • MiniBrowser/wpe/CMakeLists.txt: Added.
  • MiniBrowser/wpe/main.cpp: Added.

(automationStartedCallback):
(createViewBackend):
(main):

  • Scripts/run-minibrowser: Remove WPE specific code.
  • Scripts/run-webdriver-tests: Add headless display-server option.
  • Scripts/webkitdirs.pm:

(launcherName): Remove WPE specific code.

  • Scripts/webkitpy/webdriver_tests/webdriver_driver_wpe.py:

(WebDriverWPE.browser_name): Return MiniBrowser.
(WebDriverWPE.browser_path): Return the path to the MiniBrowser in build dir.
(WebDriverWPE.browser_args): Add --headless when running in headless mode.
(WebDriverWPE.capabilities): Use the full browser path.

  • Scripts/webkitpy/webdriver_tests/webdriver_test_runner_selenium.py:

(WebDriverTestRunnerSelenium.collect_tests): Fix early return value.

  • TestWebKitAPI/PlatformWPE.cmake: Use WPEToolingBackends instead of HeadlessViewBackend.
  • TestWebKitAPI/PlatformWebView.h: Ditto.
  • TestWebKitAPI/glib/PlatformWPE.cmake: Ditto
  • TestWebKitAPI/glib/WebKitGLib/TestMain.h:

(Test::createWebViewBackend): Ditto.

  • TestWebKitAPI/wpe/PlatformWebViewWPE.cpp:

(TestWebKitAPI::PlatformWebView::initialize): Ditto.

  • WebKitTestRunner/PlatformWPE.cmake: Ditto.
  • WebKitTestRunner/PlatformWebView.h: Ditto.
  • WebKitTestRunner/wpe/PlatformWebViewWPE.cpp:

(WTR::PlatformWebView::PlatformWebView): Ditto.

  • wpe/HeadlessViewBackend/CMakeLists.txt: Removed.
  • wpe/backends/CMakeLists.txt: Added.
  • wpe/backends/HeadlessViewBackend.cpp: Renamed from Tools/wpe/HeadlessViewBackend/HeadlessViewBackend.cpp.

(WPEToolingBackends::getEGLDisplay):
(WPEToolingBackends::HeadlessViewBackend::HeadlessViewBackend):
(WPEToolingBackends::HeadlessViewBackend::~HeadlessViewBackend):
(WPEToolingBackends::HeadlessViewBackend::createSnapshot):
(WPEToolingBackends::HeadlessViewBackend::performUpdate):
(WPEToolingBackends::HeadlessViewBackend::displayBuffer):

  • wpe/backends/HeadlessViewBackend.h: Renamed from Tools/wpe/HeadlessViewBackend/HeadlessViewBackend.h.
  • wpe/backends/ViewBackend.cpp: Added.

(WPEToolingBackends::ViewBackend::ViewBackend):
(WPEToolingBackends::ViewBackend::~ViewBackend):
(WPEToolingBackends::ViewBackend::initialize):
(WPEToolingBackends::ViewBackend::setInputClient):
(WPEToolingBackends::ViewBackend::backend const):
(WPEToolingBackends::ViewBackend::dispatchInputPointerEvent):
(WPEToolingBackends::ViewBackend::dispatchInputAxisEvent):
(WPEToolingBackends::ViewBackend::dispatchInputKeyboardEvent):

  • wpe/backends/ViewBackend.h: Added.
  • wpe/backends/WindowViewBackend.cpp: Added.

(WPEToolingBackends::WindowViewBackend::WindowViewBackend):
(WPEToolingBackends::WindowViewBackend::~WindowViewBackend):
(WPEToolingBackends::WindowViewBackend::displayBuffer):
(WPEToolingBackends::WindowViewBackend::handleKeyEvent):

  • wpe/backends/WindowViewBackend.h: Added.
  • wpe/jhbuild.modules: Remove dyz and add wayland-protocols.
Location:
trunk
Files:
10 added
1 deleted
20 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r232573 r232670  
     12018-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
    1132018-06-06  Dan Bernstein  <mitz@apple.com>
    214
  • trunk/Source/WebDriver/ChangeLog

    r232504 r232670  
     12018-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
    1132018-06-04  Carlos Garcia Campos  <cgarcia@igalia.com>
    214
  • trunk/Source/WebDriver/wpe/WebDriverServiceWPE.cpp

    r232504 r232670  
    8282void WebDriverService::platformParseCapabilities(const JSON::Object& matchedCapabilities, Capabilities& capabilities) const
    8383{
    84     capabilities.browserBinary = String("dyz");
     84    capabilities.browserBinary = String("MiniBrowser");
    8585    capabilities.browserArguments = Vector<String> { ASCIILiteral("--automation") };
    8686
  • trunk/Source/cmake/OptionsWPE.cmake

    r232196 r232670  
    6161if (DEVELOPER_MODE)
    6262    WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_API_TESTS PRIVATE ON)
     63    WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MINIBROWSER PUBLIC ON)
    6364endif ()
    6465
  • trunk/Tools/CMakeLists.txt

    r227783 r232670  
    2222elseif ("${PORT}" STREQUAL "JSCOnly")
    2323elseif ("${PORT}" STREQUAL "WPE")
     24    if (DEVELOPER_MODE OR ENABLE_MINIBROWSER)
     25        add_subdirectory(wpe/backends)
     26    endif ()
     27
    2428    if (DEVELOPER_MODE)
    2529        add_subdirectory(ImageDiff)
    2630        add_subdirectory(WebKitTestRunner)
    27         add_subdirectory(wpe/HeadlessViewBackend)
    2831        if (ENABLE_API_TESTS)
    2932            add_subdirectory(TestWebKitAPI/glib)
    3033        endif ()
     34    endif ()
     35
     36    if (ENABLE_MINIBROWSER)
     37        add_subdirectory(MiniBrowser/wpe)
    3138    endif ()
    3239elseif ("${PORT}" STREQUAL "Win")
  • trunk/Tools/ChangeLog

    r232669 r232670  
     12018-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
    1692018-06-10  Fujii Hironori  <Hironori.Fujii@sony.com>
    270
  • trunk/Tools/Scripts/run-minibrowser

    r231021 r232670  
    4545setConfiguration();
    4646
    47 if (isGtk()) {
     47if (isGtk() || isWPE()) {
    4848    # Check to see that all the frameworks are built.
    4949    checkFrameworks();
     
    5454    print "Starting MiniBrowser.\n";
    5555    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;
    6756} elsif (isAppleCocoaWebKit()) {
    6857    printHelpAndExitForRunAndDebugWebKitAppIfNeeded();
  • trunk/Tools/Scripts/run-webdriver-tests

    r228014 r232670  
    5050option_parser.add_option('--json-output', action='store', metavar="FILE",
    5151                         help='Write results to JSON file at the given path')
    52 option_parser.add_option('--display-server', choices=['xvfb', 'xorg', 'weston', 'wayland'], default='xvfb',
     52option_parser.add_option('--display-server', choices=['xvfb', 'xorg', 'weston', 'wayland', 'headless'], default='xvfb',
    5353                         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')
    5556
    5657options, args = option_parser.parse_args()
  • trunk/Tools/Scripts/webkitdirs.pm

    r232583 r232670  
    16901690sub launcherName()
    16911691{
    1692     if (isGtk()) {
     1692    if (isGtk() || isWPE()) {
    16931693        return "MiniBrowser";
    16941694    } elsif (isAppleMacWebKit()) {
     
    16961696    } elsif (isAppleWinWebKit()) {
    16971697        return "MiniBrowser";
    1698     } elsif (isWPE()) {
    1699         return "dyz";
    17001698    }
    17011699}
  • trunk/Tools/Scripts/webkitpy/webdriver_tests/webdriver_driver_wpe.py

    r225390 r232670  
    3434
    3535    def browser_name(self):
    36         return 'dyz'
     36        return 'MiniBrowser'
     37
     38    def browser_path(self):
     39        return self._port._build_path('bin', 'MiniBrowser')
    3740
    3841    def browser_args(self):
    39         return ['--automation']
     42        args = ['--automation']
     43        if self._port._display_server == 'headless':
     44            args.append('--headless')
     45        return args
    4046
    4147    def capabilities(self):
    4248        return {'wpe:browserOptions': {
    43             'binary': self.browser_name(),
     49            'binary': self.browser_path(),
    4450            '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 = None
    53         env['LD_LIBRARY_PATH'] = self._port._build_path('lib')
    54         if ld_library_path:
    55             env['LD_LIBRARY_PATH'] += ':' + ld_library_path
    56         return env
    5751
    5852
  • trunk/Tools/Scripts/webkitpy/webdriver_tests/webdriver_test_runner_selenium.py

    r228014 r232670  
    4545    def collect_tests(self, tests):
    4646        if self._driver.selenium_name() is None:
    47             return 0
     47            return []
    4848
    4949        skipped = [os.path.join(self._tests_dir, test) for test in self._expectations.skipped_tests()]
  • trunk/Tools/TestWebKitAPI/PlatformWPE.cmake

    r231042 r232670  
    1818    ${FORWARDING_HEADERS_DIR}/JavaScriptCore/glib
    1919    ${DERIVED_SOURCES_JAVASCRIPCOREWPE_DIR}
    20     ${TOOLS_DIR}/wpe/HeadlessViewBackend
     20    ${TOOLS_DIR}/wpe/backends
    2121)
    2222
     
    8080
    8181list(APPEND test_webkit_api_LIBRARIES
    82     WPEHeadlessViewBackend
     82    WPEToolingBackends
    8383)
    8484
  • trunk/Tools/TestWebKitAPI/PlatformWebView.h

    r230744 r232670  
    4949typedef GtkWidget *PlatformWindow;
    5050#elif PLATFORM(WPE)
     51namespace WPEToolingBackends {
    5152class HeadlessViewBackend;
     53}
    5254struct wpe_view_backend;
    5355typedef WKViewRef PlatformWKView;
    54 typedef HeadlessViewBackend *PlatformWindow;
     56typedef WPEToolingBackends::HeadlessViewBackend *PlatformWindow;
    5557#elif PLATFORM(WIN)
    5658typedef WKViewRef PlatformWKView;
  • trunk/Tools/TestWebKitAPI/glib/PlatformWPE.cmake

    r231042 r232670  
    1111    ${FORWARDING_HEADERS_WPE_EXTENSION_DIR}
    1212    ${FORWARDING_HEADERS_WPE_DOM_DIR}
    13     ${TOOLS_DIR}/wpe/HeadlessViewBackend
     13    ${TOOLS_DIR}/wpe/backends
    1414)
    1515
     
    2222    ${WPE_LIBRARIES}
    2323    ${WPEBACKEND_FDO_LIBRARIES}
    24     WPEHeadlessViewBackend
     24    WPEToolingBackends
    2525)
  • trunk/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h

    r232010 r232670  
    143143    static WebKitWebViewBackend* createWebViewBackend()
    144144    {
    145         auto* headlessBackend = new HeadlessViewBackend;
     145        auto* headlessBackend = new WPEToolingBackends::HeadlessViewBackend(800, 600);
    146146        return webkit_web_view_backend_new(headlessBackend->backend(), [](gpointer userData) {
    147             delete static_cast<HeadlessViewBackend*>(userData);
     147            delete static_cast<WPEToolingBackends::HeadlessViewBackend*>(userData);
    148148        }, headlessBackend);
    149149    }
  • trunk/Tools/TestWebKitAPI/wpe/PlatformWebViewWPE.cpp

    r230562 r232670  
    6767void PlatformWebView::initialize(WKPageConfigurationRef configuration)
    6868{
    69     m_window = new HeadlessViewBackend;
     69    m_window = new WPEToolingBackends::HeadlessViewBackend(800, 600);
    7070    m_view = WKViewCreate(m_window->backend(), configuration);
    7171}
  • trunk/Tools/WebKitTestRunner/PlatformWPE.cmake

    r231042 r232670  
    2020    ${WEBKIT_TESTRUNNER_DIR}/InjectedBundle/wpe
    2121    ${FORWARDING_HEADERS_DIR}
    22     ${TOOLS_DIR}/wpe/HeadlessViewBackend
     22    ${TOOLS_DIR}/wpe/backends
    2323)
    2424
     
    3535    ${LIBXKBCOMMON_LIBRARIES}
    3636    ${WPEBACKEND_FDO_LIBRARIES}
    37     WPEHeadlessViewBackend
     37    WPEToolingBackends
    3838)
    3939
  • trunk/Tools/WebKitTestRunner/PlatformWebView.h

    r229283 r232670  
    5252typedef cairo_surface_t *PlatformImage;
    5353#elif PLATFORM(WPE)
     54namespace WPEToolingBackends {
    5455class HeadlessViewBackend;
     56}
    5557typedef WKViewRef PlatformWKView;
    56 typedef HeadlessViewBackend* PlatformWindow;
     58typedef WPEToolingBackends::HeadlessViewBackend* PlatformWindow;
    5759typedef cairo_surface_t* PlatformImage;
    5860#endif
  • trunk/Tools/WebKitTestRunner/wpe/PlatformWebViewWPE.cpp

    r229256 r232670  
    4040    , m_options(options)
    4141{
    42     m_window = new HeadlessViewBackend;
     42    m_window = new WPEToolingBackends::HeadlessViewBackend(800, 600);
    4343    m_view = WKViewCreate(m_window->backend(), configuration);
    4444}
  • trunk/Tools/wpe/backends/HeadlessViewBackend.cpp

    r232669 r232670  
    2929#include <fcntl.h>
    3030#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>
    3135#include <wpe/fdo-egl.h>
    3236
    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
     39typedef 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
    3643#endif
     44
     45namespace WPEToolingBackends {
     46
     47static PFNEGLCREATEIMAGEKHRPROC createImage;
     48static PFNEGLDESTROYIMAGEKHRPROC destroyImage;
     49static PFNEGLQUERYWAYLANDBUFFERWL queryBuffer;
     50static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC imageTargetTexture2DOES;
    3751
    3852// Keep this in sync with wtf/glib/RunLoopSourcePriority.h.
     
    4761            return EGL_NO_DISPLAY;
    4862
    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);
    5663        s_display = display;
    5764    }
     
    6067}
    6168
    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);
     69HeadlessViewBackend::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"));
    9983
    10084    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);
    10789    g_source_set_priority(m_updateSource, kRunLoopSourcePriorityDispatcher);
    10890    g_source_attach(m_updateSource, g_main_context_default());
     
    11799
    118100    if (auto image = std::get<0>(m_pendingImage.second))
    119         m_egl.destroyImage(m_egl.display, image);
     101        destroyImage(m_eglDisplay, image);
    120102    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);
    132104}
    133105
    134106cairo_surface_t* HeadlessViewBackend::createSnapshot()
    135107{
     108    if (!m_eglContext)
     109        return nullptr;
     110
    136111    performUpdate();
    137112
     
    146121    bool successfulSnapshot = false;
    147122
    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))
    149124        return nullptr;
    150125
     
    158133    glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, nullptr);
    159134
    160     m_egl.imageTargetTexture2DOES(GL_TEXTURE_2D, image);
     135    imageTargetTexture2DOES(GL_TEXTURE_2D, image);
    161136    glBindTexture(GL_TEXTURE_2D, 0);
    162137
     
    203178    if (m_lockedImage.first) {
    204179        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));
    206181    }
    207182
     
    210185}
    211186
    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 };
     187void 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  
    2626#pragma once
    2727
    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"
    3229#include <cairo.h>
    3330#include <glib.h>
    3431#include <unordered_map>
    35 #include <wpe/fdo.h>
    3632
    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);
     33typedef void* EGLImageKHR;
    4034
    41 #define EGL_WAYLAND_BUFFER_WL       0x31D5 /* eglCreateImageKHR target */
    42 #define EGL_WAYLAND_PLANE_WL        0x31D6 /* eglCreateImageKHR target */
    43 #endif
     35namespace WPEToolingBackends {
    4436
    45 class HeadlessViewBackend {
     37class HeadlessViewBackend final : public ViewBackend {
    4638public:
    47     HeadlessViewBackend();
     39    HeadlessViewBackend(uint32_t width, uint32_t height);
    4840    ~HeadlessViewBackend();
    49 
    50     struct wpe_view_backend* backend() const;
    5141
    5242    cairo_surface_t* createSnapshot();
    5343
    5444private:
     45    void displayBuffer(struct wl_resource*) override;
     46
    5547    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;
    7148
    7249    std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_pendingImage { };
    7350    std::pair<struct wl_resource*, std::tuple<EGLImageKHR, uint32_t, uint32_t>> m_lockedImage { };
    7451
    75     GSource* m_updateSource;
     52    GSource* m_updateSource { nullptr };
    7653    gint64 m_frameRate { G_USEC_PER_SEC / 60 };
    7754};
     55
     56} // namespace WPEToolingBackends
  • trunk/Tools/wpe/jhbuild.modules

    r231565 r232670  
    2424      <dep package="libgcrypt"/>
    2525      <dep package="libepoxy"/>
    26       <dep package="dyz"/>
     26      <dep package="wayland-protocols"/>
    2727    </dependencies>
    2828  </metamodule>
     
    3737  <repository type="tarball" name="freedesktop.org"
    3838      href="http://www.freedesktop.org"/>
     39  <repository type="tarball" name="wayland.freedesktop.org"
     40      href="http://wayland.freedesktop.org"/>
    3941  <repository type="git" name="github.com"
    4042      href="https://github.com"/>
     
    203205  </autotools>
    204206
    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"/>
    207212  </autotools>
    208213
Note: See TracChangeset for help on using the changeset viewer.