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ů.
 
 

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