Commit 215bc794 by Jonah Ryan-Davis

Add VK_EXT_metal_surface extension support

VK_EXT_metal_surface is a similar extension to VK_MVK_macos_surface, which is already supported. Bug: chromium:1015454 Change-Id: I08d8e6b097d75236f724984b8c7d20251a63581f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/37808 Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarJonah Ryan-Davis <jonahr@google.com>
parent b0a1f0a9
......@@ -1846,8 +1846,8 @@ elseif(APPLE)
)
list(APPEND VULKAN_LIST
${SOURCE_DIR}/WSI/MacOSSurfaceMVK.mm
${SOURCE_DIR}/WSI/MacOSSurfaceMVK.h
${SOURCE_DIR}/WSI/MetalSurface.mm
${SOURCE_DIR}/WSI/MetalSurface.h
)
elseif(ANDROID)
list(APPEND SWIFTSHADER_LIST
......
......@@ -36,6 +36,7 @@ config("swiftshader_libvulkan_private_config") {
} else if (is_mac) {
defines = [
"VK_USE_PLATFORM_MACOS_MVK=1",
"VK_USE_PLATFORM_METAL_EXT=1",
"VK_EXPORT=__attribute__((visibility(\"default\")))",
]
} else {
......
......@@ -103,6 +103,10 @@ static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctio
// VK_MVK_macos_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
// VK_EXT_metal_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
// VK_KHR_win32_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
......
......@@ -42,8 +42,8 @@
#include "VkShaderModule.hpp"
#include "VkRenderPass.hpp"
#ifdef VK_USE_PLATFORM_MACOS_MVK
#include "WSI/MacOSSurfaceMVK.h"
#if defined(VK_USE_PLATFORM_METAL_EXT) || defined(VK_USE_PLATFORM_MACOS_MVK)
#include "WSI/MetalSurface.h"
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
......@@ -187,6 +187,9 @@ static const VkExtensionProperties instanceExtensionProperties[] =
#ifdef VK_USE_PLATFORM_MACOS_MVK
{ VK_MVK_MACOS_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_SPEC_VERSION },
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
{ VK_EXT_METAL_SURFACE_EXTENSION_NAME, VK_EXT_METAL_SURFACE_SPEC_VERSION },
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
{ VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_SPEC_VERSION },
#endif
......@@ -2892,6 +2895,16 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance, cons
}
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
VKAPI_ATTR VkResult VKAPI_CALL vkCreateMetalSurfaceEXT(VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface)
{
TRACE("(VkInstance instance = %p, VkMetalSurfaceCreateInfoEXT* pCreateInfo = %p, VkAllocationCallbacks* pAllocator = %p, VkSurface* pSurface = %p)",
instance, pCreateInfo, pAllocator, pSurface);
return vk::MetalSurfaceEXT::Create(pAllocator, pCreateInfo, pSurface);
}
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface)
{
......
......@@ -42,8 +42,8 @@ swiftshader_source_set("WSI") {
if (is_mac) {
sources += [
"MacOSSurfaceMVK.mm",
"MacOSSurfaceMVK.h"
"MetalSurface.mm",
"MetalSurface.h",
]
libs = [
"Cocoa.framework",
......
......@@ -12,24 +12,29 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef SWIFTSHADER_MACOSSURFACEMVK_HPP
#define SWIFTSHADER_MACOSSURFACEMVK_HPP
#ifndef SWIFTSHADER_METALSURFACE_HPP
#define SWIFTSHADER_METALSURFACE_HPP
#include "Vulkan/VkObject.hpp"
#include "VkSurfaceKHR.hpp"
#include "vulkan/vulkan_macos.h"
#ifdef VK_USE_PLATFORM_MACOS_MVK
# include "vulkan/vulkan_macos.h"
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
# include "vulkan/vulkan_metal.h"
#endif
namespace vk {
class MetalLayer;
class MacOSSurfaceMVK : public SurfaceKHR, public ObjectBase<MacOSSurfaceMVK, VkSurfaceKHR> {
class MetalSurface : public SurfaceKHR, public ObjectBase<MetalSurface, VkSurfaceKHR> {
public:
MacOSSurfaceMVK(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, void *mem);
MetalSurface(const void *pCreateInfo, void *mem);
void destroySurface(const VkAllocationCallbacks *pAllocator) override;
static size_t ComputeRequiredAllocationSize(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo);
static size_t ComputeRequiredAllocationSize(const void *pCreateInfo);
void getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
......@@ -37,9 +42,21 @@ public:
virtual void detachImage(PresentImage* image) override {}
VkResult present(PresentImage* image) override;
private:
protected:
MetalLayer* metalLayer = nullptr;
};
#ifdef VK_USE_PLATFORM_METAL_EXT
class MetalSurfaceEXT : public MetalSurface {
MetalSurfaceEXT(const VkMetalSurfaceCreateInfoEXT *pCreateInfo, void *mem);
};
#endif
#ifdef VK_USE_PLATFORM_MACOS_MVK
class MacOSSurfaceMVK : public MetalSurface {
MacOSSurfaceMVK(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, void *mem);
};
#endif
}
#endif //SWIFTSHADER_MACOSSURFACEMVK_HPP
#endif //SWIFTSHADER_METALSURFACE_HPP
......@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "MacOSSurfaceMVK.h"
#include "MetalSurface.h"
#include "Vulkan/VkDeviceMemory.hpp"
#include "Vulkan/VkImage.hpp"
......@@ -25,7 +25,29 @@ namespace vk {
class MetalLayer
{
public:
void init(const void* pView) API_AVAILABLE(macosx(10.11))
void initWithLayer(const void* pLayer) API_AVAILABLE(macosx(10.11))
{
view = nullptr;
layer = nullptr;
id<NSObject> obj = (id<NSObject>)pLayer;
if(!NSThread.isMainThread)
{
UNREACHABLE("MetalLayer::init(): not called from main thread");
}
if ([obj isKindOfClass: [CAMetalLayer class]])
{
layer = (CAMetalLayer*)[obj retain];
layer.framebufferOnly = false;
}
else
{
UNREACHABLE("MetalLayer::init(): view doesn't have metal backed layer");
}
}
void initWithView(const void* pView) API_AVAILABLE(macosx(10.11))
{
view = nullptr;
layer = nullptr;
......@@ -34,22 +56,11 @@ public:
if([obj isKindOfClass: [NSView class]])
{
if(!NSThread.isMainThread)
{
UNREACHABLE("MetalLayer::init(): not called from main thread");
}
view = (NSView*)[obj retain];
obj = view.layer;
if ([obj isKindOfClass: [CAMetalLayer class]])
{
layer = (CAMetalLayer*)[obj retain];
layer.framebufferOnly = false;
}
else
{
UNREACHABLE("MetalLayer::init(): view doesn't have metal backed layer");
}
NSView* objView = (NSView*)[obj retain];
initWithLayer(objView.layer);
view = objView;
}
}
......@@ -59,7 +70,6 @@ public:
{
[layer release];
}
if(view)
{
[view release];
......@@ -97,13 +107,12 @@ private:
CAMetalLayer* layer API_AVAILABLE(macosx(10.11));
};
MacOSSurfaceMVK::MacOSSurfaceMVK(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, void *mem) API_AVAILABLE(macosx(10.11)) :
metalLayer(reinterpret_cast<MetalLayer*>(mem))
MetalSurface::MetalSurface(const void *pCreateInfo, void *mem) : metalLayer(reinterpret_cast<MetalLayer*>(mem))
{
metalLayer->init(pCreateInfo->pView);
}
void MacOSSurfaceMVK::destroySurface(const VkAllocationCallbacks *pAllocator) API_AVAILABLE(macosx(10.11))
void MetalSurface::destroySurface(const VkAllocationCallbacks *pAllocator) API_AVAILABLE(macosx(10.11))
{
if(metalLayer)
{
......@@ -113,12 +122,12 @@ void MacOSSurfaceMVK::destroySurface(const VkAllocationCallbacks *pAllocator) AP
vk::deallocate(metalLayer, pAllocator);
}
size_t MacOSSurfaceMVK::ComputeRequiredAllocationSize(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo) API_AVAILABLE(macosx(10.11))
size_t MetalSurface::ComputeRequiredAllocationSize(const void *pCreateInfo) API_AVAILABLE(macosx(10.11))
{
return sizeof(MetalLayer);
}
void MacOSSurfaceMVK::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const API_AVAILABLE(macosx(10.11))
void MetalSurface::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const API_AVAILABLE(macosx(10.11))
{
SurfaceKHR::getSurfaceCapabilities(pSurfaceCapabilities);
......@@ -128,7 +137,7 @@ void MacOSSurfaceMVK::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceC
pSurfaceCapabilities->maxImageExtent = extent;
}
VkResult MacOSSurfaceMVK::present(PresentImage* image) API_AVAILABLE(macosx(10.11))
VkResult MetalSurface::present(PresentImage* image) API_AVAILABLE(macosx(10.11))
{
auto drawable = metalLayer->getNextDrawable();
if(drawable)
......@@ -143,4 +152,20 @@ VkResult MacOSSurfaceMVK::present(PresentImage* image) API_AVAILABLE(macosx(10.1
return VK_SUCCESS;
}
#ifdef VK_USE_PLATFORM_METAL_EXT
MetalSurfaceEXT::MetalSurfaceEXT(const VkMetalSurfaceCreateInfoEXT *pCreateInfo, void *mem) API_AVAILABLE(macosx(10.11))
: MetalSurface(pCreateInfo, mem)
{
metalLayer->initWithLayer(pCreateInfo->pLayer);
}
#endif
#ifdef VK_USE_PLATFORM_MACOS_MVK
MacOSSurfaceMVK::MacOSSurfaceMVK(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, void *mem) API_AVAILABLE(macosx(10.11))
: MetalSurface(pCreateInfo, mem)
{
metalLayer->initWithView(pCreateInfo->pView);
}
#endif
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment