1 //
2 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // DisplayVkHeadless.cpp:
7 // Implements the class methods for DisplayVkHeadless.
8 //
9
10 #include "DisplayVkHeadless.h"
11 #include "WindowSurfaceVkHeadless.h"
12
13 #include "libANGLE/Display.h"
14 #include "libANGLE/renderer/vulkan/vk_caps_utils.h"
15 #include "libANGLE/renderer/vulkan/vk_renderer.h"
16
17 namespace rx
18 {
19
DisplayVkHeadless(const egl::DisplayState & state)20 DisplayVkHeadless::DisplayVkHeadless(const egl::DisplayState &state) : DisplayVkLinux(state) {}
21
terminate()22 void DisplayVkHeadless::terminate()
23 {
24 DisplayVk::terminate();
25 }
26
isValidNativeWindow(EGLNativeWindowType window) const27 bool DisplayVkHeadless::isValidNativeWindow(EGLNativeWindowType window) const
28 {
29 return true;
30 }
31
createWindowSurfaceVk(const egl::SurfaceState & state,EGLNativeWindowType window)32 SurfaceImpl *DisplayVkHeadless::createWindowSurfaceVk(const egl::SurfaceState &state,
33 EGLNativeWindowType window)
34 {
35 return new WindowSurfaceVkHeadless(state, window);
36 }
37
generateConfigs()38 egl::ConfigSet DisplayVkHeadless::generateConfigs()
39 {
40 std::vector<GLenum> kColorFormats = {GL_RGBA8, GL_BGRA8_EXT, GL_RGB565, GL_RGB8};
41 std::vector<GLenum> kDesiredColorFormats = {GL_RGB10_A2};
42
43 for (GLenum glFormat : kDesiredColorFormats)
44 {
45 VkFormat vkFormat =
46 mRenderer->getFormat(glFormat).getActualRenderableImageVkFormat(mRenderer);
47 ASSERT(vkFormat != VK_FORMAT_UNDEFINED);
48
49 angle::FormatID actualFormatID = vk::GetFormatIDFromVkFormat(vkFormat);
50 if (mRenderer->hasImageFormatFeatureBits(
51 actualFormatID, VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT |
52 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
53 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT |
54 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT |
55 VK_FORMAT_FEATURE_TRANSFER_DST_BIT))
56 {
57 kColorFormats.push_back(glFormat);
58 }
59 }
60
61 return egl_vk::GenerateConfigs(kColorFormats.data(), kColorFormats.size(),
62 egl_vk::kConfigDepthStencilFormats,
63 ArraySize(egl_vk::kConfigDepthStencilFormats), this);
64 }
65
checkConfigSupport(egl::Config * config)66 void DisplayVkHeadless::checkConfigSupport(egl::Config *config) {}
67
getWSIExtension() const68 const char *DisplayVkHeadless::getWSIExtension() const
69 {
70 return VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME;
71 }
72
IsVulkanHeadlessDisplayAvailable()73 bool IsVulkanHeadlessDisplayAvailable()
74 {
75 return true;
76 }
77
CreateVulkanHeadlessDisplay(const egl::DisplayState & state)78 DisplayImpl *CreateVulkanHeadlessDisplay(const egl::DisplayState &state)
79 {
80 return new DisplayVkHeadless(state);
81 }
82
83 } // namespace rx
84