xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/linux/headless/DisplayVkHeadless.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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