VulkanDevice class
Pipeline-state and draw-call facade of the Vulkan backend (aliased as RHI::Device).
Exposes the OpenGL device's surface (blending, depth, cull, scissor, viewport, clear and the draw calls) so the backend-neutral render pipeline drives it unchanged.
The device also owns the real VkInstance, VkDevice, graphics/present VkQueue and the VkSwapchainKHR created from the SDL window (via CreateSwapchain(), called by the SDL window backend). PresentFrame() acquires a swap-chain image, blits the rendered scene into it and presents it (the buffer-swap equivalent).
Public types
- struct ScissorState
- struct BlendingState
- struct DepthTestState
- struct CullFaceState
Public static functions
- static void SetBlendingEnabled(bool enabled)
-
static void SetBlendingFactors(nCine::
BlendingFactor srcRgb, nCine:: BlendingFactor dstRgb, nCine:: BlendingFactor srcAlpha, nCine:: BlendingFactor dstAlpha) - static auto GetBlendingState() -> BlendingState
- static void SetBlendingState(const BlendingState& state)
- static void SetDepthTestEnabled(bool enabled)
- static void SetDepthMaskEnabled(bool enabled)
- static auto GetDepthTestState() -> DepthTestState
- static void SetDepthTestState(const DepthTestState& state)
- static void SetCullFaceEnabled(bool enabled)
- static auto GetCullFaceState() -> CullFaceState
- static void SetCullFaceState(const CullFaceState& state)
- static auto GetScissorState() -> ScissorState
- static void SetScissorState(const ScissorState& state)
- static void SetScissor(const Recti& rect)
- static void SetScissorTestEnabled(bool enabled)
- static auto GetViewport() -> Recti
- static void SetViewport(const Recti& rect)
-
static void InitViewport(std::
int32_t x, std:: int32_t y, std:: int32_t width, std:: int32_t height) - static auto GetClearColor() -> Colorf
- static void SetClearColor(const Colorf& color)
- static void Clear(ClearFlags flags)
-
static void DrawArrays(PrimitiveType primitive,
std::
int32_t firstVertex, std:: int32_t numVertices) -
static void DrawArraysInstanced(PrimitiveType primitive,
std::
int32_t firstVertex, std:: int32_t numVertices, std:: int32_t numInstances) -
static void DrawElements(PrimitiveType primitive,
std::
uint32_t numIndices, IndexFormat indexFormat, std:: uintptr_t indexOffset, std:: int32_t baseVertex) -
static void DrawElements(PrimitiveType primitive,
std::
uint32_t numIndices, std:: uintptr_t indexOffset, std:: int32_t baseVertex) -
static void DrawElementsInstanced(PrimitiveType primitive,
std::
uint32_t numIndices, IndexFormat indexFormat, std:: uintptr_t indexOffset, std:: int32_t numInstances, std:: int32_t baseVertex) -
static void DrawElementsInstanced(PrimitiveType primitive,
std::
uint32_t numIndices, std:: uintptr_t indexOffset, std:: int32_t numInstances, std:: int32_t baseVertex) - static auto InsertFence() -> FenceHandle
- static void DeleteFence(FenceHandle& fence)
-
static auto ClientWaitFence(FenceHandle fence,
std::
uint64_t timeoutNs) -> bool - static void SetupInitialState()
- static void BindProgram(VulkanShaderProgram* program)
- Records the currently bound shader program.
- static auto CurrentProgram() -> VulkanShaderProgram*
- Returns the currently bound shader program.
-
static void BindTexture(std::
uint32_t unit, const VulkanTexture* texture) - Records the texture bound to a texture unit.
- static void UnbindTexture(const VulkanTexture* texture)
- Clears a texture from every unit it is bound to (called from ~VulkanTexture to avoid a dangling pointer).
-
static auto GetBoundTexture(std::
uint32_t unit) -> const VulkanTexture* - Returns the texture bound to a texture unit.
-
static void BindUniformRange(std::
uint32_t index, const std:: uint8_t* data, std:: uint32_t size) - Records the host data range bound to a uniform binding point.
- static void UnbindRenderTarget(const VulkanRenderTarget* renderTarget)
- Clears a render target from the device if it is the current one (called from ~VulkanRenderTarget).
- static void SetRenderTarget(VulkanRenderTarget* renderTarget)
- Records the current draw render target (its color attachment 0 receives the pixels).
- static void OnShaderProgramDestroyed(VulkanShaderProgram* program)
- Drops any cached graphics pipelines keyed on a shader program being destroyed/reset.
- static auto currentRenderTargetInternal() -> VulkanRenderTarget*
- Returns the currently bound draw render target (nullptr = the screen).
-
static auto MaxUniformBindingsPublic() -> std::
uint32_t - Number of uniform binding slots tracked by BindUniformRange().
-
static void GetUniformRange(std::
uint32_t index, const std:: uint8_t*& data, std:: uint32_t& size) - Returns the host data range bound to a uniform binding slot.
-
static auto CreateSwapchain(void* windowHandle,
std::
int32_t width, std:: int32_t height, bool vsync) -> bool - Creates the Vulkan instance, device and swap chain for the given SDL window.
- static void DestroySwapchain()
- Releases the swap chain, device and instance.
-
static void ResizeSwapchain(std::
int32_t width, std:: int32_t height) - Recreates the swap chain at the new drawable size (waits for the device to go idle first).
- static void PresentFrame()
- Acquires a swap-chain image, blits the rendered scene into it and presents it (the buffer-swap equivalent).
-
static auto CreateSecondarySwapchain(void* windowHandle,
std::
int32_t width, std:: int32_t height) -> void* - Creates an additional surface and swap chain for a secondary window.
- static void DestroySecondarySwapchain(void* handle)
- Releases a secondary surface and swap chain created by CreateSecondarySwapchain().
-
static void ResizeSecondarySwapchain(void* handle,
std::
int32_t width, std:: int32_t height) - Recreates a secondary swap chain at a new size (waits for the device to go idle first).
- static void QueueSecondaryPresent(void* handle, const VulkanTexture* source)
- Hands the texture holding a secondary window's contents over to the next PresentFrame().
-
static auto GetMaxTextureDimension() -> std::
int32_t - Returns the device's largest supported 2D image dimension (
maxImageDimension2D); a safe default before device creation. -
static auto GetUniformBufferOffsetAlignment() -> std::
int32_t - Returns the device's minimum uniform-buffer bind-offset alignment in bytes (
minUniformBufferOffsetAlignment). -
static auto GetMaxUniformBufferRange() -> std::
int32_t - Returns the device's largest allowed uniform-buffer descriptor range in bytes (
maxUniformBufferRange).
Constructors, destructors, conversion operators
- VulkanDevice() deleted
- ~VulkanDevice() deleted
Function documentation
static bool nCine:: RHI:: Vulkan:: VulkanDevice:: CreateSwapchain(void* windowHandle,
std:: int32_t width,
std:: int32_t height,
bool vsync)
Creates the Vulkan instance, device and swap chain for the given SDL window.
| Parameters | |
|---|---|
| windowHandle | The SDL_Window* (created with SDL_WINDOW_VULKAN), passed as a void* so the window backend does not need the Vulkan headers. The backend queries the required instance extensions and the presentation surface from it through the SDL Vulkan API. |
| width | Swap-chain image width in pixels |
| height | Swap-chain image height in pixels |
| vsync | Whether PresentFrame() presents with vertical sync (FIFO vs. MAILBOX/IMMEDIATE) |
| Returns | true if the instance, device and swap chain were created |
static void* nCine:: RHI:: Vulkan:: VulkanDevice:: CreateSecondarySwapchain(void* windowHandle,
std:: int32_t width,
std:: int32_t height)
Creates an additional surface and swap chain for a secondary window.
| Parameters | |
|---|---|
| windowHandle | SDL_Window* of the secondary window, passed as a void* |
| width | Swap-chain image width in pixels |
| height | Swap-chain image height in pixels |
| Returns | An opaque handle to pass to the other *Secondary* functions, or nullptr if the surface failed |
Used by the ImGui multi-viewport support for the windows it spawns when a panel is dragged out of the main one. Only their presentation lives in the backend: the contents are rendered through the ordinary RHI path into an off-screen render target, whose texture is handed over for the frame with QueueSecondaryPresent(). PresentFrame() then blits each queued texture into its window's acquired image and joins it into the frame's single submit and present.