From 0e602827df086d2bbb215d828d7fdcbbe16e792b Mon Sep 17 00:00:00 2001 From: joshualitt Date: Tue, 28 Oct 2014 10:27:44 -0700 Subject: 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 Committed: https://skia.googlesource.com/skia/+/95f5194abce19e8ed875f3495fd16c79a9b931b4 Review URL: https://codereview.chromium.org/678073005 --- src/gpu/effects/GrYUVtoRGBEffect.cpp | 2 +- src/gpu/gl/GrGLProgram.cpp | 114 +++++++++++------------------ src/gpu/gl/GrGLProgram.h | 28 +------ src/gpu/gl/GrGLProgramDesc.cpp | 24 +++--- src/gpu/gl/GrGLProgramDesc.h | 2 +- src/gpu/gl/GrGpuGL.cpp | 1 - src/gpu/gl/GrGpuGL.h | 2 - src/gpu/gl/GrGpuGL_program.cpp | 2 +- src/gpu/gl/builders/GrGLProgramBuilder.cpp | 25 ++++--- 9 files changed, 73 insertions(+), 127 deletions(-) (limited to 'src/gpu') diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp index f02c1b2295..703c672cfd 100644 --- a/src/gpu/effects/GrYUVtoRGBEffect.cpp +++ b/src/gpu/effects/GrYUVtoRGBEffect.cpp @@ -109,7 +109,7 @@ private: virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE { // YUV is opaque inout->setToOther(kA_GrColorComponentFlag, 0xFF << GrColor_SHIFT_A, - InvariantOutput::kWill_ReadInput); + InvariantOutput::kWillNot_ReadInput); } GrCoordTransform fCoordTransform; diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index 2d9b569333..bfa5f3cbc1 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -129,13 +129,12 @@ void GrGLProgram::bindTextures(const GrGLInstalledProc* ip, const GrProcessor& p void GrGLProgram::setData(const GrOptDrawState& optState, GrGpu::DrawType drawType, - const GrDeviceCoordTexture* dstCopy, - SharedGLState* sharedState) { + const GrDeviceCoordTexture* dstCopy) { GrColor color = optState.getColor(); GrColor coverage = optState.getCoverageColor(); - this->setColor(optState, color, sharedState); - this->setCoverage(optState, coverage, sharedState); + this->setColor(optState, color); + this->setCoverage(optState, coverage); this->setMatrixAndRenderTargetHeight(drawType, optState); if (dstCopy) { @@ -201,80 +200,49 @@ void GrGLProgram::didSetData(GrGpu::DrawType drawType) { SkASSERT(!GrGpu::IsPathRenderingDrawType(drawType)); } -void GrGLProgram::setColor(const GrOptDrawState& optState, - GrColor color, - SharedGLState* sharedState) { +void GrGLProgram::setColor(const GrOptDrawState& optState, GrColor color) { const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); - 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; + 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."); } } -void GrGLProgram::setCoverage(const GrOptDrawState& optState, - GrColor coverage, - SharedGLState* sharedState) { +void GrGLProgram::setCoverage(const GrOptDrawState& optState, GrColor coverage) { const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); - 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; + 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."); } } diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h index e8aef35f1d..ca75e206f1 100644 --- a/src/gpu/gl/GrGLProgram.h +++ b/src/gpu/gl/GrGLProgram.h @@ -59,27 +59,6 @@ public: */ virtual bool hasVertexShader() const { return true; } - /** - * Some GL state that is relevant to programs is not stored per-program. In particular color - * and coverage attributes can be global state. This struct is read and updated by - * GrGLProgram::setColor and GrGLProgram::setCoverage to allow us to avoid setting this state - * redundantly. - */ - struct SharedGLState { - GrColor fConstAttribColor; - int fConstAttribColorIndex; - GrColor fConstAttribCoverage; - int fConstAttribCoverageIndex; - - SharedGLState() { this->invalidate(); } - void invalidate() { - fConstAttribColor = GrColor_ILLEGAL; - fConstAttribColorIndex = -1; - fConstAttribCoverage = GrColor_ILLEGAL; - fConstAttribCoverageIndex = -1; - } - }; - /** * The GrDrawState's view matrix along with the aspects of the render target determine the * matrix sent to GL. The size of the render target affects the GL matrix because we must @@ -152,8 +131,7 @@ public: */ void setData(const GrOptDrawState&, GrGpu::DrawType, - const GrDeviceCoordTexture* dstCopy, // can be NULL - SharedGLState*); + const GrDeviceCoordTexture* dstCopy /* can be NULL*/); protected: typedef GrGLProgramDataManager::UniformHandle UniformHandle; @@ -173,11 +151,11 @@ protected: // Helper for setData(). Makes GL calls to specify the initial color when there is not // per-vertex colors. - void setColor(const GrOptDrawState&, GrColor color, SharedGLState*); + void setColor(const GrOptDrawState&, GrColor color); // Helper for setData(). Makes GL calls to specify the initial coverage when there is not // per-vertex coverages. - void setCoverage(const GrOptDrawState&, GrColor coverage, SharedGLState*); + void setCoverage(const GrOptDrawState&, GrColor coverage); // A templated helper to loop over effects, set the transforms(via subclass) and bind textures void setFragmentData(const GrOptDrawState&); diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp index 79088137ca..4a274c6bb1 100644 --- a/src/gpu/gl/GrGLProgramDesc.cpp +++ b/src/gpu/gl/GrGLProgramDesc.cpp @@ -257,25 +257,27 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, header->fEmitsPointSize = GrGpu::kDrawPoints_DrawType == drawType; - if (gpu->caps()->pathRenderingSupport() && - GrGpu::IsPathRenderingDrawType(drawType) && - gpu->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunction_TexturingMode) { - header->fUseFragShaderOnly = true; + bool isPathRendering = GrGpu::IsPathRenderingDrawType(drawType); + if (gpu->caps()->pathRenderingSupport() && isPathRendering) { + header->fUseNvpr = true; SkASSERT(!optState.hasGeometryProcessor()); } else { - header->fUseFragShaderOnly = false; + header->fUseNvpr = false; } - bool defaultToUniformInputs = GrGpu::IsPathRenderingDrawType(drawType) || - GR_GL_NO_CONSTANT_ATTRIBUTES; + bool hasUniformColor = inputColorIsUsed && + (isPathRendering || !optState.hasColorVertexAttribute()); + + bool hasUniformCoverage = inputCoverageIsUsed && + (isPathRendering || !optState.hasCoverageVertexAttribute()); if (!inputColorIsUsed) { header->fColorInput = kAllOnes_ColorInput; - } else if (defaultToUniformInputs && !optState.hasColorVertexAttribute()) { + } else if (hasUniformColor) { header->fColorInput = kUniform_ColorInput; } else { header->fColorInput = kAttribute_ColorInput; - SkASSERT(!header->fUseFragShaderOnly); + SkASSERT(!header->fUseNvpr); } bool covIsSolidWhite = !optState.hasCoverageVertexAttribute() && @@ -283,11 +285,11 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, if (covIsSolidWhite || !inputCoverageIsUsed) { header->fCoverageInput = kAllOnes_ColorInput; - } else if (defaultToUniformInputs && !optState.hasCoverageVertexAttribute()) { + } else if (hasUniformCoverage) { header->fCoverageInput = kUniform_ColorInput; } else { header->fCoverageInput = kAttribute_ColorInput; - SkASSERT(!header->fUseFragShaderOnly); + SkASSERT(!header->fUseNvpr); } if (optState.readsDst()) { diff --git a/src/gpu/gl/GrGLProgramDesc.h b/src/gpu/gl/GrGLProgramDesc.h index 4e1be5b2f9..d97bdfded5 100644 --- a/src/gpu/gl/GrGLProgramDesc.h +++ b/src/gpu/gl/GrGLProgramDesc.h @@ -94,7 +94,7 @@ private: // effects that read the fragment position. // Otherwise, 0. - SkBool8 fUseFragShaderOnly; + SkBool8 fUseNvpr; SkBool8 fEmitsPointSize; ColorInput fColorInput : 8; diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index 7b892913c5..a85548ea64 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -342,7 +342,6 @@ void GrGpuGL::onResetContext(uint32_t resetBits) { if (resetBits & kProgram_GrGLBackendState) { fHWProgramID = 0; - fSharedGLProgramState.invalidate(); } } diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h index 973a568981..dc0d076a2d 100644 --- a/src/gpu/gl/GrGpuGL.h +++ b/src/gpu/gl/GrGpuGL.h @@ -288,8 +288,6 @@ private: int fHWActiveTextureUnitIdx; GrGLuint fHWProgramID; - GrGLProgram::SharedGLState fSharedGLProgramState; - enum TriState { kNo_TriState, kYes_TriState, diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp index bf73f0059c..a1259c9bf8 100644 --- a/src/gpu/gl/GrGpuGL_program.cpp +++ b/src/gpu/gl/GrGpuGL_program.cpp @@ -256,7 +256,7 @@ bool GrGpuGL::flushGraphicsState(DrawType type, this->flushBlend(*optState.get(), kDrawLines_DrawType == type, srcCoeff, dstCoeff); - fCurrentProgram->setData(*optState.get(), type, dstCopy, &fSharedGLProgramState); + fCurrentProgram->setData(*optState.get(), type, dstCopy); } GrGLRenderTarget* glRT = static_cast(optState->getRenderTarget()); diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp index 28d1517423..65a7cdaa63 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp @@ -55,7 +55,9 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, // if we have a vertex shader(we don't only if we are using NVPR or NVPR ES), then we may have // to setup a few more things like builtin vertex attributes - bool hasVertexShader = !header.fUseFragShaderOnly; + bool hasVertexShader = !(header.fUseNvpr && + gpu->glPathRendering()->texturingMode() == + GrGLPathRendering::FixedFunction_TexturingMode); if (hasVertexShader) { pb->fVS.setupLocalCoords(); pb->fVS.transformGLToSkiaCoords(); @@ -92,18 +94,15 @@ GrGLProgramBuilder::CreateProgramBuilder(const GrGLProgramDesc& desc, GrGpu::DrawType drawType, bool hasGeometryProcessor, GrGpuGL* gpu) { - if (desc.getHeader().fUseFragShaderOnly) { + if (desc.getHeader().fUseNvpr) { SkASSERT(gpu->glCaps().pathRenderingSupport()); - SkASSERT(gpu->glPathRendering()->texturingMode() == - GrGLPathRendering::FixedFunction_TexturingMode); SkASSERT(!hasGeometryProcessor); - return SkNEW_ARGS(GrGLLegacyNvprProgramBuilder, (gpu, optState, desc)); - } else if (GrGpu::IsPathRenderingDrawType(drawType)) { - SkASSERT(gpu->glCaps().pathRenderingSupport()); - SkASSERT(gpu->glPathRendering()->texturingMode() == - GrGLPathRendering::SeparableShaders_TexturingMode); - SkASSERT(!hasGeometryProcessor); - return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState, desc)); + if (gpu->glPathRendering()->texturingMode() == + GrGLPathRendering::FixedFunction_TexturingMode) { + return SkNEW_ARGS(GrGLLegacyNvprProgramBuilder, (gpu, optState, desc)); + } else { + return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState, desc)); + } } else { return SkNEW_ARGS(GrGLProgramBuilder, (gpu, optState, desc)); } @@ -420,7 +419,9 @@ GrGLProgram* GrGLProgramBuilder::finalize() { this->cleanupProgram(programID, shadersToDelete); return NULL; } - if (!this->header().fUseFragShaderOnly) { + if (!(this->header().fUseNvpr && + fGpu->glPathRendering()->texturingMode() == + GrGLPathRendering::FixedFunction_TexturingMode)) { if (!fVS.compileAndAttachShaders(programID, &shadersToDelete)) { this->cleanupProgram(programID, shadersToDelete); return NULL; -- cgit v1.2.3