VkBool32 Example::destroyTexture(vkts::IImageSP& currentImage, vkts::IDeviceMemorySP& currentDeviceMemoryImage) const { if (currentImage.get()) { currentImage->destroy(); currentDeviceMemoryImage->destroy(); } return VK_TRUE; }
VkBool32 Example::createTexture(vkts::IImageSP& currentImage, vkts::IDeviceMemorySP& currentDeviceMemoryImage, const VkImageTiling imageTiling, const VkImageUsageFlags usage, const VkImageLayout initialLayout, const VkMemoryPropertyFlags memoryPropertyFlagBits, const VkAccessFlags accessMask) const { VkResult result; // VkExtent3D extent = {VKTS_IMAGE_LENGTH, VKTS_IMAGE_LENGTH, 1}; currentImage = vkts::imageCreate(device->getDevice(), 0, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, extent, 1, 1, VK_SAMPLE_COUNT_1_BIT, imageTiling, usage, VK_SHARING_MODE_EXCLUSIVE, 0, nullptr, initialLayout, accessMask); if (!currentImage.get()) { vkts::logPrint(VKTS_LOG_ERROR, __FILE__, __LINE__, "Could not create image."); return VK_FALSE; } // VkMemoryRequirements memoryRequirements; currentImage->getImageMemoryRequirements(memoryRequirements); // VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties; physicalDevice->getPhysicalDeviceMemoryProperties(physicalDeviceMemoryProperties); currentDeviceMemoryImage = vkts::deviceMemoryCreate(device->getDevice(), memoryRequirements, VK_MAX_MEMORY_TYPES, physicalDeviceMemoryProperties.memoryTypes, memoryPropertyFlagBits); if (!currentDeviceMemoryImage.get()) { vkts::logPrint(VKTS_LOG_ERROR, __FILE__, __LINE__, "Could not allocate memory."); return VK_FALSE; } // Bind image to memory. result = vkBindImageMemory(device->getDevice(), currentImage->getImage(), currentDeviceMemoryImage->getDeviceMemory(), 0); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, __FILE__, __LINE__, "Could not bind image memory."); return VK_FALSE; } return VK_TRUE; }
VkBool32 Example::createTexture(vkts::IImageSP& currentImage, vkts::IDeviceMemorySP& currentDeviceMemoryImage, const vkts::IImageDataSP& imageData, const VkImageTiling imageTiling, const VkImageUsageFlags usage, const VkImageLayout initialLayout, const VkMemoryPropertyFlags memoryPropertyFlagBits, const VkAccessFlags accessMask) const { VkResult result; // currentImage = vkts::imageCreate(device->getDevice(), 0, imageData->getImageType(), imageData->getFormat(), imageData->getExtent3D(), 1, 1, VK_SAMPLE_COUNT_1_BIT, imageTiling, usage, VK_SHARING_MODE_EXCLUSIVE, 0, nullptr, initialLayout, accessMask); if (!currentImage.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not create image."); return VK_FALSE; } // VkMemoryRequirements memoryRequirements; currentImage->getImageMemoryRequirements(memoryRequirements); // VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties; physicalDevice->getPhysicalDeviceMemoryProperties(physicalDeviceMemoryProperties); currentDeviceMemoryImage = vkts::deviceMemoryCreate(device->getDevice(), memoryRequirements, VK_MAX_MEMORY_TYPES, physicalDeviceMemoryProperties.memoryTypes, memoryPropertyFlagBits); if (!currentDeviceMemoryImage.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not allocate memory."); return VK_FALSE; } // Bind image to memory. result = vkBindImageMemory(device->getDevice(), currentImage->getImage(), currentDeviceMemoryImage->getDeviceMemory(), 0); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not bind image memory."); return VK_FALSE; } // Upload data if host visible. if (memoryPropertyFlagBits & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { VkImageSubresource imageSubresource; imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; imageSubresource.mipLevel = 0; imageSubresource.arrayLayer = 0; VkSubresourceLayout subresourceLayout; currentImage->getImageSubresourceLayout(subresourceLayout, imageSubresource); result = currentDeviceMemoryImage->mapMemory(0, memoryRequirements.size, 0); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not map memory."); return VK_FALSE; } imageData->copy(currentDeviceMemoryImage->getMemory(), 0, subresourceLayout); currentDeviceMemoryImage->unmapMemory(); } return VK_TRUE; }