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) ...@@ -1846,8 +1846,8 @@ elseif(APPLE)
) )
list(APPEND VULKAN_LIST list(APPEND VULKAN_LIST
${SOURCE_DIR}/WSI/MacOSSurfaceMVK.mm ${SOURCE_DIR}/WSI/MetalSurface.mm
${SOURCE_DIR}/WSI/MacOSSurfaceMVK.h ${SOURCE_DIR}/WSI/MetalSurface.h
) )
elseif(ANDROID) elseif(ANDROID)
list(APPEND SWIFTSHADER_LIST list(APPEND SWIFTSHADER_LIST
......
...@@ -36,6 +36,7 @@ config("swiftshader_libvulkan_private_config") { ...@@ -36,6 +36,7 @@ config("swiftshader_libvulkan_private_config") {
} else if (is_mac) { } else if (is_mac) {
defines = [ defines = [
"VK_USE_PLATFORM_MACOS_MVK=1", "VK_USE_PLATFORM_MACOS_MVK=1",
"VK_USE_PLATFORM_METAL_EXT=1",
"VK_EXPORT=__attribute__((visibility(\"default\")))", "VK_EXPORT=__attribute__((visibility(\"default\")))",
] ]
} else { } else {
......
...@@ -103,6 +103,10 @@ static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctio ...@@ -103,6 +103,10 @@ static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctio
// VK_MVK_macos_surface // VK_MVK_macos_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK), MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
#endif #endif
#ifdef VK_USE_PLATFORM_METAL_EXT
// VK_EXT_metal_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR #ifdef VK_USE_PLATFORM_WIN32_KHR
// VK_KHR_win32_surface // VK_KHR_win32_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR), MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
......
...@@ -42,8 +42,8 @@ ...@@ -42,8 +42,8 @@
#include "VkShaderModule.hpp" #include "VkShaderModule.hpp"
#include "VkRenderPass.hpp" #include "VkRenderPass.hpp"
#ifdef VK_USE_PLATFORM_MACOS_MVK #if defined(VK_USE_PLATFORM_METAL_EXT) || defined(VK_USE_PLATFORM_MACOS_MVK)
#include "WSI/MacOSSurfaceMVK.h" #include "WSI/MetalSurface.h"
#endif #endif
#ifdef VK_USE_PLATFORM_XCB_KHR #ifdef VK_USE_PLATFORM_XCB_KHR
...@@ -187,6 +187,9 @@ static const VkExtensionProperties instanceExtensionProperties[] = ...@@ -187,6 +187,9 @@ static const VkExtensionProperties instanceExtensionProperties[] =
#ifdef VK_USE_PLATFORM_MACOS_MVK #ifdef VK_USE_PLATFORM_MACOS_MVK
{ VK_MVK_MACOS_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_SPEC_VERSION }, { VK_MVK_MACOS_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_SPEC_VERSION },
#endif #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 #ifdef VK_USE_PLATFORM_WIN32_KHR
{ VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_SPEC_VERSION }, { VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_SPEC_VERSION },
#endif #endif
...@@ -2892,6 +2895,16 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance, cons ...@@ -2892,6 +2895,16 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance, cons
} }
#endif #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 #ifdef VK_USE_PLATFORM_WIN32_KHR
VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface)
{ {
......
...@@ -42,8 +42,8 @@ swiftshader_source_set("WSI") { ...@@ -42,8 +42,8 @@ swiftshader_source_set("WSI") {
if (is_mac) { if (is_mac) {
sources += [ sources += [
"MacOSSurfaceMVK.mm", "MetalSurface.mm",
"MacOSSurfaceMVK.h" "MetalSurface.h",
] ]
libs = [ libs = [
"Cocoa.framework", "Cocoa.framework",
......
...@@ -12,24 +12,29 @@ ...@@ -12,24 +12,29 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef SWIFTSHADER_MACOSSURFACEMVK_HPP #ifndef SWIFTSHADER_METALSURFACE_HPP
#define SWIFTSHADER_MACOSSURFACEMVK_HPP #define SWIFTSHADER_METALSURFACE_HPP
#include "Vulkan/VkObject.hpp" #include "Vulkan/VkObject.hpp"
#include "VkSurfaceKHR.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 { namespace vk {
class MetalLayer; class MetalLayer;
class MacOSSurfaceMVK : public SurfaceKHR, public ObjectBase<MacOSSurfaceMVK, VkSurfaceKHR> { class MetalSurface : public SurfaceKHR, public ObjectBase<MetalSurface, VkSurfaceKHR> {
public: public:
MacOSSurfaceMVK(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, void *mem); MetalSurface(const void *pCreateInfo, void *mem);
void destroySurface(const VkAllocationCallbacks *pAllocator) override; 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; void getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
...@@ -37,9 +42,21 @@ public: ...@@ -37,9 +42,21 @@ public:
virtual void detachImage(PresentImage* image) override {} virtual void detachImage(PresentImage* image) override {}
VkResult present(PresentImage* image) override; VkResult present(PresentImage* image) override;
private: protected:
MetalLayer* metalLayer = nullptr; 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 @@ ...@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "MacOSSurfaceMVK.h" #include "MetalSurface.h"
#include "Vulkan/VkDeviceMemory.hpp" #include "Vulkan/VkDeviceMemory.hpp"
#include "Vulkan/VkImage.hpp" #include "Vulkan/VkImage.hpp"
...@@ -25,7 +25,29 @@ namespace vk { ...@@ -25,7 +25,29 @@ namespace vk {
class MetalLayer class MetalLayer
{ {
public: 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; view = nullptr;
layer = nullptr; layer = nullptr;
...@@ -34,22 +56,11 @@ public: ...@@ -34,22 +56,11 @@ public:
if([obj isKindOfClass: [NSView class]]) if([obj isKindOfClass: [NSView class]])
{ {
if(!NSThread.isMainThread) NSView* objView = (NSView*)[obj retain];
{
UNREACHABLE("MetalLayer::init(): not called from main thread"); initWithLayer(objView.layer);
}
view = (NSView*)[obj retain]; view = objView;
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");
}
} }
} }
...@@ -59,7 +70,6 @@ public: ...@@ -59,7 +70,6 @@ public:
{ {
[layer release]; [layer release];
} }
if(view) if(view)
{ {
[view release]; [view release];
...@@ -97,13 +107,12 @@ private: ...@@ -97,13 +107,12 @@ private:
CAMetalLayer* layer API_AVAILABLE(macosx(10.11)); CAMetalLayer* layer API_AVAILABLE(macosx(10.11));
}; };
MacOSSurfaceMVK::MacOSSurfaceMVK(const VkMacOSSurfaceCreateInfoMVK *pCreateInfo, void *mem) API_AVAILABLE(macosx(10.11)) : MetalSurface::MetalSurface(const void *pCreateInfo, void *mem) : metalLayer(reinterpret_cast<MetalLayer*>(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) if(metalLayer)
{ {
...@@ -113,12 +122,12 @@ void MacOSSurfaceMVK::destroySurface(const VkAllocationCallbacks *pAllocator) AP ...@@ -113,12 +122,12 @@ void MacOSSurfaceMVK::destroySurface(const VkAllocationCallbacks *pAllocator) AP
vk::deallocate(metalLayer, pAllocator); 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); 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); SurfaceKHR::getSurfaceCapabilities(pSurfaceCapabilities);
...@@ -128,7 +137,7 @@ void MacOSSurfaceMVK::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceC ...@@ -128,7 +137,7 @@ void MacOSSurfaceMVK::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceC
pSurfaceCapabilities->maxImageExtent = extent; 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(); auto drawable = metalLayer->getNextDrawable();
if(drawable) if(drawable)
...@@ -143,4 +152,20 @@ VkResult MacOSSurfaceMVK::present(PresentImage* image) API_AVAILABLE(macosx(10.1 ...@@ -143,4 +152,20 @@ VkResult MacOSSurfaceMVK::present(PresentImage* image) API_AVAILABLE(macosx(10.1
return VK_SUCCESS; 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