25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
4.4 KiB

  1. unit uvkuSurface;
  2. {$mode objfpc}{$H+}
  3. {$I Vulkan.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. Vulkan, uvkuBase;
  8. type
  9. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TvkuSurface = class(TvkuAllocHandle)
  11. private
  12. fHandle: VkSurfaceKHR;
  13. fInstanceCommands: TVkInstanceCommands;
  14. procedure CreateHandle(const aCreateInfo: Pointer);
  15. public
  16. property Handle: VkSurfaceKHR read fHandle;
  17. property InstanceCommands: TVkInstanceCommands read fInstanceCommands;
  18. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  19. constructor Create(
  20. const aCreateInfo: TVkWin32SurfaceCreateInfoKHR;
  21. const aInstanceCommands: TVkInstanceCommands;
  22. const aAllocCallbacks: PVkAllocationCallbacks = nil);
  23. {$ELSE}
  24. {$ERROR 'unknown or unsupportet platform'}
  25. {$ENDIF}
  26. constructor Create(
  27. const aHandle: VkSurfaceKHR;
  28. const aOwnsHandle: Boolean;
  29. const aInstanceCommands: TVkInstanceCommands;
  30. const aAllocCallbacks: PVkAllocationCallbacks = nil);
  31. destructor Destroy; override;
  32. public
  33. class function GetPlatformSurfaceExtensionName: String;
  34. end;
  35. implementation
  36. uses
  37. uvkuUtils;
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. //TvkuSurface////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. procedure TvkuSurface.CreateHandle(const aCreateInfo: Pointer);
  42. var err: TVkResult;
  43. begin
  44. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  45. if not Assigned(fInstanceCommands.vkCreateWin32SurfaceKHR) then
  46. raise TvkuInvalidFuncPtrException.Create('vkCreateWin32SurfaceKHR', 'VK_KHR_win32_surface');
  47. err := fInstanceCommands.vkCreateWin32SurfaceKHR(fInstanceCommands.Instance, aCreateInfo, AllocCallbacks, @fHandle);
  48. {$ENDIF}
  49. if (err < VK_SUCCESS) then
  50. raise TvkuErrorException.Create('unable to create surface', err);
  51. end;
  52. {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  53. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. constructor TvkuSurface.Create(const aCreateInfo: TVkWin32SurfaceCreateInfoKHR;
  55. const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks);
  56. begin
  57. inherited Create;
  58. fInstanceCommands := aInstanceCommands;
  59. SetAllocCallbacks(aAllocCallbacks);
  60. CreateHandle(@aCreateInfo);
  61. end;
  62. {$ENDIF}
  63. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. constructor TvkuSurface.Create(const aHandle: VkSurfaceKHR; const aOwnsHandle: Boolean;
  65. const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: PVkAllocationCallbacks);
  66. begin
  67. inherited Create;
  68. fHandle := aHandle;
  69. fInstanceCommands := aInstanceCommands;
  70. OwnsHandle := aOwnsHandle;
  71. SetAllocCallbacks(aAllocCallbacks);
  72. end;
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. destructor TvkuSurface.Destroy;
  75. begin
  76. if OwnsHandle and (fHandle <> VK_INVALID_NDP_HANDLE) then
  77. fInstanceCommands.vkDestroySurfaceKHR(fInstanceCommands.Instance, fHandle, AllocCallbacks);
  78. fHandle := VK_INVALID_NDP_HANDLE;
  79. inherited Destroy;
  80. end;
  81. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. class function TvkuSurface.GetPlatformSurfaceExtensionName: String;
  83. begin
  84. {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
  85. result := VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
  86. {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
  87. result := VK_KHR_XCB_SURFACE_EXTENSION_NAME;
  88. {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
  89. result := VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
  90. {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
  91. result := VK_KHR_MIR_SURFACE_EXTENSION_NAME;
  92. {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
  93. result := VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
  94. {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
  95. result := VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
  96. {$ELSE}
  97. {$ERROR 'unknown or unsupportet platform'}
  98. {$ENDIF}
  99. end;
  100. end.