選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

170 行
7.2 KiB

  1. unit uvkuPipelineFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuPipeline, uvkuFactoryBase, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuPipelineShaderStageCreateInfo = class(TvkuStructure)
  10. public
  11. Flags: VkPipelineShaderStageCreateFlags;
  12. Stage: TVkShaderStageFlagBits;
  13. Module: VkShaderModule;
  14. Name: String;
  15. function GetStructure: TVkPipelineShaderStageCreateInfo;
  16. procedure SetStructure(const aData: TVkPipelineShaderStageCreateInfo);
  17. end;
  18. TvkuPipelineShaderStageCreateInfoList = specialize TvkuObjList<TvkuPipelineShaderStageCreateInfo>;
  19. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. TvkuPipelineFactory = class(TvkuDeviceObjFactory)
  21. private
  22. fFlags: VkPipelineCreateFlags;
  23. fLayout: VkPipelineLayout;
  24. fBasePipelineHandle: VkPipeline;
  25. fBasePipelineIndex: VkInt32;
  26. public
  27. property Flags: VkPipelineCreateFlags read fFlags write fFlags;
  28. property Layout: VkPipelineLayout read fLayout write fLayout;
  29. property BasePipelineHandle: VkPipeline read fBasePipelineHandle write fBasePipelineHandle;
  30. property BasePipelineIndex: VkInt32 read fBasePipelineIndex write fBasePipelineIndex;
  31. end;
  32. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. TvkuGraphicsPipelineFactory = class(TvkuPipelineFactory)
  34. private
  35. fRenderPass: VkRenderPass;
  36. fSubPass: VkUint32;
  37. fStages: TvkuPipelineShaderStageCreateInfoList;
  38. fvkStages: TVkPipelineShaderStageCreateInfoArr;
  39. public
  40. property RenderPass: VkRenderPass read fRenderPass write fRenderPass;
  41. property SubPass: VkUint32 read fSubPass write fSubPass;
  42. property Stages: TvkuPipelineShaderStageCreateInfoList read fStages;
  43. function GetStructure: TVkGraphicsPipelineCreateInfo;
  44. procedure SetStructure(const aData: TVkGraphicsPipelineCreateInfo);
  45. function CreateGraphicsPipeline(const aPipelineCache: VkPipelineCache): TvkuGraphicsPipeline;
  46. procedure AfterConstruction; override;
  47. procedure BeforeDestruction; override;
  48. end;
  49. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. TvkuComputePipelineFactory = class(TvkuPipelineFactory)
  51. end;
  52. implementation
  53. uses
  54. uvkuUtils;
  55. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. //TvkuPipelineShaderStageCreateInfo//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. function TvkuPipelineShaderStageCreateInfo.GetStructure: TVkPipelineShaderStageCreateInfo;
  59. begin
  60. FillByte(result, SizeOf(result), 0);
  61. result.sType := VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  62. result.pNext := nil;
  63. result.flags := Flags;
  64. result.stage := Stage;
  65. result.module := Module;
  66. result.pName := PVkChar(Name);
  67. result.pSpecializationInfo := nil; // TODO: implement SpecializationInfo
  68. end;
  69. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. procedure TvkuPipelineShaderStageCreateInfo.SetStructure(const aData: TVkPipelineShaderStageCreateInfo);
  71. begin
  72. Flags := aData.flags;
  73. Stage := aData.stage;
  74. Module := aData.module;
  75. if Assigned(aData.pName)
  76. then Name := aData.pName
  77. else Name := '';
  78. // TODO: read SpecializationInfo
  79. end;
  80. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. //TvkuGraphicsPipelineFactory////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. function TvkuGraphicsPipelineFactory.GetStructure: TVkGraphicsPipelineCreateInfo;
  84. var i: Integer;
  85. begin
  86. SetLength(fvkStages, fStages.Length);
  87. for i := low(fvkStages) to high(fvkStages) do
  88. fvkStages[i] := fStages[i].GetStructure;
  89. FillByte(result, SizeOf(result), 0);
  90. result.sType := VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
  91. result.pNext := nil;
  92. result.flags := fFlags;
  93. result.stageCount := Length(fvkStages);
  94. result.pStages := @fvkStages[0];
  95. result.pVertexInputState := nil;
  96. result.pInputAssemblyState := nil;
  97. result.pTessellationState := nil;
  98. result.pViewportState := nil;
  99. result.pRasterizationState := nil;
  100. result.pMultisampleState := nil;
  101. result.pDepthStencilState := nil;
  102. result.pColorBlendState := nil;
  103. result.pDynamicState := nil;
  104. result.layout := fLayout;
  105. result.renderPass := fRenderPass;
  106. result.subpass := fSubPass;
  107. result.basePipelineHandle := fBasePipelineHandle;
  108. result.basePipelineIndex := fBasePipelineIndex;
  109. end;
  110. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. procedure TvkuGraphicsPipelineFactory.SetStructure(const aData: TVkGraphicsPipelineCreateInfo);
  112. var i: Integer;
  113. begin
  114. if Assigned(aData.pStages) then begin
  115. fStages.Length := aData.stageCount;
  116. for i := 0 to aData.stageCount-1 do
  117. fStages[i].SetStructure((aData.pStages + i)^);
  118. end;
  119. fFlags := aData.flags;
  120. fLayout := aData.layout;
  121. fRenderPass := aData.renderPass;
  122. fSubPass := aData.subpass;
  123. fBasePipelineHandle := aData.basePipelineHandle;
  124. fBasePipelineIndex := aData.basePipelineIndex;
  125. end;
  126. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  127. function TvkuGraphicsPipelineFactory.CreateGraphicsPipeline(const aPipelineCache: VkPipelineCache): TvkuGraphicsPipeline;
  128. begin
  129. result := TvkuGraphicsPipeline.Create(GetStructure, aPipelineCache, DeviceCommands, AllocCallbacks);
  130. end;
  131. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. procedure TvkuGraphicsPipelineFactory.AfterConstruction;
  133. begin
  134. inherited AfterConstruction;
  135. fStages := TvkuPipelineShaderStageCreateInfoList.Create;
  136. end;
  137. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. procedure TvkuGraphicsPipelineFactory.BeforeDestruction;
  139. begin
  140. FreeAndNil(fStages);
  141. inherited BeforeDestruction;
  142. end;
  143. end.