示例#1
0
Shader::~Shader() {
	ensureGLContext();

	if (mShaderProgram) {
		glCheck(glDeleteObjectARB(mShaderProgram));
	}
}
示例#2
0
void Shader::setParameter(const std::string &name, CurrentTextureType) {
	if (mShaderProgram) {
		ensureGLContext();

		mCurrentTexture = getParamLocation(name);
	}
}
示例#3
0
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));
	}
}
示例#4
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));
	}
}
示例#5
0
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));
	}
}
示例#6
0
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();
}
示例#7
0
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
}
示例#9
0
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;
}