Просмотр исходного кода

Vulkan: Adding compute pipeline support

Panagiotis Christopoulos Charitos 9 лет назад
Родитель
Сommit
6277630f32
3 измененных файлов с 62 добавлено и 7 удалено
  1. 4 2
      include/anki/gr/vulkan/PipelineImpl.h
  2. 26 0
      src/gr/vulkan/Pipeline.cpp
  3. 32 5
      src/gr/vulkan/PipelineImpl.cpp

+ 4 - 2
include/anki/gr/vulkan/PipelineImpl.h

@@ -35,10 +35,12 @@ public:
 
 	~PipelineImpl();
 
-	ANKI_USE_RESULT Error init(const PipelineInitInfo& init);
+	void init(const PipelineInitInfo& init);
 
 private:
-	ANKI_USE_RESULT Error initGraphics(const PipelineInitInfo& init);
+	void initGraphics(const PipelineInitInfo& init);
+
+	void initCompute(const PipelineInitInfo& init);
 
 	void initShaders(
 		const PipelineInitInfo& init, VkGraphicsPipelineCreateInfo& ci);

+ 26 - 0
src/gr/vulkan/Pipeline.cpp

@@ -4,3 +4,29 @@
 // http://www.anki3d.org/LICENSE
 
 #include <anki/gr/Pipeline.h>
+#include <anki/gr/vulkan/PipelineImpl.h>
+#include <anki/core/Trace.h>
+
+namespace anki
+{
+
+//==============================================================================
+Pipeline::Pipeline(GrManager* manager, U64 hash)
+	: GrObject(manager, CLASS_TYPE, hash)
+{
+	ANKI_TRACE_INC_COUNTER(GR_PIPELINES_CREATED, 1);
+}
+
+//==============================================================================
+Pipeline::~Pipeline()
+{
+}
+
+//==============================================================================
+void Pipeline::init(const PipelineInitInfo& init)
+{
+	m_impl.reset(getAllocator().newInstance<PipelineImpl>(&getManager()));
+	m_impl->init(init);
+}
+
+} // end namespace anki

+ 32 - 5
src/gr/vulkan/PipelineImpl.cpp

@@ -78,7 +78,7 @@ static const FilledGraphicsPipelineCreateInfo FILLED;
 //==============================================================================
 
 //==============================================================================
-Error PipelineImpl::initGraphics(const PipelineInitInfo& init)
+void PipelineImpl::initGraphics(const PipelineInitInfo& init)
 {
 	FilledGraphicsPipelineCreateInfo ci = FILLED;
 
@@ -105,8 +105,29 @@ Error PipelineImpl::initGraphics(const PipelineInitInfo& init)
 
 	ANKI_VK_CHECK(vkCreateGraphicsPipelines(
 		getDevice(), nullptr, 1, &ci, nullptr, &m_handle));
+}
+
+//==============================================================================
+void PipelineImpl::initCompute(const PipelineInitInfo& init)
+{
+	VkComputePipelineCreateInfo ci;
+	ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
+	ci.pNext = nullptr;
+	ci.layout = getGrManagerImpl().m_globalPipelineLayout;
+	ci.basePipelineHandle = VK_NULL_HANDLE;
 
-	return ErrorCode::NONE;
+	VkPipelineShaderStageCreateInfo& stage = ci.stage;
+	stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+	stage.pNext = nullptr;
+	stage.flags = 0;
+	stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
+	stage.module = 
+		init.m_shaders[ShaderType::COMPUTE]->getImplementation().m_handle;
+	stage.pName = "main";
+	stage.pSpecializationInfo = nullptr;
+
+	ANKI_VK_CHECK(vkCreateComputePipelines(
+		getDevice(), nullptr, 1, &ci, nullptr, &m_handle));
 }
 
 //==============================================================================
@@ -288,10 +309,16 @@ VkPipelineColorBlendStateCreateInfo* PipelineImpl::initColorState(
 }
 
 //==============================================================================
-Error PipelineImpl::init(const PipelineInitInfo& init)
+void PipelineImpl::init(const PipelineInitInfo& init)
 {
-
-	return ErrorCode::NONE;
+	if(init.m_shaders[ShaderType::COMPUTE].isCreated())
+	{
+		initCompute(init);
+	}
+	else
+	{
+		initGraphics(init);
+	}
 }
 
 } // end namespace anki