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.
 
 

139 Zeilen
6.5 KiB

  1. unit uvkuPhysicalDevice;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TVkQueueFamilyPropertiesArr = array of TVkQueueFamilyProperties;
  10. TVkSparseImageFormatPropertiesArr = array of TVkSparseImageFormatProperties;
  11. TvkuPhysicalDevice = class(TObject)
  12. private
  13. fHandle: VkPhysicalDevice;
  14. function GetQueueFamilyProperties(const aIndex: Integer): TVkQueueFamilyProperties;
  15. function GetQueueFamilyPropertyCount: Integer;
  16. public
  17. function GetFeatures: TVkPhysicalDeviceFeatures;
  18. function GetProperties: TVkPhysicalDeviceProperties;
  19. function GetMemoryProperties: TVkPhysicalDeviceMemoryProperties;
  20. function GetQueueFamilyProperties: TVkQueueFamilyPropertiesArr;
  21. function GetFormatProperties(const aFormat: TVkFormat): TVkFormatProperties;
  22. function GetImageFormatProperties(
  23. const aFormat: TVkFormat;
  24. const aImageType: TVkImageType;
  25. const aTiling: TVkImageTiling;
  26. const aUsage: VkImageUsageFlags;
  27. const aFlags: VkImageCreateFlags): TVkImageFormatProperties;
  28. function GetSparseImageFormatProperties(
  29. const aFormat: TVkFormat;
  30. const aImageType: TVkImageType;
  31. const aSamples: TVkSampleCountFlagBits;
  32. const aUsage: VkImageUsageFlags;
  33. const aTiling: TVkImageTiling): TVkSparseImageFormatPropertiesArr;
  34. public
  35. property Handle: VkPhysicalDevice read fHandle;
  36. property Features: TVkPhysicalDeviceFeatures read GetFeatures;
  37. property Properties: TVkPhysicalDeviceProperties read GetProperties;
  38. property MemoryProperties: TVkPhysicalDeviceMemoryProperties read GetMemoryProperties;
  39. property QueueFamilyPropertyCount: Integer read GetQueueFamilyPropertyCount;
  40. property QueueFamilyProperties[const aIndex: Integer]: TVkQueueFamilyProperties read GetQueueFamilyProperties;
  41. property FormatProperties[const aFormat: TVkFormat]: TVkFormatProperties read GetFormatProperties;
  42. constructor Create(const aHandle: VkPhysicalDevice);
  43. end;
  44. implementation
  45. uses
  46. uvkuUtils;
  47. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. //TvkuPhysicalDevice/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. function TvkuPhysicalDevice.GetQueueFamilyProperties(const aIndex: Integer): TVkQueueFamilyProperties;
  51. var arr: TVkQueueFamilyPropertiesArr;
  52. begin
  53. arr := GetQueueFamilyProperties();
  54. if (aIndex < Low(arr)) or (aIndex > High(arr)) then
  55. raise TvkuException.CreateFmt('index (%) out of range (%d : %d)', [aIndex, Low(arr), High(arr)]);
  56. result := arr[aIndex];
  57. end;
  58. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  59. function TvkuPhysicalDevice.GetQueueFamilyPropertyCount: Integer;
  60. begin
  61. result := Length(GetQueueFamilyProperties);
  62. end;
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. function TvkuPhysicalDevice.GetFeatures: TVkPhysicalDeviceFeatures;
  65. begin
  66. vkGetPhysicalDeviceFeatures(fHandle, @result);
  67. end;
  68. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69. function TvkuPhysicalDevice.GetProperties: TVkPhysicalDeviceProperties;
  70. begin
  71. vkGetPhysicalDeviceProperties(fHandle, @result);
  72. end;
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. function TvkuPhysicalDevice.GetMemoryProperties: TVkPhysicalDeviceMemoryProperties;
  75. begin
  76. vkGetPhysicalDeviceMemoryProperties(fHandle, @result);
  77. end;
  78. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. function TvkuPhysicalDevice.GetQueueFamilyProperties: TVkQueueFamilyPropertiesArr;
  80. var c: VkUint32;
  81. begin
  82. vkGetPhysicalDeviceQueueFamilyProperties(fHandle, @c, nil);
  83. SetLength(result, c);
  84. vkGetPhysicalDeviceQueueFamilyProperties(fHandle, @c, @result[0]);
  85. end;
  86. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. function TvkuPhysicalDevice.GetFormatProperties(const aFormat: TVkFormat): TVkFormatProperties;
  88. begin
  89. vkGetPhysicalDeviceFormatProperties(fHandle, aFormat, @result);
  90. end;
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. function TvkuPhysicalDevice.GetImageFormatProperties(const aFormat: TVkFormat; const aImageType: TVkImageType;
  93. const aTiling: TVkImageTiling; const aUsage: VkImageUsageFlags; const aFlags: VkImageCreateFlags): TVkImageFormatProperties;
  94. var err: TVkResult;
  95. begin
  96. err := vkGetPhysicalDeviceImageFormatProperties(fHandle, aFormat, aImageType, aTiling, aUsage, aFlags, @result);
  97. if (err < VK_SUCCESS) then
  98. raise TvkuErrorException.Create('unable to get physical device image format properties', err);
  99. end;
  100. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. function TvkuPhysicalDevice.GetSparseImageFormatProperties(const aFormat: TVkFormat; const aImageType: TVkImageType;
  102. const aSamples: TVkSampleCountFlagBits; const aUsage: VkImageUsageFlags; const aTiling: TVkImageTiling): TVkSparseImageFormatPropertiesArr;
  103. var c: VkUint32;
  104. begin
  105. vkGetPhysicalDeviceSparseImageFormatProperties(fHandle, aFormat, aImageType, aSamples, aUsage, aTiling, @c, nil);
  106. SetLength(result, c);
  107. vkGetPhysicalDeviceSparseImageFormatProperties(fHandle, aFormat, aImageType, aSamples, aUsage, aTiling, @c, @result[0]);
  108. end;
  109. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. constructor TvkuPhysicalDevice.Create(const aHandle: VkPhysicalDevice);
  111. begin
  112. if not Assigned(aHandle) then
  113. raise TvkuException.Create('invalid physical device handle');
  114. inherited Create;
  115. fHandle := aHandle;
  116. end;
  117. end.