From 35f774edca36656647f37a36dab7932989f558db Mon Sep 17 00:00:00 2001 From: Artur Wasmut <awasmut@uni-koblenz.de> Date: Mon, 9 Aug 2021 23:38:16 +0200 Subject: [PATCH] [#105] clean up the device feature selection a bit. --- src/vkcv/Context.cpp | 57 +++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp index 2e30fb96..d55c1026 100644 --- a/src/vkcv/Context.cpp +++ b/src/vkcv/Context.cpp @@ -145,11 +145,10 @@ namespace vkcv } /** - * @brief With the help of the reference "supported" all elements in "check" checked, - * if they are supported by the physical device. - * @param supported The reference that can be used to check "check" - * @param check The elements to be checked - * @return True, if all elements in "check" are supported + * @brief Check whether all string occurrences in "check" are contained in "supported" + * @param supported The const vector const char* reference used to compare entries in "check" + * @param check The const vector const char* reference elements to be checked by "supported" + * @return True, if all elements in "check" are supported (contained in supported) */ bool checkSupport(const std::vector<const char*>& supported, const std::vector<const char*>& check) { @@ -166,7 +165,7 @@ namespace vkcv } return true; } - + std::vector<const char*> getRequiredExtensions() { uint32_t glfwExtensionCount = 0; @@ -180,14 +179,7 @@ namespace vkcv return extensions; } - bool isPresentInCharPtrVector(const std::vector<const char*>& v, const char* term){ - for (const auto& entry : v) { - if (strcmp(entry, term) != 0) { - return true; - } - } - return false; - } + Context Context::create(const char *applicationName, uint32_t applicationVersion, @@ -216,7 +208,7 @@ namespace vkcv } #endif - // check for extension support + // check for instance extension support std::vector<vk::ExtensionProperties> instanceExtensionProperties = vk::enumerateInstanceExtensionProperties(); std::vector<const char*> supportedExtensions; @@ -257,7 +249,7 @@ namespace vkcv #endif vk::Instance instance = vk::createInstance(instanceCreateInfo); - + std::vector<vk::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices(); vk::PhysicalDevice physicalDevice = pickPhysicalDevice(instance); @@ -270,10 +262,9 @@ namespace vkcv if (!checkSupport(supportedExtensions, deviceExtensions)) { throw std::runtime_error("The requested device extensions are not supported by the physical device!"); } - + + // create required queue structs std::vector<vk::DeviceQueueCreateInfo> qCreateInfos; - - // create required queues std::vector<float> qPriorities; qPriorities.resize(queueFlags.size(), 1.f); std::vector<std::pair<int, int>> queuePairsGraphics, queuePairsCompute, queuePairsTransfer; @@ -295,35 +286,35 @@ namespace vkcv deviceCreateInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size()); deviceCreateInfo.ppEnabledLayerNames = validationLayers.data(); #endif - const bool shaderFloat16 = checkSupport(deviceExtensions, { "VK_KHR_shader_float16_int8" }); - const bool storage16bit = checkSupport(deviceExtensions, { "VK_KHR_16bit_storage" }); - - // FIXME: check if device feature is supported - vk::PhysicalDeviceShaderFloat16Int8Features deviceShaderFloat16Int8Features; - deviceShaderFloat16Int8Features.shaderFloat16 = shaderFloat16; - - vk::PhysicalDevice16BitStorageFeatures device16BitStorageFeatures; - device16BitStorageFeatures.storageBuffer16BitAccess = storage16bit; - + vk::PhysicalDeviceFeatures2 deviceFeatures2; deviceFeatures2.features.fragmentStoresAndAtomics = true; deviceFeatures2.features.geometryShader = true; deviceFeatures2.features.depthClamp = true; deviceFeatures2.features.shaderInt16 = true; - - const bool usingMeshShaders = isPresentInCharPtrVector(deviceExtensions, VK_NV_MESH_SHADER_EXTENSION_NAME); + + // TODO: proper feature management + // -------------- HARD CODED LIST OF DEVICE FEATURES THAT ARE CHECKED AGAINST AND IF USED, ENABLED ------------ + + const bool usingMeshShaders = checkSupport(deviceExtensions, { VK_NV_MESH_SHADER_EXTENSION_NAME }); vk::PhysicalDeviceMeshShaderFeaturesNV meshShadingFeatures; if (usingMeshShaders) { meshShadingFeatures.taskShader = true; meshShadingFeatures.meshShader = true; deviceFeatures2.setPNext(&meshShadingFeatures); } - + + const bool shaderFloat16 = checkSupport(deviceExtensions, { "VK_KHR_shader_float16_int8" }); + vk::PhysicalDeviceShaderFloat16Int8Features deviceShaderFloat16Int8Features; if (shaderFloat16) { + deviceShaderFloat16Int8Features.shaderFloat16 = true; deviceFeatures2.setPNext(&deviceShaderFloat16Int8Features); } - + + const bool storage16bit = checkSupport(deviceExtensions, { "VK_KHR_16bit_storage" }); + vk::PhysicalDevice16BitStorageFeatures device16BitStorageFeatures; if (storage16bit) { + device16BitStorageFeatures.storageBuffer16BitAccess = true; deviceShaderFloat16Int8Features.setPNext(&device16BitStorageFeatures); } -- GitLab