25 #include "RConfigure.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) {
398 Error(
"TGLContext::SwapCurrent",
"This context is invalid.");
402 if (
fPimpl->fWindowID != 0)
472 fFontManager(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);
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 TGLContextIdentity * GetDefaultIdentity()
Get identity of a default Gl context. Static.
TGLContextIdentity * GetIdentity() const
We can have several shared contexts, and gl-scene wants to know, if some context (defined by its iden...
std::pair< UInt_t, Int_t > DLRange_t
Identifier of a shared GL-context.
R__EXTERN TVirtualMutex * gROOTMutex
DLTrash_t::const_iterator DLTrashIt_t
virtual void RemoveContext(TGLContext *ctx)=0
TGLContextIdentity * fIdentity
void CheckDestroy()
Private function called when reference count is reduced.
void Release(TGLContext *ctx)
Remove context ctx from the list of references.
virtual void AddContext(TGLContext *ctx)=0
Bool_t MakeCurrent()
If context is valid (TGLPaintDevice, for which context was created still exists), make it current...
void Info(const char *location, const char *msgfmt,...)
void Error(const char *location, const char *msgfmt,...)
virtual ~TGLContextIdentity()
Destructor.
static TGLContextIdentity * GetCurrent()
Find identitfy of current context. Static.
TGLContext(TGLWidget *glWidget, Bool_t shareDefault=kTRUE, const TGLContext *shareList=0)
TGLContext ctor "from" TGLWidget.
TGLFontManager * fFontManager
TOneArgGuard< Func, Arg > make_guard(Func f, Arg a)
char * Form(const char *fmt,...)
void DeleteGLResources()
Delete GL resources registered for destruction.
static TGLContext * GetCurrentContext()
Ask wgl what HGLRC is current and look up corresponding TGLContext.
void Warning(const char *location, const char *msgfmt,...)
static void GlewInit()
Initialize GLEW - static private function.
TGLFontManager * GetFontManager()
Get the free-type font-manager associated with this context-identity.
#define R__LOCKGUARD2(mutex)
void SetContext(TGLWidget *widget, const TGLContext *shareList)
X11 gl-context creation.
void SwapBuffers()
If context is valid (TGLPaintDevice, for which context was created still exists), swap buffers (in ca...
This class encapsulates window-system specific information about a GL-context and alows their proper ...
Bool_t ClearCurrent()
Reset current context.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
void AddRef(TGLContext *ctx)
Add context ctx to the list of references.
TGLContextIdentity()
Constructor.
void Release()
Make the context invalid and (do thread switch, if needed) free resources.
static TGLContext * GetCurrent()
Ask TGLContextPrivate to lookup context in its internal map.
A FreeType GL font manager.
static Bool_t fgGlewInitDone
static TGLContextIdentity * fgDefaultIdentity
void ClearFontTrash()
Delete FTFFont objects registered for destruction.
void RegisterDLNameRangeToWipe(UInt_t base, Int_t size)
Remember dl range for deletion in next MakeCurrent or dtor execution.
virtual ~TGLContext()
TGLContext dtor.
std::unique_ptr< TGLContextPrivate > fPimpl