diff options
Diffstat (limited to 'backends/graphics/opengl/pipelines')
| -rw-r--r-- | backends/graphics/opengl/pipelines/shader.cpp | 26 | ||||
| -rw-r--r-- | backends/graphics/opengl/pipelines/shader.h | 2 | 
2 files changed, 26 insertions, 2 deletions
diff --git a/backends/graphics/opengl/pipelines/shader.cpp b/backends/graphics/opengl/pipelines/shader.cpp index c7befe22b8..8e38458f73 100644 --- a/backends/graphics/opengl/pipelines/shader.cpp +++ b/backends/graphics/opengl/pipelines/shader.cpp @@ -28,15 +28,28 @@ namespace OpenGL {  #if !USE_FORCED_GLES  ShaderPipeline::ShaderPipeline(Shader *shader) -    : _activeShader(shader) { +    : _activeShader(shader), _colorAttributes() {  	_vertexAttribLocation = shader->getAttributeLocation("position");  	_texCoordAttribLocation = shader->getAttributeLocation("texCoordIn");  	_colorAttribLocation = shader->getAttributeLocation("blendColorIn"); + +	assert(_vertexAttribLocation   != -1); +	assert(_texCoordAttribLocation != -1); +	assert(_colorAttribLocation    != -1); + +	// One of the attributes needs to be passed through location 0, otherwise +	// we get no output for GL contexts due to GL compatibility reasons. Let's +	// check whether this ever happens. If this ever gets hit, we need to +	// enable location 0 and pass some dummy values through it to fix output. +	assert(   _vertexAttribLocation == 0 +	       || _texCoordAttribLocation == 0 +	       || _colorAttribLocation == 0);  }  void ShaderPipeline::activateInternal() {  	GL_CALL(glEnableVertexAttribArray(_vertexAttribLocation));  	GL_CALL(glEnableVertexAttribArray(_texCoordAttribLocation)); +	GL_CALL(glEnableVertexAttribArray(_colorAttribLocation));  	if (g_context.multitextureSupported) {  		GL_CALL(glActiveTexture(GL_TEXTURE0)); @@ -48,12 +61,21 @@ void ShaderPipeline::activateInternal() {  void ShaderPipeline::deactivateInternal() {  	GL_CALL(glDisableVertexAttribArray(_vertexAttribLocation));  	GL_CALL(glDisableVertexAttribArray(_texCoordAttribLocation)); +	GL_CALL(glDisableVertexAttribArray(_colorAttribLocation));  	_activeShader->deactivate();  }  void ShaderPipeline::setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { -	GL_CALL(glVertexAttrib4f(_colorAttribLocation, r, g, b, a)); +	GLfloat *dst = _colorAttributes; +	for (uint i = 0; i < 4; ++i) { +		*dst++ = r; +		*dst++ = g; +		*dst++ = b; +		*dst++ = a; +	} + +	GL_CALL(glVertexAttribPointer(_colorAttribLocation, 4, GL_FLOAT, GL_FALSE, 0, _colorAttributes));  }  void ShaderPipeline::drawTexture(const GLTexture &texture, const GLfloat *coordinates) { diff --git a/backends/graphics/opengl/pipelines/shader.h b/backends/graphics/opengl/pipelines/shader.h index 95167ee03f..6159607099 100644 --- a/backends/graphics/opengl/pipelines/shader.h +++ b/backends/graphics/opengl/pipelines/shader.h @@ -48,6 +48,8 @@ protected:  	GLint _texCoordAttribLocation;  	GLint _colorAttribLocation; +	GLfloat _colorAttributes[4*4]; +  	Shader *const _activeShader;  };  #endif // !USE_FORCED_GLES  | 
