選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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