// Copyright 2020-2021 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

// Common Valid Usage
// Common to binding any memory to a buffer
  * [[VUID-{refpage}-buffer-01029]]
    pname:buffer must: not already be backed by a memory object
  * [[VUID-{refpage}-buffer-01030]]
    pname:buffer must: not have been created with any sparse memory binding
    flags
  * [[VUID-{refpage}-memoryOffset-01031]]
    pname:memoryOffset must: be less than the size of pname:memory
  * [[VUID-{refpage}-memory-01035]]
    pname:memory must: have been allocated using one of the memory types
    allowed in the pname:memoryTypeBits member of the
    sname:VkMemoryRequirements structure returned from a call to
    fname:vkGetBufferMemoryRequirements with pname:buffer
  * [[VUID-{refpage}-memoryOffset-01036]]
    pname:memoryOffset must: be an integer multiple of the pname:alignment
    member of the sname:VkMemoryRequirements structure returned from a call
    to fname:vkGetBufferMemoryRequirements with pname:buffer
  * [[VUID-{refpage}-size-01037]]
    The pname:size member of the sname:VkMemoryRequirements structure
    returned from a call to fname:vkGetBufferMemoryRequirements with
    pname:buffer must: be less than or equal to the size of pname:memory
    minus pname:memoryOffset
ifdef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
  * [[VUID-{refpage}-buffer-01444]]
    If pname:buffer requires a dedicated allocation (as reported by
    flink:vkGetBufferMemoryRequirements2 in
    slink:VkMemoryDedicatedRequirements::pname:requiresDedicatedAllocation
    for pname:buffer), pname:memory must: have been allocated with
    slink:VkMemoryDedicatedAllocateInfo::pname:buffer equal to pname:buffer
  * [[VUID-{refpage}-memory-01508]]
    If the sname:VkMemoryAllocateInfo provided when pname:memory was
    allocated included a slink:VkMemoryDedicatedAllocateInfo structure in
    its pname:pNext chain, and
    slink:VkMemoryDedicatedAllocateInfo::pname:buffer was not
    dlink:VK_NULL_HANDLE, then pname:buffer must: equal
    slink:VkMemoryDedicatedAllocateInfo::pname:buffer, and
    pname:memoryOffset must: be zero
endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
ifdef::VK_VERSION_1_1[]
  * [[VUID-{refpage}-None-01898]]
    If pname:buffer was created with the
    ename:VK_BUFFER_CREATE_PROTECTED_BIT bit set, the buffer must: be bound
    to a memory object allocated with a memory type that reports
    ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
  * [[VUID-{refpage}-None-01899]]
    If pname:buffer was created with the
    ename:VK_BUFFER_CREATE_PROTECTED_BIT bit not set, the buffer must: not
    be bound to a memory object allocated with a memory type that reports
    ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
endif::VK_VERSION_1_1[]
ifdef::VK_NV_dedicated_allocation[]
  * [[VUID-{refpage}-buffer-01038]]
    If pname:buffer was created with
    slink:VkDedicatedAllocationBufferCreateInfoNV::pname:dedicatedAllocation
    equal to ename:VK_TRUE, pname:memory must: have been allocated with
    slink:VkDedicatedAllocationMemoryAllocateInfoNV::pname:buffer equal to a
    buffer handle created with identical creation parameters to pname:buffer
    and pname:memoryOffset must: be zero
ifndef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
  * [[VUID-{refpage}-buffer-01039]]
    If pname:buffer was not created with
    slink:VkDedicatedAllocationBufferCreateInfoNV::pname:dedicatedAllocation
    equal to ename:VK_TRUE, pname:memory must: not have been allocated
    dedicated for a specific buffer or image
endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
endif::VK_NV_dedicated_allocation[]
ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
  * [[VUID-{refpage}-memory-02726]]
    If the value of slink:VkExportMemoryAllocateInfo::pname:handleTypes used
    to allocate pname:memory is not `0`, it must: include at least one of
    the handles set in
    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
    pname:buffer was created
ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
  * [[VUID-{refpage}-memory-02727]]
    If pname:memory was allocated by a memory import operation, the external
    handle type of the imported memory must: also have been set in
    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
    pname:buffer was created
endif::VK_ANDROID_external_memory_android_hardware_buffer[]
ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
  * [[VUID-{refpage}-memory-02985]]
    If pname:memory was allocated by a memory import operation, that is not
    slink:VkImportAndroidHardwareBufferInfoANDROID with a non-`NULL`
    pname:buffer value, the external handle type of the imported memory
    must: also have been set in
    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
    pname:buffer was created
  * [[VUID-{refpage}-memory-02986]]
    If pname:memory was allocated with the
    slink:VkImportAndroidHardwareBufferInfoANDROID memory import operation
    with a non-`NULL` pname:buffer value,
    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
    must: also have been set in
    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
    pname:buffer was created
endif::VK_ANDROID_external_memory_android_hardware_buffer[]
endif::VK_VERSION_1_1,VK_KHR_external_memory[]
ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
  * [[VUID-{refpage}-bufferDeviceAddress-03339]]
    If the
    slink:VkPhysicalDeviceBufferDeviceAddressFeatures::pname:bufferDeviceAddress
    feature is enabled and pname:buffer was created with the
    ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT bit set, pname:memory
    must: have been allocated with the
    ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT bit set
endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
ifdef::VK_FUCHSIA_buffer_collection[]
  * [[VUID-{refpage}-buffer-06408]]
    If pname:buffer was created with
    slink:VkBufferCollectionBufferCreateInfoFUCHSIA chained to
    slink:VkBufferCreateInfo::pname:pNext, pname:memory must: be allocated
    with a slink:VkImportMemoryBufferCollectionFUCHSIA chained to
    slink:VkMemoryAllocateInfo::pname:pNext
endif::VK_FUCHSIA_buffer_collection[]
// Common Valid Usage
