Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

177 строки
6.8 KiB

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