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