Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

90 Zeilen
3.5 KiB

  1. unit uvkuBufferViewFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuBufferView, uvkuAllocationHandler, uvkuDevice, uvkuFactoryBase;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuBufferViewEx = class(TvkuBufferView)
  10. private
  11. fAllocHandler: TvkuAllocationHandler;
  12. fOwnsHandler: Boolean;
  13. public
  14. destructor Destroy; override;
  15. end;
  16. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. TvkuBufferViewFactory = class(TvkuDeviceObjFactory)
  18. private
  19. fFlags: VkBufferViewCreateFlags;
  20. fBuffer: VkBuffer;
  21. fFormat: TVkFormat;
  22. fOffset: VkDeviceSize;
  23. fRange: VkDeviceSize;
  24. public
  25. property Flags: VkBufferViewCreateFlags read fFlags write fFlags;
  26. property Buffer: VkBuffer read fBuffer write fBuffer;
  27. property Format: TVkFormat read fFormat write fFormat;
  28. property Offset: VkDeviceSize read fOffset write fOffset;
  29. property Range: VkDeviceSize read fRange write fRange;
  30. function CreateBufferView: TvkuBufferViewEx;
  31. function CreateBufferView(
  32. const aAllocHandler: TvkuAllocationHandler;
  33. const aOwnsHandler: Boolean): TvkuBufferViewEx;
  34. end;
  35. implementation
  36. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. //TvkuBufferViewEx///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. destructor TvkuBufferViewEx.Destroy;
  40. begin
  41. inherited Destroy;
  42. if fOwnsHandler then
  43. FreeAndNil(fAllocHandler);
  44. end;
  45. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. //TvkuBufferViewFactory//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. function TvkuBufferViewFactory.CreateBufferView: TvkuBufferViewEx;
  49. begin
  50. result := CreateBufferView(nil, false);
  51. end;
  52. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  53. function TvkuBufferViewFactory.CreateBufferView(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuBufferViewEx;
  54. var
  55. CreateInfo: TVkBufferViewCreateInfo;
  56. begin
  57. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  58. CreateInfo.sType := VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
  59. CreateInfo.pNext := nil;
  60. CreateInfo.flags := fFlags;
  61. CreateInfo.buffer := fBuffer;
  62. CreateInfo.format := fFormat;
  63. CreateInfo.offset := fOffset;
  64. CreateInfo.range := fRange;
  65. if Assigned(aAllocHandler)
  66. then result := TvkuBufferViewEx.Create(CreateInfo, DeviceCommands, aAllocHandler.GetAllocationCallbacksPtr)
  67. else result := TvkuBufferViewEx.Create(CreateInfo, DeviceCommands);
  68. try
  69. TvkuBufferViewEx(result).fAllocHandler := aAllocHandler;
  70. TvkuBufferViewEx(result).fOwnsHandler := aOwnsHandler;
  71. except
  72. FreeAndNil(result);
  73. raise;
  74. end;
  75. end;
  76. end.