xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/mac/DisplayVkMac.mm (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1//
2// Copyright 2019 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// DisplayVkMac.mm:
7//    Implements methods from DisplayVkMac
8//
9
10#include "libANGLE/renderer/vulkan/mac/DisplayVkMac.h"
11
12#include <vulkan/vulkan.h>
13
14#include "libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.h"
15#include "libANGLE/renderer/vulkan/mac/WindowSurfaceVkMac.h"
16#include "libANGLE/renderer/vulkan/vk_caps_utils.h"
17#include "libANGLE/renderer/vulkan/vk_renderer.h"
18
19#import <Cocoa/Cocoa.h>
20
21namespace rx
22{
23
24DisplayVkMac::DisplayVkMac(const egl::DisplayState &state) : DisplayVk(state) {}
25
26bool DisplayVkMac::isValidNativeWindow(EGLNativeWindowType window) const
27{
28    NSObject *layer = reinterpret_cast<NSObject *>(window);
29    return [layer isKindOfClass:[CALayer class]];
30}
31
32SurfaceImpl *DisplayVkMac::createWindowSurfaceVk(const egl::SurfaceState &state,
33                                                 EGLNativeWindowType window)
34{
35    ASSERT(isValidNativeWindow(window));
36    return new WindowSurfaceVkMac(state, window);
37}
38
39SurfaceImpl *DisplayVkMac::createPbufferFromClientBuffer(const egl::SurfaceState &state,
40                                                         EGLenum buftype,
41                                                         EGLClientBuffer clientBuffer,
42                                                         const egl::AttributeMap &attribs)
43{
44    ASSERT(buftype == EGL_IOSURFACE_ANGLE);
45
46    return new IOSurfaceSurfaceVkMac(state, clientBuffer, attribs, mRenderer);
47}
48
49egl::ConfigSet DisplayVkMac::generateConfigs()
50{
51    constexpr GLenum kColorFormats[] = {GL_BGRA8_EXT, GL_BGRX8_ANGLEX};
52    return egl_vk::GenerateConfigs(kColorFormats, egl_vk::kConfigDepthStencilFormats, this);
53}
54
55void DisplayVkMac::checkConfigSupport(egl::Config *config)
56{
57    // TODO(geofflang): Test for native support and modify the config accordingly.
58    // anglebug.com/42261400
59}
60
61const char *DisplayVkMac::getWSIExtension() const
62{
63    return VK_EXT_METAL_SURFACE_EXTENSION_NAME;
64}
65
66bool IsVulkanMacDisplayAvailable()
67{
68    return true;
69}
70
71DisplayImpl *CreateVulkanMacDisplay(const egl::DisplayState &state)
72{
73    return new DisplayVkMac(state);
74}
75
76void DisplayVkMac::generateExtensions(egl::DisplayExtensions *outExtensions) const
77{
78    outExtensions->iosurfaceClientBuffer = true;
79
80    DisplayVk::generateExtensions(outExtensions);
81}
82
83egl::Error DisplayVkMac::validateClientBuffer(const egl::Config *configuration,
84                                              EGLenum buftype,
85                                              EGLClientBuffer clientBuffer,
86                                              const egl::AttributeMap &attribs) const
87{
88    ASSERT(buftype == EGL_IOSURFACE_ANGLE);
89
90    if (!IOSurfaceSurfaceVkMac::ValidateAttributes(this, clientBuffer, attribs))
91    {
92        return egl::EglBadAttribute();
93    }
94    return egl::NoError();
95}
96
97}  // namespace rx
98