Beispiel #1
0
void GrGpuGLShaders::flushColor(GrColor color) {
    const ProgramDesc& desc = fCurrentProgram.getDesc();
    const GrDrawState& drawState = this->getDrawState();

    if (this->getVertexLayout() & kColor_VertexLayoutBit) {
        // color will be specified per-vertex as an attribute
        // invalidate the const vertex attrib color
        fHWDrawState.setColor(GrColor_ILLEGAL);
    } else {
        switch (desc.fColorInput) {
            case ProgramDesc::kAttribute_ColorInput:
                if (fHWDrawState.getColor() != color) {
                    // OpenGL ES only supports the float varieties of
                    // glVertexAttrib
                    float c[] = GR_COLOR_TO_VEC4(color);
                    GL_CALL(VertexAttrib4fv(GrGLProgram::ColorAttributeIdx(), 
                                            c));
                    fHWDrawState.setColor(color);
                }
                break;
            case ProgramDesc::kUniform_ColorInput:
                if (fProgramData->fColor != color) {
                    // OpenGL ES doesn't support unsigned byte varieties of
                    // glUniform
                    float c[] = GR_COLOR_TO_VEC4(color);
                    GrAssert(GrGLProgram::kUnusedUniform != 
                             fProgramData->fUniLocations.fColorUni);
                    GL_CALL(Uniform4fv(fProgramData->fUniLocations.fColorUni,
                                        1, c));
                    fProgramData->fColor = color;
                }
                break;
            case ProgramDesc::kSolidWhite_ColorInput:
            case ProgramDesc::kTransBlack_ColorInput:
                break;
            default:
                GrCrash("Unknown color type.");
        }
    }
    if (fProgramData->fUniLocations.fColorFilterUni
                != GrGLProgram::kUnusedUniform
            && fProgramData->fColorFilterColor
                != drawState.getColorFilterColor()) {
        float c[] = GR_COLOR_TO_VEC4(drawState.getColorFilterColor());
        GL_CALL(Uniform4fv(fProgramData->fUniLocations.fColorFilterUni, 1, c));
        fProgramData->fColorFilterColor = drawState.getColorFilterColor();
    }
}
Beispiel #2
0
void GrGpuGLShaders::flushTextureDomain(int s) {
    const GrGLint& uni = fProgramData->fUniLocations.fStages[s].fTexDomUni;
    const GrDrawState& drawState = this->getDrawState();
    if (GrGLProgram::kUnusedUniform != uni) {
        const GrRect &texDom = drawState.getSampler(s).getTextureDomain();

        if (((1 << s) & fDirtyFlags.fTextureChangedMask) ||
            fProgramData->fTextureDomain[s] != texDom) {

            fProgramData->fTextureDomain[s] = texDom;

            float values[4] = {
                GrScalarToFloat(texDom.left()),
                GrScalarToFloat(texDom.top()),
                GrScalarToFloat(texDom.right()),
                GrScalarToFloat(texDom.bottom())
            };

            const GrGLTexture* texture =
                static_cast<const GrGLTexture*>(drawState.getTexture(s));
            GrGLTexture::Orientation orientation = texture->orientation();

            // vertical flip if necessary
            if (GrGLTexture::kBottomUp_Orientation == orientation) {
                values[1] = 1.0f - values[1];
                values[3] = 1.0f - values[3];
                // The top and bottom were just flipped, so correct the ordering
                // of elements so that values = (l, t, r, b).
                SkTSwap(values[1], values[3]);
            }

            GL_CALL(Uniform4fv(uni, 1, values));
        }
    }
}
Beispiel #3
0
void CShaderAPIOES2::SetPixelShaderFogParams(int reg)
{
	float fogParams[8];
	if ((m_TransitionTable.CurrentShadowState()->m_FogMode != SHADER_FOGMODE_DISABLED) &&
		(m_SceneFogMode != MATERIAL_FOG_NONE))
	{
		fogParams[0] = m_FogConstant[0];
		fogParams[1] = m_FogConstant[1];
		// Negative z means water fog (to avoid using additional boolean constant).
		fogParams[2] = (m_SceneFogMode == MATERIAL_FOG_LINEAR) ? m_FogConstant[2] : -1.0f;
		fogParams[3] = m_FogConstant[3];
	}
	else
	{
		fogParams[0] = 1.0f;
		fogParams[1] = m_DynamicState.m_FogZ;
		fogParams[2] = 1.0f;
		fogParams[3] = 0.0f;
	}
	fogParams[4] = m_DynamicState.m_PixelFogColor[0];
	fogParams[5] = m_DynamicState.m_PixelFogColor[1];
	fogParams[6] = m_DynamicState.m_PixelFogColor[2];
	fogParams[7] = 0.0f;
	Uniform4fv(reg, 2, fogParams);
}
Beispiel #4
0
void HudShader::useProgram() {
	Shader::useProgram();
	
	if (_projectionMatrixDirty || _modelMatrixDirty) {
		glm::mat4 mvpMatrix = _projectionMatrix * _modelMatrix;
		GL(UniformMatrix4fv(_mvpMatrixLoc, 1, GL_FALSE, glm::value_ptr(mvpMatrix)));
		_projectionMatrixDirty = false;
		_modelMatrixDirty = false;
	}

	if (_colorDirty) {
		GL(Uniform4fv(_colorLoc, 1, glm::value_ptr(_color)));
		_colorDirty = false;
	}
}
Beispiel #5
0
void GrGpuGLShaders::flushColorMatrix() {
    const ProgramDesc& desc = fCurrentProgram.getDesc();
    int matrixUni = fProgramData->fUniLocations.fColorMatrixUni;
    int vecUni = fProgramData->fUniLocations.fColorMatrixVecUni;
    if (GrGLProgram::kUnusedUniform != matrixUni
     && GrGLProgram::kUnusedUniform != vecUni) {
        const float* m = this->getDrawState().getColorMatrix();
        GrGLfloat mt[]  = {
            m[0], m[5], m[10], m[15],
            m[1], m[6], m[11], m[16],
            m[2], m[7], m[12], m[17],
            m[3], m[8], m[13], m[18],
        };
        static float scale = 1.0f / 255.0f;
        GrGLfloat vec[] = {
            m[4] * scale, m[9] * scale, m[14] * scale, m[19] * scale,
        };
        GL_CALL(UniformMatrix4fv(matrixUni, 1, false, mt));
        GL_CALL(Uniform4fv(vecUni, 1, vec));
    }
}
Beispiel #6
0
GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v)
{
	CONTEXT_EXEC(Uniform4fv(location, count, v));
}
Beispiel #7
0
//---------------------------------------------------------------------------
void Material::RegisterStaticUniform4fv( const std::string& name, const std::vector< Vec4f >& values )
{
	m_uniforms4fv.push_back( Uniform4fv( name, values ) );
}