No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

208 líneas
8.0 KiB

  1. unit uvkuInstanceFactory;
  2. {$mode objfpc}{$H+}
  3. {$I Vulkan.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. Vulkan, uvkuInstance, uvkuAllocationHandler;
  8. type
  9. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TvkuApplicationInfo = packed record
  11. AppName: String;
  12. AppVersion: VkVersion;
  13. EngineName: String;
  14. EngineVersion: VkVersion;
  15. ApiVersion: VkVersion;
  16. end;
  17. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18. TvkuInstanceEx = class(TvkuInstance)
  19. private
  20. fAllocHandler: TvkuAllocationHandler;
  21. fOwnsHandler: Boolean;
  22. public
  23. destructor Destroy; override;
  24. end;
  25. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. TvkuInstanceFactory = class(TObject)
  27. private
  28. fFlags: VkInstanceCreateFlags;
  29. fApplicationInfo: TvkuApplicationInfo;
  30. fLayers: TStringList;
  31. fExtensions: TStringList;
  32. function GetLayers: TStrings;
  33. function GetExtensions: TStrings;
  34. public
  35. property Flags: VkInstanceCreateFlags read fFlags;
  36. property ApplicationInfo: TvkuApplicationInfo read fApplicationInfo;
  37. property Layers: TStrings read GetLayers;
  38. property Extensions: TStrings read GetExtensions;
  39. function CreateInstance: TvkuInstance;
  40. function CreateInstance(
  41. const aAllocHandler: TvkuAllocationHandler;
  42. const aOwnsHandler: Boolean): TvkuInstance;
  43. constructor Create;
  44. destructor Destroy; override;
  45. public
  46. class function GetPlatformSurfaceExtensionName: String;
  47. end;
  48. function vkuApplicationInfo: TvkuApplicationInfo;
  49. function vkuApplicationInfo(
  50. aAppName: String;
  51. aAppVersion: VkVersion;
  52. aEngineName: String;
  53. aEngineVersion: VkVersion;
  54. aApiVersion: VkVersion = VK_API_VERSION): TvkuApplicationInfo;
  55. implementation
  56. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. function vkuApplicationInfo: TvkuApplicationInfo;
  58. begin
  59. result.AppName := ExtractFileName(ParamStr(0));
  60. result.AppVersion := 0;
  61. result.EngineName := ExtractFileName(ParamStr(0));
  62. result.EngineVersion := 0;
  63. result.ApiVersion := VK_API_VERSION;
  64. end;
  65. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66. function vkuApplicationInfo(aAppName: String; aAppVersion: VkVersion; aEngineName: String; aEngineVersion: VkVersion; aApiVersion: VkVersion): TvkuApplicationInfo;
  67. begin
  68. result := vkuApplicationInfo();
  69. result.AppName := aAppName;
  70. result.AppVersion := aAppVersion;
  71. result.EngineName := aEngineName;
  72. result.EngineVersion := aEngineVersion;
  73. result.ApiVersion := aApiVersion;
  74. end;
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. //TvkuInstanceEx/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. destructor TvkuInstanceEx.Destroy;
  79. begin
  80. inherited Destroy;
  81. if fOwnsHandler then
  82. FreeAndNil(fAllocHandler);
  83. end;
  84. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. //TvkuInstanceFactory///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. function TvkuInstanceFactory.GetLayers: TStrings;
  88. begin
  89. result := fLayers;
  90. end;
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. function TvkuInstanceFactory.GetExtensions: TStrings;
  93. begin
  94. result := fExtensions;
  95. end;
  96. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. function TvkuInstanceFactory.CreateInstance: TvkuInstance;
  98. begin
  99. result := CreateInstance(nil, false);
  100. end;
  101. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. function TvkuInstanceFactory.CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstance;
  103. var
  104. CreateInfo: TVkInstanceCreateInfo;
  105. AppInfo: TVkApplicationInfo;
  106. i: Integer;
  107. lay: array of PVkChar;
  108. ext: array of PVkChar;
  109. begin
  110. FillByte(AppInfo{%H-}, SizeOf(AppInfo), 0);
  111. AppInfo.sType := VK_STRUCTURE_TYPE_APPLICATION_INFO;
  112. AppInfo.pNext := nil;
  113. AppInfo.pApplicationName := PVkChar(fApplicationInfo.AppName);
  114. AppInfo.applicationVersion := fApplicationInfo.AppVersion;
  115. AppInfo.pEngineName := PVkChar(fApplicationInfo.EngineName);
  116. AppInfo.engineVersion := fApplicationInfo.EngineVersion;
  117. AppInfo.apiVersion := fApplicationInfo.ApiVersion;
  118. SetLength(lay, fLayers.Count);
  119. for i := 0 to fLayers.Count-1 do
  120. lay[i] := PVkChar(fLayers[i]);
  121. SetLength(ext, fExtensions.Count);
  122. for i := 0 to fExtensions.Count-1 do
  123. ext[i] := PVkChar(fExtensions[i]);
  124. FillByte(CreateInfo{%H-}, SizeOf(CreateInfo), 0);
  125. CreateInfo.sType := VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
  126. CreateInfo.pNext := nil;
  127. CreateInfo.flags := fFlags;
  128. CreateInfo.pApplicationInfo := @AppInfo;
  129. CreateInfo.enabledLayerCount := Length(lay);
  130. CreateInfo.ppEnabledLayerNames := @lay[0];
  131. CreateInfo.enabledExtensionCount := Length(ext);
  132. CreateInfo.ppEnabledExtensionNames := @ext[0];
  133. if Assigned(aAllocHandler)
  134. then result := TvkuInstanceEx.Create(CreateInfo, aAllocHandler.GetAllocationCallbacks)
  135. else result := TvkuInstanceEx.Create(CreateInfo);
  136. try
  137. TvkuInstanceEx(result).fAllocHandler := aAllocHandler;
  138. TvkuInstanceEx(result).fOwnsHandler := aOwnsHandler;
  139. except
  140. FreeAndNil(result);
  141. raise;
  142. end;
  143. end;
  144. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  145. constructor TvkuInstanceFactory.Create;
  146. begin
  147. inherited Create;
  148. fLayers := TStringList.Create;
  149. fExtensions := TStringList.Create;
  150. fApplicationInfo := vkuApplicationInfo;
  151. fFlags := 0;
  152. end;
  153. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. destructor TvkuInstanceFactory.Destroy;
  155. begin
  156. FreeAndNil(fLayers);
  157. FreeAndNil(fExtensions);
  158. inherited Destroy;
  159. end;
  160. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  161. class function TvkuInstanceFactory.GetPlatformSurfaceExtensionName: String;
  162. begin
  163. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  164. result := VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
  165. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  166. result := VK_KHR_XCB_SURFACE_EXTENSION_NAME;
  167. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  168. result := VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
  169. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  170. result := VK_KHR_MIR_SURFACE_EXTENSION_NAME;
  171. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  172. result := VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
  173. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  174. result := VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
  175. {$ELSE}
  176. {$ERROR 'unknown or unsupportet platform'}
  177. {$ENDIF}
  178. end;
  179. end.