Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

231 rader
8.8 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: TvkuInstance;
  32. procedure SetWinControl(aValue: TWinControl);
  33. public
  34. property WinControl: TWinControl read fWinControl write SetWinControl;
  35. property Flags: VkFlags read fFlags write fFlags;
  36. function CreateSurface: TvkuSurface;
  37. function CreateSurface(
  38. const aAllocHandler: TvkuAllocationHandler;
  39. const aOwnsHandler: Boolean): TvkuSurface;
  40. constructor Create(const aInstance: TvkuInstance);
  41. end;
  42. implementation
  43. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  44. uses Windows;
  45. {$ENDIF}
  46. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. //TvkuSurfaceEx//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. destructor TvkuSurfaceEx.Destroy;
  50. begin
  51. inherited Destroy;
  52. if fOwnsHandler then
  53. FreeAndNil(fAllocHandler);
  54. end;
  55. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. //TvkuSurfaceFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  59. {$ERROR 'TODO: implement'}
  60. procedure TvkuSurfaceFactory.SetDisplay(const aValue: TDisplay);
  61. begin
  62. end;
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. procedure TvkuSurfaceFactory.SetWindow(const aValue: TWindow);
  65. begin
  66. end;
  67. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  68. {$ERROR 'TODO: implement'}
  69. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. procedure TvkuSurfaceFactory.SetConnection(const aValue: xcb_connection_t);
  71. begin
  72. end;
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. procedure TvkuSurfaceFactory.SetWindow(const aValue: xcb_window_t);
  75. begin
  76. end;
  77. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  78. {$ERROR 'TODO: implement'}
  79. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. procedure TvkuSurfaceFactory.SetDisplay(const aValue: wl_display);
  81. begin
  82. end;
  83. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. procedure TvkuSurfaceFactory.SetSurface(const aValue: wl_surface);
  85. begin
  86. end;
  87. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  88. {$ERROR 'TODO: implement'}
  89. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. procedure TvkuSurfaceFactory.SetConnection(const aValue: MirConnection);
  91. begin
  92. end;
  93. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. procedure TvkuSurfaceFactory.SetSurface(const aValue: MirSurface);
  95. begin
  96. end;
  97. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  98. {$ERROR 'TODO: implement'}
  99. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. procedure TvkuSurfaceFactory.SetWindow(const aValue: ANativeWindow);
  101. begin
  102. end;
  103. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  104. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. procedure TvkuSurfaceFactory.SetHwnd(const aValue: Vulkan.HWND);
  106. begin
  107. SetWinControl(nil);
  108. fHwnd := aValue;
  109. end;
  110. {$ENDIF}
  111. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. procedure TvkuSurfaceFactory.SetWinControl(aValue: TWinControl);
  113. begin
  114. if fWinControl = aValue then
  115. exit;
  116. fWinControl := aValue;
  117. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  118. {$ERROR 'TODO: implement'}
  119. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  120. {$ERROR 'TODO: implement'}
  121. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  122. {$ERROR 'TODO: implement'}
  123. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  124. {$ERROR 'TODO: implement'}
  125. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  126. {$ERROR 'TODO: implement'}
  127. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  128. fHwnd := Vulkan.HWND(fWinControl.Handle);
  129. {$ENDIF}
  130. end;
  131. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. function TvkuSurfaceFactory.CreateSurface: TvkuSurface;
  133. begin
  134. result := CreateSurface(nil, false);
  135. end;
  136. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  137. function TvkuSurfaceFactory.CreateSurface(const aAllocHandler: TvkuAllocationHandler; const aOwnsHandler: Boolean): TvkuSurface;
  138. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  139. {$ERROR 'TODO: implement'}
  140. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  141. {$ERROR 'TODO: implement'}
  142. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  143. {$ERROR 'TODO: implement'}
  144. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  145. {$ERROR 'TODO: implement'}
  146. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  147. {$ERROR 'TODO: implement'}
  148. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  149. var CreateInfo: TVkWin32SurfaceCreateInfoKHR;
  150. {$ENDIF}
  151. var srf: TvkuSurfaceEx;
  152. begin
  153. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  154. {$ERROR 'TODO: implement'}
  155. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  156. {$ERROR 'TODO: implement'}
  157. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  158. {$ERROR 'TODO: implement'}
  159. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  160. {$ERROR 'TODO: implement'}
  161. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  162. {$ERROR 'TODO: implement'}
  163. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  164. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  165. CreateInfo.sType := VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
  166. CreateInfo.pNext := nil;
  167. CreateInfo.flags := fFlags;
  168. CreateInfo.hinstance := fHInstance;
  169. CreateInfo.hwnd := fHwnd;
  170. {$ENDIF}
  171. if Assigned(aAllocHandler)
  172. then srf := TvkuSurfaceEx.Create(fInstance.Handle, CreateInfo, fInstance.InstanceCommands, aAllocHandler.GetAllocationCallbacks)
  173. else srf := TvkuSurfaceEx.Create(fInstance.Handle, CreateInfo, fInstance.InstanceCommands);
  174. try
  175. srf.fAllocHandler := aAllocHandler;
  176. srf.fOwnsHandler := aOwnsHandler;
  177. except
  178. FreeAndNil(srf);
  179. end;
  180. result := srf;
  181. end;
  182. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  183. constructor TvkuSurfaceFactory.Create(const aInstance: TvkuInstance);
  184. begin
  185. inherited Create;
  186. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  187. {$ERROR 'TODO: implement'}
  188. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  189. {$ERROR 'TODO: implement'}
  190. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  191. {$ERROR 'TODO: implement'}
  192. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  193. {$ERROR 'TODO: implement'}
  194. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  195. {$ERROR 'TODO: implement'}
  196. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  197. fHInstance := Vulkan.HINSTANCE(GetModuleHandle(nil));
  198. {$ENDIF}
  199. fInstance := aInstance;
  200. fFlags := 0;
  201. end;
  202. end.