Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

188 lignes
7.5 KiB

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