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

90 行
3.5 KiB

  1. unit uvkuBufferFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuBuffer, uvkuTypes, uvkuFactoryBase;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuBufferFactory = class(TvkuDeviceObjFactory)
  10. private
  11. fFlags: VkBufferCreateFlags;
  12. fSize: VkDeviceSize;
  13. fUsage: VkBufferUsageFlags;
  14. fSharingMode: TVkSharingMode;
  15. fQueueFamilyIndices: TVkUint32List;
  16. public
  17. property Flags: VkBufferCreateFlags read fFlags write fFlags;
  18. property Size: VkDeviceSize read fSize write fSize;
  19. property Usage: VkBufferUsageFlags read fUsage write fUsage;
  20. property SharingMode: TVkSharingMode read fSharingMode write fSharingMode;
  21. property QueueFamilyIndices: TVkUint32List read fQueueFamilyIndices;
  22. function GetStructure: TVkBufferCreateInfo;
  23. procedure SetStructure(const aData: TVkBufferCreateInfo);
  24. function CreateBuffer: TvkuBuffer;
  25. procedure AfterConstruction; override;
  26. procedure BeforeDestruction; override;
  27. end;
  28. implementation
  29. uses
  30. uvkuUtils;
  31. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. //TvkuBufferFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. function TvkuBufferFactory.GetStructure: TVkBufferCreateInfo;
  35. begin
  36. FillByte(result, SizeOf(result), 0);
  37. result.sType := VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  38. result.pNext := nil;
  39. result.flags := fFlags;
  40. result.size := fSize;
  41. result.usage := fUsage;
  42. result.sharingMode := fSharingMode;
  43. result.queueFamilyIndexCount := fQueueFamilyIndices.Length;
  44. result.pQueueFamilyIndices := fQueueFamilyIndices.PData;
  45. end;
  46. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. procedure TvkuBufferFactory.SetStructure(const aData: TVkBufferCreateInfo);
  48. var i: Integer;
  49. begin
  50. fFlags := aData.flags;
  51. fSize := aData.size;
  52. fUsage := aData.usage;
  53. fSharingMode := aData.sharingMode;
  54. fQueueFamilyIndices.SetData(aData.pQueueFamilyIndices, aData.queueFamilyIndexCount);
  55. end;
  56. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. function TvkuBufferFactory.CreateBuffer: TvkuBuffer;
  58. begin
  59. result := TvkuBuffer.Create(GetStructure, DeviceCommands, AllocCallbacks);
  60. end;
  61. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. procedure TvkuBufferFactory.AfterConstruction;
  63. begin
  64. inherited AfterConstruction;
  65. fQueueFamilyIndices := TVkUint32List.Create;
  66. end;
  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. procedure TvkuBufferFactory.BeforeDestruction;
  69. begin
  70. FreeAndNil(fQueueFamilyIndices);
  71. inherited BeforeDestruction;
  72. end;
  73. end.