Browse Source

Vk: write an internal helper for connecting Vulkan structures.

pull/491/head
Vladimír Vondruš 5 years ago
parent
commit
613a0d8cf6
  1. 1
      src/Magnum/Vk/CMakeLists.txt
  2. 8
      src/Magnum/Vk/DeviceProperties.cpp
  3. 59
      src/Magnum/Vk/Implementation/structureHelpers.h
  4. 4
      src/Magnum/Vk/Test/CMakeLists.txt
  5. 82
      src/Magnum/Vk/Test/StructureHelpersTest.cpp

1
src/Magnum/Vk/CMakeLists.txt

@ -93,6 +93,7 @@ set(MagnumVk_PRIVATE_HEADERS
Implementation/compressedPixelFormatMapping.hpp
Implementation/pixelFormatMapping.hpp
Implementation/structureHelpers.h
Implementation/vertexFormatMapping.hpp)
# Objects shared between main and test library

8
src/Magnum/Vk/DeviceProperties.cpp

@ -43,6 +43,7 @@
#include "Magnum/Vk/Version.h"
#include "Magnum/Vk/Implementation/Arguments.h"
#include "Magnum/Vk/Implementation/InstanceState.h"
#include "Magnum/Vk/Implementation/structureHelpers.h"
namespace Magnum { namespace Vk {
@ -192,11 +193,8 @@ const VkPhysicalDeviceProperties2& DeviceProperties::properties() {
Containers::Reference<void*> next = _state->properties.pNext;
/* Fetch driver properties, if supported */
if(isVersionSupported(Version::Vk12) || extensionPropertiesInternal().isSupported<Extensions::KHR::driver_properties>()) {
*next = &_state->driverProperties;
next = _state->driverProperties.pNext;
_state->driverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
}
if(isVersionSupported(Version::Vk12) || extensionPropertiesInternal().isSupported<Extensions::KHR::driver_properties>())
connect(next, _state->driverProperties, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES);
_state->getPropertiesImplementation(*this, _state->properties);
}

59
src/Magnum/Vk/Implementation/structureHelpers.h

@ -0,0 +1,59 @@
#ifndef Magnum_Vk_Implementation_structureHelpers_h
#define Magnum_Vk_Implementation_structureHelpers_h
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include <Corrade/Containers/Reference.h>
#include <Corrade/Utility/Assert.h>
#include "Magnum/Magnum.h"
#include "Magnum/Vk/Vulkan.h"
namespace Magnum { namespace Vk { namespace Implementation {
/* Meant to be used for connecting a longer chain of structures. Anything
that was connected to the `next` pointer before is reconnected to
`structure.pNext`; the `next` reference is rebound to the `structure.pNext`
field connected so it can be passed to another structureConnect() again. */
template<class T> inline void structureConnect(Containers::Reference<void*>& next, T& structure, VkStructureType type) {
void* const previousNext = next;
*next = &structure;
structure.sType = type;
structure.pNext = previousNext;
next = structure.pNext;
}
template<class T> inline void structureConnect(Containers::Reference<const void*>& next, T& structure, VkStructureType type) {
/* There's no better way as the pNext are either const void* or void*
and it's a mess. For example VkDeviceCreateInfo has const void* but it
can point to VkPhysicalDeviceFeatures2 which then has void* as it's
primarily an output structure. So we'll just drop all const-correctness
and operate on void*. */
structureConnect(reinterpret_cast<Containers::Reference<void*>&>(next), structure, type);
}
}}}
#endif

4
src/Magnum/Vk/Test/CMakeLists.txt

@ -42,6 +42,9 @@ corrade_add_test(VkResultTest ResultTest.cpp LIBRARIES MagnumVk)
corrade_add_test(VkRenderPassTest RenderPassTest.cpp LIBRARIES MagnumVkTestLib)
corrade_add_test(VkShaderTest ShaderTest.cpp LIBRARIES MagnumVk)
corrade_add_test(VkStructureHelpersTest StructureHelpersTest.cpp)
target_include_directories(VkStructureHelpersTest PRIVATE $<TARGET_PROPERTY:MagnumVk,INTERFACE_INCLUDE_DIRECTORIES>)
add_library(VkAssertTestObjects OBJECT AssertTest.cpp)
target_include_directories(VkAssertTestObjects PRIVATE $<TARGET_PROPERTY:MagnumVk,INTERFACE_INCLUDE_DIRECTORIES>)
corrade_add_test(VkAssertTest
@ -125,6 +128,7 @@ set_target_properties(
VkResultTest
VkRenderPassTest
VkShaderTest
VkStructureHelpersTest
VkVersionTest
PROPERTIES FOLDER "Magnum/Vk/Test")

82
src/Magnum/Vk/Test/StructureHelpersTest.cpp

@ -0,0 +1,82 @@
/*
This file is part of Magnum.
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
2020 Vladimír Vondruš <mosra@centrum.cz>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include <Corrade/TestSuite/Tester.h>
#include "Magnum/Vk/Implementation/structureHelpers.h"
namespace Magnum { namespace Vk { namespace Test { namespace {
struct StructureHelpersTest: TestSuite::Tester {
explicit StructureHelpersTest();
template<class T> void connect();
};
StructureHelpersTest::StructureHelpersTest() {
addTests<StructureHelpersTest>({
&StructureHelpersTest::connect<VkDeviceCreateInfo>,
&StructureHelpersTest::connect<VkPhysicalDeviceFeatures2>});
}
template<class> struct Type;
template<> struct Type<const void*> {
static const char* name() { return "const void*"; }
};
template<> struct Type<void*> {
static const char* name() { return "void*"; }
};
template<class T> void StructureHelpersTest::connect() {
typedef typename std::remove_reference<decltype(T{}.pNext)>::type NextType;
setTestCaseTemplateName(Type<NextType>::name());
VkPhysicalDeviceVariablePointersFeatures variableFeatures{};
T info{};
info.pNext = &variableFeatures;
Containers::Reference<NextType> next = info.pNext;
VkPhysicalDeviceMultiviewFeatures multiviewFeatures{};
Implementation::structureConnect(next, multiviewFeatures, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES);
CORRADE_COMPARE(info.pNext, &multiviewFeatures);
CORRADE_COMPARE(multiviewFeatures.sType, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES);
CORRADE_COMPARE(const_cast<const void**>(&*next), const_cast<const void**>(&multiviewFeatures.pNext));
/* The pre-existing next pointer should be preserved */
CORRADE_COMPARE(*next, &variableFeatures);
VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcrFeatures{};
Implementation::structureConnect(next, ycbcrFeatures, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES);
CORRADE_COMPARE(multiviewFeatures.pNext, &ycbcrFeatures);
CORRADE_COMPARE(ycbcrFeatures.sType, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES);
CORRADE_COMPARE(const_cast<const void**>(&*next), const_cast<const void**>(&ycbcrFeatures.pNext));
/* The pre-existing next pointer should be preserved */
CORRADE_COMPARE(*next, &variableFeatures);
}
}}}}
CORRADE_TEST_MAIN(Magnum::Vk::Test::StructureHelpersTest)
Loading…
Cancel
Save