Adds TYPE_MACOS to WSI framework to enable dEQP-VK.wsi.macos.* tests.
Adds WSI integration to tcu::osx::VulkanPlatform using an Objective-C++
wrapper around a native NSView subclass backed by a CAMetalLayer.
Affects:
dEQP-VK.wsi.macos.*
Components: Framework, Vulkan
Change-Id: I53b487ec6040e88b125d168be7e8c3408f44d959
dEQP-VK.wsi.android.colorspace.extensions
dEQP-VK.wsi.android.colorspace.basic
dEQP-VK.wsi.android.colorspace.hdr
+dEQP-VK.wsi.macos.surface.create
+dEQP-VK.wsi.macos.surface.create_custom_allocator
+dEQP-VK.wsi.macos.surface.create_simulate_oom
+dEQP-VK.wsi.macos.surface.query_support
+dEQP-VK.wsi.macos.surface.query_capabilities
+dEQP-VK.wsi.macos.surface.query_capabilities2
+dEQP-VK.wsi.macos.surface.query_formats
+dEQP-VK.wsi.macos.surface.query_formats2
+dEQP-VK.wsi.macos.surface.query_present_modes
+dEQP-VK.wsi.macos.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.macos.surface.query_devgroup_present_modes
+dEQP-VK.wsi.macos.surface.destroy_null_handle
+dEQP-VK.wsi.macos.surface.initial_size
+dEQP-VK.wsi.macos.surface.resize
+dEQP-VK.wsi.macos.swapchain.create.min_image_count
+dEQP-VK.wsi.macos.swapchain.create.image_format
+dEQP-VK.wsi.macos.swapchain.create.image_extent
+dEQP-VK.wsi.macos.swapchain.create.image_array_layers
+dEQP-VK.wsi.macos.swapchain.create.image_usage
+dEQP-VK.wsi.macos.swapchain.create.image_sharing_mode
+dEQP-VK.wsi.macos.swapchain.create.pre_transform
+dEQP-VK.wsi.macos.swapchain.create.composite_alpha
+dEQP-VK.wsi.macos.swapchain.create.present_mode
+dEQP-VK.wsi.macos.swapchain.create.clipped
+dEQP-VK.wsi.macos.swapchain.simulate_oom.min_image_count
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_format
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_extent
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_array_layers
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_usage
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_sharing_mode
+dEQP-VK.wsi.macos.swapchain.simulate_oom.pre_transform
+dEQP-VK.wsi.macos.swapchain.simulate_oom.composite_alpha
+dEQP-VK.wsi.macos.swapchain.simulate_oom.present_mode
+dEQP-VK.wsi.macos.swapchain.simulate_oom.clipped
+dEQP-VK.wsi.macos.swapchain.render.basic
+dEQP-VK.wsi.macos.swapchain.destroy.null_handle
+dEQP-VK.wsi.macos.swapchain.get_images.incomplete
+dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.mailbox.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.mailbox.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo_relaxed.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo_relaxed.incremental_present
+dEQP-VK.wsi.macos.display_timing.fifo.reference
+dEQP-VK.wsi.macos.display_timing.fifo.display_timing
+dEQP-VK.wsi.macos.display_timing.fifo_relaxed.reference
+dEQP-VK.wsi.macos.display_timing.fifo_relaxed.display_timing
+dEQP-VK.wsi.macos.display_timing.immediate.reference
+dEQP-VK.wsi.macos.display_timing.immediate.display_timing
+dEQP-VK.wsi.macos.display_timing.mailbox.reference
+dEQP-VK.wsi.macos.display_timing.mailbox.display_timing
+dEQP-VK.wsi.macos.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.macos.shared_presentable_image.scale_none.continuous
+dEQP-VK.wsi.macos.colorspace.extensions
+dEQP-VK.wsi.macos.colorspace.basic
+dEQP-VK.wsi.macos.colorspace.hdr
dEQP-VK.wsi.display.get_display_properties
dEQP-VK.wsi.display.get_display_plane_properties
dEQP-VK.wsi.display.get_display_plane_supported_displays
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.create.present_mode
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.create.clipped
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.render.basic
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.min_image_count
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_format
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_extent
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_array_layers
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_usage
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_sharing_mode
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.pre_transform
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.composite_alpha
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.present_mode
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.clipped
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.render.basic
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_cosited
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
TYPE_MIR,
TYPE_ANDROID,
TYPE_WIN32,
+ TYPE_MACOS,
TYPE_LAST
};
typedef DisplayInterface<TYPE_WIN32> Win32DisplayInterface;
typedef WindowInterface<TYPE_WIN32> Win32WindowInterface;
+// VK_MVK_macos_surface
+
+template<>
+struct TypeTraits<TYPE_MACOS>
+{
+ typedef void* NativeWindowType;
+};
+
+typedef WindowInterface<TYPE_MACOS> MacOSWindowInterface;
+
} // wsi
} // vk
"mir",
"android",
"win32",
+ "macos",
};
return de::getSizedArrayElement<TYPE_LAST>(s_names, wsiType);
}
"VK_KHR_mir_surface",
"VK_KHR_android_surface",
"VK_KHR_win32_surface",
+ "VK_MVK_macos_surface"
};
return de::getSizedArrayElement<TYPE_LAST>(s_extNames, wsiType);
}
noDisplayLimit,
noWindowLimit,
},
+ // VK_MVK_macos_surface
+ {
+ PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE|PlatformProperties::FEATURE_RESIZE_WINDOW,
+ PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE,
+ noDisplayLimit,
+ noWindowLimit,
+ },
};
return de::getSizedArrayElement<TYPE_LAST>(s_properties, wsiType);
VkSurfaceKHR* pSurface)
{
// Update this function if you add more WSI implementations
- DE_STATIC_ASSERT(TYPE_LAST == 6);
+ DE_STATIC_ASSERT(TYPE_LAST == 7);
switch (wsiType)
{
return vki.createWin32SurfaceKHR(instance, &createInfo, pAllocator, pSurface);
}
+ case TYPE_MACOS:
+ {
+ const MacOSWindowInterface& macOSWindow = dynamic_cast<const MacOSWindowInterface&>(nativeWindow);
+ const VkMacOSSurfaceCreateInfoMVK createInfo =
+ {
+ VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK,
+ DE_NULL,
+ (VkMacOSSurfaceCreateFlagsMVK)0,
+ macOSWindow.getNative()
+ };
+
+ return vki.createMacOSSurfaceMVK(instance, &createInfo, pAllocator, pSurface);
+ }
+
default:
DE_FATAL("Unknown WSI type");
return VK_ERROR_SURFACE_LOST_KHR;
dEQP-VK.wsi.win32.colorspace.extensions
dEQP-VK.wsi.win32.colorspace.basic
dEQP-VK.wsi.win32.colorspace.hdr
+dEQP-VK.wsi.macos.surface.create
+dEQP-VK.wsi.macos.surface.create_custom_allocator
+dEQP-VK.wsi.macos.surface.create_simulate_oom
+dEQP-VK.wsi.macos.surface.query_support
+dEQP-VK.wsi.macos.surface.query_capabilities
+dEQP-VK.wsi.macos.surface.query_capabilities2
+dEQP-VK.wsi.macos.surface.query_formats
+dEQP-VK.wsi.macos.surface.query_formats2
+dEQP-VK.wsi.macos.surface.query_present_modes
+dEQP-VK.wsi.macos.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.macos.surface.query_devgroup_present_modes
+dEQP-VK.wsi.macos.surface.destroy_null_handle
+dEQP-VK.wsi.macos.surface.initial_size
+dEQP-VK.wsi.macos.surface.resize
+dEQP-VK.wsi.macos.swapchain.create.min_image_count
+dEQP-VK.wsi.macos.swapchain.create.image_format
+dEQP-VK.wsi.macos.swapchain.create.image_extent
+dEQP-VK.wsi.macos.swapchain.create.image_array_layers
+dEQP-VK.wsi.macos.swapchain.create.image_usage
+dEQP-VK.wsi.macos.swapchain.create.image_sharing_mode
+dEQP-VK.wsi.macos.swapchain.create.pre_transform
+dEQP-VK.wsi.macos.swapchain.create.composite_alpha
+dEQP-VK.wsi.macos.swapchain.create.present_mode
+dEQP-VK.wsi.macos.swapchain.create.clipped
+dEQP-VK.wsi.macos.swapchain.simulate_oom.min_image_count
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_format
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_extent
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_array_layers
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_usage
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_sharing_mode
+dEQP-VK.wsi.macos.swapchain.simulate_oom.pre_transform
+dEQP-VK.wsi.macos.swapchain.simulate_oom.composite_alpha
+dEQP-VK.wsi.macos.swapchain.simulate_oom.present_mode
+dEQP-VK.wsi.macos.swapchain.simulate_oom.clipped
+dEQP-VK.wsi.macos.swapchain.render.basic
+dEQP-VK.wsi.macos.swapchain.destroy.null_handle
+dEQP-VK.wsi.macos.swapchain.get_images.incomplete
+dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.mailbox.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.mailbox.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo_relaxed.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo_relaxed.incremental_present
+dEQP-VK.wsi.macos.display_timing.fifo.reference
+dEQP-VK.wsi.macos.display_timing.fifo.display_timing
+dEQP-VK.wsi.macos.display_timing.fifo_relaxed.reference
+dEQP-VK.wsi.macos.display_timing.fifo_relaxed.display_timing
+dEQP-VK.wsi.macos.display_timing.immediate.reference
+dEQP-VK.wsi.macos.display_timing.immediate.display_timing
+dEQP-VK.wsi.macos.display_timing.mailbox.reference
+dEQP-VK.wsi.macos.display_timing.mailbox.display_timing
+dEQP-VK.wsi.macos.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.macos.shared_presentable_image.scale_none.continuous
+dEQP-VK.wsi.macos.colorspace.extensions
+dEQP-VK.wsi.macos.colorspace.basic
+dEQP-VK.wsi.macos.colorspace.hdr
dEQP-VK.wsi.display.get_display_properties
dEQP-VK.wsi.display.get_display_plane_properties
dEQP-VK.wsi.display.get_display_plane_supported_displays
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.create.present_mode
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.create.clipped
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.render.basic
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.min_image_count
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_format
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_extent
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_array_layers
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_usage
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_sharing_mode
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.pre_transform
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.composite_alpha
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.present_mode
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.clipped
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.render.basic
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_cosited
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
dEQP-VK.wsi.win32.colorspace.extensions
dEQP-VK.wsi.win32.colorspace.basic
dEQP-VK.wsi.win32.colorspace.hdr
+dEQP-VK.wsi.macos.surface.create
+dEQP-VK.wsi.macos.surface.create_custom_allocator
+dEQP-VK.wsi.macos.surface.create_simulate_oom
+dEQP-VK.wsi.macos.surface.query_support
+dEQP-VK.wsi.macos.surface.query_capabilities
+dEQP-VK.wsi.macos.surface.query_capabilities2
+dEQP-VK.wsi.macos.surface.query_formats
+dEQP-VK.wsi.macos.surface.query_formats2
+dEQP-VK.wsi.macos.surface.query_present_modes
+dEQP-VK.wsi.macos.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.macos.surface.query_devgroup_present_modes
+dEQP-VK.wsi.macos.surface.destroy_null_handle
+dEQP-VK.wsi.macos.surface.initial_size
+dEQP-VK.wsi.macos.surface.resize
+dEQP-VK.wsi.macos.swapchain.create.min_image_count
+dEQP-VK.wsi.macos.swapchain.create.image_format
+dEQP-VK.wsi.macos.swapchain.create.image_extent
+dEQP-VK.wsi.macos.swapchain.create.image_array_layers
+dEQP-VK.wsi.macos.swapchain.create.image_usage
+dEQP-VK.wsi.macos.swapchain.create.image_sharing_mode
+dEQP-VK.wsi.macos.swapchain.create.pre_transform
+dEQP-VK.wsi.macos.swapchain.create.composite_alpha
+dEQP-VK.wsi.macos.swapchain.create.present_mode
+dEQP-VK.wsi.macos.swapchain.create.clipped
+dEQP-VK.wsi.macos.swapchain.simulate_oom.min_image_count
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_format
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_extent
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_array_layers
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_usage
+dEQP-VK.wsi.macos.swapchain.simulate_oom.image_sharing_mode
+dEQP-VK.wsi.macos.swapchain.simulate_oom.pre_transform
+dEQP-VK.wsi.macos.swapchain.simulate_oom.composite_alpha
+dEQP-VK.wsi.macos.swapchain.simulate_oom.present_mode
+dEQP-VK.wsi.macos.swapchain.simulate_oom.clipped
+dEQP-VK.wsi.macos.swapchain.render.basic
+dEQP-VK.wsi.macos.swapchain.destroy.null_handle
+dEQP-VK.wsi.macos.swapchain.get_images.incomplete
+dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.immediate.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.mailbox.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.mailbox.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo.incremental_present
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo_relaxed.reference
+dEQP-VK.wsi.macos.incremental_present.scale_none.fifo_relaxed.incremental_present
+dEQP-VK.wsi.macos.display_timing.fifo.reference
+dEQP-VK.wsi.macos.display_timing.fifo.display_timing
+dEQP-VK.wsi.macos.display_timing.fifo_relaxed.reference
+dEQP-VK.wsi.macos.display_timing.fifo_relaxed.display_timing
+dEQP-VK.wsi.macos.display_timing.immediate.reference
+dEQP-VK.wsi.macos.display_timing.immediate.display_timing
+dEQP-VK.wsi.macos.display_timing.mailbox.reference
+dEQP-VK.wsi.macos.display_timing.mailbox.display_timing
+dEQP-VK.wsi.macos.shared_presentable_image.scale_none.demand
+dEQP-VK.wsi.macos.shared_presentable_image.scale_none.continuous
+dEQP-VK.wsi.macos.colorspace.extensions
+dEQP-VK.wsi.macos.colorspace.basic
+dEQP-VK.wsi.macos.colorspace.hdr
dEQP-VK.wsi.display.get_display_properties
dEQP-VK.wsi.display.get_display_plane_properties
dEQP-VK.wsi.display.get_display_plane_supported_displays
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.create.present_mode
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.create.clipped
dEQP-VK.protected_memory.interaction.wsi.win32.swapchain.render.basic
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.min_image_count
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_format
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_extent
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_array_layers
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_usage
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.image_sharing_mode
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.pre_transform
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.composite_alpha
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.present_mode
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.create.clipped
+dEQP-VK.protected_memory.interaction.wsi.macos.swapchain.render.basic
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_cosited
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
dEQP-VK.protected_memory.interaction.ycbcr.r4g4b4a4_unorm_pack16.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
osx/tcuOSXPlatform.hpp
osx/tcuOSXVulkanPlatform.cpp
osx/tcuOSXVulkanPlatform.hpp
+ osx/tcuOSXMetalView.mm
+ osx/tcuOSXMetalView.hpp
)
else ()
--- /dev/null
+#ifndef _TCUOSXMETALVIEW_HPP
+#define _TCUOSXMETALVIEW_HPP
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Tester Core
+ * ----------------------------------------
+ *
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief VK_MVK_macos_surface compatible view
+ *//*--------------------------------------------------------------------*/
+
+namespace tcu
+{
+namespace osx
+{
+
+class MetalView
+{
+public:
+ MetalView (int width, int height);
+ ~MetalView (void);
+
+ void setSize (int width, int height);
+
+ void* getView (void) const { return m_view; }
+
+private:
+ MetalView (const MetalView&);
+ MetalView operator= (const MetalView&);
+
+ void* m_view;
+};
+
+} // osx
+} // tcu
+
+#endif // _TCUOSXMETALVIEW_HPP
--- /dev/null
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Tester Core
+ * ----------------------------------------
+ *
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief VK_MVK_macos_surface compatible view
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuOSXMetalView.hpp"
+
+#import <AppKit/AppKit.h>
+#import <QuartzCore/QuartzCore.h>
+
+@interface NativeMetalView : NSView
+@end
+
+@implementation NativeMetalView
+- (id)initWithFrame:(NSRect) frame {
+ if(self = [super initWithFrame: frame]) {
+ // Make this a layer-backed view
+ self.wantsLayer = YES;
+ }
+ return self;
+}
+
+// Callback to create the backing metal layer
+- (CALayer*)makeBackingLayer {
+ return [CAMetalLayer layer];
+}
+@end
+
+namespace tcu
+{
+namespace osx
+{
+ MetalView::MetalView (int width, int height)
+ : m_view([[NativeMetalView alloc] initWithFrame:NSMakeRect(0, 0, width, height)])
+ {
+ }
+
+ void MetalView::setSize(int width, int height)
+ {
+ [(NativeMetalView*)m_view setFrame:NSMakeRect(0, 0, width, height)];
+ }
+
+ MetalView::~MetalView ()
+ {
+ [(NativeMetalView*)m_view dealloc];
+ }
+} // osx
+} // tcu
#include "tcuOSXVulkanPlatform.hpp"
#include "tcuOSXPlatform.hpp"
+#include "tcuOSXMetalView.hpp"
#include "vkWsiPlatform.hpp"
#include "gluPlatform.hpp"
#include "tcuFunctionLibrary.hpp"
namespace osx
{
+class VulkanWindow : public vk::wsi::MacOSWindowInterface
+{
+public:
+ VulkanWindow (MovePtr<osx::MetalView> view)
+ : vk::wsi::MacOSWindowInterface(view->getView())
+ , m_view(view)
+ {
+ }
+
+ void resize (const UVec2& newSize) {
+ m_view->setSize(newSize.x(), newSize.y());
+ }
+
+private:
+ UniquePtr<osx::MetalView> m_view;
+};
+
+class VulkanDisplay : public vk::wsi::Display
+{
+public:
+ VulkanDisplay ()
+ {
+ }
+
+ vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const
+ {
+ const deUint32 width = !initialSize ? 400 : initialSize->x();
+ const deUint32 height = !initialSize ? 300 : initialSize->y();
+ return new VulkanWindow(MovePtr<osx::MetalView>(new osx::MetalView(width, height)));
+ }
+};
+
class VulkanLibrary : public vk::Library
{
public:
vk::wsi::Display* VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
{
- switch(wsiType)
- {
- //TODO: Core Graphics WSI
- default:
+ if (wsiType != vk::wsi::TYPE_MACOS)
TCU_THROW(NotSupportedError, "WSI type not supported");
- };
+ return new VulkanDisplay();
}
vk::Library* VulkanPlatform::createLibrary (void) const
# MacOS?
if (DE_OS_IS_OSX)
find_package(OpenGL REQUIRED)
- set(DEQP_PLATFORM_LIBRARIES ${OPENGL_LIBRARIES})
+ find_library(COCOA_LIBRARY Cocoa)
+ find_library(QUARTZCORE_LIBRARY QuartzCore)
+ set(DEQP_PLATFORM_LIBRARIES ${OPENGL_LIBRARIES} ${COCOA_LIBRARY} ${QUARTZCORE_LIBRARY})
include_directories(${OPENGL_INCLUDE_DIRS})
endif()