Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

127 lignes
4.8 KiB

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