|
- unit uvkuPhysicalDevice;
-
- {$mode objfpc}{$H+}
-
- interface
-
- uses
- Classes, SysUtils,
- Vulkan;
-
- type
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TVkQueueFamilyPropertiesArr = array of TVkQueueFamilyProperties;
- TVkSparseImageFormatPropertiesArr = array of TVkSparseImageFormatProperties;
- TvkuPhysicalDevice = class(TObject)
- private
- fHandle: VkPhysicalDevice;
- function GetQueueFamilyProperties(const aIndex: Integer): TVkQueueFamilyProperties;
- function GetQueueFamilyPropertyCount: Integer;
- public
- function GetFeatures: TVkPhysicalDeviceFeatures;
- function GetProperties: TVkPhysicalDeviceProperties;
- function GetMemoryProperties: TVkPhysicalDeviceMemoryProperties;
- function GetQueueFamilyProperties: TVkQueueFamilyPropertiesArr;
- function GetFormatProperties(const aFormat: TVkFormat): TVkFormatProperties;
- function GetImageFormatProperties(
- const aFormat: TVkFormat;
- const aImageType: TVkImageType;
- const aTiling: TVkImageTiling;
- const aUsage: VkImageUsageFlags;
- const aFlags: VkImageCreateFlags): TVkImageFormatProperties;
- function GetSparseImageFormatProperties(
- const aFormat: TVkFormat;
- const aImageType: TVkImageType;
- const aSamples: TVkSampleCountFlagBits;
- const aUsage: VkImageUsageFlags;
- const aTiling: TVkImageTiling): TVkSparseImageFormatPropertiesArr;
- public
- property Handle: VkPhysicalDevice read fHandle;
- property Features: TVkPhysicalDeviceFeatures read GetFeatures;
- property Properties: TVkPhysicalDeviceProperties read GetProperties;
- property MemoryProperties: TVkPhysicalDeviceMemoryProperties read GetMemoryProperties;
-
- property QueueFamilyPropertyCount: Integer read GetQueueFamilyPropertyCount;
- property QueueFamilyProperties[const aIndex: Integer]: TVkQueueFamilyProperties read GetQueueFamilyProperties;
-
- property FormatProperties[const aFormat: TVkFormat]: TVkFormatProperties read GetFormatProperties;
-
- constructor Create(const aHandle: VkPhysicalDevice);
- end;
-
- implementation
-
- uses
- uvkuUtils;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TvkuPhysicalDevice/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetQueueFamilyProperties(const aIndex: Integer): TVkQueueFamilyProperties;
- var arr: TVkQueueFamilyPropertiesArr;
- begin
- arr := GetQueueFamilyProperties();
- if (aIndex < Low(arr)) or (aIndex > High(arr)) then
- raise TvkuException.CreateFmt('index (%) out of range (%d : %d)', [aIndex, Low(arr), High(arr)]);
- result := arr[aIndex];
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetQueueFamilyPropertyCount: Integer;
- begin
- result := Length(GetQueueFamilyProperties);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetFeatures: TVkPhysicalDeviceFeatures;
- begin
- vkGetPhysicalDeviceFeatures(fHandle, @result);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetProperties: TVkPhysicalDeviceProperties;
- begin
- vkGetPhysicalDeviceProperties(fHandle, @result);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetMemoryProperties: TVkPhysicalDeviceMemoryProperties;
- begin
- vkGetPhysicalDeviceMemoryProperties(fHandle, @result);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetQueueFamilyProperties: TVkQueueFamilyPropertiesArr;
- var c: VkUint32;
- begin
- vkGetPhysicalDeviceQueueFamilyProperties(fHandle, @c, nil);
- SetLength(result, c);
- vkGetPhysicalDeviceQueueFamilyProperties(fHandle, @c, @result[0]);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetFormatProperties(const aFormat: TVkFormat): TVkFormatProperties;
- begin
- vkGetPhysicalDeviceFormatProperties(fHandle, aFormat, @result);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetImageFormatProperties(const aFormat: TVkFormat; const aImageType: TVkImageType;
- const aTiling: TVkImageTiling; const aUsage: VkImageUsageFlags; const aFlags: VkImageCreateFlags): TVkImageFormatProperties;
- var err: TVkResult;
- begin
- err := vkGetPhysicalDeviceImageFormatProperties(fHandle, aFormat, aImageType, aTiling, aUsage, aFlags, @result);
- if (err < VK_SUCCESS) then
- raise TvkuErrorException.Create('unable to get physical device image format properties', err);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TvkuPhysicalDevice.GetSparseImageFormatProperties(const aFormat: TVkFormat; const aImageType: TVkImageType;
- const aSamples: TVkSampleCountFlagBits; const aUsage: VkImageUsageFlags; const aTiling: TVkImageTiling): TVkSparseImageFormatPropertiesArr;
- var c: VkUint32;
- begin
- vkGetPhysicalDeviceSparseImageFormatProperties(fHandle, aFormat, aImageType, aSamples, aUsage, aTiling, @c, nil);
- SetLength(result, c);
- vkGetPhysicalDeviceSparseImageFormatProperties(fHandle, aFormat, aImageType, aSamples, aUsage, aTiling, @c, @result[0]);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor TvkuPhysicalDevice.Create(const aHandle: VkPhysicalDevice);
- begin
- if not Assigned(aHandle) then
- raise TvkuException.Create('invalid physical device handle');
- inherited Create;
- fHandle := aHandle;
- end;
-
- end.
|