23 #include "RConfigure.h"
32 std::vector<Int_t> TGLFormat::fgAvailableSamples;
36 TGLFormat::TGLFormat() :
37 fDoubleBuffered(kTRUE),
49 fSamples(GetDefaultSamples())
63 TGLFormat::TGLFormat(Rgl::EFormatOptions opt) :
64 fDoubleBuffered(opt & Rgl::kDoubleBuffer),
67 fDepthSize(opt & Rgl::kDepth ? 32 : 0),
69 fDepthSize(opt & Rgl::kDepth ? 16 : 0),
71 fAccumSize(opt & Rgl::kAccum ? 8 : 0),
72 fStencilSize(opt & Rgl::kStencil ? 8 : 0),
73 fSamples(opt & Rgl::kMultiSample ? GetDefaultSamples() : 0)
80 TGLFormat::~TGLFormat()
87 Bool_t TGLFormat::operator == (
const TGLFormat &rhs)
const
89 return fDoubleBuffered == rhs.fDoubleBuffered && fDepthSize == rhs.fDepthSize &&
90 fAccumSize == rhs.fAccumSize && fStencilSize == rhs.fStencilSize;
96 Bool_t TGLFormat::operator != (
const TGLFormat &rhs)
const
98 return !(*
this == rhs);
104 Int_t TGLFormat::GetDepthSize()
const
112 void TGLFormat::SetDepthSize(Int_t depth)
121 Bool_t TGLFormat::HasDepth()
const
123 return GetDepthSize() != 0;
129 Int_t TGLFormat::GetStencilSize()
const
137 void TGLFormat::SetStencilSize(Int_t stencil)
140 fStencilSize = stencil;
146 Bool_t TGLFormat::HasStencil()
const
148 return GetStencilSize() != 0;
154 Int_t TGLFormat::GetAccumSize()
const
162 void TGLFormat::SetAccumSize(Int_t accum)
171 Bool_t TGLFormat::HasAccumBuffer()
const
173 return GetAccumSize() != 0;
179 Bool_t TGLFormat::IsDoubleBuffered()
const
181 return fDoubleBuffered;
187 void TGLFormat::SetDoubleBuffered(Bool_t db)
189 fDoubleBuffered = db;
195 Bool_t TGLFormat::IsStereo()
const
203 void TGLFormat::SetStereo(Bool_t db)
211 Int_t TGLFormat::GetSamples()
const
219 void TGLFormat::SetSamples(Int_t samples)
227 Bool_t TGLFormat::HasMultiSampling()
const
229 return fSamples != 0;
235 Int_t TGLFormat::GetDefaultSamples()
237 Int_t req = gEnv->GetValue(
"OpenGL.Framebuffer.Multisample", 0);
246 if (fgAvailableSamples.empty())
247 InitAvailableSamples();
249 std::vector<Int_t>::iterator i = fgAvailableSamples.begin();
250 while (i != fgAvailableSamples.end() - 1 && *i < req)
254 Info(
"TGLFormat::GetDefaultSamples",
"Requested multi-sampling %d not available, using %d. Adjusting default.", req, *i);
255 gEnv->SetValue(
"OpenGL.Framebuffer.Multisample", *i);
263 void TGLFormat::InitAvailableSamples()
265 std::set<Int_t> ns_set;
271 #elif defined(R__HAS_COCOA)
275 TGLWidget *widget = TGLWidget::CreateDummy();
276 widget->MakeCurrent();
278 if (GLXEW_ARB_multisample)
280 Display *dpy = (Display*) gVirtualX->GetDisplay();
281 XVisualInfo tmpl; tmpl.screen = gVirtualX->GetScreen();
282 long mask = VisualScreenMask;
283 int numVisuals, use_gl, ms_ns;
284 XVisualInfo *vis = XGetVisualInfo(dpy, mask, &tmpl, &numVisuals);
285 for (
int i = 0; i < numVisuals; i++)
287 if (glXGetConfig(dpy, &vis[i], GLX_USE_GL, &use_gl) == 0)
289 glXGetConfig(dpy, &vis[i], GLX_SAMPLES_ARB, &ms_ns);
290 ns_set.insert(ms_ns);
299 fgAvailableSamples.reserve(ns_set.size());
300 for (std::set<Int_t>::iterator i = ns_set.begin(); i != ns_set.end(); ++i)
302 fgAvailableSamples.push_back(*i);