void GraphicsContext3D::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data) { makeContextCurrent(); // FIXME: remove the two glFlush calls when the driver bug is fixed, i.e., // all previous rendering calls should be done before reading pixels. ::glFlush(); #if PLATFORM(BLACKBERRY) if (m_isImaginationHardware && m_fbo == m_boundFBO) { // FIXME: This workaround should always be used until the // driver alignment bug is fixed, even when we aren't // drawing to the canvas. readPixelsIMG(x, y, width, height, format, type, data); } else ::glReadPixels(x, y, width, height, format, type, data); #else if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) { resolveMultisamplingIfNecessary(IntRect(x, y, width, height)); ::glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); ::glFlush(); } ::glReadPixels(x, y, width, height, format, type, data); if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) ::glBindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO); #endif }
void GraphicsContext3D::readRenderingResults(unsigned char *pixels, int pixelsSize) { if (pixelsSize < m_currentWidth * m_currentHeight * 4) return; makeContextCurrent(); bool mustRestoreFBO = false; if (m_attrs.antialias) { resolveMultisamplingIfNecessary(); ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_fbo); mustRestoreFBO = true; } else { if (m_boundFBO != m_fbo) { mustRestoreFBO = true; ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_fbo); } } GLint packAlignment = 4; bool mustRestorePackAlignment = false; ::glGetIntegerv(GL_PACK_ALIGNMENT, &packAlignment); if (packAlignment > 4) { ::glPixelStorei(GL_PACK_ALIGNMENT, 4); mustRestorePackAlignment = true; } readPixelsAndConvertToBGRAIfNecessary(0, 0, m_currentWidth, m_currentHeight, pixels); if (mustRestorePackAlignment) ::glPixelStorei(GL_PACK_ALIGNMENT, packAlignment); if (mustRestoreFBO) ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_boundFBO); }
void GraphicsContext3D::prepareTexture() { if (m_layerComposited) return; makeContextCurrent(); if (m_attrs.antialias) resolveMultisamplingIfNecessary(); ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_fbo); ::glActiveTexture(GL_TEXTURE0); #if PLATFORM(BLACKBERRY) if (!platformTexture()) { GLuint tex = 0; ::glGenTextures(1, &tex); ::glBindTexture(GL_TEXTURE_2D, tex); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_currentWidth, m_currentHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); m_compositingLayer->setTextureID(tex); } ::glBindTexture(GL_TEXTURE_2D, platformTexture()); #else ::glBindTexture(GL_TEXTURE_2D, m_compositorTexture); #endif ::glCopyTexImage2D(GL_TEXTURE_2D, 0, m_internalColorFormat, 0, 0, m_currentWidth, m_currentHeight, 0); ::glBindTexture(GL_TEXTURE_2D, m_boundTexture0); ::glActiveTexture(m_activeTexture); if (m_boundFBO != m_fbo) ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_boundFBO); ::glFinish(); m_layerComposited = true; }
void GraphicsContext3D::prepareTexture() { if (m_layerComposited) return; makeContextCurrent(); if (m_attrs.antialias) resolveMultisamplingIfNecessary(); m_layerComposited = true; }
void GraphicsContext3D::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height) { makeContextCurrent(); if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) { resolveMultisamplingIfNecessary(IntRect(x, y, width, height)); ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); } ::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO); }
void GraphicsContext3D::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data) { // FIXME: remove the two glFlush calls when the driver bug is fixed, i.e., // all previous rendering calls should be done before reading pixels. makeContextCurrent(); ::glFlush(); if (m_attrs.antialias && m_state.boundFBO == m_multisampleFBO) { resolveMultisamplingIfNecessary(IntRect(x, y, width, height)); ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_fbo); ::glFlush(); } ::glReadPixels(x, y, width, height, format, type, data); if (m_attrs.antialias && m_state.boundFBO == m_multisampleFBO) ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO); }
void GraphicsContext3D::copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border) { makeContextCurrent(); #if !PLATFORM(BLACKBERRY) if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) { resolveMultisamplingIfNecessary(IntRect(x, y, width, height)); ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_fbo); } #endif ::glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); #if !PLATFORM(BLACKBERRY) if (m_attrs.antialias && m_boundFBO == m_multisampleFBO) ::glBindFramebufferEXT(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO); #endif }
void GraphicsContext3D::prepareTexture() { if (m_layerComposited) return; makeContextCurrent(); if (m_attrs.antialias) resolveMultisamplingIfNecessary(IntRect(0, 0, m_currentWidth, m_currentHeight)); ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); ::glActiveTexture(GL_TEXTURE0); ::glBindTexture(GL_TEXTURE_2D, m_compositorTexture); ::glCopyTexImage2D(GL_TEXTURE_2D, 0, m_internalColorFormat, 0, 0, m_currentWidth, m_currentHeight, 0); ::glBindTexture(GL_TEXTURE_2D, m_boundTexture0); ::glActiveTexture(m_activeTexture); ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); ::glFinish(); m_layerComposited = true; }
void GraphicsContext3D::readRenderingResults(unsigned char *pixels, int pixelsSize) { int totalBytes = m_currentWidth * m_currentHeight * 4; if (pixelsSize < totalBytes) return; makeContextCurrent(); bool mustRestoreFBO = false; if (m_attrs.antialias) { resolveMultisamplingIfNecessary(IntRect(0, 0, m_currentWidth, m_currentHeight)); ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); mustRestoreFBO = true; } else { if (m_boundFBO != m_fbo) { mustRestoreFBO = true; ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo); } } GLint packAlignment = 4; bool mustRestorePackAlignment = false; ::glGetIntegerv(GL_PACK_ALIGNMENT, &packAlignment); if (packAlignment > 4) { ::glPixelStorei(GL_PACK_ALIGNMENT, 4); mustRestorePackAlignment = true; } ::glReadPixels(0, 0, m_currentWidth, m_currentHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels); if (isGLES2Compliant()) { for (int i = 0; i < totalBytes; i += 4) std::swap(pixels[i], pixels[i + 2]); // Convert to BGRA. } if (mustRestorePackAlignment) ::glPixelStorei(GL_PACK_ALIGNMENT, packAlignment); if (mustRestoreFBO) ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO); }