25#include "RConfigure.h"
26#include "TGLIncludes.h"
62 gROOT->ProcessLineFast(
Form(
"((TGLContext *)0x%lx)->SetContext((TGLWidget *)0x%lx, (TGLContext *)0x%lx)",
89 GLenum status = glewInit();
90 if (status != GLEW_OK)
91 Warning(
"TGLContext::GlewInit",
"GLEW initalization failed.");
93 Info(
"TGLContext::GlewInit",
"GLEW initalization successful.");
104 struct LayoutCompatible_t {
108 unsigned char fDummy2;
110 unsigned short fDummy4;
111 unsigned short fDummy5;
126 Error(
"TGLContext::SetContext",
"SetContext must be called only from ctor");
131 LayoutCompatible_t *trick =
132 reinterpret_cast<LayoutCompatible_t *
>(widget->
GetId());
133 HWND hWND = *trick->fPHwnd;
134 HDC hDC = GetWindowDC(hWND);
137 Error(
"TGLContext::SetContext",
"GetWindowDC failed");
138 throw std::runtime_error(
"GetWindowDC failed");
142 if (HGLRC glContext = wglCreateContext(hDC)) {
143 if (shareList && !wglShareLists(shareList->
fPimpl->fGLContext, glContext)) {
144 wglDeleteContext(glContext);
145 Error(
"TGLContext::SetContext",
"Context sharing failed!");
146 throw std::runtime_error(
"Context sharing failed");
150 fPimpl->fGLContext = glContext;
152 Error(
"TGLContext::SetContext",
"wglCreateContext failed");
153 throw std::runtime_error(
"wglCreateContext failed");
171 Error(
"TGLContext::MakeCurrent",
"This context is invalid.");
176 return Bool_t(
gROOT->ProcessLineFast(
Form(
"((TGLContext *)0x%lx)->MakeCurrent()",
this)));
196 return wglMakeCurrent(0, 0);
206 Error(
"TGLContext::SwapBuffers",
"This context is invalid.");
211 gROOT->ProcessLineFast(
Form(
"((TGLContext *)0x%lx)->SwapBuffers()",
this));
217 wglSwapLayerBuffers(
fPimpl->fHDC, WGL_SWAP_MAIN_PLANE);
230 gROOT->ProcessLineFast(
Form(
"((TGLContext *)0x%lx)->Release()",
this));
240 wglDeleteContext(
fPimpl->fGLContext);
244#elif defined(R__HAS_COCOA)
252 Error(
"TGLContext::SetContext",
"SetContext must be called only from ctor");
273 Error(
"TGLContext::MakeCurrent",
"This context is invalid.");
303 Error(
"TGLContext::SwapBuffers",
"This context is invalid.");
332 Error(
"TGLContext::SetContext",
"SetContext must be called only from ctor");
337 Display *dpy =
static_cast<Display *
>(widget->
GetInnerData().first);
338 XVisualInfo *visInfo =
static_cast<XVisualInfo *
>(widget->
GetInnerData().second);
340 GLXContext glCtx = shareList ? glXCreateContext(dpy, visInfo, shareList->
fPimpl->fGLContext,
True)
341 : glXCreateContext(dpy, visInfo, None,
True);
344 Error(
"TGLContext::SetContext",
"glXCreateContext failed!");
345 throw std::runtime_error(
"glXCreateContext failed!");
349 fPimpl->fVisualInfo = visInfo;
350 fPimpl->fGLContext = glCtx;
365 Error(
"TGLContext::MakeCurrent",
"This context is invalid.");
369 if (
fPimpl->fWindowID != 0) {
388 return glXMakeCurrent(
fPimpl->fDpy, None, 0);
398 Error(
"TGLContext::SwapCurrent",
"This context is invalid.");
402 if (
fPimpl->fWindowID != 0)
472fFontManager(0), fCnt(0), fClientCnt(0)
490 fCtxs.push_back(ctx);
498 CtxList_t::iterator i = std::find(
fCtxs.begin(),
fCtxs.end(), ctx);
499 if (i !=
fCtxs.end())
507 Error(
"TGLContextIdentity::Release",
"unregistered context.");
527 glDeleteLists(it->first, it->second);
void Info(const char *location, const char *msgfmt,...)
void Error(const char *location, const char *msgfmt,...)
void Warning(const char *location, const char *msgfmt,...)
R__EXTERN TVirtualMutex * gROOTMutex
char * Form(const char *fmt,...)
#define R__LOCKGUARD(mutex)
Identifier of a shared GL-context.
virtual ~TGLContextIdentity()
Destructor.
static TGLContextIdentity * GetDefaultIdentity()
Get identity of a default Gl context. Static.
void CheckDestroy()
Private function called when reference count is reduced.
TGLContextIdentity()
Constructor.
std::pair< UInt_t, Int_t > DLRange_t
TGLFontManager * fFontManager
static TGLContextIdentity * fgDefaultIdentity
void DeleteGLResources()
Delete GL resources registered for destruction.
void Release(TGLContext *ctx)
Remove context ctx from the list of references.
DLTrash_t::const_iterator DLTrashIt_t
static TGLContextIdentity * GetCurrent()
Find identitfy of current context. Static.
TGLFontManager * GetFontManager()
Get the free-type font-manager associated with this context-identity.
void AddRef(TGLContext *ctx)
Add context ctx to the list of references.
void RegisterDLNameRangeToWipe(UInt_t base, Int_t size)
Remember dl range for deletion in next MakeCurrent or dtor execution.
static TGLContext * GetDefaultContextAny()
Get the first GL context with the default identity.
static void RegisterContext(TGLContext *ctx)
Register gl-context to find it later as current (GetCurrentContext)
static void RemoveContext(TGLContext *ctx)
Un-register deleted context.
static TGLContext * GetCurrentContext()
Ask wgl what HGLRC is current and look up corresponding TGLContext.
This class encapsulates window-system specific information about a GL-context and alows their proper ...
void Release()
Make the context invalid and (do thread switch, if needed) free resources.
void SwapBuffers()
If context is valid (TGLPaintDevice, for which context was created still exists), swap buffers (in ca...
TGLContextIdentity * GetIdentity() const
We can have several shared contexts, and gl-scene wants to know, if some context (defined by its iden...
static Bool_t fgGlewInitDone
std::unique_ptr< TGLContextPrivate > fPimpl
virtual ~TGLContext()
TGLContext dtor.
Bool_t MakeCurrent()
If context is valid (TGLPaintDevice, for which context was created still exists), make it current.
void SetContext(TGLWidget *widget, const TGLContext *shareList)
X11 gl-context creation.
static void GlewInit()
Initialize GLEW - static private function.
TGLContext(TGLWidget *glWidget, Bool_t shareDefault=kTRUE, const TGLContext *shareList=0)
TGLContext ctor "from" TGLWidget.
Bool_t ClearCurrent()
Reset current context.
TGLContextIdentity * fIdentity
static TGLContext * GetCurrent()
Ask TGLContextPrivate to lookup context in its internal map.
A FreeType GL font manager.
void ClearFontTrash()
Delete FTFFont objects registered for destruction.
virtual void AddContext(TGLContext *ctx)=0
virtual void RemoveContext(TGLContext *ctx)=0
TOneArgGuard< Func, Arg > make_guard(Func f, Arg a)