Shader::~Shader() { ensureGLContext(); if (mShaderProgram) { glCheck(glDeleteObjectARB(mShaderProgram)); } }
void Shader::setParameter(const std::string &name, CurrentTextureType) { if (mShaderProgram) { ensureGLContext(); mCurrentTexture = getParamLocation(name); } }
void Shader::bind(const Shader *shader) { ensureGLContext(); if (shader && shader->mShaderProgram) { glCheck(glUseProgramObjectARB(shader->mShaderProgram)); shader->bindTextures(); if (shader->mCurrentTexture != -1) { glCheck(glUniform1iARB(shader->mCurrentTexture, 0)); } } else { glCheck(glUseProgramObjectARB(0)); } }
void Shader::setParameter(const std::string &name, const Transform &transform) { if (mShaderProgram) { ensureGLContext(); GLhandleARB program = glCheck(glGetHandleARB(glGetHandleARB(GL_PROGRAM_OBJECT_ARB))); glCheck(glUseProgramObjectARB(mShaderProgram)); GLint location = getParamLocation(name); if (location != -1) { glCheck(glUniformMatrix4fvARB(location, 1, GL_FALSE, transform.getMatrix())); } glCheck(glUseProgramObjectARB(program)); } }
void Shader::setParameter(const std::string &name, float x, float y, float z, float w) { if (mShaderProgram) { ensureGLContext(); GLhandleARB program = glCheck(glGetHandleARB(glGetHandleARB(GL_PROGRAM_OBJECT_ARB))); glCheck(glUseProgramObjectARB(mShaderProgram)); GLint location = getParamLocation(name); if (location != -1) { glCheck(glUniform4fARB(location, x, y, z, w)); } glCheck(glUseProgramObjectARB(program)); } }
void ThreadedCompositor::renderLayerTree() { if (!m_scene) return; if (!ensureGLContext()) return; FloatRect clipRect(0, 0, m_viewportSize.width(), m_viewportSize.height()); TransformationMatrix viewportTransform; FloatPoint scrollPostion = viewportController()->visibleContentsRect().location(); viewportTransform.scale(viewportController()->pageScaleFactor() * m_deviceScaleFactor); viewportTransform.translate(-scrollPostion.x(), -scrollPostion.y()); m_scene->paintToCurrentGLContext(viewportTransform, 1, clipRect, Color::white, false, scrollPostion); glContext()->swapBuffers(); }
void Shader::setParameter(const std::string &name, const Texture &texture) { if (mShaderProgram) { ensureGLContext(); GLint location = getParamLocation(name); if (location != -1) { TextureTable::iterator it = mTextures.find(location); if (it == mTextures.end()) { GLint maxUnits = getMaxTextureUnits(); if (mTextures.size() + 1 >= staticCast_t(maxUnits)) { std::cerr << "Imposible to use texture \"" << name << "\" for shader, all available texture units are used.\n"; return; } mTextures[location] = &texture; } else { it->second = &texture; } } } }
void ThreadedCompositor::renderLayerTree() { if (!m_scene) return; if (!ensureGLContext()) return; FloatRect clipRect(0, 0, m_viewportSize.width(), m_viewportSize.height()); TransformationMatrix viewportTransform; FloatPoint scrollPostion = viewportController()->visibleContentsRect().location(); viewportTransform.scale(viewportController()->pageScaleFactor()); viewportTransform.translate(-scrollPostion.x(), -scrollPostion.y()); m_scene->paintToCurrentGLContext(viewportTransform, 1, clipRect, Color::white, false, scrollPostion); #if PLATFORM(BCM_RPI) auto bufferExport = m_surface->lockFrontBuffer(); m_compositingManager.commitBCMBuffer(bufferExport); #endif #if PLATFORM(BCM_NEXUS) auto bufferExport = m_surface->lockFrontBuffer(); m_compositingManager.commitBCMNexusBuffer(bufferExport); #endif #if PLATFORM(INTEL_CE) auto bufferExport = m_surface->lockFrontBuffer(); m_compositingManager.commitIntelCEBuffer(bufferExport); #endif glContext()->swapBuffers(); #if PLATFORM(GBM) auto bufferExport = m_surface->lockFrontBuffer(); m_compositingManager.commitPrimeBuffer(bufferExport); #endif }
bool Shader::compile(const char *vertexShaderCode, const char *fragmentShaderCode) { ensureGLContext(); if (!isAvailable()) { std::cerr << "Failed to create a shader. Your system doesn't support shaders. " << "You should use Shader::isAvailable() befor trying to use shaders.\n"; return false; } if (mShaderProgram) { glCheck(glDeleteObjectARB(mShaderProgram)); } mCurrentTexture = -1; mTextures.clear(); mParams.clear(); mShaderProgram = glCheck(glCreateProgramObjectARB()); if (vertexShaderCode) { GLhandleARB vertexShader = glCheck(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); glCheck(glShaderSourceARB(vertexShader, 1, &vertexShaderCode, null)); glCheck(glCompileShaderARB(vertexShader)); GLint success; glCheck(glGetObjectParameterivARB(vertexShader, GL_OBJECT_COMPILE_STATUS_ARB, &success)); if (success == GL_FALSE) { char log[1024]; glCheck(glGetInfoLogARB(vertexShader, sizeof(log), 0, log)); std::cerr << "Failed to compile vertex shader. " << log << "\n"; glCheck(glDeleteObjectARB(mShaderProgram)); glCheck(glDeleteObjectARB(vertexShader)); mShaderProgram = 0; return false; } glCheck(glAttachObjectARB(mShaderProgram, vertexShader)); glCheck(glDeleteObjectARB(vertexShader)); } if (fragmentShaderCode) { GLhandleARB fragmentShader = glCheck(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); glCheck(glShaderSourceARB(fragmentShader, 1, &fragmentShaderCode, null)); glCheck(glCompileShaderARB(fragmentShader)); GLint success; glCheck(glGetObjectParameterivARB(fragmentShader, GL_OBJECT_COMPILE_STATUS_ARB, &success)); if (success == GL_FALSE) { char log[1024]; glCheck(glGetInfoLogARB(fragmentShader, sizeof(log), 0, log)); std::cerr << "Failed to compile vertex shader. " << log << "\n"; glCheck(glDeleteObjectARB(mShaderProgram)); glCheck(glDeleteObjectARB(fragmentShader)); mShaderProgram = 0; return false; } glCheck(glAttachObjectARB(mShaderProgram, fragmentShader)); glCheck(glDeleteObjectARB(fragmentShader)); } glCheck(glLinkProgramARB(mShaderProgram)); GLint success; glCheck(glGetObjectParameterivARB(mShaderProgram, GL_OBJECT_LINK_STATUS_ARB, &success)); if (success == GL_FALSE) { char log[1024]; glCheck(glGetInfoLogARB(mShaderProgram, sizeof(log), 0, log)); std::cerr << "Failed to link shader. " << log << "\n"; glCheck(glDeleteObjectARB(mShaderProgram)); mShaderProgram = 0; return false; } glCheck(glFlush()); return true; }