37 Bool_t TGLFBO::fgRescaleToPow2       = kTRUE; 
 
   38 Bool_t TGLFBO::fgMultiSampleNAWarned = kFALSE;
 
   54    fMSCoverageSamples (0),
 
   73 void TGLFBO::Init(
int w, 
int h, 
int ms_samples)
 
   75    static const std::string eh(
"TGLFBO::Init ");
 
   78    if (!GLEW_EXT_framebuffer_object)
 
   80       throw std::runtime_error(eh + 
"GL_EXT_framebuffer_object extension required for FBO.");
 
   88       Int_t nw = 1 << TMath::CeilNint(TMath::Log2(w));
 
   89       Int_t nh = 1 << TMath::CeilNint(TMath::Log2(h));
 
   90       if (nw != w || nh != h)
 
   92          fWScale = ((Float_t)w) / nw;
 
   93          fHScale = ((Float_t)h) / nh;
 
   99    if (ms_samples > 0 && ! GLEW_EXT_framebuffer_multisample)
 
  101       if (!fgMultiSampleNAWarned)
 
  103          Info(eh.c_str(), 
"GL implementation does not support multi-sampling for FBOs.");
 
  104          fgMultiSampleNAWarned = kTRUE;
 
  109    if (fFrameBuffer != 0)
 
  111       if (fW == w && fH == h && fMSSamples == ms_samples)
 
  117    glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &maxSize);
 
  118    if (w > maxSize || h > maxSize)
 
  120       throw std::runtime_error(eh + Form(
"maximum size supported by GL implementation is %d.", maxSize));
 
  123    fW = w; fH = h; fMSSamples = ms_samples;
 
  127       if (GLEW_NV_framebuffer_multisample_coverage)
 
  130          glGetIntegerv(GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV, &n_modes);
 
  131          GLint *modes = 
new GLint[2*n_modes];
 
  132          glGetIntegerv(GL_MULTISAMPLE_COVERAGE_MODES_NV, modes);
 
  134          for (
int i = 0; i < n_modes; ++i)
 
  136             if (modes[i*2+1] == fMSSamples && modes[i*2] > fMSCoverageSamples)
 
  137                fMSCoverageSamples = modes[i*2];
 
  143          Info(eh.c_str(), 
"InitMultiSample coverage_samples=%d, color_samples=%d.", fMSCoverageSamples, fMSSamples);
 
  150          Info(eh.c_str(), 
"InitStandard (no multi-sampling).");
 
  155    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
 
  157    glBindFramebufferEXT (GL_FRAMEBUFFER_EXT,  0);
 
  158    glBindTexture        (GL_TEXTURE_2D,       0);
 
  162       case GL_FRAMEBUFFER_COMPLETE_EXT:
 
  164             printf(
"%sConstructed TGLFBO ... all fine.\n", eh.c_str());
 
  166       case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
 
  168          throw std::runtime_error(eh + 
"Constructed TGLFBO not supported, choose different formats.");
 
  172          throw std::runtime_error(eh + 
"Constructed TGLFBO is not complete, unexpected error.");
 
  180 void TGLFBO::Release()
 
  182    glDeleteFramebuffersEXT (1, &fFrameBuffer);
 
  183    glDeleteRenderbuffersEXT(1, &fDepthBuffer);
 
  185    if (fMSFrameBuffer) glDeleteFramebuffersEXT (1, &fMSFrameBuffer);
 
  186    if (fMSColorBuffer) glDeleteRenderbuffersEXT(1, &fMSColorBuffer);
 
  187    if (fColorTexture)  glDeleteTextures        (1, &fColorTexture);
 
  189    fW = fH = -1; fMSSamples = fMSCoverageSamples = 0;
 
  190    fFrameBuffer = fColorTexture = fDepthBuffer = fMSFrameBuffer = fMSColorBuffer = 0;
 
  199    if (fMSSamples > 0) {
 
  200       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fMSFrameBuffer);
 
  207       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFrameBuffer);
 
  214 void TGLFBO::Unbind()
 
  218       glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fMSFrameBuffer);
 
  219       glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fFrameBuffer);
 
  220       glBlitFramebufferEXT(0, 0, fW, fH, 0, 0, fW, fH, GL_COLOR_BUFFER_BIT, GL_NEAREST);
 
  223    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
 
  229 void TGLFBO::BindTexture()
 
  231    glPushAttrib(GL_TEXTURE_BIT);
 
  232    glBindTexture(GL_TEXTURE_2D, fColorTexture);
 
  233    glEnable(GL_TEXTURE_2D);
 
  237       glMatrixMode(GL_TEXTURE);
 
  239       glScalef(fWScale, fHScale, 1);
 
  240       glMatrixMode(GL_MODELVIEW);
 
  247 void TGLFBO::UnbindTexture()
 
  251       glMatrixMode(GL_TEXTURE);
 
  253       glMatrixMode(GL_MODELVIEW);
 
  261 void TGLFBO::SetAsReadBuffer()
 
  263    glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fFrameBuffer);
 
  270 void TGLFBO::InitStandard()
 
  272    glGenFramebuffersEXT(1, &fFrameBuffer);
 
  273    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFrameBuffer);
 
  275    fDepthBuffer  = CreateAndAttachRenderBuffer(GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
 
  276    fColorTexture = CreateAndAttachColorTexture();
 
  281 void TGLFBO::InitMultiSample()
 
  283    glGenFramebuffersEXT(1, &fMSFrameBuffer);
 
  284    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fMSFrameBuffer);
 
  286    fMSColorBuffer = CreateAndAttachRenderBuffer(GL_RGBA8,             GL_COLOR_ATTACHMENT0);
 
  287    fDepthBuffer   = CreateAndAttachRenderBuffer(GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
 
  290    glGenFramebuffersEXT(1, &fFrameBuffer);
 
  291    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFrameBuffer);
 
  293    fColorTexture = CreateAndAttachColorTexture();
 
  298 UInt_t TGLFBO::CreateAndAttachRenderBuffer(Int_t format, Int_t type)
 
  302    glGenRenderbuffersEXT(1, &
id);
 
  303    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 
id);
 
  307       if (fMSCoverageSamples > 0)
 
  308          glRenderbufferStorageMultisampleCoverageNV(GL_RENDERBUFFER_EXT, fMSCoverageSamples, fMSSamples, format, fW, fH);
 
  310          glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, fMSSamples, format, fW, fH);
 
  314       glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, fW, fH);
 
  317    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, type, GL_RENDERBUFFER_EXT, 
id);
 
  325 UInt_t TGLFBO::CreateAndAttachColorTexture()
 
  329    glGenTextures(1, &
id);
 
  331    glBindTexture(GL_TEXTURE_2D, 
id);
 
  332    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 
  333    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
  334    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
  335    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
  336    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fW, fH, 0, GL_RGBA,
 
  337                 GL_UNSIGNED_BYTE, NULL);
 
  339    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
 
  340                              GL_TEXTURE_2D, 
id, 0);
 
  348 Bool_t TGLFBO::GetRescaleToPow2()
 
  350    return fgRescaleToPow2;
 
  357 void TGLFBO::SetRescaleToPow2(Bool_t r)