|
- unit uvkuSurface;
-
- {$mode objfpc}{$H+}
- {$I Vulkan.inc}
-
- interface
-
- uses
- Classes, SysUtils,
- Vulkan;
-
- type
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TvkuSurface = class(TObject)
- private
- fHandle: VkSurfaceKHR;
- fInstance: VkInstance;
- fAllocCallbacks: PVkAllocationCallbacks;
- fInstanceCommands: TVkInstanceCommands;
-
- procedure CreateHandle(const aCreateInfo: Pointer; const aAllocCallbacks: PVkAllocationCallbacks);
- public
- property Handle: VkSurfaceKHR read fHandle;
- property Instance: VkInstance read fInstance;
- property InstanceCommands: TVkInstanceCommands read fInstanceCommands;
-
- {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
- constructor Create(
- const aInstance: VkInstance;
- const aCreateInfo: TVkWin32SurfaceCreateInfoKHR;
- const aInstanceCommands: TVkInstanceCommands);
- constructor Create(
- const aInstance: VkInstance;
- const aCreateInfo: TVkWin32SurfaceCreateInfoKHR;
- const aInstanceCommands: TVkInstanceCommands;
- const aAllocCallbacks: TVkAllocationCallbacks);
- {$ELSE}
- {$ERROR 'unknown or unsupportet platform'}
- {$ENDIF}
- destructor Destroy; override;
- public
- class function GetPlatformSurfaceExtensionName: String;
- end;
-
- implementation
-
- uses
- uvkuUtils;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TvkuSurface////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TvkuSurface.CreateHandle(const aCreateInfo: Pointer; const aAllocCallbacks: PVkAllocationCallbacks);
- var err: TVkResult;
- begin
- if Assigned(aAllocCallbacks) then begin
- new(fAllocCallbacks);
- fAllocCallbacks^ := aAllocCallbacks^;
- end;
- {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
- if not Assigned(fInstanceCommands.vkCreateWin32SurfaceKHR) then
- raise TvkuException.Create('invalid function pointer: vkCreateWin32SurfaceKHR; did you enabled the VK_KHR_win32_surface extension?');
- err := fInstanceCommands.vkCreateWin32SurfaceKHR(fInstance, aCreateInfo, fAllocCallbacks, @fHandle);
- {$ENDIF}
- if (err < VK_SUCCESS) then
- raise TvkuErrorException.Create('unable to create surface', err);
- end;
-
- {$IF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor TvkuSurface.Create(const aInstance: VkInstance; const aCreateInfo: TVkWin32SurfaceCreateInfoKHR;
- const aInstanceCommands: TVkInstanceCommands);
- begin
- inherited Create;
- fInstance := aInstance;
- fInstanceCommands := aInstanceCommands;
- CreateHandle(@aCreateInfo, nil);
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor TvkuSurface.Create(const aInstance: VkInstance; const aCreateInfo: TVkWin32SurfaceCreateInfoKHR;
- const aInstanceCommands: TVkInstanceCommands; const aAllocCallbacks: TVkAllocationCallbacks);
- begin
- inherited Create;
- fInstance := aInstance;
- fInstanceCommands := aInstanceCommands;
- CreateHandle(@aCreateInfo, @aAllocCallbacks);
- end;
- {$ENDIF}
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- destructor TvkuSurface.Destroy;
- begin
- if (fHandle <> VK_INVALID_NDP_HANDLE) then begin
- fInstanceCommands.vkDestroySurfaceKHR(fInstance, fHandle, fAllocCallbacks);
- fHandle := VK_INVALID_NDP_HANDLE;
- end;
- if Assigned(fAllocCallbacks) then begin
- Dispose(fAllocCallbacks);
- fAllocCallbacks := nil;
- end;
- inherited Destroy;
- end;
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TvkuSurface.GetPlatformSurfaceExtensionName: String;
- begin
- {$IF DEFINED(VK_USE_PLATFORM_XLIB_KHR)}
- result := VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
- {$ELSEIF DEFINED(VK_USE_PLATFORM_XCB_KHR)}
- result := VK_KHR_XCB_SURFACE_EXTENSION_NAME;
- {$ELSEIF DEFINED(VK_USE_PLATFORM_WAYLAND_KHR)}
- result := VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
- {$ELSEIF DEFINED(VK_USE_PLATFORM_MIR_KHR)}
- result := VK_KHR_MIR_SURFACE_EXTENSION_NAME;
- {$ELSEIF DEFINED(VK_USE_PLATFORM_ANDROID_KHR)}
- result := VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
- {$ELSEIF DEFINED(VK_USE_PLATFORM_WIN32_KHR)}
- result := VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
- {$ELSE}
- {$ERROR 'unknown or unsupportet platform'}
- {$ENDIF}
- end;
-
- end.
|