Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

124 rader
5.3 KiB

  1. unit uvkuImageViewFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuImageView, uvkuFactoryBase, uvkuTypes;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuImageSubresourceRange = class(TvkuStructure)
  10. AspectMask: VkImageAspectFlags;
  11. BaseMipLevel: VkUint32;
  12. LevelCount: VkUint32;
  13. BaseArrayLayer: VkUint32;
  14. LayerCount: VkUint32;
  15. function GetStructure: TVkImageSubresourceRange;
  16. procedure SetStructure(const aData: TVkImageSubresourceRange);
  17. end;
  18. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. TvkuImageViewFactory = class(TvkuDeviceObjFactory)
  20. private
  21. fFlags: VkImageViewCreateFlags;
  22. fImage: VkImage;
  23. fViewType: TVkImageViewType;
  24. fFormat: TVkFormat;
  25. fComponents: TVkComponentMapping;
  26. fSubresourceRange: TvkuImageSubresourceRange;
  27. public
  28. property Flags: VkImageViewCreateFlags read fFlags write fFlags;
  29. property Image: VkImage read fImage write fImage;
  30. property ViewType: TVkImageViewType read fViewType write fViewType;
  31. property Format: TVkFormat read fFormat write fFormat;
  32. property Components: TVkComponentMapping read fComponents write fComponents;
  33. property SubresourceRange: TvkuImageSubresourceRange read fSubresourceRange;
  34. function GetStructure: TVkImageViewCreateInfo;
  35. procedure SetStructure(const aData: TVkImageViewCreateInfo);
  36. function CreateImageView: TvkuImageView;
  37. procedure AfterConstruction; override;
  38. procedure BeforeDestruction; override;
  39. end;
  40. implementation
  41. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. //TvkuImageSubresourceRange//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. function TvkuImageSubresourceRange.GetStructure: TVkImageSubresourceRange;
  45. begin
  46. FillByte(result, SizeOf(result), 0);
  47. result.aspectMask := AspectMask;
  48. result.baseMipLevel := BaseMipLevel;
  49. result.levelCount := LevelCount;
  50. result.baseArrayLayer := BaseArrayLayer;
  51. result.layerCount := LayerCount;
  52. end;
  53. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. procedure TvkuImageSubresourceRange.SetStructure(const aData: TVkImageSubresourceRange);
  55. begin
  56. AspectMask := aData.aspectMask;
  57. BaseMipLevel := aData.baseMipLevel;
  58. LevelCount := aData.levelCount;
  59. BaseArrayLayer := aData.baseArrayLayer;
  60. LayerCount := aData.layerCount;
  61. end;
  62. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. //TvkuImageViewFactory///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. function TvkuImageViewFactory.GetStructure: TVkImageViewCreateInfo;
  66. begin
  67. FillByte(result, SizeOf(result), 0);
  68. result.sType := VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  69. result.pNext := nil;
  70. result.flags := fFlags;
  71. result.image := fImage;
  72. result.viewType := fViewType;
  73. result.format := fFormat;
  74. result.components := fComponents;
  75. result.subresourceRange := fSubresourceRange.GetStructure;
  76. end;
  77. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. procedure TvkuImageViewFactory.SetStructure(const aData: TVkImageViewCreateInfo);
  79. begin
  80. fFlags := aData.flags;
  81. fImage := aData.image;
  82. fViewType := aData.viewType;
  83. fFormat := aData.format;
  84. fComponents := aData.components;
  85. fSubresourceRange.SetStructure(aData.subresourceRange);
  86. end;
  87. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. function TvkuImageViewFactory.CreateImageView: TvkuImageView;
  89. begin
  90. result := TvkuImageView.Create(GetStructure, DeviceCommands, AllocCallbacks);
  91. end;
  92. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. procedure TvkuImageViewFactory.AfterConstruction;
  94. begin
  95. inherited AfterConstruction;
  96. fSubresourceRange := TvkuImageSubresourceRange.Create;
  97. end;
  98. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. procedure TvkuImageViewFactory.BeforeDestruction;
  100. begin
  101. FreeAndNil(fSubresourceRange);
  102. inherited BeforeDestruction;
  103. end;
  104. end.