+ memory = allocateMemory(vk, vkDevice, &memAlloc, (const VkAllocationCallbacks*)DE_NULL);
+ }
+ catch (const vk::Error& error)
+ {
+ return tcu::TestStatus::fail("Alloc memory failed! (Error code: " + de::toString(error.getMessage()) + ")");
+ }
+
+ if (vk.bindBufferMemory(vkDevice, *testBuffer, *memory, 0) != VK_SUCCESS)
+ return tcu::TestStatus::fail("Bind buffer memory failed!");
+
+ return tcu::TestStatus::incomplete();
+}
+
+tcu::TestStatus BufferDedicatedAllocation::createTestBuffer (VkDeviceSize size,
+ VkBufferUsageFlags usage,
+ Context& context,
+ Move<VkBuffer>& testBuffer,
+ Move<VkDeviceMemory>& memory) const
+{
+ const std::vector<std::string>& extensions = context.getDeviceExtensions();
+ const deBool isSupported = std::find(extensions.begin(), extensions.end(), "VK_KHR_dedicated_allocation") != extensions.end();
+ if (!isSupported)
+ TCU_THROW(NotSupportedError, "Not supported");
+
+ const InstanceInterface& vkInstance = context.getInstanceInterface();
+ const VkDevice vkDevice = context.getDevice();
+ const VkPhysicalDevice vkPhysicalDevice = context.getPhysicalDevice();
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ VkPhysicalDeviceMemoryProperties memoryProperties;
+ VkMemoryDedicatedRequirementsKHR dedicatedRequirements =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ false, // VkBool32 prefersDedicatedAllocation
+ false // VkBool32 requiresDedicatedAllocation
+ };
+ VkMemoryRequirements2KHR memReqs =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR, // VkStructureType sType
+ &dedicatedRequirements, // void* pNext
+ {0, 0, 0} // VkMemoryRequirements memoryRequirements
+ };
+
+ const VkBufferCreateInfo bufferParams =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkBufferCreateFlags flags;
+ size, // VkDeviceSize size;
+ usage, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ };
+
+ try
+ {
+ testBuffer = vk::createBuffer(vk, vkDevice, &bufferParams, (const VkAllocationCallbacks*)DE_NULL);
+ }
+ catch (const vk::Error& error)
+ {
+ return tcu::TestStatus::fail("Buffer creation failed! (Error code: " + de::toString(error.getMessage()) + ")");
+ }
+
+ VkBufferMemoryRequirementsInfo2KHR info =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ *testBuffer // VkBuffer buffer
+ };
+
+ vk.getBufferMemoryRequirements2KHR(vkDevice, &info, &memReqs);
+
+ if (dedicatedRequirements.requiresDedicatedAllocation == VK_TRUE)
+ {
+ std::ostringstream errorMsg;
+ errorMsg << "Nonexternal objects cannot require dedicated allocation.";
+ return tcu::TestStatus::fail(errorMsg.str());
+ }
+
+ if (size > memReqs.memoryRequirements.size)
+ {
+ std::ostringstream errorMsg;
+ errorMsg << "Requied memory size (" << memReqs.memoryRequirements.size << " bytes) smaller than the buffer's size (" << size << " bytes)!";
+ return tcu::TestStatus::fail(errorMsg.str());
+ }
+
+ deMemset(&memoryProperties, 0, sizeof(memoryProperties));
+ vkInstance.getPhysicalDeviceMemoryProperties(vkPhysicalDevice, &memoryProperties);
+
+ const deUint32 heapTypeIndex = static_cast<deUint32>(deCtz32(memReqs.memoryRequirements.memoryTypeBits));
+ //const VkMemoryType memoryType = memoryProperties.memoryTypes[heapTypeIndex];
+ //const VkMemoryHeap memoryHeap = memoryProperties.memoryHeaps[memoryType.heapIndex];
+
+ vk.getBufferMemoryRequirements2KHR(vkDevice, &info, &memReqs); // get the proper size requirement
+
+ if (size > memReqs.memoryRequirements.size)
+ {
+ std::ostringstream errorMsg;
+ errorMsg << "Requied memory size (" << memReqs.memoryRequirements.size << " bytes) smaller than the buffer's size (" << size << " bytes)!";
+ return tcu::TestStatus::fail(errorMsg.str());
+ }
+
+ {
+ VkResult result = VK_ERROR_OUT_OF_HOST_MEMORY;
+ VkDeviceMemory rawMemory = DE_NULL;
+
+ vk::VkMemoryDedicatedAllocateInfoKHR
+ dedicatedInfo =