Esempio n. 1
0
VkBool32 VKTS_APIENTRY fileSaveBinary(const char* filename, const IBinaryBufferSP& buffer)
{
    if (!buffer.get())
    {
        return VK_FALSE;
    }

    return fileSave(filename, buffer->getData(), buffer->getSize());
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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));
}