PipelineImpl.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <anki/gr/vulkan/PipelineImpl.h>
  6. #include <anki/gr/Pipeline.h>
  7. #include <anki/gr/vulkan/ShaderImpl.h>
  8. #include <anki/gr/vulkan/GrManagerImpl.h>
  9. namespace anki
  10. {
  11. //==============================================================================
  12. // Misc =
  13. //==============================================================================
  14. /// Pre-filled VkGraphicsPipelineCreateInfo
  15. class FilledGraphicsPipelineCreateInfo : public VkGraphicsPipelineCreateInfo
  16. {
  17. public:
  18. Array<VkPipelineShaderStageCreateInfo, U(ShaderType::COUNT) - 1> m_stages;
  19. VkPipelineVertexInputStateCreateInfo m_vertex;
  20. Array<VkVertexInputBindingDescription, MAX_VERTEX_ATTRIBUTES> m_bindings;
  21. Array<VkVertexInputAttributeDescription, MAX_VERTEX_ATTRIBUTES> m_attribs;
  22. VkPipelineInputAssemblyStateCreateInfo m_ia;
  23. VkPipelineTessellationStateCreateInfo m_tess;
  24. VkPipelineViewportStateCreateInfo m_vp;
  25. VkPipelineRasterizationStateCreateInfo m_rast;
  26. VkPipelineMultisampleStateCreateInfo m_ms;
  27. VkPipelineDepthStencilStateCreateInfo m_ds;
  28. VkPipelineColorBlendStateCreateInfo m_color;
  29. VkPipelineDynamicStateCreateInfo m_dyn;
  30. FilledGraphicsPipelineCreateInfo()
  31. {
  32. memset(this, 0, sizeof(*this));
  33. sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
  34. for(VkPipelineShaderStageCreateInfo& stage : m_stages)
  35. {
  36. stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  37. }
  38. m_vertex.sType =
  39. VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
  40. m_ia.sType =
  41. VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
  42. m_tess.sType =
  43. VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
  44. m_vp.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
  45. m_rast.sType =
  46. VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
  47. m_ms.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
  48. m_ds.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
  49. m_color.sType =
  50. VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
  51. m_dyn.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
  52. }
  53. };
  54. static const FilledGraphicsPipelineCreateInfo FILLED;
  55. //==============================================================================
  56. // PipelineImpl =
  57. //==============================================================================
  58. //==============================================================================
  59. Error PipelineImpl::initGraphics(const PipelineInitInfo& init)
  60. {
  61. FilledGraphicsPipelineCreateInfo ci = FILLED;
  62. ci.pStages = &ci.m_stages[0];
  63. initShaders(init, ci);
  64. ci.pVertexInputState = initVertexStage(init.m_vertex, ci.m_vertex);
  65. ci.layout = getGrManagerImpl().m_globalPipelineLayout;
  66. ci.renderPass = getGrManagerImpl().getOrCreateCompatibleRenderPass(init);
  67. ci.basePipelineHandle = VK_NULL_HANDLE;
  68. return ErrorCode::NONE;
  69. }
  70. //==============================================================================
  71. void PipelineImpl::initShaders(
  72. const PipelineInitInfo& init, VkGraphicsPipelineCreateInfo& ci)
  73. {
  74. ci.stageCount = 0;
  75. for(ShaderType type = ShaderType::FIRST_GRAPHICS;
  76. type <= ShaderType::LAST_GRAPHICS;
  77. ++type)
  78. {
  79. if(!init.m_shaders[type].isCreated())
  80. {
  81. continue;
  82. }
  83. ANKI_ASSERT(
  84. init.m_shaders[type]->getImplementation().m_shaderType == type);
  85. ANKI_ASSERT(init.m_shaders[type]->getImplementation().m_handle);
  86. VkPipelineShaderStageCreateInfo& stage =
  87. const_cast<VkPipelineShaderStageCreateInfo&>(
  88. ci.pStages[ci.stageCount]);
  89. ANKI_VK_MEMSET_DBG(stage);
  90. stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  91. stage.pNext = nullptr;
  92. stage.flags = 0;
  93. stage.stage = VkShaderStageFlagBits(1u << U(type));
  94. stage.module = init.m_shaders[type]->getImplementation().m_handle;
  95. stage.pName = "main";
  96. stage.pSpecializationInfo = nullptr;
  97. ++ci.stageCount;
  98. }
  99. }
  100. //==============================================================================
  101. VkPipelineVertexInputStateCreateInfo* PipelineImpl::initVertexStage(
  102. const VertexStateInfo& vertex, VkPipelineVertexInputStateCreateInfo& ci)
  103. {
  104. if(vertex.m_bindingCount == 0 && vertex.m_attributeCount == 0)
  105. {
  106. // Early out
  107. return nullptr;
  108. }
  109. // First the bindings
  110. ci.vertexBindingDescriptionCount = vertex.m_bindingCount;
  111. for(U i = 0; i < ci.vertexBindingDescriptionCount; ++i)
  112. {
  113. VkVertexInputBindingDescription& vkBinding =
  114. const_cast<VkVertexInputBindingDescription&>(
  115. ci.pVertexBindingDescriptions[i]);
  116. vkBinding.binding = i;
  117. vkBinding.stride = vertex.m_bindings[i].m_stride;
  118. switch(vertex.m_bindings[i].m_stepRate)
  119. {
  120. case VertexStepRate::VERTEX:
  121. vkBinding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
  122. break;
  123. case VertexStepRate::INSTANCE:
  124. vkBinding.inputRate = VK_VERTEX_INPUT_RATE_INSTANCE;
  125. break;
  126. default:
  127. ANKI_ASSERT(0);
  128. }
  129. }
  130. // Then the attributes
  131. ci.vertexAttributeDescriptionCount = vertex.m_attributeCount;
  132. for(U i = 0; i < ci.vertexAttributeDescriptionCount; ++i)
  133. {
  134. VkVertexInputAttributeDescription& vkAttrib =
  135. const_cast<VkVertexInputAttributeDescription&>(
  136. ci.pVertexAttributeDescriptions[i]);
  137. vkAttrib.location = 0;
  138. vkAttrib.binding = vertex.m_attributes[i].m_binding;
  139. vkAttrib.format = convertFormat(vertex.m_attributes[i].m_format);
  140. vkAttrib.offset = vertex.m_attributes[i].m_offset;
  141. }
  142. return &ci;
  143. }
  144. //==============================================================================
  145. VkPipelineInputAssemblyStateCreateInfo* PipelineImpl::initInputAssemblyState(
  146. const InputAssemblerStateInfo& ia,
  147. VkPipelineInputAssemblyStateCreateInfo& ci)
  148. {
  149. // TODO
  150. return &ci;
  151. }
  152. //==============================================================================
  153. Error PipelineImpl::init(const PipelineInitInfo& init)
  154. {
  155. return ErrorCode::NONE;
  156. }
  157. } // end namespace anki