You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

90 line
3.1 KiB

  1. unit uvkuDevice;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuDevice = class(TObject)
  10. private
  11. fHandle: VkDevice;
  12. fPhysicalDevice: VkPhysicalDevice;
  13. fAllocCallbacks: PVkAllocationCallbacks;
  14. procedure CreateHandle(
  15. const aCreateInfo: PVkDeviceCreateInfo;
  16. const aAllocCallbacks: PVkAllocationCallbacks);
  17. public
  18. property Handle: VkDevice read fHandle;
  19. property PhysicalDevice: VkPhysicalDevice read fPhysicalDevice;
  20. constructor Create(
  21. const aPhysicalDevice: VkPhysicalDevice;
  22. const aCreateInfo: TVkDeviceCreateInfo);
  23. constructor Create(
  24. const aPhysicalDevice: VkPhysicalDevice;
  25. const aCreateInfo: TVkDeviceCreateInfo;
  26. const aAllocCallbacks: TVkAllocationCallbacks);
  27. destructor Destroy; override;
  28. end;
  29. implementation
  30. uses
  31. uvkuUtils;
  32. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. //TvkuDevice/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. procedure TvkuDevice.CreateHandle(const aCreateInfo: PVkDeviceCreateInfo; const aAllocCallbacks: PVkAllocationCallbacks);
  36. var err: TVkResult;
  37. begin
  38. if Assigned(aAllocCallbacks) then begin
  39. new(fAllocCallbacks);
  40. fAllocCallbacks^ := aAllocCallbacks^;
  41. end;
  42. err := vkCreateDevice(fPhysicalDevice, aCreateInfo, fAllocCallbacks, @fHandle);
  43. if (err < VK_SUCCESS) then
  44. raise TvkuErrorException.Create('unable to create device', err);
  45. end;
  46. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. constructor TvkuDevice.Create(const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo);
  48. begin
  49. inherited Create;
  50. fHandle := nil;
  51. fPhysicalDevice := aPhysicalDevice;
  52. CreateHandle(@aCreateInfo, nil);
  53. end;
  54. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. constructor TvkuDevice.Create(const aPhysicalDevice: VkPhysicalDevice; const aCreateInfo: TVkDeviceCreateInfo; const aAllocCallbacks: TVkAllocationCallbacks);
  56. begin
  57. inherited Create;
  58. fHandle := nil;
  59. fPhysicalDevice := aPhysicalDevice;
  60. CreateHandle(@aCreateInfo, @aAllocCallbacks);
  61. end;
  62. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. destructor TvkuDevice.Destroy;
  64. begin
  65. if Assigned(fHandle) then begin
  66. vkDestroyDevice(fHandle, fAllocCallbacks);
  67. fHandle := nil;
  68. end;
  69. if Assigned(fAllocCallbacks) then begin
  70. Dispose(fAllocCallbacks);
  71. fAllocCallbacks := nil;
  72. end;
  73. inherited Destroy;
  74. end;
  75. end.