Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

240 Zeilen
9.2 KiB

  1. unit uvkuSurfaceFactory;
  2. {$mode objfpc}{$H+}
  3. {$I Vulkan.inc}
  4. interface
  5. uses
  6. Classes, SysUtils, Controls,
  7. Vulkan, uvkuInstance, uvkuSurface, uvkuAllocationHandler;
  8. type
  9. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TvkuSurfaceEx = class(TvkuSurface)
  11. private
  12. fAllocHandler: TvkuAllocationHandler;
  13. fOwnsHandler: Boolean;
  14. public
  15. destructor Destroy; override;
  16. end;
  17. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18. TvkuSurfaceFactory = class(TObject)
  19. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  20. private
  21. fHInstance: Vulkan.HINSTANCE;
  22. fHwnd: Vulkan.HWND;
  23. procedure SetHwnd(const aValue: Vulkan.HWND);
  24. public
  25. property HInstance: Vulkan.HINSTANCE read fHInstance write fHInstance;
  26. property Hwnd: Vulkan.HWND read fHwnd write SetHwnd;
  27. {$ENDIF}
  28. private
  29. fFlags: VkFlags;
  30. fWinControl: TWinControl;
  31. fInstance: VkInstance;
  32. fInstanceCommands: TVkInstanceCommands;
  33. procedure SetWinControl(aValue: TWinControl);
  34. public
  35. property WinControl: TWinControl read fWinControl write SetWinControl;
  36. property Flags: VkFlags read fFlags write fFlags;
  37. function CreateSurface: TvkuSurface;
  38. function CreateSurface(
  39. const aAllocHandler: TvkuAllocationHandler;
  40. const aOwnsHandler: Boolean): TvkuSurface;
  41. constructor Create(const aInstance: TvkuInstance);
  42. constructor Create(const aInstance: VkInstance; const aInstanceCommands: TVkInstanceCommands);
  43. end;
  44. implementation
  45. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  46. uses Windows;
  47. {$ENDIF}
  48. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. //TvkuSurfaceEx//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. destructor TvkuSurfaceEx.Destroy;
  52. begin
  53. inherited Destroy;
  54. if fOwnsHandler then
  55. FreeAndNil(fAllocHandler);
  56. end;
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. //TvkuSurfaceFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  59. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  61. {$ERROR 'TODO: implement'}
  62. procedure TvkuSurfaceFactory.SetDisplay(const aValue: TDisplay);
  63. begin
  64. end;
  65. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66. procedure TvkuSurfaceFactory.SetWindow(const aValue: TWindow);
  67. begin
  68. end;
  69. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  70. {$ERROR 'TODO: implement'}
  71. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. procedure TvkuSurfaceFactory.SetConnection(const aValue: xcb_connection_t);
  73. begin
  74. end;
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. procedure TvkuSurfaceFactory.SetWindow(const aValue: xcb_window_t);
  77. begin
  78. end;
  79. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  80. {$ERROR 'TODO: implement'}
  81. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. procedure TvkuSurfaceFactory.SetDisplay(const aValue: wl_display);
  83. begin
  84. end;
  85. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. procedure TvkuSurfaceFactory.SetSurface(const aValue: wl_surface);
  87. begin
  88. end;
  89. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  90. {$ERROR 'TODO: implement'}
  91. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. procedure TvkuSurfaceFactory.SetConnection(const aValue: MirConnection);
  93. begin
  94. end;
  95. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. procedure TvkuSurfaceFactory.SetSurface(const aValue: MirSurface);
  97. begin
  98. end;
  99. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  100. {$ERROR 'TODO: implement'}
  101. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. procedure TvkuSurfaceFactory.SetWindow(const aValue: ANativeWindow);
  103. begin
  104. end;
  105. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  106. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. procedure TvkuSurfaceFactory.SetHwnd(const aValue: Vulkan.HWND);
  108. begin
  109. SetWinControl(nil);
  110. fHwnd := aValue;
  111. end;
  112. {$ENDIF}
  113. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  114. procedure TvkuSurfaceFactory.SetWinControl(aValue: TWinControl);
  115. begin
  116. if fWinControl = aValue then
  117. exit;
  118. fWinControl := aValue;
  119. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  120. {$ERROR 'TODO: implement'}
  121. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  122. {$ERROR 'TODO: implement'}
  123. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  124. {$ERROR 'TODO: implement'}
  125. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  126. {$ERROR 'TODO: implement'}
  127. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  128. {$ERROR 'TODO: implement'}
  129. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  130. fHwnd := Vulkan.HWND(fWinControl.Handle);
  131. {$ENDIF}
  132. end;
  133. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  134. function TvkuSurfaceFactory.CreateSurface: TvkuSurface;
  135. begin
  136. result := CreateSurface(nil, false);
  137. end;
  138. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  139. function TvkuSurfaceFactory.CreateSurface(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuSurface;
  140. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  141. {$ERROR 'TODO: implement'}
  142. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  143. {$ERROR 'TODO: implement'}
  144. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  145. {$ERROR 'TODO: implement'}
  146. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  147. {$ERROR 'TODO: implement'}
  148. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  149. {$ERROR 'TODO: implement'}
  150. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  151. var CreateInfo: TVkWin32SurfaceCreateInfoKHR;
  152. {$ENDIF}
  153. var srf: TvkuSurfaceEx;
  154. begin
  155. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  156. {$ERROR 'TODO: implement'}
  157. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  158. {$ERROR 'TODO: implement'}
  159. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  160. {$ERROR 'TODO: implement'}
  161. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  162. {$ERROR 'TODO: implement'}
  163. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  164. {$ERROR 'TODO: implement'}
  165. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  166. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  167. CreateInfo.sType := VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
  168. CreateInfo.pNext := nil;
  169. CreateInfo.flags := fFlags;
  170. CreateInfo.hinstance := fHInstance;
  171. CreateInfo.hwnd := fHwnd;
  172. {$ENDIF}
  173. if Assigned(aAllocHandler)
  174. then srf := TvkuSurfaceEx.Create(fInstance, CreateInfo, fInstanceCommands, aAllocHandler.GetAllocationCallbacks)
  175. else srf := TvkuSurfaceEx.Create(fInstance, CreateInfo, fInstanceCommands);
  176. try
  177. srf.fAllocHandler := aAllocHandler;
  178. srf.fOwnsHandler := aOwnsHandler;
  179. except
  180. FreeAndNil(srf);
  181. end;
  182. result := srf;
  183. end;
  184. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. constructor TvkuSurfaceFactory.Create(const aInstance: TvkuInstance);
  186. begin
  187. Create(aInstance.Handle, aInstance.InstanceCommands);
  188. end;
  189. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  190. constructor TvkuSurfaceFactory.Create(const aInstance: VkInstance; const aInstanceCommands: TVkInstanceCommands);
  191. begin
  192. inherited Create;
  193. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  194. {$ERROR 'TODO: implement'}
  195. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  196. {$ERROR 'TODO: implement'}
  197. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  198. {$ERROR 'TODO: implement'}
  199. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  200. {$ERROR 'TODO: implement'}
  201. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  202. {$ERROR 'TODO: implement'}
  203. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  204. fHInstance := Vulkan.HINSTANCE(GetModuleHandle(nil));
  205. {$ENDIF}
  206. fInstance := aInstance;
  207. fInstanceCommands := aInstanceCommands;
  208. fFlags := 0;
  209. end;
  210. end.