bool query(char const *ext) { bool found = doQuery(ext); LOGDEV_GL_VERBOSE("%s: %b") << ext << found; return found; }
void reconfigure() { if(!self.isReady() || size == Size()) return; LOGDEV_GL_VERBOSE("Reconfiguring framebuffer: %s ms:%i") << size.asText() << sampleCount(); // Configure textures for the framebuffer. color.setUndefinedImage(size, colorFormat); color.setWrap(gl::ClampToEdge, gl::ClampToEdge); color.setFilter(gl::Nearest, gl::Linear, gl::MipNone); DENG2_ASSERT(color.isReady()); depthStencil.setDepthStencilContent(size); depthStencil.setWrap(gl::ClampToEdge, gl::ClampToEdge); depthStencil.setFilter(gl::Nearest, gl::Nearest, gl::MipNone); DENG2_ASSERT(depthStencil.isReady()); try { // We'd like to use texture attachments for both color and depth/stencil. target.configure(&color, &depthStencil); } catch(GLTarget::ConfigError const &er) { // Alternatively try without depth/stencil texture (some renderer features // will not be available!). LOG_GL_WARNING("Texture-based framebuffer failed: %s\n" "Trying fallback without depth/stencil texture") << er.asText(); target.configure(GLTarget::Color, color, GLTarget::DepthStencil); } target.clear(GLTarget::ColorDepthStencil); if(isMultisampled()) { try { // Set up the multisampled target with suitable renderbuffers. multisampleTarget.configure(size, GLTarget::ColorDepthStencil, sampleCount()); multisampleTarget.clear(GLTarget::ColorDepthStencil); // Actual drawing occurs in the multisampled target that is then // blitted to the main target. target.setProxy(&multisampleTarget); } catch(GLTarget::ConfigError const &er) { LOG_GL_WARNING("Multisampling not supported: %s") << er.asText(); _samples = 1; goto noMultisampling; } } else { noMultisampling: multisampleTarget.configure(); } }