25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 

186 satır
7.1 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. end;
  46. function vkuApplicationInfo: TvkuApplicationInfo;
  47. function vkuApplicationInfo(
  48. aAppName: String;
  49. aAppVersion: VkVersion;
  50. aEngineName: String;
  51. aEngineVersion: VkVersion;
  52. aApiVersion: VkVersion = VK_API_VERSION): TvkuApplicationInfo;
  53. implementation
  54. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. function vkuApplicationInfo: TvkuApplicationInfo;
  56. begin
  57. result.AppName := ExtractFileName(ParamStr(0));
  58. result.AppVersion := 0;
  59. result.EngineName := ExtractFileName(ParamStr(0));
  60. result.EngineVersion := 0;
  61. result.ApiVersion := VK_API_VERSION;
  62. end;
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. function vkuApplicationInfo(aAppName: String; aAppVersion: VkVersion; aEngineName: String; aEngineVersion: VkVersion; aApiVersion: VkVersion): TvkuApplicationInfo;
  65. begin
  66. result := vkuApplicationInfo();
  67. result.AppName := aAppName;
  68. result.AppVersion := aAppVersion;
  69. result.EngineName := aEngineName;
  70. result.EngineVersion := aEngineVersion;
  71. result.ApiVersion := aApiVersion;
  72. end;
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. //TvkuInstanceEx/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. destructor TvkuInstanceEx.Destroy;
  77. begin
  78. inherited Destroy;
  79. if fOwnsHandler then
  80. FreeAndNil(fAllocHandler);
  81. end;
  82. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. //TvkuInstanceFactory///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. function TvkuInstanceFactory.GetLayers: TStrings;
  86. begin
  87. result := fLayers;
  88. end;
  89. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. function TvkuInstanceFactory.GetExtensions: TStrings;
  91. begin
  92. result := fExtensions;
  93. end;
  94. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. function TvkuInstanceFactory.CreateInstance: TvkuInstance;
  96. begin
  97. result := CreateInstance(nil, false);
  98. end;
  99. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. function TvkuInstanceFactory.CreateInstance(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuInstance;
  101. var
  102. CreateInfo: TVkInstanceCreateInfo;
  103. AppInfo: TVkApplicationInfo;
  104. i: Integer;
  105. lay: array of PVkChar;
  106. ext: array of PVkChar;
  107. begin
  108. FillByte(AppInfo{%H-}, SizeOf(AppInfo), 0);
  109. AppInfo.sType := VK_STRUCTURE_TYPE_APPLICATION_INFO;
  110. AppInfo.pNext := nil;
  111. AppInfo.pApplicationName := PVkChar(fApplicationInfo.AppName);
  112. AppInfo.applicationVersion := fApplicationInfo.AppVersion;
  113. AppInfo.pEngineName := PVkChar(fApplicationInfo.EngineName);
  114. AppInfo.engineVersion := fApplicationInfo.EngineVersion;
  115. AppInfo.apiVersion := fApplicationInfo.ApiVersion;
  116. SetLength(lay, fLayers.Count);
  117. for i := 0 to fLayers.Count-1 do
  118. lay[i] := PVkChar(fLayers[i]);
  119. SetLength(ext, fExtensions.Count);
  120. for i := 0 to fExtensions.Count-1 do
  121. ext[i] := PVkChar(fExtensions[i]);
  122. FillByte(CreateInfo{%H-}, SizeOf(CreateInfo), 0);
  123. CreateInfo.sType := VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
  124. CreateInfo.pNext := nil;
  125. CreateInfo.flags := fFlags;
  126. CreateInfo.pApplicationInfo := @AppInfo;
  127. CreateInfo.enabledLayerCount := Length(lay);
  128. CreateInfo.ppEnabledLayerNames := @lay[0];
  129. CreateInfo.enabledExtensionCount := Length(ext);
  130. CreateInfo.ppEnabledExtensionNames := @ext[0];
  131. if Assigned(aAllocHandler)
  132. then result := TvkuInstanceEx.Create(CreateInfo, aAllocHandler.GetAllocationCallbacks)
  133. else result := TvkuInstanceEx.Create(CreateInfo);
  134. try
  135. TvkuInstanceEx(result).fAllocHandler := aAllocHandler;
  136. TvkuInstanceEx(result).fOwnsHandler := aOwnsHandler;
  137. except
  138. FreeAndNil(result);
  139. raise;
  140. end;
  141. end;
  142. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  143. constructor TvkuInstanceFactory.Create;
  144. begin
  145. inherited Create;
  146. fLayers := TStringList.Create;
  147. fExtensions := TStringList.Create;
  148. fApplicationInfo := vkuApplicationInfo;
  149. fFlags := 0;
  150. end;
  151. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. destructor TvkuInstanceFactory.Destroy;
  153. begin
  154. FreeAndNil(fLayers);
  155. FreeAndNil(fExtensions);
  156. inherited Destroy;
  157. end;
  158. end.