Hash :
229fc83d
Author :
Date :
2019-01-21T18:09:15
Vulkan: Port renderer to Fuchsia (reland) Add DisplayVk and WindowSurfaceVk subclasses for Fuchsia to the vulkan renderer, as well as an implementation of OSWindow that renders fullscreen for the test suite. Disallow use of the vulkan loader from third_party as Fuchsia uses a fork of the loader and has not sent those changes upstream yet. Add a small wayland-inspired library libfuchsia-egl to provide a type "struct fuchsia_egl_window" to use as EGLNativeWindowType. This type combines a zx_handle_t to an image pipe channel and a surface size. Image pipes can only be used once to create a VkSurfaceKHR. This means we have to recreate the pipe in tests that call eglCreateWindowSurface more than once with a single OSWindow, or the second call will fail. Add a resetNativeWindow() method to accomplish this. Reland disabling -Wextra-semi. BUG=angleproject:2475 TEST=angle_end2end_tests on Fuchsia Change-Id: Ie91715bcd760c6c04d4b8a02a91daa71e32ee30c Reviewed-on: https://chromium-review.googlesource.com/c/1467603 Commit-Queue: Michael Spang <spang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fuchsia_egl.h"
#include "fuchsia_egl_backend.h"
#include <zircon/assert.h>
#include <zircon/syscalls.h>
#define FUCHSIA_EGL_WINDOW_MAGIC 0x80738870 // "FXIP"
struct fuchsia_egl_window
{
uint32_t magic;
zx_handle_t image_pipe_handle;
int32_t width;
int32_t height;
};
fuchsia_egl_window *fuchsia_egl_window_create(zx_handle_t image_pipe_handle,
int32_t width,
int32_t height)
{
if (width <= 0 || height <= 0)
return NULL;
fuchsia_egl_window *egl_window = malloc(sizeof(*egl_window));
egl_window->magic = FUCHSIA_EGL_WINDOW_MAGIC;
egl_window->image_pipe_handle = image_pipe_handle;
egl_window->width = width;
egl_window->height = height;
return egl_window;
}
void fuchsia_egl_window_destroy(fuchsia_egl_window *egl_window)
{
ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC);
if (egl_window->image_pipe_handle != ZX_HANDLE_INVALID)
{
zx_handle_close(egl_window->image_pipe_handle);
egl_window->image_pipe_handle = ZX_HANDLE_INVALID;
}
egl_window->magic = -1U;
free(egl_window);
}
void fuchsia_egl_window_resize(fuchsia_egl_window *egl_window, int32_t width, int32_t height)
{
ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC);
if (width <= 0 || height <= 0)
return;
egl_window->width = width;
egl_window->height = height;
}
int32_t fuchsia_egl_window_get_width(fuchsia_egl_window *egl_window)
{
ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC);
return egl_window->width;
}
int32_t fuchsia_egl_window_get_height(fuchsia_egl_window *egl_window)
{
ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC);
return egl_window->height;
}
zx_handle_t fuchsia_egl_window_release_image_pipe(fuchsia_egl_window *egl_window)
{
ZX_ASSERT(egl_window->magic == FUCHSIA_EGL_WINDOW_MAGIC);
zx_handle_t image_pipe_handle = egl_window->image_pipe_handle;
egl_window->image_pipe_handle = ZX_HANDLE_INVALID;
return image_pipe_handle;
}