From 9f2825f249110153eba6c5a5713713033696be5c Mon Sep 17 00:00:00 2001 From: joshualitt Date: Mon, 27 Oct 2014 17:56:18 -0700 Subject: Revert of Patch to remove constant attributes (patchset #6 id:100001 of https://codereview.chromium.org/678073005/) Reason for revert: Breaks the K1 Original issue's description: > Working patch to remove constant attributes. This may cause some gm mismatches, I will rebaseline tonight. > > BUG=skia: > > Committed: https://skia.googlesource.com/skia/+/84c94c0dfd1e12e97d8a835882dda575f36e41d2 TBR=bsalomon@google.com,egdaniel@google.com,joshualitt@chromium.org NOTREECHECKS=true NOTRY=true BUG=skia: Review URL: https://codereview.chromium.org/679363002 --- src/gpu/gl/GrGLProgram.cpp | 114 +++++++++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 41 deletions(-) (limited to 'src/gpu/gl/GrGLProgram.cpp') diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index bfa5f3cbc1..2d9b569333 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -129,12 +129,13 @@ void GrGLProgram::bindTextures(const GrGLInstalledProc* ip, const GrProcessor& p void GrGLProgram::setData(const GrOptDrawState& optState, GrGpu::DrawType drawType, - const GrDeviceCoordTexture* dstCopy) { + const GrDeviceCoordTexture* dstCopy, + SharedGLState* sharedState) { GrColor color = optState.getColor(); GrColor coverage = optState.getCoverageColor(); - this->setColor(optState, color); - this->setCoverage(optState, coverage); + this->setColor(optState, color, sharedState); + this->setCoverage(optState, coverage, sharedState); this->setMatrixAndRenderTargetHeight(drawType, optState); if (dstCopy) { @@ -200,49 +201,80 @@ void GrGLProgram::didSetData(GrGpu::DrawType drawType) { SkASSERT(!GrGpu::IsPathRenderingDrawType(drawType)); } -void GrGLProgram::setColor(const GrOptDrawState& optState, GrColor color) { +void GrGLProgram::setColor(const GrOptDrawState& optState, + GrColor color, + SharedGLState* sharedState) { const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); - switch (header.fColorInput) { - case GrGLProgramDesc::kAttribute_ColorInput: - // Attribute case is handled in GrGpuGL::setupGeometry - break; - case GrGLProgramDesc::kUniform_ColorInput: - if (fColor != color && fBuiltinUniformHandles.fColorUni.isValid()) { - // OpenGL ES doesn't support unsigned byte varieties of glUniform - GrGLfloat c[4]; - GrColorToRGBAFloat(color, c); - fProgramDataManager.set4fv(fBuiltinUniformHandles.fColorUni, 1, c); - fColor = color; - } - break; - case GrGLProgramDesc::kAllOnes_ColorInput: - // Handled by shader creation - break; - default: - SkFAIL("Unexpected color type."); + if (!optState.hasColorVertexAttribute()) { + switch (header.fColorInput) { + case GrGLProgramDesc::kAttribute_ColorInput: + SkASSERT(-1 != header.fColorAttributeIndex); + if (sharedState->fConstAttribColor != color || + sharedState->fConstAttribColorIndex != header.fColorAttributeIndex) { + // OpenGL ES only supports the float varieties of glVertexAttrib + GrGLfloat c[4]; + GrColorToRGBAFloat(color, c); + GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); + sharedState->fConstAttribColor = color; + sharedState->fConstAttribColorIndex = header.fColorAttributeIndex; + } + break; + case GrGLProgramDesc::kUniform_ColorInput: + if (fColor != color && fBuiltinUniformHandles.fColorUni.isValid()) { + // OpenGL ES doesn't support unsigned byte varieties of glUniform + GrGLfloat c[4]; + GrColorToRGBAFloat(color, c); + fProgramDataManager.set4fv(fBuiltinUniformHandles.fColorUni, 1, c); + fColor = color; + } + sharedState->fConstAttribColorIndex = -1; + break; + case GrGLProgramDesc::kAllOnes_ColorInput: + sharedState->fConstAttribColorIndex = -1; + break; + default: + SkFAIL("Unexpected color type."); + } + } else { + sharedState->fConstAttribColorIndex = -1; } } -void GrGLProgram::setCoverage(const GrOptDrawState& optState, GrColor coverage) { +void GrGLProgram::setCoverage(const GrOptDrawState& optState, + GrColor coverage, + SharedGLState* sharedState) { const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); - switch (header.fCoverageInput) { - case GrGLProgramDesc::kAttribute_ColorInput: - // Attribute case is handled in GrGpuGL::setupGeometry - break; - case GrGLProgramDesc::kUniform_ColorInput: - if (fCoverage != coverage) { - // OpenGL ES doesn't support unsigned byte varieties of glUniform - GrGLfloat c[4]; - GrColorToRGBAFloat(coverage, c); - fProgramDataManager.set4fv(fBuiltinUniformHandles.fCoverageUni, 1, c); - fCoverage = coverage; - } - break; - case GrGLProgramDesc::kAllOnes_ColorInput: - // Handled by shader creation - break; - default: - SkFAIL("Unexpected coverage type."); + if (!optState.hasCoverageVertexAttribute()) { + switch (header.fCoverageInput) { + case GrGLProgramDesc::kAttribute_ColorInput: + if (sharedState->fConstAttribCoverage != coverage || + sharedState->fConstAttribCoverageIndex != header.fCoverageAttributeIndex) { + // OpenGL ES only supports the float varieties of glVertexAttrib + GrGLfloat c[4]; + GrColorToRGBAFloat(coverage, c); + GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); + sharedState->fConstAttribCoverage = coverage; + sharedState->fConstAttribCoverageIndex = header.fCoverageAttributeIndex; + } + break; + case GrGLProgramDesc::kUniform_ColorInput: + if (fCoverage != coverage) { + // OpenGL ES doesn't support unsigned byte varieties of glUniform + GrGLfloat c[4]; + GrColorToRGBAFloat(coverage, c); + fProgramDataManager.set4fv(fBuiltinUniformHandles.fCoverageUni, 1, c); + fCoverage = coverage; + } + sharedState->fConstAttribCoverageIndex = -1; + break; + case GrGLProgramDesc::kAllOnes_ColorInput: + sharedState->fConstAttribCoverageIndex = -1; + break; + default: + SkFAIL("Unexpected coverage type."); + } + } else { + sharedState->fConstAttribCoverageIndex = -1; } } -- cgit v1.2.3