Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 

177 řádky
6.9 KiB

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