Browse Source

Vk: variadic Is[Instance]Extension checks.

Because I'd like to static_assert on these.
pull/234/head
Vladimír Vondruš 6 years ago
parent
commit
bb00bf43bf
  1. 38
      src/Magnum/Vk/Test/ExtensionsTest.cpp
  2. 16
      src/Magnum/Vk/TypeTraits.h

38
src/Magnum/Vk/Test/ExtensionsTest.cpp

@ -62,6 +62,25 @@ void ExtensionsTest::isInstanceExtension() {
CORRADE_VERIFY(Implementation::IsInstanceExtension<Extensions::KHR::get_physical_device_properties2>::value);
CORRADE_VERIFY(!Implementation::IsInstanceExtension<Extensions::KHR::external_memory>::value);
CORRADE_VERIFY(!Implementation::IsInstanceExtension<int>::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<GLExtension>::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() {

16
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...> class IsInstanceExtension;
CORRADE_HAS_TYPE(IsInstanceExtension<U>, decltype(T::InstanceIndex));
template<class T, class U, class ...Args> class IsInstanceExtension<T, U, Args...> {
/** @todo C++17: use &&... instead of all this */
public: enum: bool { value = IsInstanceExtension<T>::value && IsInstanceExtension<U, Args...>::value };
};
template<class...> class IsExtension;
CORRADE_HAS_TYPE(IsExtension<U>, decltype(T::Index));
template<class T, class U, class ...Args> class IsExtension<T, U, Args...> {
/** @todo C++17: use &&... instead of all this */
public: enum: bool { value = IsExtension<T>::value && IsExtension<U, Args...>::value };
};
}
}}

Loading…
Cancel
Save