Files
test/intern/ghost/intern/GHOST_Context.hh
Campbell Barton ebfa7edeb1 Cleanup: use snake case, replace "m_" prefix with "_" suffix
Follow our own C++ conventions for GHOST.
2025-08-16 16:14:18 +10:00

193 lines
4.8 KiB
C++

/* SPDX-FileCopyrightText: 2013 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup GHOST
* Declaration of GHOST_Context class.
*/
#pragma once
#include "GHOST_IContext.hh"
#include "GHOST_Types.h"
#include <cstdlib> /* For `nullptr`. */
class GHOST_Context : public GHOST_IContext {
protected:
static thread_local inline GHOST_Context *active_context_;
public:
/**
* Constructor.
* \param context_params: Parameters to use when initializing the context.
*/
GHOST_Context(const GHOST_ContextParams &context_params) : context_params_(context_params) {}
/**
* Destructor.
*/
~GHOST_Context() override
{
if (active_context_ == this) {
active_context_ = nullptr;
}
};
/**
* Returns the thread's currently active drawing context.
*/
static inline GHOST_Context *getActiveDrawingContext()
{
return active_context_;
}
/** \copydoc #GHOST_IContext::swapBuffers */
GHOST_TSuccess swapBuffers() override = 0;
/** \copydoc #GHOST_IContext::activateDrawingContext */
GHOST_TSuccess activateDrawingContext() override = 0;
/** \copydoc #GHOST_IContext::releaseDrawingContext */
GHOST_TSuccess releaseDrawingContext() override = 0;
/**
* Call immediately after new to initialize. If this fails then immediately delete the object.
* \return Indication as to whether initialization has succeeded.
*/
virtual GHOST_TSuccess initializeDrawingContext() = 0;
/**
* Updates the drawing context of this window. Needed
* whenever the window is changed.
* \return Indication of success.
*/
virtual GHOST_TSuccess updateDrawingContext()
{
return GHOST_kFailure;
}
/**
* Checks if it is OK for a remove the native display
* \return Indication as to whether removal has succeeded.
*/
virtual GHOST_TSuccess releaseNativeHandles() = 0;
/**
* Sets the swap interval for #swapBuffers.
* \param interval: The swap interval to use.
* \return A boolean success indicator.
*/
virtual GHOST_TSuccess setSwapInterval(int /*interval*/)
{
return GHOST_kFailure;
}
/**
* Gets the current swap interval for #swapBuffers.
* \param interval_out: Variable to store the swap interval if it can be read.
* \return Whether the swap interval can be read.
*/
virtual GHOST_TSuccess getSwapInterval(int & /*interval*/)
{
return GHOST_kFailure;
}
/**
* Get user data.
*/
void *getUserData()
{
return user_data_;
}
/**
* Set user data (intended for the caller to use as needed).
*/
void setUserData(void *user_data)
{
user_data_ = user_data;
}
/**
* Stereo visual created. Only necessary for 'real' stereo support,
* ie quad buffered stereo. This is not always possible, depends on
* the graphics h/w
*/
bool isStereoVisual() const
{
return context_params_.is_stereo_visual;
}
/** Get the VSync value. */
virtual GHOST_TVSyncModes getVSync()
{
return context_params_.vsync;
}
/**
* Returns if the context is rendered upside down compared to OpenGL.
*/
virtual bool isUpsideDown() const
{
return false;
}
/** \copydoc #GHOST_IContext::getDefaultFramebuffer */
unsigned int getDefaultFramebuffer() override
{
return 0;
}
#ifdef WITH_VULKAN_BACKEND
/** \copydoc #GHOST_IContext::getVulkanHandles */
virtual GHOST_TSuccess getVulkanHandles(GHOST_VulkanHandles & /* r_handles */) override
{
return GHOST_kFailure;
};
/** \copydoc #GHOST_IContext::getVulkanSwapChainFormat */
virtual GHOST_TSuccess getVulkanSwapChainFormat(
GHOST_VulkanSwapChainData * /*r_swap_chain_data*/) override
{
return GHOST_kFailure;
}
/** \copydoc #GHOST_IContext::setVulkanSwapBuffersCallbacks */
virtual GHOST_TSuccess setVulkanSwapBuffersCallbacks(
std::function<void(const GHOST_VulkanSwapChainData *)> /*swap_buffers_pre_callback*/,
std::function<void(void)> /*swap_buffers_post_callback*/,
std::function<void(GHOST_VulkanOpenXRData *)> /*openxr_acquire_framebuffer_image_callback*/,
std::function<void(GHOST_VulkanOpenXRData *)> /*openxr_release_framebuffer_image_callback*/)
override
{
return GHOST_kFailure;
}
#endif
protected:
GHOST_ContextParams context_params_;
/** Caller specified, not for internal use. */
void *user_data_ = nullptr;
#ifdef WITH_OPENGL_BACKEND
static void initClearGL();
#endif
MEM_CXX_CLASS_ALLOC_FUNCS("GHOST:GHOST_Context")
};
#ifdef _WIN32
bool win32_chk(bool result, const char *file = nullptr, int line = 0, const char *text = nullptr);
bool win32_silent_chk(bool result);
# ifndef NDEBUG
# define WIN32_CHK(x) win32_chk((x), __FILE__, __LINE__, #x)
# else
# define WIN32_CHK(x) win32_chk(x)
# endif
# define WIN32_CHK_SILENT(x, silent) ((silent) ? win32_silent_chk(x) : WIN32_CHK(x))
#endif /* _WIN32 */