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

119 行
4.9 KiB

  1. unit uvkuImageFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuImage, uvkuTypes, uvkuFactoryBase;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuImageFactory = class(TvkuDeviceObjFactory)
  10. private
  11. fFlags: VkImageCreateFlags;
  12. fImageType: TVkImageType;
  13. fFormat: TVkFormat;
  14. fExtent: TVkExtent3D;
  15. fMipLevels: VkUint32;
  16. fArrayLayers: VkUint32;
  17. fSamples: TVkSampleCountFlagBits;
  18. fTiling: TVkImageTiling;
  19. fUsage: VkImageUsageFlags;
  20. fSharingMode: TVkSharingMode;
  21. fQueueFamilyIndices: TVkUint32List;
  22. fInitialLayout: TVkImageLayout;
  23. public
  24. property Flags: VkImageCreateFlags read fFlags write fFlags;
  25. property ImageType: TVkImageType read fImageType write fImageType;
  26. property Format: TVkFormat read fFormat write fFormat;
  27. property Extent: TVkExtent3D read fExtent write fExtent;
  28. property MipLevels: VkUint32 read fMipLevels write fMipLevels;
  29. property ArrayLayers: VkUint32 read fArrayLayers write fArrayLayers;
  30. property Samples: TVkSampleCountFlagBits read fSamples write fSamples;
  31. property Tiling: TVkImageTiling read fTiling write fTiling;
  32. property Usage: VkImageUsageFlags read fUsage write fUsage;
  33. property SharingMode: TVkSharingMode read fSharingMode write fSharingMode;
  34. property InitialLayout: TVkImageLayout read fInitialLayout write fInitialLayout;
  35. property QueueFamilyIndices: TVkUint32List read fQueueFamilyIndices;
  36. function GetStructure: TVkImageCreateInfo;
  37. procedure SetStructure(const aData: TVkImageCreateInfo);
  38. function CreateImage: TvkuImage;
  39. procedure AfterConstruction; override;
  40. procedure BeforeDestruction; override;
  41. end;
  42. implementation
  43. uses
  44. uvkuUtils;
  45. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. //TvkuImageFactory///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. function TvkuImageFactory.GetStructure: TVkImageCreateInfo;
  49. begin
  50. FillByte(result, SizeOf(result), 0);
  51. result.sType := VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
  52. result.pNext := nil;
  53. result.flags := fFlags;
  54. result.imageType := fImageType;
  55. result.format := fFormat;
  56. result.extent := fExtent;
  57. result.mipLevels := fMipLevels;
  58. result.arrayLayers := fArrayLayers;
  59. result.samples := fSamples;
  60. result.tiling := fTiling;
  61. result.usage := fUsage;
  62. result.sharingMode := fSharingMode;
  63. result.queueFamilyIndexCount := fQueueFamilyIndices.Length;
  64. result.pQueueFamilyIndices := fQueueFamilyIndices.PData;
  65. result.initialLayout := fInitialLayout;
  66. end;
  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. procedure TvkuImageFactory.SetStructure(const aData: TVkImageCreateInfo);
  69. var i: Integer;
  70. begin
  71. fFlags := aData.flags;
  72. fImageType := aData.imageType;
  73. fFormat := aData.format;
  74. fExtent := aData.extent;
  75. fMipLevels := aData.mipLevels;
  76. fArrayLayers := aData.arrayLayers;
  77. fSamples := aData.samples;
  78. fTiling := aData.tiling;
  79. fUsage := aData.usage;
  80. fSharingMode := aData.sharingMode;
  81. fInitialLayout := aData.initialLayout;
  82. fQueueFamilyIndices.SetData(aData.pQueueFamilyIndices, aData.queueFamilyIndexCount);
  83. end;
  84. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. function TvkuImageFactory.CreateImage: TvkuImage;
  86. begin
  87. result := TvkuImage.Create(GetStructure, DeviceCommands, AllocCallbacks);
  88. end;
  89. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. procedure TvkuImageFactory.AfterConstruction;
  91. begin
  92. inherited AfterConstruction;
  93. fQueueFamilyIndices := TVkUint32List.Create;
  94. end;
  95. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. procedure TvkuImageFactory.BeforeDestruction;
  97. begin
  98. FreeAndNil(fQueueFamilyIndices);
  99. inherited BeforeDestruction;
  100. end;
  101. end.