Vulkan API не возвращает расширения и слои валидации

101
22 апреля 2022, 10:40

При попытке получения свойств слоёв валидации и расширений в вектора типа 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;
}
Answer 1

Потому что необходимо делать 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.

READ ALSO
Как сделать метод const и неconst одновременно? [закрыт]

Как сделать метод const и неconst одновременно? [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

118
Спящий парикмахер

Спящий парикмахер

Помогите разобраться как реализовать задачу "Спящий парикмахер", используя обмен сообщениями: Send и RecvРазобрался, как реализовать через...

156
Ошибка Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) Xcode c++

Ошибка Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) Xcode c++

Есть программа, ошибку выдает после прохождения функции mat1, при присваивании A[i] значение функции

133
Не работает простейший алгоритм

Не работает простейший алгоритм

Есть простейший алгоритм на c++, который заполняет и выводит двухмерный динамический массив числами от 1 до n*m, но не работает с некоторыми...

157