При попытке получения свойств слоёв валидации и расширений в вектора типа VkLayerProperties и VkExtensionProperties, функции VkEnumerateInstanceLayerProperties и VkEnumerateInstanceExtensionProperties возвращают только количество слоёв и расширений, а число элементов в векторах = 0.
Код:
#include <iostream>
#include <cstdint>
#include <string>
#include <vector>
#include <algorithm>
#include <vulkan/vulkan.h>
int wmain() {
//////////////////// Слои ////////////////////
uint32_t lCount = 0;
vkEnumerateInstanceLayerProperties(
&lCount,
nullptr);
if (lCount == 0)
std::cout << "Error: Validation layers is missing !" << std::endl;
std::vector<VkLayerProperties> lProperties;
vkEnumerateInstanceLayerProperties(
&lCount,
lProperties.data());
std::cout << "Layers count : " << lCount << std::endl;
std::for_each(lProperties.begin(), lProperties.end(), [](VkLayerProperties& prop) {
std::cout << prop.layerName << std::endl;
});
//////////////////// Расширения ////////////////////
uint32_t exCount = 0;
vkEnumerateInstanceExtensionProperties(
nullptr,
&exCount,
nullptr);
if (exCount == 0)
std::cout << "Error: Extensions is missing !" << std::endl;
std::vector<VkExtensionProperties> exProperties;
vkEnumerateInstanceExtensionProperties(
nullptr,
&exCount,
exProperties.data());
std::cout << "Extension count : " << exCount << std::endl;
std::for_each(exProperties.begin(), exProperties.end(), [](VkExtensionProperties& prop) {
std::cout << prop.extensionName << std::endl;
});
return 0;
}
Потому что необходимо делать std::vector<>::resize
перд тем как передавать std::vector<>::resize::data
в си функцию. Она откуда может знать, выделена ли там память или нет?
uint32_t lCount = 0;
vkEnumerateInstanceLayerProperties(
&lCount,
nullptr);
if (lCount == 0)
std::cout << "Error: Validation layers is missing !" << std::endl;
std::vector<VkLayerProperties> lProperties;
lProperties.resize(lCount);
vkEnumerateInstanceLayerProperties(
&lCount,
lProperties.data());
std::cout << "Layers count : " << lCount << std::endl;
std::for_each(lProperties.begin(), lProperties.end(), [](VkLayerProperties& prop) {
std::cout << prop.layerName << std::endl;
});
//////////////////// Расширения ////////////////////
uint32_t exCount = 0;
vkEnumerateInstanceExtensionProperties(
nullptr,
&exCount,
nullptr);
if (exCount == 0)
std::cout << "Error: Extensions is missing !" << std::endl;
std::vector<VkExtensionProperties> exProperties;
exProperties.resize(exCount)
vkEnumerateInstanceExtensionProperties(
nullptr,
&exCount,
exProperties.data());
std::cout << "Extension count : " << exCount << std::endl;
std::for_each(exProperties.begin(), exProperties.end(), [](VkExtensionProperties& prop) {
std::cout << prop.extensionName << std::endl;
});
До исправления:
Layers count : 10
Extension count : 11
После исправления:
Layers count : 10
VK_LAYER_AMD_switchable_graphics
VK_LAYER_VALVE_steam_overlay
VK_LAYER_VALVE_steam_fossilize
VK_MIRILLIS_LAYER
VK_LAYER_LUNARG_api_dump
VK_LAYER_LUNARG_device_simulation
VK_LAYER_LUNARG_gfxreconstruct
VK_LAYER_KHRONOS_validation
VK_LAYER_LUNARG_monitor
VK_LAYER_LUNARG_screenshot
Extension count : 11
VK_KHR_device_group_creation
VK_KHR_external_fence_capabilities
VK_KHR_external_memory_capabilities
VK_KHR_external_semaphore_capabilities
VK_KHR_get_physical_device_properties2
VK_KHR_get_surface_capabilities2
VK_KHR_surface
VK_KHR_win32_surface
VK_EXT_debug_report
VK_EXT_debug_utils
VK_EXT_swapchain_colorspace
P.S. не знаю с какого стандарта это пошло, но при пустом векторе, при попытке обращения к .data()
или же к &someVector[0]
вернется NULL
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Помогите разобраться как реализовать задачу "Спящий парикмахер", используя обмен сообщениями: Send и RecvРазобрался, как реализовать через...
Есть программа, ошибку выдает после прохождения функции mat1, при присваивании A[i] значение функции
Есть простейший алгоритм на c++, который заполняет и выводит двухмерный динамический массив числами от 1 до n*m, но не работает с некоторыми...