Hash :
b73eee71
Author :
Date :
2021-07-07T18:51:35
Reland: [Vulkan] Add DisplayVkNull Currently all DisplayVk implementations depend on VK_KHR_swapchain and VK_KHR_surface extensions. When running Chromium on Fuchsia these extensions are never used (content is shown on the screen using ImagePipe API without dependency on swapchain). ANGLE still depended on these extensions for DisplayVkFuchsia. This CL adds DisplayVkNull, which allows to run ANGLE without dependency on swapchain. It's usable only offscreen and cannot present content on a surface. Bug: chromium:1203879 Change-Id: I5cadcdf46ed1cfb5ebb3cb69dbfef063e9e2b826 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3012368 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: 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
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// DisplayVkNull.cpp:
// Implements the class methods for DisplayVkNull.
//
#include "DisplayVkNull.h"
#include "WindowSurfaceVkNull.h"
#include "libANGLE/Display.h"
#include "libANGLE/renderer/vulkan/RendererVk.h"
#include "libANGLE/renderer/vulkan/vk_caps_utils.h"
namespace rx
{
DisplayVkNull::DisplayVkNull(const egl::DisplayState &state) : DisplayVk(state) {}
bool DisplayVkNull::isValidNativeWindow(EGLNativeWindowType window) const
{
return false;
}
SurfaceImpl *DisplayVkNull::createWindowSurfaceVk(const egl::SurfaceState &state,
EGLNativeWindowType window)
{
return new WindowSurfaceVkNull(state, window);
}
const char *DisplayVkNull::getWSIExtension() const
{
return nullptr;
}
bool DisplayVkNull::isUsingSwapchain() const
{
return false;
}
egl::ConfigSet DisplayVkNull::generateConfigs()
{
constexpr GLenum kColorFormats[] = {GL_RGBA8, GL_BGRA8_EXT, GL_RGB565, GL_RGB8};
return egl_vk::GenerateConfigs(kColorFormats, egl_vk::kConfigDepthStencilFormats, this);
}
void DisplayVkNull::checkConfigSupport(egl::Config *config)
{
config->surfaceType &= ~EGL_WINDOW_BIT;
}
bool IsVulkanNullDisplayAvailable()
{
return true;
}
DisplayImpl *CreateVulkanNullDisplay(const egl::DisplayState &state)
{
return new DisplayVkNull(state);
}
} // namespace rx