您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

109 行
3.7 KiB

  1. unit uvkuSurfaceFactory;
  2. {$mode objfpc}{$H+}
  3. {$I Vulkan.inc}
  4. interface
  5. uses
  6. Classes, SysUtils, Controls,
  7. Vulkan, uvkuSurface, uvkuFactoryBase;
  8. type
  9. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TvkuSurfaceFactory = class(TvkuInstanceObjFactory)
  11. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  12. private
  13. fHInstance: Vulkan.HINSTANCE;
  14. fHwnd: Vulkan.HWND;
  15. procedure SetHwnd(const aValue: Vulkan.HWND);
  16. public
  17. property HInstance: Vulkan.HINSTANCE read fHInstance write fHInstance;
  18. property Hwnd: Vulkan.HWND read fHwnd write SetHwnd;
  19. function GetStructure: TVkWin32SurfaceCreateInfoKHR;
  20. procedure SetStructure(const aData: TVkWin32SurfaceCreateInfoKHR);
  21. {$ENDIF}
  22. private
  23. fFlags: VkFlags;
  24. fWinControl: TWinControl;
  25. procedure SetWinControl(aValue: TWinControl);
  26. public
  27. property WinControl: TWinControl read fWinControl write SetWinControl;
  28. property Flags: VkFlags read fFlags write fFlags;
  29. function CreateSurface: TvkuSurface;
  30. procedure AfterConstruction; override;
  31. end;
  32. implementation
  33. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  34. uses Windows;
  35. {$ENDIF}
  36. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. //TvkuSurfaceFactory/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  40. procedure TvkuSurfaceFactory.SetHwnd(const aValue: Vulkan.HWND);
  41. begin
  42. SetWinControl(nil);
  43. fHwnd := aValue;
  44. end;
  45. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. function TvkuSurfaceFactory.GetStructure: TVkWin32SurfaceCreateInfoKHR;
  47. begin
  48. FillByte(result, SizeOf(result), 0);
  49. result.sType := VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
  50. result.pNext := nil;
  51. result.flags := fFlags;
  52. result.hinstance := fHInstance;
  53. result.hwnd := fHwnd;
  54. end;
  55. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. procedure TvkuSurfaceFactory.SetStructure(const aData: TVkWin32SurfaceCreateInfoKHR);
  57. begin
  58. fFlags := aData.flags;
  59. fHInstance := aData.hinstance;
  60. fHwnd := aData.hwnd;
  61. end;
  62. {$ENDIF}
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. procedure TvkuSurfaceFactory.SetWinControl(aValue: TWinControl);
  65. begin
  66. if fWinControl = aValue then
  67. exit;
  68. fWinControl := aValue;
  69. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  70. fHwnd := Vulkan.HWND(fWinControl.Handle);
  71. {$ELSE}
  72. {$ERROR 'unknown or unsupported system'}
  73. {$ENDIF}
  74. end;
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. function TvkuSurfaceFactory.CreateSurface: TvkuSurface;
  77. begin
  78. result := TvkuSurface.Create(GetStructure, InstanceCommands, AllocCallbacks);
  79. end;
  80. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. procedure TvkuSurfaceFactory.AfterConstruction;
  82. begin
  83. inherited AfterConstruction;
  84. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  85. fHInstance := Vulkan.HINSTANCE(GetModuleHandle(nil));
  86. {$ENDIF}
  87. fFlags := 0;
  88. end;
  89. end.