Commit 764d572b by Tobin Ehlis Committed by Commit Bot

Vulkan: Refactor SecondaryCommandBuffers class

A strictly cosmetic change to move code into alphabetical order. In working with SecondaryCommandBuffer commands in separate CLs, it can be difficult/annoying to track which commands are already in place as some of them are out-of-order. This change puts the command enums, functions, and processing in alphabetical order to simplify searching and adding new commands. Bug: b/154030403 Change-Id: I6dba4cf48d6f27c056585ac633c694e083b1a263 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2158816Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Tobin Ehlis <tobine@google.com>
parent e5491253
...@@ -27,6 +27,8 @@ const char *GetCommandString(CommandID id) ...@@ -27,6 +27,8 @@ const char *GetCommandString(CommandID id)
return "--Invalid--"; return "--Invalid--";
case CommandID::BeginQuery: case CommandID::BeginQuery:
return "BeginQuery"; return "BeginQuery";
case CommandID::BeginTransformFeedback:
return "BeginTransformFeedback";
case CommandID::BindComputePipeline: case CommandID::BindComputePipeline:
return "BindComputePipeline"; return "BindComputePipeline";
case CommandID::BindDescriptorSets: case CommandID::BindDescriptorSets:
...@@ -35,10 +37,10 @@ const char *GetCommandString(CommandID id) ...@@ -35,10 +37,10 @@ const char *GetCommandString(CommandID id)
return "BindGraphicsPipeline"; return "BindGraphicsPipeline";
case CommandID::BindIndexBuffer: case CommandID::BindIndexBuffer:
return "BindIndexBuffer"; return "BindIndexBuffer";
case CommandID::BindVertexBuffers:
return "BindVertexBuffers";
case CommandID::BindTransformFeedbackBuffers: case CommandID::BindTransformFeedbackBuffers:
return "BindTransformFeedbackBuffers"; return "BindTransformFeedbackBuffers";
case CommandID::BindVertexBuffers:
return "BindVertexBuffers";
case CommandID::BlitImage: case CommandID::BlitImage:
return "BlitImage"; return "BlitImage";
case CommandID::BufferBarrier: case CommandID::BufferBarrier:
...@@ -67,22 +69,24 @@ const char *GetCommandString(CommandID id) ...@@ -67,22 +69,24 @@ const char *GetCommandString(CommandID id)
return "DrawIndexed"; return "DrawIndexed";
case CommandID::DrawIndexedBaseVertex: case CommandID::DrawIndexedBaseVertex:
return "DrawIndexedBaseVertex"; return "DrawIndexedBaseVertex";
case CommandID::DrawIndexedIndirect:
return "DrawIndexedIndirect";
case CommandID::DrawIndexedInstanced: case CommandID::DrawIndexedInstanced:
return "DrawIndexedInstanced"; return "DrawIndexedInstanced";
case CommandID::DrawIndexedInstancedBaseVertex: case CommandID::DrawIndexedInstancedBaseVertex:
return "DrawIndexedInstancedBaseVertex"; return "DrawIndexedInstancedBaseVertex";
case CommandID::DrawIndexedInstancedBaseVertexBaseInstance: case CommandID::DrawIndexedInstancedBaseVertexBaseInstance:
return "DrawIndexedInstancedBaseVertexBaseInstance"; return "DrawIndexedInstancedBaseVertexBaseInstance";
case CommandID::DrawIndirect:
return "DrawIndirect";
case CommandID::DrawInstanced: case CommandID::DrawInstanced:
return "DrawInstanced"; return "DrawInstanced";
case CommandID::DrawInstancedBaseInstance: case CommandID::DrawInstancedBaseInstance:
return "DrawInstancedBaseInstance"; return "DrawInstancedBaseInstance";
case CommandID::DrawIndexedIndirect:
return "DrawIndexedIndirect";
case CommandID::DrawIndirect:
return "DrawIndirect";
case CommandID::EndQuery: case CommandID::EndQuery:
return "EndQuery"; return "EndQuery";
case CommandID::EndTransformFeedback:
return "EndTransformFeedback";
case CommandID::ExecutionBarrier: case CommandID::ExecutionBarrier:
return "ExecutionBarrier"; return "ExecutionBarrier";
case CommandID::FillBuffer: case CommandID::FillBuffer:
...@@ -107,10 +111,6 @@ const char *GetCommandString(CommandID id) ...@@ -107,10 +111,6 @@ const char *GetCommandString(CommandID id)
return "WaitEvents"; return "WaitEvents";
case CommandID::WriteTimestamp: case CommandID::WriteTimestamp:
return "WriteTimestamp"; return "WriteTimestamp";
case CommandID::BeginTransformFeedback:
return "BeginTransformFeedback";
case CommandID::EndTransformFeedback:
return "EndTransformFeedback";
default: default:
// Need this to work around MSVC warning 4715. // Need this to work around MSVC warning 4715.
UNREACHABLE(); UNREACHABLE();
...@@ -141,6 +141,20 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -141,6 +141,20 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
vkCmdBeginQuery(cmdBuffer, params->queryPool, params->query, params->flags); vkCmdBeginQuery(cmdBuffer, params->queryPool, params->query, params->flags);
break; break;
} }
case CommandID::BeginTransformFeedback:
{
const BeginTransformFeedbackParams *params =
getParamPtr<BeginTransformFeedbackParams>(currentCommand);
const VkBuffer *counterBuffers =
Offset<VkBuffer>(params, sizeof(BeginTransformFeedbackParams));
// Workaround for AMD driver bug where it expects the offsets array to be
// non-null
gl::TransformFeedbackBuffersArray<VkDeviceSize> offsets;
offsets.fill(0);
vkCmdBeginTransformFeedbackEXT(cmdBuffer, 0, params->bufferCount,
counterBuffers, offsets.data());
break;
}
case CommandID::BindComputePipeline: case CommandID::BindComputePipeline:
{ {
const BindPipelineParams *params = const BindPipelineParams *params =
...@@ -311,6 +325,13 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -311,6 +325,13 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
vkCmdDrawIndexed(cmdBuffer, params->indexCount, 1, 0, params->vertexOffset, 0); vkCmdDrawIndexed(cmdBuffer, params->indexCount, 1, 0, params->vertexOffset, 0);
break; break;
} }
case CommandID::DrawIndexedIndirect:
{
const DrawIndexedIndirectParams *params =
getParamPtr<DrawIndexedIndirectParams>(currentCommand);
vkCmdDrawIndexedIndirect(cmdBuffer, params->buffer, params->offset, 1, 0);
break;
}
case CommandID::DrawIndexedInstanced: case CommandID::DrawIndexedInstanced:
{ {
const DrawIndexedInstancedParams *params = const DrawIndexedInstancedParams *params =
...@@ -336,6 +357,13 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -336,6 +357,13 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
params->firstInstance); params->firstInstance);
break; break;
} }
case CommandID::DrawIndirect:
{
const DrawIndirectParams *params =
getParamPtr<DrawIndirectParams>(currentCommand);
vkCmdDrawIndirect(cmdBuffer, params->buffer, params->offset, 1, 0);
break;
}
case CommandID::DrawInstanced: case CommandID::DrawInstanced:
{ {
const DrawInstancedParams *params = const DrawInstancedParams *params =
...@@ -352,26 +380,26 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -352,26 +380,26 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
params->firstVertex, params->firstInstance); params->firstVertex, params->firstInstance);
break; break;
} }
case CommandID::DrawIndirect:
{
const DrawIndirectParams *params =
getParamPtr<DrawIndirectParams>(currentCommand);
vkCmdDrawIndirect(cmdBuffer, params->buffer, params->offset, 1, 0);
break;
}
case CommandID::DrawIndexedIndirect:
{
const DrawIndexedIndirectParams *params =
getParamPtr<DrawIndexedIndirectParams>(currentCommand);
vkCmdDrawIndexedIndirect(cmdBuffer, params->buffer, params->offset, 1, 0);
break;
}
case CommandID::EndQuery: case CommandID::EndQuery:
{ {
const EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand); const EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand);
vkCmdEndQuery(cmdBuffer, params->queryPool, params->query); vkCmdEndQuery(cmdBuffer, params->queryPool, params->query);
break; break;
} }
case CommandID::EndTransformFeedback:
{
const EndTransformFeedbackParams *params =
getParamPtr<EndTransformFeedbackParams>(currentCommand);
const VkBuffer *counterBuffers =
Offset<VkBuffer>(params, sizeof(EndTransformFeedbackParams));
// Workaround for AMD driver bug where it expects the offsets array to be
// non-null
gl::TransformFeedbackBuffersArray<VkDeviceSize> offsets;
offsets.fill(0);
vkCmdEndTransformFeedbackEXT(cmdBuffer, 0, params->bufferCount, counterBuffers,
offsets.data());
break;
}
case CommandID::ExecutionBarrier: case CommandID::ExecutionBarrier:
{ {
const ExecutionBarrierParams *params = const ExecutionBarrierParams *params =
...@@ -487,34 +515,6 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -487,34 +515,6 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
params->query); params->query);
break; break;
} }
case CommandID::BeginTransformFeedback:
{
const BeginTransformFeedbackParams *params =
getParamPtr<BeginTransformFeedbackParams>(currentCommand);
const VkBuffer *counterBuffers =
Offset<VkBuffer>(params, sizeof(BeginTransformFeedbackParams));
// Workaround for AMD driver bug where it expects the offsets array to be
// non-null
gl::TransformFeedbackBuffersArray<VkDeviceSize> offsets;
offsets.fill(0);
vkCmdBeginTransformFeedbackEXT(cmdBuffer, 0, params->bufferCount,
counterBuffers, offsets.data());
break;
}
case CommandID::EndTransformFeedback:
{
const EndTransformFeedbackParams *params =
getParamPtr<EndTransformFeedbackParams>(currentCommand);
const VkBuffer *counterBuffers =
Offset<VkBuffer>(params, sizeof(EndTransformFeedbackParams));
// Workaround for AMD driver bug where it expects the offsets array to be
// non-null
gl::TransformFeedbackBuffersArray<VkDeviceSize> offsets;
offsets.fill(0);
vkCmdEndTransformFeedbackEXT(cmdBuffer, 0, params->bufferCount, counterBuffers,
offsets.data());
break;
}
default: default:
{ {
UNREACHABLE(); UNREACHABLE();
......
...@@ -24,12 +24,15 @@ namespace vk ...@@ -24,12 +24,15 @@ namespace vk
namespace priv namespace priv
{ {
// NOTE: Please keep command-related enums, stucts, functions
// and other code dealing with commands in alphabetical order
// This simplifies searching and updating commands.
enum class CommandID : uint16_t enum class CommandID : uint16_t
{ {
// Invalid cmd used to mark end of sequence of commands // Invalid cmd used to mark end of sequence of commands
Invalid = 0, Invalid = 0,
BeginQuery, BeginQuery,
BeginTransformFeedback,
BindComputePipeline, BindComputePipeline,
BindDescriptorSets, BindDescriptorSets,
BindGraphicsPipeline, BindGraphicsPipeline,
...@@ -50,14 +53,15 @@ enum class CommandID : uint16_t ...@@ -50,14 +53,15 @@ enum class CommandID : uint16_t
Draw, Draw,
DrawIndexed, DrawIndexed,
DrawIndexedBaseVertex, DrawIndexedBaseVertex,
DrawIndexedIndirect,
DrawIndexedInstanced, DrawIndexedInstanced,
DrawIndexedInstancedBaseVertex, DrawIndexedInstancedBaseVertex,
DrawIndexedInstancedBaseVertexBaseInstance, DrawIndexedInstancedBaseVertexBaseInstance,
DrawIndirect,
DrawInstanced, DrawInstanced,
DrawInstancedBaseInstance, DrawInstancedBaseInstance,
DrawIndirect,
DrawIndexedIndirect,
EndQuery, EndQuery,
EndTransformFeedback,
ExecutionBarrier, ExecutionBarrier,
FillBuffer, FillBuffer,
ImageBarrier, ImageBarrier,
...@@ -70,8 +74,6 @@ enum class CommandID : uint16_t ...@@ -70,8 +74,6 @@ enum class CommandID : uint16_t
SetEvent, SetEvent,
WaitEvents, WaitEvents,
WriteTimestamp, WriteTimestamp,
BeginTransformFeedback,
EndTransformFeedback,
}; };
#define VERIFY_4_BYTE_ALIGNMENT(StructName) \ #define VERIFY_4_BYTE_ALIGNMENT(StructName) \
...@@ -81,11 +83,19 @@ enum class CommandID : uint16_t ...@@ -81,11 +83,19 @@ enum class CommandID : uint16_t
// This makes it easy to know the size of params & to copy params // This makes it easy to know the size of params & to copy params
// TODO: Could optimize the size of some of these structs through bit-packing // TODO: Could optimize the size of some of these structs through bit-packing
// and customizing sizing based on limited parameter sets used by ANGLE // and customizing sizing based on limited parameter sets used by ANGLE
struct BindPipelineParams struct BeginQueryParams
{ {
VkPipeline pipeline; VkQueryPool queryPool;
uint32_t query;
VkQueryControlFlags flags;
}; };
VERIFY_4_BYTE_ALIGNMENT(BindPipelineParams) VERIFY_4_BYTE_ALIGNMENT(BeginQueryParams)
struct BeginTransformFeedbackParams
{
uint32_t bufferCount;
};
VERIFY_4_BYTE_ALIGNMENT(BeginTransformFeedbackParams)
struct BindDescriptorSetParams struct BindDescriptorSetParams
{ {
...@@ -105,19 +115,20 @@ struct BindIndexBufferParams ...@@ -105,19 +115,20 @@ struct BindIndexBufferParams
}; };
VERIFY_4_BYTE_ALIGNMENT(BindIndexBufferParams) VERIFY_4_BYTE_ALIGNMENT(BindIndexBufferParams)
struct BindTransformFeedbackBuffersParams struct BindPipelineParams
{ {
// ANGLE always has firstBinding of 0 so not storing that currently VkPipeline pipeline;
uint32_t bindingCount;
}; };
VERIFY_4_BYTE_ALIGNMENT(BindTransformFeedbackBuffersParams) VERIFY_4_BYTE_ALIGNMENT(BindPipelineParams)
struct BindVertexBuffersParams struct BindTransformFeedbackBuffersParams
{ {
// ANGLE always has firstBinding of 0 so not storing that currently // ANGLE always has firstBinding of 0 so not storing that currently
uint32_t bindingCount; uint32_t bindingCount;
}; };
VERIFY_4_BYTE_ALIGNMENT(BindVertexBuffersParams) VERIFY_4_BYTE_ALIGNMENT(BindTransformFeedbackBuffersParams)
using BindVertexBuffersParams = BindTransformFeedbackBuffersParams;
struct BlitImageParams struct BlitImageParams
{ {
...@@ -128,6 +139,39 @@ struct BlitImageParams ...@@ -128,6 +139,39 @@ struct BlitImageParams
}; };
VERIFY_4_BYTE_ALIGNMENT(BlitImageParams) VERIFY_4_BYTE_ALIGNMENT(BlitImageParams)
struct BufferBarrierParams
{
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
VkBufferMemoryBarrier bufferMemoryBarrier;
};
VERIFY_4_BYTE_ALIGNMENT(BufferBarrierParams)
struct ClearAttachmentsParams
{
uint32_t attachmentCount;
VkClearRect rect;
};
VERIFY_4_BYTE_ALIGNMENT(ClearAttachmentsParams)
struct ClearColorImageParams
{
VkImage image;
VkImageLayout imageLayout;
VkClearColorValue color;
VkImageSubresourceRange range;
};
VERIFY_4_BYTE_ALIGNMENT(ClearColorImageParams)
struct ClearDepthStencilImageParams
{
VkImage image;
VkImageLayout imageLayout;
VkClearDepthStencilValue depthStencil;
VkImageSubresourceRange range;
};
VERIFY_4_BYTE_ALIGNMENT(ClearDepthStencilImageParams)
struct CopyBufferParams struct CopyBufferParams
{ {
VkBuffer srcBuffer; VkBuffer srcBuffer;
...@@ -164,39 +208,20 @@ struct CopyImageToBufferParams ...@@ -164,39 +208,20 @@ struct CopyImageToBufferParams
}; };
VERIFY_4_BYTE_ALIGNMENT(CopyImageToBufferParams) VERIFY_4_BYTE_ALIGNMENT(CopyImageToBufferParams)
struct ClearAttachmentsParams struct DispatchParams
{
uint32_t attachmentCount;
VkClearRect rect;
};
VERIFY_4_BYTE_ALIGNMENT(ClearAttachmentsParams)
struct ClearColorImageParams
{
VkImage image;
VkImageLayout imageLayout;
VkClearColorValue color;
VkImageSubresourceRange range;
};
VERIFY_4_BYTE_ALIGNMENT(ClearColorImageParams)
struct ClearDepthStencilImageParams
{ {
VkImage image; uint32_t groupCountX;
VkImageLayout imageLayout; uint32_t groupCountY;
VkClearDepthStencilValue depthStencil; uint32_t groupCountZ;
VkImageSubresourceRange range;
}; };
VERIFY_4_BYTE_ALIGNMENT(ClearDepthStencilImageParams) VERIFY_4_BYTE_ALIGNMENT(DispatchParams)
struct PushConstantsParams struct DispatchIndirectParams
{ {
VkPipelineLayout layout; VkBuffer buffer;
VkShaderStageFlags flag; VkDeviceSize offset;
uint32_t offset;
uint32_t size;
}; };
VERIFY_4_BYTE_ALIGNMENT(PushConstantsParams) VERIFY_4_BYTE_ALIGNMENT(DispatchIndirectParams)
struct DrawParams struct DrawParams
{ {
...@@ -205,23 +230,6 @@ struct DrawParams ...@@ -205,23 +230,6 @@ struct DrawParams
}; };
VERIFY_4_BYTE_ALIGNMENT(DrawParams) VERIFY_4_BYTE_ALIGNMENT(DrawParams)
struct DrawInstancedParams
{
uint32_t vertexCount;
uint32_t instanceCount;
uint32_t firstVertex;
};
VERIFY_4_BYTE_ALIGNMENT(DrawInstancedParams)
struct DrawInstancedBaseInstanceParams
{
uint32_t vertexCount;
uint32_t instanceCount;
uint32_t firstVertex;
uint32_t firstInstance;
};
VERIFY_4_BYTE_ALIGNMENT(DrawInstancedBaseInstanceParams)
struct DrawIndexedParams struct DrawIndexedParams
{ {
uint32_t indexCount; uint32_t indexCount;
...@@ -235,6 +243,13 @@ struct DrawIndexedBaseVertexParams ...@@ -235,6 +243,13 @@ struct DrawIndexedBaseVertexParams
}; };
VERIFY_4_BYTE_ALIGNMENT(DrawIndexedBaseVertexParams) VERIFY_4_BYTE_ALIGNMENT(DrawIndexedBaseVertexParams)
struct DrawIndexedIndirectParams
{
VkBuffer buffer;
VkDeviceSize offset;
};
VERIFY_4_BYTE_ALIGNMENT(DrawIndexedIndirectParams)
struct DrawIndexedInstancedParams struct DrawIndexedInstancedParams
{ {
uint32_t indexCount; uint32_t indexCount;
...@@ -260,34 +275,48 @@ struct DrawIndexedInstancedBaseVertexBaseInstanceParams ...@@ -260,34 +275,48 @@ struct DrawIndexedInstancedBaseVertexBaseInstanceParams
}; };
VERIFY_4_BYTE_ALIGNMENT(DrawIndexedInstancedBaseVertexBaseInstanceParams) VERIFY_4_BYTE_ALIGNMENT(DrawIndexedInstancedBaseVertexBaseInstanceParams)
struct DrawIndexedIndirectParams struct DrawIndirectParams
{ {
VkBuffer buffer; VkBuffer buffer;
VkDeviceSize offset; VkDeviceSize offset;
}; };
VERIFY_4_BYTE_ALIGNMENT(DrawIndexedIndirectParams) VERIFY_4_BYTE_ALIGNMENT(DrawIndirectParams)
struct DispatchParams struct DrawInstancedParams
{ {
uint32_t groupCountX; uint32_t vertexCount;
uint32_t groupCountY; uint32_t instanceCount;
uint32_t groupCountZ; uint32_t firstVertex;
}; };
VERIFY_4_BYTE_ALIGNMENT(DispatchParams) VERIFY_4_BYTE_ALIGNMENT(DrawInstancedParams)
struct DrawIndirectParams struct DrawInstancedBaseInstanceParams
{ {
VkBuffer buffer; uint32_t vertexCount;
VkDeviceSize offset; uint32_t instanceCount;
uint32_t firstVertex;
uint32_t firstInstance;
}; };
VERIFY_4_BYTE_ALIGNMENT(DrawIndirectParams) VERIFY_4_BYTE_ALIGNMENT(DrawInstancedBaseInstanceParams)
struct DispatchIndirectParams struct EndQueryParams
{ {
VkBuffer buffer; VkQueryPool queryPool;
VkDeviceSize offset; uint32_t query;
}; };
VERIFY_4_BYTE_ALIGNMENT(DispatchIndirectParams) VERIFY_4_BYTE_ALIGNMENT(EndQueryParams)
struct EndTransformFeedbackParams
{
uint32_t bufferCount;
};
VERIFY_4_BYTE_ALIGNMENT(EndTransformFeedbackParams)
struct ExecutionBarrierParams
{
VkPipelineStageFlags stageMask;
};
VERIFY_4_BYTE_ALIGNMENT(ExecutionBarrierParams)
struct FillBufferParams struct FillBufferParams
{ {
...@@ -298,6 +327,14 @@ struct FillBufferParams ...@@ -298,6 +327,14 @@ struct FillBufferParams
}; };
VERIFY_4_BYTE_ALIGNMENT(FillBufferParams) VERIFY_4_BYTE_ALIGNMENT(FillBufferParams)
struct ImageBarrierParams
{
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
VkImageMemoryBarrier imageMemoryBarrier;
};
VERIFY_4_BYTE_ALIGNMENT(ImageBarrierParams)
struct MemoryBarrierParams struct MemoryBarrierParams
{ {
VkPipelineStageFlags srcStageMask; VkPipelineStageFlags srcStageMask;
...@@ -317,34 +354,14 @@ struct PipelineBarrierParams ...@@ -317,34 +354,14 @@ struct PipelineBarrierParams
}; };
VERIFY_4_BYTE_ALIGNMENT(PipelineBarrierParams) VERIFY_4_BYTE_ALIGNMENT(PipelineBarrierParams)
struct ExecutionBarrierParams struct PushConstantsParams
{
VkPipelineStageFlags stageMask;
};
VERIFY_4_BYTE_ALIGNMENT(ExecutionBarrierParams)
struct BufferBarrierParams
{
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
VkBufferMemoryBarrier bufferMemoryBarrier;
};
VERIFY_4_BYTE_ALIGNMENT(BufferBarrierParams)
struct ImageBarrierParams
{
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
VkImageMemoryBarrier imageMemoryBarrier;
};
VERIFY_4_BYTE_ALIGNMENT(ImageBarrierParams)
struct SetEventParams
{ {
VkEvent event; VkPipelineLayout layout;
VkPipelineStageFlags stageMask; VkShaderStageFlags flag;
uint32_t offset;
uint32_t size;
}; };
VERIFY_4_BYTE_ALIGNMENT(SetEventParams) VERIFY_4_BYTE_ALIGNMENT(PushConstantsParams)
struct ResetEventParams struct ResetEventParams
{ {
...@@ -353,17 +370,6 @@ struct ResetEventParams ...@@ -353,17 +370,6 @@ struct ResetEventParams
}; };
VERIFY_4_BYTE_ALIGNMENT(ResetEventParams) VERIFY_4_BYTE_ALIGNMENT(ResetEventParams)
struct WaitEventsParams
{
uint32_t eventCount;
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
uint32_t memoryBarrierCount;
uint32_t bufferMemoryBarrierCount;
uint32_t imageMemoryBarrierCount;
};
VERIFY_4_BYTE_ALIGNMENT(WaitEventsParams)
struct ResetQueryPoolParams struct ResetQueryPoolParams
{ {
VkQueryPool queryPool; VkQueryPool queryPool;
...@@ -380,20 +386,23 @@ struct ResolveImageParams ...@@ -380,20 +386,23 @@ struct ResolveImageParams
}; };
VERIFY_4_BYTE_ALIGNMENT(ResolveImageParams) VERIFY_4_BYTE_ALIGNMENT(ResolveImageParams)
struct BeginQueryParams struct SetEventParams
{ {
VkQueryPool queryPool; VkEvent event;
uint32_t query; VkPipelineStageFlags stageMask;
VkQueryControlFlags flags;
}; };
VERIFY_4_BYTE_ALIGNMENT(BeginQueryParams) VERIFY_4_BYTE_ALIGNMENT(SetEventParams)
struct EndQueryParams struct WaitEventsParams
{ {
VkQueryPool queryPool; uint32_t eventCount;
uint32_t query; VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
uint32_t memoryBarrierCount;
uint32_t bufferMemoryBarrierCount;
uint32_t imageMemoryBarrierCount;
}; };
VERIFY_4_BYTE_ALIGNMENT(EndQueryParams) VERIFY_4_BYTE_ALIGNMENT(WaitEventsParams)
struct WriteTimestampParams struct WriteTimestampParams
{ {
...@@ -403,25 +412,12 @@ struct WriteTimestampParams ...@@ -403,25 +412,12 @@ struct WriteTimestampParams
}; };
VERIFY_4_BYTE_ALIGNMENT(WriteTimestampParams) VERIFY_4_BYTE_ALIGNMENT(WriteTimestampParams)
struct BeginTransformFeedbackParams
{
uint32_t bufferCount;
};
VERIFY_4_BYTE_ALIGNMENT(BeginTransformFeedbackParams)
struct EndTransformFeedbackParams
{
uint32_t bufferCount;
};
VERIFY_4_BYTE_ALIGNMENT(EndTransformFeedbackParams)
// Header for every cmd in custom cmd buffer // Header for every cmd in custom cmd buffer
struct CommandHeader struct CommandHeader
{ {
CommandID id; CommandID id;
uint16_t size; uint16_t size;
}; };
static_assert(sizeof(CommandHeader) == 4, "Check CommandHeader size"); static_assert(sizeof(CommandHeader) == 4, "Check CommandHeader size");
template <typename DestT, typename T> template <typename DestT, typename T>
...@@ -451,6 +447,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -451,6 +447,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable
// Add commands // Add commands
void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags); void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
void beginTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers);
void bindComputePipeline(const Pipeline &pipeline); void bindComputePipeline(const Pipeline &pipeline);
void bindDescriptorSets(const PipelineLayout &layout, void bindDescriptorSets(const PipelineLayout &layout,
...@@ -536,7 +534,10 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -536,7 +534,10 @@ class SecondaryCommandBuffer final : angle::NonCopyable
void drawIndexed(uint32_t indexCount); void drawIndexed(uint32_t indexCount);
void drawIndexedBaseVertex(uint32_t indexCount, uint32_t vertexOffset); void drawIndexedBaseVertex(uint32_t indexCount, uint32_t vertexOffset);
void drawIndexedIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride);
void drawIndexedInstanced(uint32_t indexCount, uint32_t instanceCount); void drawIndexedInstanced(uint32_t indexCount, uint32_t instanceCount);
void drawIndexedInstancedBaseVertex(uint32_t indexCount, void drawIndexedInstancedBaseVertex(uint32_t indexCount,
uint32_t instanceCount, uint32_t instanceCount,
...@@ -547,23 +548,21 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -547,23 +548,21 @@ class SecondaryCommandBuffer final : angle::NonCopyable
int32_t vertexOffset, int32_t vertexOffset,
uint32_t firstInstance); uint32_t firstInstance);
void drawIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride);
void drawInstanced(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex); void drawInstanced(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex);
void drawInstancedBaseInstance(uint32_t vertexCount, void drawInstancedBaseInstance(uint32_t vertexCount,
uint32_t instanceCount, uint32_t instanceCount,
uint32_t firstVertex, uint32_t firstVertex,
uint32_t firstInstance); uint32_t firstInstance);
void drawIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride);
void drawIndexedIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride);
void endQuery(VkQueryPool queryPool, uint32_t query); void endQuery(VkQueryPool queryPool, uint32_t query);
void endTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers);
void executionBarrier(VkPipelineStageFlags stageMask); void executionBarrier(VkPipelineStageFlags stageMask);
void fillBuffer(const Buffer &dstBuffer, void fillBuffer(const Buffer &dstBuffer,
...@@ -623,10 +622,6 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -623,10 +622,6 @@ class SecondaryCommandBuffer final : angle::NonCopyable
VkQueryPool queryPool, VkQueryPool queryPool,
uint32_t query); uint32_t query);
void beginTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers);
void endTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers);
// No-op for compatibility // No-op for compatibility
VkResult end() { return VK_SUCCESS; } VkResult end() { return VK_SUCCESS; }
...@@ -766,6 +761,17 @@ ANGLE_INLINE void SecondaryCommandBuffer::beginQuery(VkQueryPool queryPool, ...@@ -766,6 +761,17 @@ ANGLE_INLINE void SecondaryCommandBuffer::beginQuery(VkQueryPool queryPool,
paramStruct->flags = flags; paramStruct->flags = flags;
} }
ANGLE_INLINE void SecondaryCommandBuffer::beginTransformFeedback(uint32_t bufferCount,
const VkBuffer *counterBuffers)
{
uint8_t *writePtr;
size_t bufferSize = bufferCount * sizeof(VkBuffer);
BeginTransformFeedbackParams *paramStruct = initCommand<BeginTransformFeedbackParams>(
CommandID::BeginTransformFeedback, bufferSize, &writePtr);
paramStruct->bufferCount = bufferCount;
storePointerParameter(writePtr, counterBuffers, bufferSize);
}
ANGLE_INLINE void SecondaryCommandBuffer::bindComputePipeline(const Pipeline &pipeline) ANGLE_INLINE void SecondaryCommandBuffer::bindComputePipeline(const Pipeline &pipeline)
{ {
BindPipelineParams *paramStruct = BindPipelineParams *paramStruct =
...@@ -1032,6 +1038,18 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedBaseVertex(uint32_t indexCo ...@@ -1032,6 +1038,18 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedBaseVertex(uint32_t indexCo
paramStruct->vertexOffset = vertexOffset; paramStruct->vertexOffset = vertexOffset;
} }
ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
DrawIndexedIndirectParams *paramStruct =
initCommand<DrawIndexedIndirectParams>(CommandID::DrawIndexedIndirect);
paramStruct->buffer = buffer.getHandle();
paramStruct->offset = offset;
ASSERT(drawCount == 1);
}
ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedInstanced(uint32_t indexCount, ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedInstanced(uint32_t indexCount,
uint32_t instanceCount) uint32_t instanceCount)
{ {
...@@ -1070,6 +1088,20 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedInstancedBaseVertexBaseInst ...@@ -1070,6 +1088,20 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedInstancedBaseVertexBaseInst
paramStruct->firstInstance = firstInstance; paramStruct->firstInstance = firstInstance;
} }
ANGLE_INLINE void SecondaryCommandBuffer::drawIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
DrawIndirectParams *paramStruct = initCommand<DrawIndirectParams>(CommandID::DrawIndirect);
paramStruct->buffer = buffer.getHandle();
paramStruct->offset = offset;
// OpenGL ES doesn't have a way to specify a drawCount or stride, throw assert if something
// changes.
ASSERT(drawCount == 1);
}
ANGLE_INLINE void SecondaryCommandBuffer::drawInstanced(uint32_t vertexCount, ANGLE_INLINE void SecondaryCommandBuffer::drawInstanced(uint32_t vertexCount,
uint32_t instanceCount, uint32_t instanceCount,
uint32_t firstVertex) uint32_t firstVertex)
...@@ -1093,32 +1125,6 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawInstancedBaseInstance(uint32_t ver ...@@ -1093,32 +1125,6 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawInstancedBaseInstance(uint32_t ver
paramStruct->firstInstance = firstInstance; paramStruct->firstInstance = firstInstance;
} }
ANGLE_INLINE void SecondaryCommandBuffer::drawIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
DrawIndirectParams *paramStruct = initCommand<DrawIndirectParams>(CommandID::DrawIndirect);
paramStruct->buffer = buffer.getHandle();
paramStruct->offset = offset;
// OpenGL ES doesn't have a way to specify a drawCount or stride, throw assert if something
// changes.
ASSERT(drawCount == 1);
}
ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedIndirect(const Buffer &buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride)
{
DrawIndexedIndirectParams *paramStruct =
initCommand<DrawIndexedIndirectParams>(CommandID::DrawIndexedIndirect);
paramStruct->buffer = buffer.getHandle();
paramStruct->offset = offset;
ASSERT(drawCount == 1);
}
ANGLE_INLINE void SecondaryCommandBuffer::endQuery(VkQueryPool queryPool, uint32_t query) ANGLE_INLINE void SecondaryCommandBuffer::endQuery(VkQueryPool queryPool, uint32_t query)
{ {
EndQueryParams *paramStruct = initCommand<EndQueryParams>(CommandID::EndQuery); EndQueryParams *paramStruct = initCommand<EndQueryParams>(CommandID::EndQuery);
...@@ -1126,6 +1132,17 @@ ANGLE_INLINE void SecondaryCommandBuffer::endQuery(VkQueryPool queryPool, uint32 ...@@ -1126,6 +1132,17 @@ ANGLE_INLINE void SecondaryCommandBuffer::endQuery(VkQueryPool queryPool, uint32
paramStruct->query = query; paramStruct->query = query;
} }
ANGLE_INLINE void SecondaryCommandBuffer::endTransformFeedback(uint32_t bufferCount,
const VkBuffer *counterBuffers)
{
uint8_t *writePtr;
size_t bufferSize = bufferCount * sizeof(VkBuffer);
EndTransformFeedbackParams *paramStruct = initCommand<EndTransformFeedbackParams>(
CommandID::EndTransformFeedback, bufferSize, &writePtr);
paramStruct->bufferCount = bufferCount;
storePointerParameter(writePtr, counterBuffers, bufferSize);
}
ANGLE_INLINE void SecondaryCommandBuffer::executionBarrier(VkPipelineStageFlags stageMask) ANGLE_INLINE void SecondaryCommandBuffer::executionBarrier(VkPipelineStageFlags stageMask)
{ {
ExecutionBarrierParams *paramStruct = ExecutionBarrierParams *paramStruct =
...@@ -1299,28 +1316,6 @@ ANGLE_INLINE void SecondaryCommandBuffer::writeTimestamp(VkPipelineStageFlagBits ...@@ -1299,28 +1316,6 @@ ANGLE_INLINE void SecondaryCommandBuffer::writeTimestamp(VkPipelineStageFlagBits
paramStruct->queryPool = queryPool; paramStruct->queryPool = queryPool;
paramStruct->query = query; paramStruct->query = query;
} }
ANGLE_INLINE void SecondaryCommandBuffer::beginTransformFeedback(uint32_t bufferCount,
const VkBuffer *counterBuffers)
{
uint8_t *writePtr;
size_t bufferSize = bufferCount * sizeof(VkBuffer);
BeginTransformFeedbackParams *paramStruct = initCommand<BeginTransformFeedbackParams>(
CommandID::BeginTransformFeedback, bufferSize, &writePtr);
paramStruct->bufferCount = bufferCount;
storePointerParameter(writePtr, counterBuffers, bufferSize);
}
ANGLE_INLINE void SecondaryCommandBuffer::endTransformFeedback(uint32_t bufferCount,
const VkBuffer *counterBuffers)
{
uint8_t *writePtr;
size_t bufferSize = bufferCount * sizeof(VkBuffer);
EndTransformFeedbackParams *paramStruct = initCommand<EndTransformFeedbackParams>(
CommandID::EndTransformFeedback, bufferSize, &writePtr);
paramStruct->bufferCount = bufferCount;
storePointerParameter(writePtr, counterBuffers, bufferSize);
}
} // namespace priv } // namespace priv
} // namespace vk } // namespace vk
} // namespace rx } // namespace rx
......
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