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
GraphicsPipeline::GraphicsPipeline(const VkDevice device, const VkPipelineCache pipelineCache, const VkGraphicsPipelineCreateInfo& graphicsPipelineCreateInfo, const VkPipeline pipeline, const VkTsVertexBufferType vertexBufferType) :
    IGraphicsPipeline(), device(device), pipelineCache(pipelineCache), graphicsPipelineCreateInfo(graphicsPipelineCreateInfo), allStagesSerialized(), vertexInputStateSerialized(), inputAssemblyStateSerialized(), tessellationStateSerialized(), viewportStateSerialized(), rasterizationStateSerialized(), multisampleStateSerialized(), depthStencilStateSerialized(), colorBlendStateSerialized(), dynamicStateSerialized(), pipeline(pipeline), vertexBufferType(vertexBufferType)
{
    this->graphicsPipelineCreateInfo.pStages = nullptr;
    this->graphicsPipelineCreateInfo.pVertexInputState = nullptr;
    this->graphicsPipelineCreateInfo.pInputAssemblyState = nullptr;
    this->graphicsPipelineCreateInfo.pTessellationState = nullptr;
    this->graphicsPipelineCreateInfo.pViewportState = nullptr;
    this->graphicsPipelineCreateInfo.pRasterizationState = nullptr;
    this->graphicsPipelineCreateInfo.pMultisampleState = nullptr;
    this->graphicsPipelineCreateInfo.pDepthStencilState = nullptr;
    this->graphicsPipelineCreateInfo.pColorBlendState = nullptr;
    this->graphicsPipelineCreateInfo.pDynamicState = nullptr;

    if (graphicsPipelineCreateInfo.stageCount > 0 && graphicsPipelineCreateInfo.pStages)
    {
        for (uint32_t i = 0; i < graphicsPipelineCreateInfo.stageCount; i++)
        {
            IBinaryBufferSP currentStageSerialized = commonSerializeStructureType(&graphicsPipelineCreateInfo.pStages[i]);

            allStagesSerialized.append(currentStageSerialized);

            if (i == 0)
            {
                this->graphicsPipelineCreateInfo.pStages = (const VkPipelineShaderStageCreateInfo*) currentStageSerialized->getData();
            }
        }
    }

    if (graphicsPipelineCreateInfo.pVertexInputState)
    {
        vertexInputStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pVertexInputState);

        this->graphicsPipelineCreateInfo.pVertexInputState = (const VkPipelineVertexInputStateCreateInfo*) vertexInputStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pInputAssemblyState)
    {
        inputAssemblyStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pInputAssemblyState);

        this->graphicsPipelineCreateInfo.pInputAssemblyState = (const VkPipelineInputAssemblyStateCreateInfo*) inputAssemblyStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pTessellationState)
    {
        tessellationStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pTessellationState);

        this->graphicsPipelineCreateInfo.pTessellationState = (const VkPipelineTessellationStateCreateInfo*) tessellationStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pViewportState)
    {
        viewportStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pViewportState);

        this->graphicsPipelineCreateInfo.pViewportState = (const VkPipelineViewportStateCreateInfo*) viewportStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pRasterizationState)
    {
        rasterizationStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pRasterizationState);

        this->graphicsPipelineCreateInfo.pRasterizationState = (const VkPipelineRasterizationStateCreateInfo*) rasterizationStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pMultisampleState)
    {
        multisampleStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pMultisampleState);

        this->graphicsPipelineCreateInfo.pMultisampleState = (const VkPipelineMultisampleStateCreateInfo*) multisampleStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pDepthStencilState)
    {
        depthStencilStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pDepthStencilState);

        this->graphicsPipelineCreateInfo.pDepthStencilState = (const VkPipelineDepthStencilStateCreateInfo*) depthStencilStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pColorBlendState)
    {
        colorBlendStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pColorBlendState);

        this->graphicsPipelineCreateInfo.pColorBlendState = (const VkPipelineColorBlendStateCreateInfo*) colorBlendStateSerialized->getData();
    }

    if (graphicsPipelineCreateInfo.pDynamicState)
    {
        dynamicStateSerialized = commonSerializeStructureType(graphicsPipelineCreateInfo.pDynamicState);

        this->graphicsPipelineCreateInfo.pDynamicState = (const VkPipelineDynamicStateCreateInfo*) dynamicStateSerialized->getData();
    }
}