KhronosGroup / Vulkan-Hpp

Open-Source Vulkan C++ API
Apache License 2.0
3.12k stars 305 forks source link

LayerSettingEXT.setValues #1907

Closed tomilov closed 4 months ago

tomilov commented 4 months ago

valueCount in setValues is not size, it is a count, because of that current implementation:

    template <typename T>
    LayerSettingEXT & setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & values_ ) VULKAN_HPP_NOEXCEPT
    {
      valueCount = static_cast<uint32_t>( values_.size() * sizeof( T ) );
      pValues    = values_.data();
      return *this;
    }

results in crush in a validation layer. * sizeof( T ) is unneded.

    vk::LayerSettingEXT validationLayerSetting = {
        .pLayerName = "VK_LAYER_KHRONOS_validation",
    };
    validationLayerSetting.type = vk::LayerSettingTypeEXT::eString;
    {
        validationLayerSetting.pSettingName = "validate_gpu_based";
        static constexpr auto kValidateGpuBasedSetting = {
            "GPU_BASED_GPU_ASSISTED",
        };
        validationLayerSetting.setValues<const char *>(kValidateGpuBasedSetting);
        layerSettings.push_back(validationLayerSetting);
    }
asuessenbach commented 4 months ago

Ah, I see: valueCount actually is the count of elements in pValues, and type encodes the actual type of those elements. Unfortunately, that information is not transported via vk.xml. That is: some special handling is required!

Thanks a lot for this hint.