2017-02-15 13 views
0

Привет Я пытаюсь связать буфер глубины памяти, но я получаю сообщение об ошибке, как показано ниже. Я не знаю, почему эта ошибка появляется.Ошибка привязки изображения глубины вулкана

Формат глубины - VK_FORMAT_D16_UNORM, а использование - VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT. Я читал онлайн, что TILING не должен быть линейным, но затем я получаю другую ошибку. Благодаря!!!

Код для создания и привязки изображения приведен ниже.

VkImageCreateInfo imageInfo = {}; 

// If the depth format is undefined, use fallback as 16-byte value 
if (Depth.format == VK_FORMAT_UNDEFINED) { 
    Depth.format = VK_FORMAT_D16_UNORM; 
} 

const VkFormat depthFormat = Depth.format; 

VkFormatProperties props; 
vkGetPhysicalDeviceFormatProperties(*deviceObj->gpu, depthFormat, &props); 

if (props.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { 
    imageInfo.tiling = VK_IMAGE_TILING_LINEAR; 
} 
else if (props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { 
    imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; 
} 
else { 
    std::cout << "Unsupported Depth Format, try other Depth formats.\n"; 
    exit(-1); 
} 

imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 
imageInfo.pNext = NULL; 
imageInfo.imageType = VK_IMAGE_TYPE_2D; 
imageInfo.format = depthFormat; 
imageInfo.extent.width = width; 
imageInfo.extent.height = height; 
imageInfo.extent.depth = 1; 
imageInfo.mipLevels = 1; 
imageInfo.arrayLayers = 1; 
imageInfo.samples = NUM_SAMPLES; 
imageInfo.queueFamilyIndexCount = 0; 
imageInfo.pQueueFamilyIndices = NULL; 
imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; 
imageInfo.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 
imageInfo.flags = 0; 

// User create image info and create the image objects 
result = vkCreateImage(deviceObj->device, &imageInfo, NULL, &Depth.image); 
assert(result == VK_SUCCESS); 

// Get the image memory requirements 
VkMemoryRequirements memRqrmnt; 
vkGetImageMemoryRequirements(deviceObj->device, Depth.image, &memRqrmnt); 

VkMemoryAllocateInfo memAlloc = {}; 
memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; 
memAlloc.pNext = NULL; 
memAlloc.allocationSize = 0; 
memAlloc.memoryTypeIndex = 0; 
memAlloc.allocationSize = memRqrmnt.size; 

// Determine the type of memory required with the help of memory properties 
pass = deviceObj->memoryTypeFromProperties(memRqrmnt.memoryTypeBits, 0, /* No requirements */ &memAlloc.memoryTypeIndex); 
assert(pass); 

// Allocate the memory for image objects 
result = vkAllocateMemory(deviceObj->device, &memAlloc, NULL, &Depth.mem); 
assert(result == VK_SUCCESS); 

// Bind the allocated memeory 
result = vkBindImageMemory(deviceObj->device, Depth.image, Depth.mem, 0); 
assert(result == VK_SUCCESS); 

enter image description here

ответ

3

Да, линейная плиточные может не поддерживаться для использования глубины изображений. Обратитесь к разделу «Спецификация» и «Действительное использование» от VkImageCreateInfo. Возможность запрашивается командами vkGetPhysicalDeviceFormatProperties и vkGetPhysicalDeviceImageFormatProperties. Хотя форматы глубины «opaque», поэтому нет оснований использовать линейную черепицу.

Это вы, кажется, делаете в своем коде.
Но ошибка информирует вас о том, что вы пытаетесь использовать тип памяти, который не разрешен для данного изображения. Используйте команду vkGetImageMemoryRequirements для запроса того, какие типы памяти разрешены.

Возможно, у вас есть ошибки (вы используете 0x1, что явно не входит в 0x84 для сообщения). Вы можете повторно использовать код примера в Device Memory chapter of the specification. Предоставьте свою реализацию memoryTypeFromProperties для получения более конкретного ответа.

+0

HI спасибо за помощь ... для memoryTypeFromProperties я memRqrmntTypeBits, как и 132. 132 VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132. Я получаю неподдерживаемый формат глубины, попробуйте флористику формат глубины. –

0

Я случайно установил typeIndex в 1 вместо i, и теперь он работает. В моей защите я был вулканом, кодирующим весь день, и мои глаза кровоточат :). Спасибо за помощь.

bool VulkanDevice::memoryTypeFromProperties(uint32_t typeBits, VkFlags  
requirementsMask, uint32_t *typeIndex) 
{ 
    // Search memtypes to find first index with those properties 
for (uint32_t i = 0; i < 32; i++) { 
    if ((typeBits & 1) == 1) { 
     // Type is available, does it match user properties? 
     if ((memoryProperties.memoryTypes[i].propertyFlags & requirementsMask) == requirementsMask) { 
      *typeIndex = i;// was set to 1 :(
      return true; 
     } 
    } 
    typeBits >>= 1; 
} 
// No memory types matched, return failure 
return false; 
}