Home | History | Annotate | Download | only in Vulkan
      1 // Copyright 2018 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef VK_COMMAND_BUFFER_HPP_
     16 #define VK_COMMAND_BUFFER_HPP_
     17 
     18 #include "VkConfig.h"
     19 #include "VkObject.hpp"
     20 #include <memory>
     21 #include <vector>
     22 
     23 namespace sw
     24 {
     25 	class Renderer;
     26 }
     27 
     28 namespace vk
     29 {
     30 
     31 class Framebuffer;
     32 class Pipeline;
     33 class RenderPass;
     34 
     35 class CommandBuffer
     36 {
     37 public:
     38 	static constexpr VkSystemAllocationScope GetAllocationScope() { return VK_SYSTEM_ALLOCATION_SCOPE_OBJECT; }
     39 
     40 	CommandBuffer(VkCommandBufferLevel pLevel);
     41 
     42 	void destroy(const VkAllocationCallbacks* pAllocator);
     43 
     44 	VkResult begin(VkCommandBufferUsageFlags flags, const VkCommandBufferInheritanceInfo* pInheritanceInfo);
     45 	VkResult end();
     46 	VkResult reset(VkCommandPoolResetFlags flags);
     47 
     48 	void beginRenderPass(VkRenderPass renderPass, VkFramebuffer framebuffer, VkRect2D renderArea,
     49 	                     uint32_t clearValueCount, const VkClearValue* pClearValues, VkSubpassContents contents);
     50 	void nextSubpass(VkSubpassContents contents);
     51 	void endRenderPass();
     52 	void executeCommands(uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);
     53 
     54 	void setDeviceMask(uint32_t deviceMask);
     55 	void dispatchBase(uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
     56 	                  uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
     57 
     58 	void pipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
     59 	                     uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
     60 	                     uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
     61 	                     uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);
     62 	void bindPipeline(VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
     63 	void bindVertexBuffers(uint32_t firstBinding, uint32_t bindingCount,
     64 	                       const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
     65 
     66 	void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
     67 	void endQuery(VkQueryPool queryPool, uint32_t query);
     68 	void resetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
     69 	void writeTimestamp(VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query);
     70 	void copyQueryPoolResults(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
     71 	                          VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags);
     72 	void pushConstants(VkPipelineLayout layout, VkShaderStageFlags stageFlags,
     73 	                   uint32_t offset, uint32_t size, const void* pValues);
     74 
     75 	void setViewport(uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports);
     76 	void setScissor(uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors);
     77 	void setLineWidth(float lineWidth);
     78 	void setDepthBias(float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor);
     79 	void setBlendConstants(const float blendConstants[4]);
     80 	void setDepthBounds(float minDepthBounds, float maxDepthBounds);
     81 	void setStencilCompareMask(VkStencilFaceFlags faceMask, uint32_t compareMask);
     82 	void setStencilWriteMask(VkStencilFaceFlags faceMask, uint32_t writeMask);
     83 	void setStencilReference(VkStencilFaceFlags faceMask, uint32_t reference);
     84 	void bindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
     85 		uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets,
     86 		uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);
     87 	void bindIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
     88 	void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
     89 	void dispatchIndirect(VkBuffer buffer, VkDeviceSize offset);
     90 	void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions);
     91 	void copyImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
     92 		uint32_t regionCount, const VkImageCopy* pRegions);
     93 	void blitImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
     94 		uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter);
     95 	void copyBufferToImage(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout,
     96 		uint32_t regionCount, const VkBufferImageCopy* pRegions);
     97 	void copyImageToBuffer(VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
     98 		uint32_t regionCount, const VkBufferImageCopy* pRegions);
     99 	void updateBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);
    100 	void fillBuffer(VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data);
    101 	void clearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor,
    102 		uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
    103 	void clearDepthStencilImage(VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil,
    104 		uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
    105 	void clearAttachments(uint32_t attachmentCount, const VkClearAttachment* pAttachments,
    106 		uint32_t rectCount, const VkClearRect* pRects);
    107 	void resolveImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
    108 		uint32_t regionCount, const VkImageResolve* pRegions);
    109 	void setEvent(VkEvent event, VkPipelineStageFlags stageMask);
    110 	void resetEvent(VkEvent event, VkPipelineStageFlags stageMask);
    111 	void waitEvents(uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask,
    112 		VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
    113 		uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
    114 		uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);
    115 
    116 	void draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);
    117 	void drawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);
    118 	void drawIndirect(VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);
    119 	void drawIndexedIndirect(VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);
    120 
    121 	// TODO(sugoi): Move ExecutionState out of CommandBuffer (possibly into Device)
    122 	struct ExecutionState
    123 	{
    124 		sw::Renderer* renderer = nullptr;
    125 		RenderPass* renderPass = nullptr;
    126 		Framebuffer* renderPassFramebuffer = nullptr;
    127 		Pipeline* pipelines[VK_PIPELINE_BIND_POINT_RANGE_SIZE] = {};
    128 
    129 		struct VertexInputBinding
    130 		{
    131 			VkBuffer buffer;
    132 			VkDeviceSize offset;
    133 		};
    134 		VertexInputBinding vertexInputBindings[MAX_VERTEX_INPUT_BINDINGS] = {};
    135 	};
    136 
    137 	void submit(CommandBuffer::ExecutionState& executionState);
    138 
    139 	class Command;
    140 private:
    141 	void resetState();
    142 	template<typename T, typename... Args> void addCommand(Args&&... args);
    143 
    144 	enum State { INITIAL, RECORDING, EXECUTABLE, PENDING, INVALID };
    145 	State state = INITIAL;
    146 	VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
    147 
    148 	// FIXME (b/119409619): replace this vector by an allocator so we can control all memory allocations
    149 	std::vector<std::unique_ptr<Command>>* commands;
    150 };
    151 
    152 using DispatchableCommandBuffer = DispatchableObject<CommandBuffer, VkCommandBuffer>;
    153 
    154 static inline CommandBuffer* Cast(VkCommandBuffer object)
    155 {
    156 	return DispatchableCommandBuffer::Cast(object);
    157 }
    158 
    159 } // namespace vk
    160 
    161 #endif // VK_COMMAND_BUFFER_HPP_
    162