Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TX11GL.cxx
Go to the documentation of this file.
1// @(#)root/gl:$Id$
2// Author: Timur Pocheptsov (TX11GLManager) / Valeriy Onuchin (TX11GL)
3
4/*************************************************************************
5 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include <deque>
13#include <map>
14#include <cstdlib>
15#include <cstring>
16
17#include "TVirtualViewer3D.h"
18#include "TVirtualX.h"
19#include "TGLViewer.h"
20#include "TGLManip.h"
21#include "TX11GL.h"
22#include "TError.h"
23#include "TROOT.h"
24
25/** \class TX11GLManager
26\ingroup opengl
27The TX11GLManager is X11 implementation of TGLManager.
28*/
29
31 //these are numbers returned by gVirtualX->AddWindow and gVirtualX->AddPixmap
33 fH(0), fX(0), fY(0), fGLXContext(nullptr), fDirect(kFALSE),
34 fXImage(nullptr), fNextFreeContext(nullptr), fDirectGC(nullptr), fPixmapGC(nullptr)
35 {
36 }//FIXME
39 //X11 pixmap
40 Pixmap fX11Pixmap;
41 //
44 //
47 //
48 GLXContext fGLXContext;
50 //GL buffer is read into XImage
52 std::vector<UChar_t> fBUBuffer;//gl buffer is read from bottom to top.
53 //
57};
58
59namespace {
60
61 typedef std::deque<TX11GLManager::TGLContext_t> DeviceTable_t;
62 typedef DeviceTable_t::size_type SizeType_t;
63 typedef std::map<Int_t, XVisualInfo *> WinTable_t;
65
66 //RAII class for Pixmap
67 class TX11PixGuard {
68 private:
69 Display *fDpy;
70 Pixmap fPix;
71
72 public:
73 TX11PixGuard(Display *dpy, Pixmap pix) : fDpy(dpy), fPix(pix) {}
74 ~TX11PixGuard(){if (fPix) XFreePixmap(fDpy, fPix);}
75 void Stop(){fPix = 0;}
76
77 private:
78 TX11PixGuard(const TX11PixGuard &) = delete;
79 TX11PixGuard &operator = (const TX11PixGuard &) = delete;
80 };
81
82 //RAII class for GLXContext
83 class TGLXCtxGuard {
84 private:
85 Display *fDpy;
86 GLXContext fCtx;
87
88 public:
89 TGLXCtxGuard(Display *dpy, GLXContext ctx) : fDpy(dpy), fCtx(ctx) {}
90 ~TGLXCtxGuard(){if (fCtx) glXDestroyContext(fDpy, fCtx);}
91 void Stop(){fCtx = nullptr;}
92
93 private:
94 TGLXCtxGuard(const TGLXCtxGuard &) = delete;
95 TGLXCtxGuard &operator = (const TGLXCtxGuard &) = delete;
96 };
97
98 // RAII class for XImage.
99 class TXImageGuard {
100 private:
101 XImage *fImage;
102
103 TXImageGuard(const TXImageGuard &) = delete;
104 TXImageGuard &operator = (const TXImageGuard &) = delete;
105
106 public:
107 explicit TXImageGuard(XImage *im) : fImage(im) {}
108 ~TXImageGuard(){if (fImage) XDestroyImage(fImage);}
109 void Stop(){fImage = nullptr;}
110 };
111
112}
113
114// Attriblist for glXChooseVisual (double-buffered visual).
115const Int_t dblBuff[] =
116 {
118 GLX_RGBA,
119 GLX_DEPTH_SIZE, 16,
121 GLX_RED_SIZE, 1,
123 GLX_BLUE_SIZE, 1,
124 None
125 };
126
127// Attriblist for glxChooseVisual (single-buffered visual).
128const Int_t *snglBuff = dblBuff + 1;
129
131public:
132 TX11GLImpl();
133 ~TX11GLImpl();
134
135 WinTable_t fGLWindows;
136 DeviceTable_t fGLContexts;
137 Display *fDpy;
139
140private:
141 TX11GLImpl(const TX11GLImpl &) = delete;
143};
144
145
146////////////////////////////////////////////////////////////////////////////////
147/// Constructor.
148
149TX11GLManager::TX11GLImpl::TX11GLImpl() : fDpy(nullptr), fNextFreeContext(nullptr)
150{
151 fDpy = reinterpret_cast<Display *>(gVirtualX->GetDisplay());
152}
153
154
155////////////////////////////////////////////////////////////////////////////////
156/// Destructor.
157/// Destroys only GL contexts and XImages pixmaps and windows must be
158/// closed through gVirtualX
159
161{
162 for (SizeType_t i = 0, e = fGLContexts.size(); i < e; ++i) {
163 TGLContext_t &ctx = fGLContexts[i];
164
165 if (ctx.fGLXContext) {
166 ::Warning("TX11GLManager::~TX11GLManager", "opengl device with index %ld was not destroyed", (Long_t)i);
168
169 if (ctx.fPixmapIndex != -1) {
170 gVirtualX->SelectWindow(ctx.fPixmapIndex);
171 gVirtualX->ClosePixmap();
172 if (ctx.fXImage)
174 }
175 }
176 }
177}
178
179
180////////////////////////////////////////////////////////////////////////////////
181/// Constructor.
182
184{
185 gGLManager = this;
186 gROOT->GetListOfSpecials()->Add(this);
187}
188
189
190////////////////////////////////////////////////////////////////////////////////
191/// Destructor.
192
194{
195 delete fPimpl;
196}
197
198
199////////////////////////////////////////////////////////////////////////////////
200/// Try to find correct visual.
201
203{
206 const_cast<Int_t *>(dblBuff)
207 );
208
209 if (!visInfo) {
210 Error("InitGLWindow", "No good visual found!\n");
211 return -1;
212 }
213
214 Int_t x = 0, y = 0;
215 UInt_t w = 0, h = 0, b = 0, d = 0;
216 Window root = 0;
217 XGetGeometry(fPimpl->fDpy, winID, &root, &x, &y, &w, &h, &b, &d);
218
220 attr.colormap = XCreateColormap(fPimpl->fDpy, root, visInfo->visual, AllocNone); // ???
221 attr.event_mask = NoEventMask;
222 attr.backing_store = Always;
223 attr.bit_gravity = NorthWestGravity;
224
226
227 // Create window with specific visual.
229 fPimpl->fDpy, winID,
230 x, y, w, h,
231 0, visInfo->depth, InputOutput,
232 visInfo->visual, mask, &attr
233 );
234
235 // Check results.
237
238 // Register window for gVirtualX.
239 Int_t x11Ind = gVirtualX->AddWindow(glWin, w, h);
240
241 // Register this window for GL manager.
243
244 return x11Ind;
245}
246
247
248////////////////////////////////////////////////////////////////////////////////
249/// Context creation requires Display * and XVisualInfo
250/// (was saved for such winInd).
251
253{
254 GLXContext glxCtx = glXCreateContext(fPimpl->fDpy, fPimpl->fGLWindows[winInd], None, True);
255
256 if (!glxCtx) {
257 Error("CreateContext", "glXCreateContext failed\n");
258 return -1;
259 }
260
261 // Register new context now.
263 Int_t ind = ctx->fWindowIndex;
264 ctx->fWindowIndex = winInd;
265 ctx->fGLXContext = glxCtx;
267 return ind;
268 } else {
269 TGLXCtxGuard glxCtxGuard(fPimpl->fDpy, glxCtx);
271 newDev.fWindowIndex = winInd;
272 newDev.fGLXContext = glxCtx;
273
274 fPimpl->fGLContexts.push_back(newDev);
275 glxCtxGuard.Stop();
276
277 return Int_t(fPimpl->fGLContexts.size()) - 1;
278 }
279}
280
281
282////////////////////////////////////////////////////////////////////////////////
283/// Make GL context current.
284
290
291
292////////////////////////////////////////////////////////////////////////////////
293/// Swaps buffers or copy pixmap.
294
296{
298 Window winID = gVirtualX->GetWindowID(ctx.fWindowIndex);
299
300 if (ctx.fPixmapIndex == -1)
302 else if (ctx.fXImage && ctx.fDirect) {
303 if (!ctx.fDirectGC)
304 ctx.fDirectGC = XCreateGC(fPimpl->fDpy, winID, 0, nullptr);
305
306 if (!ctx.fDirectGC) {
307 Error("Flush", "XCreateGC failed while copying pixmap\n");
308 ctx.fDirect = kFALSE;
309 return;
310 }
311
312 XCopyArea(fPimpl->fDpy, ctx.fX11Pixmap, winID, ctx.fDirectGC, 0, 0, ctx.fW, ctx.fH, ctx.fX, ctx.fY);
313 }
314}
315
316
317////////////////////////////////////////////////////////////////////////////////
318/// Create GL pixmap.
319
321{
322 // Create new x11 pixmap and XImage.
323 Pixmap x11Pix = XCreatePixmap(fPimpl->fDpy, gVirtualX->GetWindowID(ctx.fWindowIndex), ctx.fW,
324 ctx.fH, fPimpl->fGLWindows[ctx.fWindowIndex]->depth);
325
326 if (!x11Pix) {
327 Error("CreateGLPixmap", "XCreatePixmap failed\n");
328 return kFALSE;
329 }
330
331 TX11PixGuard pixGuard(fPimpl->fDpy, x11Pix);
332
333 // XImage part here.
336 0, nullptr, ctx.fW, ctx.fH,
337 visInfo->depth <= 8 ? 8 : (visInfo->depth <= 16 ? 16 : 32), 0);
338
339 if (testIm) {
340 TXImageGuard imGuard(testIm);
341 testIm->data = static_cast<Char_t *>(malloc(testIm->bytes_per_line * testIm->height));
342
343 if (!testIm->data) {
344 Error("CreateGLPixmap", "Cannot malloc XImage data\n");
345 return kFALSE;
346 }
347
348 if (XInitImage(testIm)) {
349 ctx.fPixmapIndex = gVirtualX->AddPixmap(x11Pix, ctx.fW, ctx.fH);
350 ctx.fBUBuffer.resize(testIm->bytes_per_line * testIm->height);
351 ctx.fX11Pixmap = x11Pix;
352 ctx.fXImage = testIm;
353 pixGuard.Stop();
354 imGuard.Stop();
355 return kTRUE;
356 } else
357 Error("CreateGLPixmap", "XInitImage error!\n");
358 } else
359 Error("CreateGLPixmap", "XCreateImage error!\n");
360
361 return kFALSE;
362}
363
364
365////////////////////////////////////////////////////////////////////////////////
366/// Attach off screen device.
367
369{
370 // Create pixmap and XImage for GL context ctxInd.
373 newCtx.fWindowIndex = ctx.fWindowIndex;
374 newCtx.fW = w, newCtx.fH = h, newCtx.fX = x, newCtx.fY = y;
375 newCtx.fGLXContext = ctx.fGLXContext;
376
377 if (CreateGLPixmap(newCtx)) {
378 ctx.fPixmapIndex = newCtx.fPixmapIndex;
379 ctx.fX11Pixmap = newCtx.fX11Pixmap;
380 ctx.fW = w, ctx.fH = h, ctx.fX = x, ctx.fY = y;
381 ctx.fDirect = kFALSE;
382 ctx.fXImage = newCtx.fXImage;
383 ctx.fBUBuffer.swap(newCtx.fBUBuffer);
384 return kTRUE;
385 }
386
387 return kFALSE;
388}
389
390
391////////////////////////////////////////////////////////////////////////////////
392/// Resize off screen device.
393
395{
396 // Create a new pixmap and a new XImage if needed.
398
399 if (ctx.fPixmapIndex != -1) {
400 if (std::abs(Int_t(w) - Int_t(ctx.fW)) > 1 || std::abs(Int_t(h) - Int_t(ctx.fH)) > 1) {
402 newCtx.fWindowIndex = ctx.fWindowIndex;
403 newCtx.fW = w, newCtx.fH = h, newCtx.fX = x, newCtx.fY = y;
404 newCtx.fGLXContext = ctx.fGLXContext;
405
406 if (CreateGLPixmap(newCtx)) {
407 gVirtualX->SelectWindow(ctx.fPixmapIndex);
408 gVirtualX->ClosePixmap();
409 ctx.fPixmapIndex = newCtx.fPixmapIndex;
410 ctx.fX11Pixmap = newCtx.fX11Pixmap;
411 ctx.fW = w, ctx.fH = h, ctx.fX = x, ctx.fY = y;
412 ctx.fDirect = kFALSE;
413 if (ctx.fXImage) XDestroyImage(ctx.fXImage);
414 ctx.fXImage = newCtx.fXImage;
415 ctx.fBUBuffer.swap(newCtx.fBUBuffer);
416 return kTRUE;
417 } else
418 Error("ResizeOffScreenDevice", "Resize failed\n");
419 } else {
420 ctx.fX = x;
421 ctx.fY = y;
422 }
423 }
424
425 return kFALSE;
426}
427
428
429////////////////////////////////////////////////////////////////////////////////
430/// Selects off-screen device to make it accessible by gVirtualX.
431
433{
434 gVirtualX->SelectWindow(fPimpl->fGLContexts[ctxInd].fPixmapIndex);
435}
436
437
438////////////////////////////////////////////////////////////////////////////////
439/// Selection-rotation support for TPad/TCanvas.
440
442{
443 if (fPimpl->fGLContexts[ctxInd].fPixmapIndex != -1)
444 fPimpl->fGLContexts[ctxInd].fDirect = dir;
445}
446
447
448////////////////////////////////////////////////////////////////////////////////
449/// GL buffer is read info buffer, after that lines are reordered
450/// into XImage, XImage copied into pixmap.
451
453{
455
456 if (ctx.fPixmapIndex != -1 && ctx.fXImage) {
457 // Read GL buffer.
460 glReadPixels(0, 0, ctx.fW, ctx.fH, GL_BGRA, GL_UNSIGNED_BYTE, &ctx.fBUBuffer[0]);
461
462 if (!ctx.fPixmapGC)
463 ctx.fPixmapGC = XCreateGC(fPimpl->fDpy, ctx.fX11Pixmap, 0, nullptr);
464 if (ctx.fPixmapGC) {
465 // GL buffer read operation gives bottom-up order of pixels, but XImage
466 // require top-down. So, change RGB lines first.
467 char *dest = ctx.fXImage->data;
468 const UChar_t *src = &ctx.fBUBuffer[ctx.fW * 4 * (ctx.fH - 1)];
469 for (UInt_t i = 0, e = ctx.fH; i < e; ++i) {
470 memcpy(dest, src, ctx.fW * 4);
471 dest += ctx.fW * 4;
472 src -= ctx.fW * 4;
473 }
474 XPutImage(fPimpl->fDpy, ctx.fX11Pixmap, ctx.fPixmapGC, ctx.fXImage, 0, 0, 0, 0, ctx.fW, ctx.fH);
475 } else
476 Error("ReadGLBuffer", "XCreateGC error while attempt to copy XImage\n");
477 }
478}
479
480
481////////////////////////////////////////////////////////////////////////////////
482/// Deletes GLX context and frees pixmap and image (if any).
483
485{
487
488 // Free GL context.
490 ctx.fGLXContext = nullptr;
491
492 // If the pixmap exists it is destroyed.
493 if (ctx.fPixmapIndex != -1) {
494 gVirtualX->SelectWindow(ctx.fPixmapIndex);
495 gVirtualX->ClosePixmap();
496 ctx.fPixmapIndex = -1;
497 if(ctx.fXImage) {
499 ctx.fXImage = nullptr;
500 }
501 if (ctx.fDirectGC)
502 XFreeGC(fPimpl->fDpy, ctx.fDirectGC), ctx.fDirectGC = nullptr;
503 if (ctx.fPixmapGC)
504 XFreeGC(fPimpl->fDpy, ctx.fPixmapGC), ctx.fPixmapGC = nullptr;
505 }
506
508 fPimpl->fNextFreeContext = &ctx;
509 ctx.fWindowIndex = ctxInd;
510}
511
512
513////////////////////////////////////////////////////////////////////////////////
514/// Returns an index suitable for gVirtualX.
515
520
521
522////////////////////////////////////////////////////////////////////////////////
523/// Returns the current dimensions of a GL pixmap.
524
526{
528
529 if (ctx.fPixmapIndex != -1) {
530 viewport[0] = 0;
531 viewport[1] = 0;
532 viewport[2] = ctx.fW;
533 viewport[3] = ctx.fH;
534 }
535}
536
537
538////////////////////////////////////////////////////////////////////////////////
539/// Paint a single object.
540
545
546
547////////////////////////////////////////////////////////////////////////////////
548/// Print viewer.
549
551{
552 vv->PrintObjects();
553}
554
555////////////////////////////////////////////////////////////////////////////////
556/// Select manipulator.
557
562
563
564////////////////////////////////////////////////////////////////////////////////
565/// Pan objects.
566
568{
569 return o->Pan(x, y);
570}
571
572////////////////////////////////////////////////////////////////////////////////
573///Analog of TObject::DistancetoPrimitive
574
576{
577 return plot->PlotSelected(px, py);
578}
579
580////////////////////////////////////////////////////////////////////////////////
581///Analog of TObject::GetObjectInfo
582
584{
585 return plot->GetPlotInfo(px, py);
586}
Handle_t Window_t
Window handle.
Definition GuiTypes.h:29
#define d(i)
Definition RSha256.hxx:102
#define b(i)
Definition RSha256.hxx:100
#define h(i)
Definition RSha256.hxx:106
#define e(i)
Definition RSha256.hxx:103
int Int_t
Signed integer 4 bytes (int)
Definition RtypesCore.h:59
char Char_t
Character 1 byte (char)
Definition RtypesCore.h:51
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
Definition RtypesCore.h:69
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
Definition RtypesCore.h:68
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define GL_BGRA
Definition TGLViewer.cxx:61
winID winInd
winID h TVirtualViewer3D TVirtualGLPainter p
winID h TVirtualViewer3D vv
winID h TVirtualViewer3D TVirtualGLPainter char TVirtualGLPainter plot
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void pix
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t dest
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t rect
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t attr
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
XID Window
Definition TGX11.h:36
Binding & operator=(OUT(*fun)(void))
#define gROOT
Definition TROOT.h:411
#define gGLManager
Definition TVirtualGL.h:159
#define gVirtualX
Definition TVirtualX.h:337
const Int_t dblBuff[]
Definition TX11GL.cxx:115
const Int_t * snglBuff
Definition TX11GL.cxx:128
#define malloc
Definition civetweb.c:1575
Concrete class describing an orientated (free) or axis aligned box of 8 vertices.
Abstract base camera class - concrete classes for orthographic and perspective cameras derive from it...
Definition TGLCamera.h:44
Viewport (pixel base) 2D rectangle class.
Definition TGLUtil.h:422
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1057
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1071
virtual void Pan(Int_t px, Int_t py)=0
Abstract 3D shapes viewer.
DeviceTable_t fGLContexts
Definition TX11GL.cxx:136
TX11GLImpl(const TX11GLImpl &)=delete
TX11GLImpl()
Constructor.
Definition TX11GL.cxx:149
~TX11GLImpl()
Destructor.
Definition TX11GL.cxx:160
TGLContext_t * fNextFreeContext
Definition TX11GL.cxx:138
TX11GLImpl & operator=(const TX11GLImpl &)=delete
void PanObject(TVirtualGLPainter *o, Int_t x, Int_t y) override
Pan objects.
Definition TX11GL.cxx:567
Int_t InitGLWindow(Window_t winID) override
Try to find correct visual.
Definition TX11GL.cxx:202
~TX11GLManager() override
Destructor.
Definition TX11GL.cxx:193
char * GetPlotInfo(TVirtualGLPainter *plot, Int_t px, Int_t py) override
Analog of TObject::GetObjectInfo.
Definition TX11GL.cxx:583
void ReadGLBuffer(Int_t devInd) override
GL buffer is read info buffer, after that lines are reordered into XImage, XImage copied into pixmap.
Definition TX11GL.cxx:452
void SelectOffScreenDevice(Int_t devInd) override
Selects off-screen device to make it accessible by gVirtualX.
Definition TX11GL.cxx:432
void Flush(Int_t ctxInd) override
Swaps buffers or copy pixmap.
Definition TX11GL.cxx:295
Bool_t AttachOffScreenDevice(Int_t ctxInd, Int_t x, Int_t y, UInt_t w, UInt_t h) override
Attach off screen device.
Definition TX11GL.cxx:368
void DeleteGLContext(Int_t devInd) override
Deletes GLX context and frees pixmap and image (if any).
Definition TX11GL.cxx:484
void MarkForDirectCopy(Int_t devInd, Bool_t) override
Selection-rotation support for TPad/TCanvas.
Definition TX11GL.cxx:441
Bool_t MakeCurrent(Int_t devInd) override
Make GL context current.
Definition TX11GL.cxx:285
Int_t GetVirtualXInd(Int_t devInd) override
Returns an index suitable for gVirtualX.
Definition TX11GL.cxx:516
Bool_t ResizeOffScreenDevice(Int_t devInd, Int_t x, Int_t y, UInt_t w, UInt_t h) override
Resize off screen device.
Definition TX11GL.cxx:394
Int_t CreateGLContext(Int_t winInd) override
Context creation requires Display * and XVisualInfo (was saved for such winInd).
Definition TX11GL.cxx:252
Bool_t CreateGLPixmap(TGLContext_t &)
Create GL pixmap.
Definition TX11GL.cxx:320
void PrintViewer(TVirtualViewer3D *vv) override
Print viewer.
Definition TX11GL.cxx:550
void PaintSingleObject(TVirtualGLPainter *) override
Paint a single object.
Definition TX11GL.cxx:541
Bool_t PlotSelected(TVirtualGLPainter *plot, Int_t px, Int_t py) override
Analog of TObject::DistancetoPrimitive.
Definition TX11GL.cxx:575
TX11GLManager()
Constructor.
Definition TX11GL.cxx:183
Bool_t SelectManip(TVirtualGLManip *manip, const TGLCamera *camera, const TGLRect *rect, const TGLBoundingBox *sceneBox) override
Select manipulator.
Definition TX11GL.cxx:558
TX11GLImpl * fPimpl
Definition TX11GL.h:37
void ExtractViewport(Int_t devInd, Int_t *vp) override
Returns the current dimensions of a GL pixmap.
Definition TX11GL.cxx:525
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
TGLContext_t * fNextFreeContext
Definition TX11GL.cxx:54
std::vector< UChar_t > fBUBuffer
Definition TX11GL.cxx:52