VkCommandBuffer.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Gr/CommandBuffer.h>
  7. #include <AnKi/Gr/Vulkan/VkCommandBufferFactory.h>
  8. #include <AnKi/Gr/CommandBuffer.h>
  9. #include <AnKi/Gr/Texture.h>
  10. #include <AnKi/Gr/Buffer.h>
  11. #include <AnKi/Gr/Shader.h>
  12. #include <AnKi/Gr/Vulkan/VkPipelineQuery.h>
  13. #include <AnKi/Gr/Vulkan/VkBuffer.h>
  14. #include <AnKi/Gr/Vulkan/VkTexture.h>
  15. #include <AnKi/Gr/Vulkan/VkGraphicsState.h>
  16. #include <AnKi/Gr/Vulkan/VkGrManager.h>
  17. #include <AnKi/Util/List.h>
  18. namespace anki {
  19. #define ANKI_BATCH_COMMANDS 1
  20. // Forward
  21. class CommandBufferInitInfo;
  22. /// @addtogroup vulkan
  23. /// @{
  24. /// Command buffer implementation.
  25. class CommandBufferImpl final : public CommandBuffer
  26. {
  27. friend class CommandBuffer;
  28. public:
  29. /// Default constructor
  30. CommandBufferImpl(CString name)
  31. : CommandBuffer(name)
  32. {
  33. }
  34. ~CommandBufferImpl();
  35. Error init(const CommandBufferInitInfo& init);
  36. const MicroCommandBufferPtr& getMicroCommandBuffer()
  37. {
  38. return m_microCmdb;
  39. }
  40. VkCommandBuffer getHandle() const
  41. {
  42. ANKI_ASSERT(m_handle);
  43. return m_handle;
  44. }
  45. Bool renderedToDefaultFramebuffer() const
  46. {
  47. return m_renderedToDefaultFb;
  48. }
  49. Bool isEmpty() const
  50. {
  51. return m_empty;
  52. }
  53. void writeTimestampInternal(TimestampQuery* query);
  54. // To enable using Anki's commandbuffers for external workloads
  55. void beginRecordingExt()
  56. {
  57. commandCommon();
  58. }
  59. void endRecording();
  60. Bool isFinalized() const
  61. {
  62. return m_finalized;
  63. }
  64. #if ANKI_ASSERTIONS_ENABLED
  65. void setSubmitted()
  66. {
  67. ANKI_ASSERT(!m_submitted);
  68. m_submitted = true;
  69. }
  70. #endif
  71. private:
  72. StackMemoryPool m_pool;
  73. MicroCommandBufferPtr m_microCmdb;
  74. VkCommandBuffer m_handle = VK_NULL_HANDLE;
  75. ThreadId m_tid = ~ThreadId(0);
  76. Bool m_renderedToDefaultFb : 1 = false;
  77. Bool m_finalized : 1 = false;
  78. Bool m_empty : 1 = true;
  79. Bool m_beganRecording : 1 = false;
  80. Bool m_debugMarkers : 1 = false;
  81. #if ANKI_ASSERTIONS_ENABLED
  82. U32 m_commandCount = 0;
  83. U32 m_debugMarkersPushed = 0;
  84. Bool m_submitted = false;
  85. Bool m_insideRenderpass = false;
  86. #endif
  87. GraphicsStateTracker m_graphicsState;
  88. DescriptorState m_descriptorState;
  89. ShaderProgramImpl* m_graphicsProg ANKI_DEBUG_CODE(= nullptr); ///< Last bound graphics program
  90. ShaderProgramImpl* m_computeProg ANKI_DEBUG_CODE(= nullptr);
  91. ShaderProgramImpl* m_rtProg ANKI_DEBUG_CODE(= nullptr);
  92. /// Some common operations per command.
  93. ANKI_FORCE_INLINE void commandCommon()
  94. {
  95. ANKI_ASSERT(!m_finalized);
  96. #if ANKI_EXTRA_CHECKS
  97. ++m_commandCount;
  98. #endif
  99. m_empty = false;
  100. if(!m_beganRecording) [[unlikely]]
  101. {
  102. beginRecording();
  103. m_beganRecording = true;
  104. }
  105. ANKI_ASSERT(Thread::getCurrentThreadId() == m_tid && "Commands must be recorder and flushed by the thread this command buffer was created");
  106. ANKI_ASSERT(m_handle);
  107. }
  108. void drawcallCommon();
  109. void dispatchCommon();
  110. void setImageBarrier(VkPipelineStageFlags srcStage, VkAccessFlags srcAccess, VkImageLayout prevLayout, VkPipelineStageFlags dstStage,
  111. VkAccessFlags dstAccess, VkImageLayout newLayout, VkImage img, const VkImageSubresourceRange& range);
  112. void beginRecording();
  113. const ShaderProgramImpl& getBoundProgram()
  114. {
  115. if(m_graphicsProg)
  116. {
  117. ANKI_ASSERT(m_computeProg == nullptr && m_rtProg == nullptr);
  118. return *m_graphicsProg;
  119. }
  120. else if(m_computeProg)
  121. {
  122. ANKI_ASSERT(m_graphicsProg == nullptr && m_rtProg == nullptr);
  123. return *m_computeProg;
  124. }
  125. else
  126. {
  127. ANKI_ASSERT(m_graphicsProg == nullptr && m_computeProg == nullptr && m_rtProg != nullptr);
  128. return *m_rtProg;
  129. }
  130. }
  131. void traceRaysInternal(const BufferView& sbtBuffer, U32 sbtRecordSize32, U32 hitGroupSbtRecordCount, U32 rayTypeCount, U32 width, U32 height,
  132. U32 depth, BufferView argsBuff);
  133. };
  134. /// @}
  135. } // end namespace anki