Commit 45bb2b9c by Tobin Ehlis Committed by Commit Bot

Vulkan: Add debug label commands to SecondaryCommandBuffer

Add begin/end/insert DebugUtilsLabel commands to SecondaryCommandBuffer. Switch use of these commands to the outside renderpass command buffer instead of directly in the primary command buffer. This change should maintain the exact same sequence of commands but avoids some direct use of the primary command buffer. This is desirable for the threaded refactor where a worker thread will process the SecondaryCommandBuffer into a primary and the main thread will no longer use the primary command buffer directly. Note that because the debug utils label has an arbitrarily long string that we need to adjust the command allocation to allow for the string size exceeding the default allocation size. In this case we just make a single larger allocation to accommodate the command with the large string. Bug: b/154030403 Change-Id: Iab7832ffc3d38ce168da2d624bd5b5d5b33ec11b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2161955 Commit-Queue: Tobin Ehlis <tobine@google.com> Reviewed-by: 's avatarCharlie Lao <cclao@google.com>
parent d93b9559
...@@ -2423,12 +2423,12 @@ angle::Result ContextVk::insertEventMarker(GLsizei length, const char *marker) ...@@ -2423,12 +2423,12 @@ angle::Result ContextVk::insertEventMarker(GLsizei length, const char *marker)
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::PrimaryCommandBuffer *primary; vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(flushAndGetPrimaryCommandBuffer(&primary)); ANGLE_TRY(endRenderPassAndGetCommandBuffer(&outsideRenderPassCommandBuffer));
VkDebugUtilsLabelEXT label; VkDebugUtilsLabelEXT label;
vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label); vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label);
primary->insertDebugUtilsLabelEXT(label); outsideRenderPassCommandBuffer->insertDebugUtilsLabelEXT(label);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2438,12 +2438,12 @@ angle::Result ContextVk::pushGroupMarker(GLsizei length, const char *marker) ...@@ -2438,12 +2438,12 @@ angle::Result ContextVk::pushGroupMarker(GLsizei length, const char *marker)
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::PrimaryCommandBuffer *primary; vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(flushAndGetPrimaryCommandBuffer(&primary)); ANGLE_TRY(endRenderPassAndGetCommandBuffer(&outsideRenderPassCommandBuffer));
VkDebugUtilsLabelEXT label; VkDebugUtilsLabelEXT label;
vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label); vk::MakeDebugUtilsLabel(GL_DEBUG_SOURCE_APPLICATION, marker, &label);
primary->beginDebugUtilsLabelEXT(label); outsideRenderPassCommandBuffer->beginDebugUtilsLabelEXT(label);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2453,9 +2453,9 @@ angle::Result ContextVk::popGroupMarker() ...@@ -2453,9 +2453,9 @@ angle::Result ContextVk::popGroupMarker()
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::PrimaryCommandBuffer *primary; vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(flushAndGetPrimaryCommandBuffer(&primary)); ANGLE_TRY(endRenderPassAndGetCommandBuffer(&outsideRenderPassCommandBuffer));
primary->endDebugUtilsLabelEXT(); outsideRenderPassCommandBuffer->endDebugUtilsLabelEXT();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2468,12 +2468,12 @@ angle::Result ContextVk::pushDebugGroup(const gl::Context *context, ...@@ -2468,12 +2468,12 @@ angle::Result ContextVk::pushDebugGroup(const gl::Context *context,
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::PrimaryCommandBuffer *primary; vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(flushAndGetPrimaryCommandBuffer(&primary)); ANGLE_TRY(endRenderPassAndGetCommandBuffer(&outsideRenderPassCommandBuffer));
VkDebugUtilsLabelEXT label; VkDebugUtilsLabelEXT label;
vk::MakeDebugUtilsLabel(source, message.c_str(), &label); vk::MakeDebugUtilsLabel(source, message.c_str(), &label);
primary->insertDebugUtilsLabelEXT(label); outsideRenderPassCommandBuffer->insertDebugUtilsLabelEXT(label);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -2483,9 +2483,9 @@ angle::Result ContextVk::popDebugGroup(const gl::Context *context) ...@@ -2483,9 +2483,9 @@ angle::Result ContextVk::popDebugGroup(const gl::Context *context)
if (!mRenderer->enableDebugUtils()) if (!mRenderer->enableDebugUtils())
return angle::Result::Continue; return angle::Result::Continue;
vk::PrimaryCommandBuffer *primary; vk::CommandBuffer *outsideRenderPassCommandBuffer;
ANGLE_TRY(flushAndGetPrimaryCommandBuffer(&primary)); ANGLE_TRY(endRenderPassAndGetCommandBuffer(&outsideRenderPassCommandBuffer));
primary->endDebugUtilsLabelEXT(); outsideRenderPassCommandBuffer->endDebugUtilsLabelEXT();
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -631,6 +631,8 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -631,6 +631,8 @@ class ContextVk : public ContextImpl, public vk::Context
angle::Result endRenderPassAndGetCommandBuffer(vk::CommandBuffer **commandBufferOut) angle::Result endRenderPassAndGetCommandBuffer(vk::CommandBuffer **commandBufferOut)
{ {
// Only one command buffer should be active at a time
ASSERT(mOutsideRenderPassCommands.empty() || mRenderPassCommands.empty());
ANGLE_TRY(endRenderPass()); ANGLE_TRY(endRenderPass());
*commandBufferOut = &mOutsideRenderPassCommands.getCommandBuffer(); *commandBufferOut = &mOutsideRenderPassCommands.getCommandBuffer();
return angle::Result::Continue; return angle::Result::Continue;
...@@ -758,17 +760,6 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -758,17 +760,6 @@ class ContextVk : public ContextImpl, public vk::Context
double cpuTimestampS; double cpuTimestampS;
}; };
angle::Result flushAndGetPrimaryCommandBuffer(vk::PrimaryCommandBuffer **primaryCommands)
{
flushOutsideRenderPassCommands();
ANGLE_TRY(endRenderPass());
*primaryCommands = &mPrimaryCommands;
// We assume any calling code is going to record primary commands.
mHasPrimaryCommands = true;
return angle::Result::Continue;
}
angle::Result setupDraw(const gl::Context *context, angle::Result setupDraw(const gl::Context *context,
gl::PrimitiveMode mode, gl::PrimitiveMode mode,
GLint firstVertexOrInvalid, GLint firstVertexOrInvalid,
......
...@@ -25,6 +25,8 @@ const char *GetCommandString(CommandID id) ...@@ -25,6 +25,8 @@ const char *GetCommandString(CommandID id)
{ {
case CommandID::Invalid: case CommandID::Invalid:
return "--Invalid--"; return "--Invalid--";
case CommandID::BeginDebugUtilsLabel:
return "BeginDebugUtilsLabel";
case CommandID::BeginQuery: case CommandID::BeginQuery:
return "BeginQuery"; return "BeginQuery";
case CommandID::BeginTransformFeedback: case CommandID::BeginTransformFeedback:
...@@ -83,6 +85,8 @@ const char *GetCommandString(CommandID id) ...@@ -83,6 +85,8 @@ const char *GetCommandString(CommandID id)
return "DrawInstanced"; return "DrawInstanced";
case CommandID::DrawInstancedBaseInstance: case CommandID::DrawInstancedBaseInstance:
return "DrawInstancedBaseInstance"; return "DrawInstancedBaseInstance";
case CommandID::EndDebugUtilsLabel:
return "EndDebugUtilsLabel";
case CommandID::EndQuery: case CommandID::EndQuery:
return "EndQuery"; return "EndQuery";
case CommandID::EndTransformFeedback: case CommandID::EndTransformFeedback:
...@@ -93,6 +97,8 @@ const char *GetCommandString(CommandID id) ...@@ -93,6 +97,8 @@ const char *GetCommandString(CommandID id)
return "FillBuffer"; return "FillBuffer";
case CommandID::ImageBarrier: case CommandID::ImageBarrier:
return "ImageBarrier"; return "ImageBarrier";
case CommandID::InsertDebugUtilsLabel:
return "InsertDebugUtilsLabel";
case CommandID::MemoryBarrier: case CommandID::MemoryBarrier:
return "MemoryBarrier"; return "MemoryBarrier";
case CommandID::PipelineBarrier: case CommandID::PipelineBarrier:
...@@ -135,6 +141,20 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -135,6 +141,20 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
{ {
switch (currentCommand->id) switch (currentCommand->id)
{ {
case CommandID::BeginDebugUtilsLabel:
{
const DebugUtilsLabelParams *params =
getParamPtr<DebugUtilsLabelParams>(currentCommand);
const char *pLabelName = Offset<char>(params, sizeof(DebugUtilsLabelParams));
const VkDebugUtilsLabelEXT label = {
VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
nullptr,
pLabelName,
{params->color[0], params->color[1], params->color[2], params->color[3]}};
ASSERT(vkCmdBeginDebugUtilsLabelEXT);
vkCmdBeginDebugUtilsLabelEXT(cmdBuffer, &label);
break;
}
case CommandID::BeginQuery: case CommandID::BeginQuery:
{ {
const BeginQueryParams *params = getParamPtr<BeginQueryParams>(currentCommand); const BeginQueryParams *params = getParamPtr<BeginQueryParams>(currentCommand);
...@@ -380,6 +400,12 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -380,6 +400,12 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
params->firstVertex, params->firstInstance); params->firstVertex, params->firstInstance);
break; break;
} }
case CommandID::EndDebugUtilsLabel:
{
ASSERT(vkCmdEndDebugUtilsLabelEXT);
vkCmdEndDebugUtilsLabelEXT(cmdBuffer);
break;
}
case CommandID::EndQuery: case CommandID::EndQuery:
{ {
const EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand); const EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand);
...@@ -423,6 +449,20 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer) ...@@ -423,6 +449,20 @@ void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
0, nullptr, 0, nullptr, 1, &params->imageMemoryBarrier); 0, nullptr, 0, nullptr, 1, &params->imageMemoryBarrier);
break; break;
} }
case CommandID::InsertDebugUtilsLabel:
{
const DebugUtilsLabelParams *params =
getParamPtr<DebugUtilsLabelParams>(currentCommand);
const char *pLabelName = Offset<char>(params, sizeof(DebugUtilsLabelParams));
const VkDebugUtilsLabelEXT label = {
VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
nullptr,
pLabelName,
{params->color[0], params->color[1], params->color[2], params->color[3]}};
ASSERT(vkCmdInsertDebugUtilsLabelEXT);
vkCmdInsertDebugUtilsLabelEXT(cmdBuffer, &label);
break;
}
case CommandID::MemoryBarrier: case CommandID::MemoryBarrier:
{ {
const MemoryBarrierParams *params = const MemoryBarrierParams *params =
......
...@@ -30,6 +30,7 @@ enum class CommandID : uint16_t ...@@ -30,6 +30,7 @@ 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,
BeginDebugUtilsLabel,
BeginQuery, BeginQuery,
BeginTransformFeedback, BeginTransformFeedback,
BindComputePipeline, BindComputePipeline,
...@@ -59,11 +60,13 @@ enum class CommandID : uint16_t ...@@ -59,11 +60,13 @@ enum class CommandID : uint16_t
DrawIndirect, DrawIndirect,
DrawInstanced, DrawInstanced,
DrawInstancedBaseInstance, DrawInstancedBaseInstance,
EndDebugUtilsLabel,
EndQuery, EndQuery,
EndTransformFeedback, EndTransformFeedback,
ExecutionBarrier, ExecutionBarrier,
FillBuffer, FillBuffer,
ImageBarrier, ImageBarrier,
InsertDebugUtilsLabel,
MemoryBarrier, MemoryBarrier,
PipelineBarrier, PipelineBarrier,
PushConstants, PushConstants,
...@@ -207,6 +210,13 @@ struct CopyImageToBufferParams ...@@ -207,6 +210,13 @@ struct CopyImageToBufferParams
}; };
VERIFY_4_BYTE_ALIGNMENT(CopyImageToBufferParams) VERIFY_4_BYTE_ALIGNMENT(CopyImageToBufferParams)
// This is a common struct used by both begin & insert DebugUtilsLabelEXT() functions
struct DebugUtilsLabelParams
{
float color[4];
};
VERIFY_4_BYTE_ALIGNMENT(DebugUtilsLabelParams)
struct DispatchParams struct DispatchParams
{ {
uint32_t groupCountX; uint32_t groupCountX;
...@@ -298,6 +308,10 @@ struct DrawInstancedBaseInstanceParams ...@@ -298,6 +308,10 @@ struct DrawInstancedBaseInstanceParams
}; };
VERIFY_4_BYTE_ALIGNMENT(DrawInstancedBaseInstanceParams) VERIFY_4_BYTE_ALIGNMENT(DrawInstancedBaseInstanceParams)
// A special struct used with commands that don't have params
struct EmptyParams
{};
struct EndQueryParams struct EndQueryParams
{ {
VkQueryPool queryPool; VkQueryPool queryPool;
...@@ -444,6 +458,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -444,6 +458,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable
static constexpr bool ExecutesInline() { return true; } static constexpr bool ExecutesInline() { return true; }
// Add commands // Add commands
void beginDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &label);
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 beginTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers);
...@@ -558,6 +574,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -558,6 +574,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable
uint32_t firstVertex, uint32_t firstVertex,
uint32_t firstInstance); uint32_t firstInstance);
void endDebugUtilsLabelEXT();
void endQuery(VkQueryPool queryPool, uint32_t query); void endQuery(VkQueryPool queryPool, uint32_t query);
void endTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers); void endTransformFeedback(uint32_t counterBufferCount, const VkBuffer *pCounterBuffers);
...@@ -573,6 +591,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -573,6 +591,8 @@ class SecondaryCommandBuffer final : angle::NonCopyable
VkPipelineStageFlags dstStageMask, VkPipelineStageFlags dstStageMask,
const VkImageMemoryBarrier &imageMemoryBarrier); const VkImageMemoryBarrier &imageMemoryBarrier);
void insertDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &label);
void memoryBarrier(VkPipelineStageFlags srcStageMask, void memoryBarrier(VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask, VkPipelineStageFlags dstStageMask,
const VkMemoryBarrier *memoryBarrier); const VkMemoryBarrier *memoryBarrier);
...@@ -664,6 +684,7 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -664,6 +684,7 @@ class SecondaryCommandBuffer final : angle::NonCopyable
bool empty() const { return mCommands.size() == 0 || mCommands[0]->id == CommandID::Invalid; } bool empty() const { return mCommands.size() == 0 || mCommands[0]->id == CommandID::Invalid; }
private: private:
void commonDebugUtilsLabel(CommandID cmd, const VkDebugUtilsLabelEXT &label);
template <class StructType> template <class StructType>
ANGLE_INLINE StructType *commonInit(CommandID cmdID, size_t allocationSize) ANGLE_INLINE StructType *commonInit(CommandID cmdID, size_t allocationSize)
{ {
...@@ -679,11 +700,11 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -679,11 +700,11 @@ class SecondaryCommandBuffer final : angle::NonCopyable
reinterpret_cast<CommandHeader *>(mCurrentWritePointer)->id = CommandID::Invalid; reinterpret_cast<CommandHeader *>(mCurrentWritePointer)->id = CommandID::Invalid;
return Offset<StructType>(header, sizeof(CommandHeader)); return Offset<StructType>(header, sizeof(CommandHeader));
} }
ANGLE_INLINE void allocateNewBlock() ANGLE_INLINE void allocateNewBlock(size_t blockSize = kBlockSize)
{ {
ASSERT(mAllocator); ASSERT(mAllocator);
mCurrentWritePointer = mAllocator->fastAllocate(kBlockSize); mCurrentWritePointer = mAllocator->fastAllocate(blockSize);
mCurrentBytesRemaining = kBlockSize; mCurrentBytesRemaining = blockSize;
mCommands.push_back(reinterpret_cast<CommandHeader *>(mCurrentWritePointer)); mCommands.push_back(reinterpret_cast<CommandHeader *>(mCurrentWritePointer));
} }
...@@ -698,9 +719,19 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -698,9 +719,19 @@ class SecondaryCommandBuffer final : angle::NonCopyable
constexpr size_t fixedAllocationSize = sizeof(StructType) + sizeof(CommandHeader); constexpr size_t fixedAllocationSize = sizeof(StructType) + sizeof(CommandHeader);
const size_t allocationSize = fixedAllocationSize + variableSize; const size_t allocationSize = fixedAllocationSize + variableSize;
// Make sure we have enough room to mark follow-on header "Invalid" // Make sure we have enough room to mark follow-on header "Invalid"
if (mCurrentBytesRemaining < (allocationSize + sizeof(CommandHeader))) const size_t requiredSize = allocationSize + sizeof(CommandHeader);
if (mCurrentBytesRemaining < requiredSize)
{ {
allocateNewBlock(); // variable size command can potentially exceed default cmd allocation blockSize
if (requiredSize <= kBlockSize)
allocateNewBlock();
else
{
// Make sure allocation is 4-byte aligned
const size_t alignedSize = roundUp<size_t>(requiredSize, 4);
ASSERT((alignedSize % 4) == 0);
allocateNewBlock(alignedSize);
}
} }
*variableDataPtr = Offset<uint8_t>(mCurrentWritePointer, fixedAllocationSize); *variableDataPtr = Offset<uint8_t>(mCurrentWritePointer, fixedAllocationSize);
return commonInit<StructType>(cmdID, allocationSize); return commonInit<StructType>(cmdID, allocationSize);
...@@ -710,10 +741,13 @@ class SecondaryCommandBuffer final : angle::NonCopyable ...@@ -710,10 +741,13 @@ class SecondaryCommandBuffer final : angle::NonCopyable
template <class StructType> template <class StructType>
ANGLE_INLINE StructType *initCommand(CommandID cmdID) ANGLE_INLINE StructType *initCommand(CommandID cmdID)
{ {
constexpr size_t allocationSize = sizeof(StructType) + sizeof(CommandHeader); constexpr size_t paramSize =
std::is_same<StructType, EmptyParams>::value ? 0 : sizeof(StructType);
constexpr size_t allocationSize = paramSize + sizeof(CommandHeader);
// Make sure we have enough room to mark follow-on header "Invalid" // Make sure we have enough room to mark follow-on header "Invalid"
if (mCurrentBytesRemaining < (allocationSize + sizeof(CommandHeader))) if (mCurrentBytesRemaining < (allocationSize + sizeof(CommandHeader)))
{ {
ASSERT((allocationSize + sizeof(CommandHeader)) < kBlockSize);
allocateNewBlock(); allocateNewBlock();
} }
return commonInit<StructType>(cmdID, allocationSize); return commonInit<StructType>(cmdID, allocationSize);
...@@ -750,6 +784,27 @@ ANGLE_INLINE SecondaryCommandBuffer::SecondaryCommandBuffer() ...@@ -750,6 +784,27 @@ ANGLE_INLINE SecondaryCommandBuffer::SecondaryCommandBuffer()
{} {}
ANGLE_INLINE SecondaryCommandBuffer::~SecondaryCommandBuffer() {} ANGLE_INLINE SecondaryCommandBuffer::~SecondaryCommandBuffer() {}
// begin and insert DebugUtilsLabelEXT funcs share this same function body
ANGLE_INLINE void SecondaryCommandBuffer::commonDebugUtilsLabel(CommandID cmd,
const VkDebugUtilsLabelEXT &label)
{
uint8_t *writePtr;
const size_t stringSize = strlen(label.pLabelName) + 1;
const size_t alignedStringSize = roundUp<size_t>(stringSize, 4);
DebugUtilsLabelParams *paramStruct =
initCommand<DebugUtilsLabelParams>(cmd, alignedStringSize, &writePtr);
paramStruct->color[0] = label.color[0];
paramStruct->color[1] = label.color[1];
paramStruct->color[2] = label.color[2];
paramStruct->color[3] = label.color[3];
storePointerParameter(writePtr, label.pLabelName, alignedStringSize);
}
ANGLE_INLINE void SecondaryCommandBuffer::beginDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &label)
{
commonDebugUtilsLabel(CommandID::BeginDebugUtilsLabel, label);
}
ANGLE_INLINE void SecondaryCommandBuffer::beginQuery(VkQueryPool queryPool, ANGLE_INLINE void SecondaryCommandBuffer::beginQuery(VkQueryPool queryPool,
uint32_t query, uint32_t query,
VkQueryControlFlags flags) VkQueryControlFlags flags)
...@@ -1124,6 +1179,11 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawInstancedBaseInstance(uint32_t ver ...@@ -1124,6 +1179,11 @@ ANGLE_INLINE void SecondaryCommandBuffer::drawInstancedBaseInstance(uint32_t ver
paramStruct->firstInstance = firstInstance; paramStruct->firstInstance = firstInstance;
} }
ANGLE_INLINE void SecondaryCommandBuffer::endDebugUtilsLabelEXT()
{
initCommand<EmptyParams>(CommandID::EndDebugUtilsLabel);
}
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);
...@@ -1173,6 +1233,12 @@ ANGLE_INLINE void SecondaryCommandBuffer::imageBarrier( ...@@ -1173,6 +1233,12 @@ ANGLE_INLINE void SecondaryCommandBuffer::imageBarrier(
paramStruct->imageMemoryBarrier = imageMemoryBarrier; paramStruct->imageMemoryBarrier = imageMemoryBarrier;
} }
ANGLE_INLINE void SecondaryCommandBuffer::insertDebugUtilsLabelEXT(
const VkDebugUtilsLabelEXT &label)
{
commonDebugUtilsLabel(CommandID::InsertDebugUtilsLabel, label);
}
ANGLE_INLINE void SecondaryCommandBuffer::memoryBarrier(VkPipelineStageFlags srcStageMask, ANGLE_INLINE void SecondaryCommandBuffer::memoryBarrier(VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask, VkPipelineStageFlags dstStageMask,
const VkMemoryBarrier *memoryBarrier) const VkMemoryBarrier *memoryBarrier)
......
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