diff --git a/src/Magnum/Vk/Test/ExtensionsTest.cpp b/src/Magnum/Vk/Test/ExtensionsTest.cpp index 40b0e4127..4e29d07e1 100644 --- a/src/Magnum/Vk/Test/ExtensionsTest.cpp +++ b/src/Magnum/Vk/Test/ExtensionsTest.cpp @@ -62,6 +62,25 @@ void ExtensionsTest::isInstanceExtension() { CORRADE_VERIFY(Implementation::IsInstanceExtension::value); CORRADE_VERIFY(!Implementation::IsInstanceExtension::value); CORRADE_VERIFY(!Implementation::IsInstanceExtension::value); + + /* Variadic check (used in variadic addEnabledExtensions()), check that it + properly fails for each occurence of a device extension */ + CORRADE_VERIFY((Implementation::IsInstanceExtension< + Extensions::KHR::get_physical_device_properties2, + Extensions::KHR::external_memory_capabilities, + Extensions::KHR::external_fence_capabilities>::value)); + CORRADE_VERIFY(!(Implementation::IsInstanceExtension< + Extensions::KHR::draw_indirect_count, /* not */ + Extensions::KHR::external_memory_capabilities, + Extensions::KHR::external_fence_capabilities>::value)); + CORRADE_VERIFY(!(Implementation::IsInstanceExtension< + Extensions::KHR::get_physical_device_properties2, + Extensions::KHR::external_memory, /* not */ + Extensions::KHR::external_fence_capabilities>::value)); + CORRADE_VERIFY(!(Implementation::IsInstanceExtension< + Extensions::KHR::get_physical_device_properties2, + Extensions::KHR::external_memory_capabilities, + Extensions::KHR::external_fence>::value)); /* not */ } void ExtensionsTest::isExtension() { @@ -79,6 +98,25 @@ void ExtensionsTest::isExtension() { CORRADE_EXPECT_FAIL("GL/AL extensions are not rejected right now."); CORRADE_VERIFY(!Implementation::IsExtension::value); } + + /* Variadic check (used in variadic addEnabledExtensions()), check that it + properly fails for each occurence of a device extension */ + CORRADE_VERIFY((Implementation::IsExtension< + Extensions::KHR::external_memory, + Extensions::KHR::depth_stencil_resolve, + Extensions::KHR::external_fence>::value)); + CORRADE_VERIFY(!(Implementation::IsExtension< + Extensions::KHR::external_memory_capabilities, /* not */ + Extensions::KHR::depth_stencil_resolve, + Extensions::KHR::external_fence>::value)); + CORRADE_VERIFY(!(Implementation::IsExtension< + Extensions::KHR::external_memory, + Extensions::EXT::debug_report, /* not */ + Extensions::KHR::external_fence>::value)); + CORRADE_VERIFY(!(Implementation::IsExtension< + Extensions::KHR::external_memory, + Extensions::KHR::depth_stencil_resolve, + Extensions::KHR::external_fence_capabilities>::value)); /* not */ } void ExtensionsTest::constructInstanceExtensionFromCompileTimeExtension() { diff --git a/src/Magnum/Vk/TypeTraits.h b/src/Magnum/Vk/TypeTraits.h index 406c6fbad..ed14c25cb 100644 --- a/src/Magnum/Vk/TypeTraits.h +++ b/src/Magnum/Vk/TypeTraits.h @@ -38,8 +38,20 @@ namespace Implementation { /* Put into a separate header so APIs that need it don't need to pull in the whole Extensions.h. Tested in ExtensionsTest also. */ /** @todo filter out GL/AL extensions also */ - CORRADE_HAS_TYPE(IsInstanceExtension, decltype(T::InstanceIndex)); - CORRADE_HAS_TYPE(IsExtension, decltype(T::Index)); + + template class IsInstanceExtension; + CORRADE_HAS_TYPE(IsInstanceExtension, decltype(T::InstanceIndex)); + template class IsInstanceExtension { + /** @todo C++17: use &&... instead of all this */ + public: enum: bool { value = IsInstanceExtension::value && IsInstanceExtension::value }; + }; + + template class IsExtension; + CORRADE_HAS_TYPE(IsExtension, decltype(T::Index)); + template class IsExtension { + /** @todo C++17: use &&... instead of all this */ + public: enum: bool { value = IsExtension::value && IsExtension::value }; + }; } }}