Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

148 rindas
6.2 KiB

  1. unit uvkuDescriptorSetLayoutFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuFactoryBase, uvkuDescriptorSetLayout, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuDescriptorSetLayoutBinding = class(TvkuStructure)
  10. private
  11. fImmutableSamplers: TVkSamplerList;
  12. public
  13. Binding: VkUint32;
  14. DescriptorType: TVkDescriptorType;
  15. DescriptorCount: VkUint32;
  16. StageFlags: VkShaderStageFlags;
  17. property ImmutableSamplers: TVkSamplerList read fImmutableSamplers;
  18. function GetStructure: TVkDescriptorSetLayoutBinding;
  19. procedure SetStructure(const aData: TVkDescriptorSetLayoutBinding);
  20. procedure AfterConstruction; override;
  21. procedure BeforeDestruction; override;
  22. end;
  23. TvkuDescriptorSetLayoutBindingArr = specialize TvkuObjList<TvkuDescriptorSetLayoutBinding>;
  24. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. TvkuDescriptorSetLayoutFactory = class(TvkuDeviceObjFactory)
  26. private
  27. fFlags: VkDescriptorSetLayoutCreateFlags;
  28. fBindings: TvkuDescriptorSetLayoutBindingArr;
  29. fvkBindings: TVkDescriptorSetLayoutBindingArr;
  30. public
  31. property Flags: VkDescriptorSetLayoutCreateFlags read fFlags write fFlags;
  32. property Bindings: TvkuDescriptorSetLayoutBindingArr read fBindings;
  33. function GetStructure: TVkDescriptorSetLayoutCreateInfo;
  34. procedure SetStructure(const aData: TVkDescriptorSetLayoutCreateInfo);
  35. function CreateDescriptorSetLayout: TvkuDescriptorSetLayout;
  36. procedure AfterConstruction; override;
  37. procedure BeforeDestruction; override;
  38. end;
  39. implementation
  40. uses
  41. uvkuUtils;
  42. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. //TvkuDescriptorSetLayoutBinding/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. function TvkuDescriptorSetLayoutBinding.GetStructure: TVkDescriptorSetLayoutBinding;
  46. begin
  47. FillByte(result, SizeOf(result), 0);
  48. result.binding := Binding;
  49. result.descriptorType := DescriptorType;
  50. result.descriptorCount := DescriptorCount;
  51. result.stageFlags := StageFlags;
  52. result.pImmutableSamplers := fImmutableSamplers.PData;
  53. if (fImmutableSamplers.Length <> 0) and
  54. (fImmutableSamplers.Length <> DescriptorCount) then
  55. raise TvkuException.Create('''ImmutableSamplers'' must be either empty or contains ''DescriptorCount'' number of elements');
  56. end;
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. procedure TvkuDescriptorSetLayoutBinding.SetStructure(const aData: TVkDescriptorSetLayoutBinding);
  59. var i: Integer;
  60. begin
  61. Binding := aData.binding;
  62. DescriptorType := aData.descriptorType;
  63. StageFlags := aData.stageFlags;
  64. fImmutableSamplers.SetData(aData.pImmutableSamplers, aData.descriptorCount);
  65. end;
  66. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. procedure TvkuDescriptorSetLayoutBinding.AfterConstruction;
  68. begin
  69. inherited AfterConstruction;
  70. fImmutableSamplers := TVkSamplerList.Create;
  71. end;
  72. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. procedure TvkuDescriptorSetLayoutBinding.BeforeDestruction;
  74. begin
  75. FreeAndNil(fImmutableSamplers);
  76. inherited BeforeDestruction;
  77. end;
  78. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. //TvkuDescriptorSetLayoutFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. function TvkuDescriptorSetLayoutFactory.GetStructure: TVkDescriptorSetLayoutCreateInfo;
  82. var i: Integer;
  83. begin
  84. SetLength(fvkBindings, fBindings.Length);
  85. for i := low(fvkBindings) to high(fvkBindings) do
  86. fvkBindings[i] := fBindings[i].GetStructure;
  87. FillByte(result, SizeOf(result), 0);
  88. result.sType := VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
  89. result.pNext := nil;
  90. result.flags := fFlags;
  91. result.bindingCount := Length(fvkBindings);
  92. result.pBindings := @fvkBindings[0];
  93. end;
  94. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. procedure TvkuDescriptorSetLayoutFactory.SetStructure(const aData: TVkDescriptorSetLayoutCreateInfo);
  96. var i: Integer;
  97. begin
  98. fFlags := aData.flags;
  99. fBindings.Length := aData.bindingCount;
  100. for i := 0 to fBindings.Length do
  101. fBindings[i].SetStructure((aData.pBindings + i)^);
  102. end;
  103. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  104. function TvkuDescriptorSetLayoutFactory.CreateDescriptorSetLayout: TvkuDescriptorSetLayout;
  105. begin
  106. result := TvkuDescriptorSetLayout.Create(GetStructure, DeviceCommands, AllocCallbacks);
  107. end;
  108. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. procedure TvkuDescriptorSetLayoutFactory.AfterConstruction;
  110. begin
  111. inherited AfterConstruction;
  112. fBindings := TvkuDescriptorSetLayoutBindingArr.Create;
  113. end;
  114. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  115. procedure TvkuDescriptorSetLayoutFactory.BeforeDestruction;
  116. begin
  117. FreeAndNil(fBindings);
  118. inherited BeforeDestruction;
  119. end;
  120. end.