Merge changes If2de3cbd,Ia12719e9 * changes: Update to latest LLVM 7.0 release branch revision. Squashed 'third_party/llvm-7.0/llvm/' changes from 65ce2e56889..cd98f42d074
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp index 59f77fc..432edf9 100644 --- a/src/Vulkan/VkCommandBuffer.cpp +++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -140,7 +140,8 @@ struct Draw : public CommandBuffer::Command { - Draw(uint32_t pVertexCount) : vertexCount(pVertexCount) + Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) + : vertexCount(vertexCount), instanceCount(instanceCount), firstVertex(firstVertex), firstInstance(firstInstance) { } @@ -154,7 +155,7 @@ { const auto& vertexInput = executionState.vertexInputBindings[i]; Buffer* buffer = Cast(vertexInput.buffer); - context.input[i].buffer = buffer ? buffer->getOffsetPointer(vertexInput.offset) : nullptr; + context.input[i].buffer = buffer ? buffer->getOffsetPointer(vertexInput.offset + context.input[i].stride * firstVertex) : nullptr; } executionState.renderer->setContext(context); @@ -162,10 +163,19 @@ executionState.renderer->setViewport(pipeline->getViewport()); executionState.renderer->setBlendConstant(pipeline->getBlendConstants()); - executionState.renderer->draw(context.drawType, 0, pipeline->computePrimitiveCount(vertexCount)); + const uint32_t primitiveCount = pipeline->computePrimitiveCount(vertexCount); + const uint32_t lastInstance = firstInstance + instanceCount - 1; + for(uint32_t instance = firstInstance; instance <= lastInstance; instance++) + { + executionState.renderer->setInstanceID(instance); + executionState.renderer->draw(context.drawType, 0, primitiveCount); + } } uint32_t vertexCount; + uint32_t instanceCount; + uint32_t firstVertex; + uint32_t firstInstance; }; struct ImageToImageCopy : public CommandBuffer::Command @@ -737,12 +747,7 @@ void CommandBuffer::draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) { - if(instanceCount > 1 || firstVertex != 0 || firstInstance != 0) - { - UNIMPLEMENTED(); - } - - addCommand<Draw>(vertexCount); + addCommand<Draw>(vertexCount, instanceCount, firstVertex, firstInstance); } void CommandBuffer::drawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance)
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp index 0fc4adb..00fe21d 100644 --- a/src/Vulkan/libVulkan.cpp +++ b/src/Vulkan/libVulkan.cpp
@@ -930,10 +930,7 @@ TRACE("(VkDevice device = 0x%X, VkPipelineCache pipelineCache = 0x%X, uint32_t createInfoCount = %d, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator = 0x%X, VkPipeline* pPipelines = 0x%X)", device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines); - if(pipelineCache != VK_NULL_HANDLE) - { - UNIMPLEMENTED(); - } + // TODO (b/123588002): Optimize based on pipelineCache. VkResult errorResult = VK_SUCCESS; for(uint32_t i = 0; i < createInfoCount; i++) @@ -966,10 +963,7 @@ TRACE("(VkDevice device = 0x%X, VkPipelineCache pipelineCache = 0x%X, uint32_t createInfoCount = %d, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator = 0x%X, VkPipeline* pPipelines = 0x%X)", device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines); - if(pipelineCache != VK_NULL_HANDLE) - { - UNIMPLEMENTED(); - } + // TODO (b/123588002): Optimize based on pipelineCache. VkResult errorResult = VK_SUCCESS; for(uint32_t i = 0; i < createInfoCount; i++)