aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2014-10-28 10:27:44 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-10-28 10:27:44 -0700
commit0e602827df086d2bbb215d828d7fdcbbe16e792b (patch)
tree5757d88a4e655f032accda6500591bb88dec1020 /src/gpu
parent98102a8f795abbfcb98547ced4a8b72eadbad377 (diff)
Working patch to remove constant attributes. This may cause some gm mismatches, I will rebaseline tonight.
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/effects/GrYUVtoRGBEffect.cpp2
-rw-r--r--src/gpu/gl/GrGLProgram.cpp114
-rw-r--r--src/gpu/gl/GrGLProgram.h28
-rw-r--r--src/gpu/gl/GrGLProgramDesc.cpp24
-rw-r--r--src/gpu/gl/GrGLProgramDesc.h2
-rw-r--r--src/gpu/gl/GrGpuGL.cpp1
-rw-r--r--src/gpu/gl/GrGpuGL.h2
-rw-r--r--src/gpu/gl/GrGpuGL_program.cpp2
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.cpp25
9 files changed, 73 insertions, 127 deletions
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
@@ -60,27 +60,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
* convert from Skia device coords to GL's normalized coords. Also the origin of the render
@@ -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<GrGLRenderTarget*>(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;