Буфер хранения Vec3 не является допустимым макетом, несмотря на скалярный квалификатор - PullRequest
0 голосов
/ 29 апреля 2020

Насколько я понимаю, спецификатор макета scalar в GLSL на вулканском языке должен позволять простому массиву значений vec3 работать , очевидно, без каких-либо функций физического устройства, которые должны быть указаны. Я пробовал и без указания скалярных функций макета, например, так:

VkPhysicalDeviceScalarBlockLayoutFeatures layoutfeatures = {};
layoutfeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES;
layoutfeatures.scalarBlockLayout = VK_TRUE;
VkPhysicalDeviceFeatures2 features2 = {};
features2.features = m_required_features;
features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
features2.pNext = &layoutfeatures;

VkDeviceCreateInfo create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
create_info.queueCreateInfoCount = static_cast<uint32_t>(queue_create_infos.size());
create_info.pQueueCreateInfos = queue_create_infos.data();
create_info.enabledExtensionCount = static_cast<uint32_t>(enabled_extensions_names.size());
create_info.ppEnabledExtensionNames = enabled_extensions_names.data();
create_info.pEnabledFeatures = &features2 .features;
create_info.pNext = &features2 ;
create_info.flags = flags;
VkDevice device;
VUL_EXCEPT_RESULT(vkCreateDevice(physical_device, &create_info, pAllocator, &device));

, но безрезультатно. Я получаю странные ошибки c.

вот пример кода:

#version 450
#extension GL_EXT_scalar_block_layout: require

#define WORKGROUP_SIZE 128
layout (local_size_x = WORKGROUP_SIZE, local_size_y = 1, local_size_z = 1) in;
layout(scalar, binding = 3) buffer MyBufferBlock{
    vec3 example_array[];
};


void main(){
 example_array[gl_GlobalInvocationID.x] = 0.0;
}

, и я получаю следующую ошибку проверки SPIR-V:

"example.exe"
ERROR : SPEC_INVALIDATION - Message ID Number 7060244, Message ID String UNASSIGNED-CoreValidation-Shader-InconsistentSpirv:
Validation Error: [ UNASSIGNED-CoreValidation-Shader-InconsistentSpirv ] Object 0: handle = 0x6543e40, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x6bbb14 | SPIR-V module not valid: Structure id 500 decorated as BufferBlock for variable in Uniform storage class must follow relaxed storage buffer layout rules: member 0 contains an array with stride 12 not satisfying alignment to 16
  %MyBufferBlock = OpTypeStruct %_runtimearr_v3float

Сначала я не понимаю, почему он пытается вызвать мой буфер как униформу? и, конечно, я все еще не понимаю, как это вообще является нарушением spe c.

...