Commit cb586623 by Corentin Wallez Committed by Corentin Wallez

MetalSurface: set layer.device to a ref of the system default device.

If layer.device is null, [layer nextDrawable] returns nil, so on surface initialization we set layer.device to a dummy MTLDevice by getting a reference of the system default device. MTLCreateSystemDefaultDevice() requires linking against Metal.framework but Chromium needs to ship on platforms that don't have Metal. This means we can't directly link against the framework, instead we "weakly" link against it so that if it is not present, the function pointers are just null (instead of failing to launch). Bug: dawn:269 Change-Id: I5984613f576849c6f219c253da7eb277fa75ef52 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43209 Kokoro-Presubmit: Corentin Wallez <cwallez@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Tested-by: 's avatarCorentin Wallez <cwallez@google.com>
parent c66dad95
...@@ -1092,7 +1092,8 @@ elseif(APPLE) ...@@ -1092,7 +1092,8 @@ elseif(APPLE)
find_library(QUARTZ_FRAMEWORK Quartz) find_library(QUARTZ_FRAMEWORK Quartz)
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation) find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
find_library(IOSURFACE_FRAMEWORK IOSurface) find_library(IOSURFACE_FRAMEWORK IOSurface)
set(OS_LIBS "${COCOA_FRAMEWORK}" "${QUARTZ_FRAMEWORK}" "${CORE_FOUNDATION_FRAMEWORK}" "${IOSURFACE_FRAMEWORK}") find_library(METAL_FRAMEWORK Metal)
set(OS_LIBS "${COCOA_FRAMEWORK}" "${QUARTZ_FRAMEWORK}" "${CORE_FOUNDATION_FRAMEWORK}" "${IOSURFACE_FRAMEWORK}" "${METAL_FRAMEWORK}")
endif() endif()
########################################################### ###########################################################
...@@ -1632,4 +1633,4 @@ if(HAVE_PVR_SUBMODULE AND SWIFTSHADER_BUILD_PVR) ...@@ -1632,4 +1633,4 @@ if(HAVE_PVR_SUBMODULE AND SWIFTSHADER_BUILD_PVR)
foreach(pvr_target ${PVR_TARGET_OTHER} ${PVR_VULKAN_TARGET_OTHER} ${PVR_GLES_TARGET_OTHER}) foreach(pvr_target ${PVR_TARGET_OTHER} ${PVR_VULKAN_TARGET_OTHER} ${PVR_GLES_TARGET_OTHER})
set_target_properties(${pvr_target} PROPERTIES FOLDER Samples/PowerVR-Build) set_target_properties(${pvr_target} PROPERTIES FOLDER Samples/PowerVR-Build)
endforeach() endforeach()
endif() endif()
\ No newline at end of file
...@@ -14,6 +14,15 @@ ...@@ -14,6 +14,15 @@
import("../swiftshader.gni") import("../swiftshader.gni")
config("WSI_metal_weak_framework") {
if (is_mac) {
ldflags = [
"-weak_framework",
"Metal",
]
}
}
swiftshader_source_set("WSI") { swiftshader_source_set("WSI") {
sources = [ sources = [
"VkSurfaceKHR.cpp", "VkSurfaceKHR.cpp",
...@@ -42,13 +51,14 @@ swiftshader_source_set("WSI") { ...@@ -42,13 +51,14 @@ swiftshader_source_set("WSI") {
if (is_mac) { if (is_mac) {
sources += [ sources += [
"MetalSurface.mm",
"MetalSurface.h", "MetalSurface.h",
"MetalSurface.mm",
] ]
libs = [ libs = [
"Cocoa.framework", "Cocoa.framework",
"QuartzCore.framework", "QuartzCore.framework",
] ]
public_configs = [ ":WSI_metal_weak_framework" ]
} }
include_dirs = [ include_dirs = [
...@@ -63,5 +73,5 @@ swiftshader_source_set("WSI") { ...@@ -63,5 +73,5 @@ swiftshader_source_set("WSI") {
"../Vulkan:swiftshader_libvulkan_headers", "../Vulkan:swiftshader_libvulkan_headers",
] ]
configs = [ "../Vulkan:swiftshader_libvulkan_private_config", ] configs = [ "../Vulkan:swiftshader_libvulkan_private_config" ]
} }
...@@ -40,6 +40,7 @@ public: ...@@ -40,6 +40,7 @@ public:
{ {
layer = (CAMetalLayer*)[obj retain]; layer = (CAMetalLayer*)[obj retain];
layer.framebufferOnly = false; layer.framebufferOnly = false;
layer.device = MTLCreateSystemDefaultDevice();
} }
else else
{ {
...@@ -68,6 +69,7 @@ public: ...@@ -68,6 +69,7 @@ public:
{ {
if(layer) if(layer)
{ {
[layer.device release];
[layer release]; [layer release];
} }
if(view) if(view)
......
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