Commit 4a4c259f by Chris Forbes

Implement vkCmdDispatchBase

Bug: b/126871859 Test: dEQP-VK.compute.device_group.dispatch_base Change-Id: I15446caa46d9711f86cf0e1b3a0d8d0fe9b4eec9 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31288 Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent a7a37556
...@@ -211,6 +211,7 @@ namespace sw ...@@ -211,6 +211,7 @@ namespace sw
vk::DescriptorSet::Bindings const &descriptorSets, vk::DescriptorSet::Bindings const &descriptorSets,
vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets, vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets,
PushConstantStorage const &pushConstants, PushConstantStorage const &pushConstants,
uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
{ {
auto &modes = shader->getModes(); auto &modes = shader->getModes();
...@@ -241,11 +242,11 @@ namespace sw ...@@ -241,11 +242,11 @@ namespace sw
data.pushConstants = pushConstants; data.pushConstants = pushConstants;
data.constants = &sw::constants; data.constants = &sw::constants;
for (uint32_t groupZ = 0; groupZ < groupCountZ; groupZ++) for (uint32_t groupZ = baseGroupZ; groupZ < baseGroupZ + groupCountZ; groupZ++)
{ {
for (uint32_t groupY = 0; groupY < groupCountY; groupY++) for (uint32_t groupY = baseGroupY; groupY < baseGroupY + groupCountY; groupY++)
{ {
for (uint32_t groupX = 0; groupX < groupCountX; groupX++) for (uint32_t groupX = baseGroupX; groupX < baseGroupX + groupCountX; groupX++)
{ {
// TODO(bclayton): Split work across threads. // TODO(bclayton): Split work across threads.
......
...@@ -59,6 +59,7 @@ namespace sw ...@@ -59,6 +59,7 @@ namespace sw
vk::DescriptorSet::Bindings const &descriptorSetBindings, vk::DescriptorSet::Bindings const &descriptorSetBindings,
vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets, vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets,
PushConstantStorage const &pushConstants, PushConstantStorage const &pushConstants,
uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
protected: protected:
......
...@@ -165,7 +165,8 @@ private: ...@@ -165,7 +165,8 @@ private:
class Dispatch : public CommandBuffer::Command class Dispatch : public CommandBuffer::Command
{ {
public: public:
Dispatch(uint32_t pGroupCountX, uint32_t pGroupCountY, uint32_t pGroupCountZ) : Dispatch(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t pGroupCountX, uint32_t pGroupCountY, uint32_t pGroupCountZ) :
baseGroupX(baseGroupX), baseGroupY(baseGroupY), baseGroupZ(baseGroupZ),
groupCountX(pGroupCountX), groupCountY(pGroupCountY), groupCountZ(pGroupCountZ) groupCountX(pGroupCountX), groupCountY(pGroupCountY), groupCountZ(pGroupCountZ)
{ {
} }
...@@ -176,13 +177,17 @@ protected: ...@@ -176,13 +177,17 @@ protected:
auto const &pipelineState = executionState.pipelineState[VK_PIPELINE_BIND_POINT_COMPUTE]; auto const &pipelineState = executionState.pipelineState[VK_PIPELINE_BIND_POINT_COMPUTE];
ComputePipeline* pipeline = static_cast<ComputePipeline*>(pipelineState.pipeline); ComputePipeline* pipeline = static_cast<ComputePipeline*>(pipelineState.pipeline);
pipeline->run(groupCountX, groupCountY, groupCountZ, pipeline->run(baseGroupX, baseGroupY, baseGroupZ,
groupCountX, groupCountY, groupCountZ,
pipelineState.descriptorSets, pipelineState.descriptorSets,
pipelineState.descriptorDynamicOffsets, pipelineState.descriptorDynamicOffsets,
executionState.pushConstants); executionState.pushConstants);
} }
private: private:
uint32_t baseGroupX;
uint32_t baseGroupY;
uint32_t baseGroupZ;
uint32_t groupCountX; uint32_t groupCountX;
uint32_t groupCountY; uint32_t groupCountY;
uint32_t groupCountZ; uint32_t groupCountZ;
...@@ -204,7 +209,7 @@ protected: ...@@ -204,7 +209,7 @@ protected:
auto const &pipelineState = executionState.pipelineState[VK_PIPELINE_BIND_POINT_COMPUTE]; auto const &pipelineState = executionState.pipelineState[VK_PIPELINE_BIND_POINT_COMPUTE];
ComputePipeline* pipeline = static_cast<ComputePipeline*>(pipelineState.pipeline); ComputePipeline* pipeline = static_cast<ComputePipeline*>(pipelineState.pipeline);
pipeline->run(cmd->x, cmd->y, cmd->z, pipeline->run(0, 0, 0, cmd->x, cmd->y, cmd->z,
pipelineState.descriptorSets, pipelineState.descriptorSets,
pipelineState.descriptorDynamicOffsets, pipelineState.descriptorDynamicOffsets,
executionState.pushConstants); executionState.pushConstants);
...@@ -1219,7 +1224,7 @@ void CommandBuffer::setDeviceMask(uint32_t deviceMask) ...@@ -1219,7 +1224,7 @@ void CommandBuffer::setDeviceMask(uint32_t deviceMask)
void CommandBuffer::dispatchBase(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, void CommandBuffer::dispatchBase(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
{ {
UNIMPLEMENTED("dispatchBase"); addCommand<Dispatch>(baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
} }
void CommandBuffer::pipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, void CommandBuffer::pipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
...@@ -1388,7 +1393,7 @@ void CommandBuffer::bindIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkInde ...@@ -1388,7 +1393,7 @@ void CommandBuffer::bindIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkInde
void CommandBuffer::dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) void CommandBuffer::dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
{ {
addCommand<Dispatch>(groupCountX, groupCountY, groupCountZ); addCommand<Dispatch>(0, 0, 0, groupCountX, groupCountY, groupCountZ);
} }
void CommandBuffer::dispatchIndirect(VkBuffer buffer, VkDeviceSize offset) void CommandBuffer::dispatchIndirect(VkBuffer buffer, VkDeviceSize offset)
......
...@@ -560,7 +560,8 @@ void ComputePipeline::compileShaders(const VkAllocationCallbacks* pAllocator, co ...@@ -560,7 +560,8 @@ void ComputePipeline::compileShaders(const VkAllocationCallbacks* pAllocator, co
program->finalize(); program->finalize();
} }
void ComputePipeline::run(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ, void ComputePipeline::run(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ,
vk::DescriptorSet::Bindings const &descriptorSets, vk::DescriptorSet::Bindings const &descriptorSets,
vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets, vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets,
sw::PushConstantStorage const &pushConstants) sw::PushConstantStorage const &pushConstants)
...@@ -568,6 +569,7 @@ void ComputePipeline::run(uint32_t groupCountX, uint32_t groupCountY, uint32_t g ...@@ -568,6 +569,7 @@ void ComputePipeline::run(uint32_t groupCountX, uint32_t groupCountY, uint32_t g
ASSERT_OR_RETURN(program != nullptr); ASSERT_OR_RETURN(program != nullptr);
program->run( program->run(
descriptorSets, descriptorDynamicOffsets, pushConstants, descriptorSets, descriptorDynamicOffsets, pushConstants,
baseGroupX, baseGroupY, baseGroupZ,
groupCountX, groupCountY, groupCountZ); groupCountX, groupCountY, groupCountZ);
} }
......
...@@ -112,7 +112,8 @@ public: ...@@ -112,7 +112,8 @@ public:
void compileShaders(const VkAllocationCallbacks* pAllocator, const VkComputePipelineCreateInfo* pCreateInfo); void compileShaders(const VkAllocationCallbacks* pAllocator, const VkComputePipelineCreateInfo* pCreateInfo);
void run(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ, void run(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ,
vk::DescriptorSet::Bindings const &descriptorSets, vk::DescriptorSet::Bindings const &descriptorSets,
vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets, vk::DescriptorSet::DynamicOffsets const &descriptorDynamicOffsets,
sw::PushConstantStorage const &pushConstants); sw::PushConstantStorage const &pushConstants);
......
...@@ -1911,8 +1911,10 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMask(VkCommandBuffer commandBuffer, uin ...@@ -1911,8 +1911,10 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMask(VkCommandBuffer commandBuffer, uin
VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
{ {
TRACE("()"); TRACE("(VkCommandBuffer commandBuffer = %p, baseGroupX = %u, baseGroupY = %u, baseGroupZ = %u, groupCountX = %u, groupCountY = %u, groupCountZ = %u)",
UNIMPLEMENTED("vkCmdDispatchBase"); commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
vk::Cast(commandBuffer)->dispatchBase(baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
} }
VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties) VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment