VkBool32 VKTS_APIENTRY fileSaveBinary(const char* filename, const IBinaryBufferSP& buffer) { if (!buffer.get()) { return VK_FALSE; } return fileSave(filename, buffer->getData(), buffer->getSize()); }
IBufferObjectSP VKTS_APIENTRY bufferObjectCreate(IBufferSP& stageBuffer, IDeviceMemorySP& stageDeviceMemory, const IInitialResourcesSP& initialResources, const ICommandBuffersSP& cmdBuffer, const IBinaryBufferSP& binaryBuffer, const VkBufferCreateInfo& bufferCreateInfo, const VkMemoryPropertyFlags memoryPropertyFlag) { if (!initialResources.get() || !cmdBuffer.get() || !binaryBuffer.get()) { return IBufferObjectSP(); } // VkResult result; // IBufferSP buffer; IDeviceMemorySP deviceMemory; if (!bufferObjectPrepare(buffer, deviceMemory, initialResources, bufferCreateInfo, memoryPropertyFlag)) { return IBufferObjectSP(); } // if (memoryPropertyFlag & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { result = deviceMemory->upload(0, deviceMemory->getAllocationSize(), 0, binaryBuffer->getData(), binaryBuffer->getSize()); if (result != VK_SUCCESS) { logPrint(VKTS_LOG_ERROR, "BufferObject: Could not upload vertex data."); return IBufferObjectSP(); } } else { if (!bufferObjectPrepare(stageBuffer, stageDeviceMemory, initialResources, bufferCreateInfo, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) { logPrint(VKTS_LOG_ERROR, "BufferObject: Could not create vertex buffer."); return IBufferObjectSP(); } result = stageDeviceMemory->upload(0, stageDeviceMemory->getAllocationSize(), 0, binaryBuffer->getData(), binaryBuffer->getSize()); if (result != VK_SUCCESS) { logPrint(VKTS_LOG_ERROR, "BufferObject: Could not upload vertex data."); return IBufferObjectSP(); } VkBufferCopy bufferCopy; bufferCopy.srcOffset = 0; bufferCopy.dstOffset = 0; bufferCopy.size = binaryBuffer->getSize(); stageBuffer->copyBuffer(cmdBuffer->getCommandBuffer(), buffer->getBuffer(), buffer->getSize(), 1, &bufferCopy); } // IBufferViewSP noBufferView; auto newInstance = new BufferObject(initialResources, buffer, noBufferView, deviceMemory); if (!newInstance) { buffer->destroy(); return IBufferObjectSP(); } return IBufferObjectSP(newInstance); }
IImageDataSP VKTS_APIENTRY imageDataLoadGli(const std::string& name, const IBinaryBufferSP& buffer) { if (!buffer.get()) { return IImageDataSP(); } auto texture = gli::load(name.c_str()); if (texture.empty()) { return IImageDataSP(); } if (texture.layers() > 1 && texture.faces() > 1) { return IImageDataSP(); } VkFormat format = imageDataTranslateFormat(texture.format()); if (format == VK_FORMAT_UNDEFINED) { return IImageDataSP(); } uint32_t arrayLayers = (uint32_t)(texture.layers() * texture.faces()); uint32_t mipLevels = (uint32_t)texture.levels(); VkImageType imageType = VK_IMAGE_TYPE_2D; if (texture.extent().z > 1) { imageType = VK_IMAGE_TYPE_3D; } // std::vector<size_t> allOffsets; size_t offset = 0; for (size_t arrayLayer = texture.base_layer(); arrayLayer <= texture.max_layer(); arrayLayer++) { for (size_t face = texture.base_face(); face <= texture.max_face(); face++) { for (size_t mipLevel = texture.base_level(); mipLevel <= texture.max_level(); mipLevel++) { allOffsets.push_back(offset); offset += texture.size(mipLevel); } } } size_t totalSize = offset; std::vector<uint8_t> data(totalSize); offset = 0; for (size_t arrayLayer = texture.base_layer(); arrayLayer <= texture.max_layer(); arrayLayer++) { for (size_t face = texture.base_face(); face <= texture.max_face(); face++) { for (size_t mipLevel = texture.base_level(); mipLevel <= texture.max_level(); mipLevel++) { memcpy(&data[offset], texture.data(arrayLayer, face, mipLevel), texture.size(mipLevel)); offset += texture.size(mipLevel); } } } return IImageDataSP(new ImageData(name, imageType, format, { (uint32_t)texture.extent().x, (uint32_t)texture.extent().y, (uint32_t)texture.extent().z }, mipLevels, arrayLayers, allOffsets, &data[0], totalSize)); }