Revert r2872
git-svn-id: http://skia.googlecode.com/svn/trunk@2873 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrGpuGLShaders.cpp b/src/gpu/GrGpuGLShaders.cpp
index 87bdb05..98ac1bf 100644
--- a/src/gpu/GrGpuGLShaders.cpp
+++ b/src/gpu/GrGpuGLShaders.cpp
@@ -875,97 +875,6 @@
fHWGeometryState.fArrayPtrsDirty = false;
}
-namespace {
-void copy_stage_to_desc(GrGLProgram::StageDesc* stage,
- const GrGLTexture* texture,
- const GrSamplerState& sampler,
- const GrGpuGL::GLCaps& caps) {
- typedef GrGLProgram::StageDesc StageDesc;
- GrAssert(NULL != texture);
- stage->fOptFlags = 0;
- stage->setEnabled(true);
-
- // we matrix to invert when orientation is TopDown, so make sure
- // we aren't in that case before flagging as identity.
- if (GrGpuGL::TextureMatrixIsIdentity(texture, sampler)) {
- stage->fOptFlags |= StageDesc::kIdentityMatrix_OptFlagBit;
- } else if (!sampler.getMatrix().hasPerspective()) {
- stage->fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
- }
- switch (sampler.getSampleMode()) {
- case GrSamplerState::kNormal_SampleMode:
- stage->fCoordMapping = StageDesc::kIdentity_CoordMapping;
- break;
- case GrSamplerState::kRadial_SampleMode:
- stage->fCoordMapping = StageDesc::kRadialGradient_CoordMapping;
- break;
- case GrSamplerState::kRadial2_SampleMode:
- if (sampler.radial2IsDegenerate()) {
- stage->fCoordMapping =
- StageDesc::kRadial2GradientDegenerate_CoordMapping;
- } else {
- stage->fCoordMapping =
- StageDesc::kRadial2Gradient_CoordMapping;
- }
- break;
- case GrSamplerState::kSweep_SampleMode:
- stage->fCoordMapping = StageDesc::kSweepGradient_CoordMapping;
- break;
- default:
- GrCrash("Unexpected sample mode!");
- break;
- }
-
- switch (sampler.getFilter()) {
- // these both can use a regular texture2D()
- case GrSamplerState::kNearest_Filter:
- case GrSamplerState::kBilinear_Filter:
- stage->fFetchMode = StageDesc::kSingle_FetchMode;
- break;
- // performs 4 texture2D()s
- case GrSamplerState::k4x4Downsample_Filter:
- stage->fFetchMode = StageDesc::k2x2_FetchMode;
- break;
- // performs fKernelWidth texture2D()s
- case GrSamplerState::kConvolution_Filter:
- stage->fFetchMode = StageDesc::kConvolution_FetchMode;
- break;
- default:
- GrCrash("Unexpected filter!");
- break;
- }
-
- if (sampler.hasTextureDomain()) {
- GrAssert(GrSamplerState::kClamp_WrapMode ==
- sampler.getWrapX() &&
- GrSamplerState::kClamp_WrapMode ==
- sampler.getWrapY());
- stage->fOptFlags |= StageDesc::kCustomTextureDomain_OptFlagBit;
- }
-
- stage->fInConfigFlags = 0;
- if (!caps.fTextureSwizzleSupport) {
- if (GrPixelConfigIsAlphaOnly(texture->config())) {
- // if we don't have texture swizzle support then
- // the shader must do an alpha smear after reading
- // the texture
- stage->fInConfigFlags |= StageDesc::kSmearAlpha_InConfigFlag;
- } else if (sampler.swapsRAndB()) {
- stage->fInConfigFlags |= StageDesc::kSwapRAndB_InConfigFlag;
- }
- }
- if (GrPixelConfigIsUnpremultiplied(texture->config())) {
- stage->fInConfigFlags |= StageDesc::kMulRGBByAlpha_InConfigFlag;
- }
-
- if (sampler.getFilter() == GrSamplerState::kConvolution_Filter) {
- stage->fKernelWidth = sampler.getKernelWidth();
- } else {
- stage->fKernelWidth = 0;
- }
-}
-}
-
void GrGpuGLShaders::buildProgram(GrPrimitiveType type,
BlendOptFlags blendOpts,
GrBlendCoeff dstCoeff) {
@@ -1035,37 +944,106 @@
// use canonical value when not set to avoid cache misses
desc.fVertexEdgeType = GrDrawState::kHairLine_EdgeType;
}
- int firstCoverageStage = drawState.getFirstCoverageStage();
- for (int s = 0; s < firstCoverageStage; ++s) {
+ for (int s = 0; s < GrDrawState::kNumStages; ++s) {
StageDesc& stage = desc.fStages[s];
- bool enabled = !skipColor && this->isStageEnabled(s);
- if (enabled) {
+
+ stage.fOptFlags = 0;
+ stage.setEnabled(this->isStageEnabled(s));
+
+ bool skip = s < drawState.getFirstCoverageStage() ? skipColor :
+ skipCoverage;
+
+ if (!skip && stage.isEnabled()) {
+ lastEnabledStage = s;
const GrGLTexture* texture =
static_cast<const GrGLTexture*>(drawState.getTexture(s));
- copy_stage_to_desc(&stage,
- texture,
- drawState.getSampler(s),
- this->glCaps());
- lastEnabledStage = s;
+ GrAssert(NULL != texture);
+ const GrSamplerState& sampler = drawState.getSampler(s);
+ // we matrix to invert when orientation is TopDown, so make sure
+ // we aren't in that case before flagging as identity.
+ if (TextureMatrixIsIdentity(texture, sampler)) {
+ stage.fOptFlags |= StageDesc::kIdentityMatrix_OptFlagBit;
+ } else if (!sampler.getMatrix().hasPerspective()) {
+ stage.fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
+ }
+ switch (sampler.getSampleMode()) {
+ case GrSamplerState::kNormal_SampleMode:
+ stage.fCoordMapping = StageDesc::kIdentity_CoordMapping;
+ break;
+ case GrSamplerState::kRadial_SampleMode:
+ stage.fCoordMapping = StageDesc::kRadialGradient_CoordMapping;
+ break;
+ case GrSamplerState::kRadial2_SampleMode:
+ if (sampler.radial2IsDegenerate()) {
+ stage.fCoordMapping =
+ StageDesc::kRadial2GradientDegenerate_CoordMapping;
+ } else {
+ stage.fCoordMapping =
+ StageDesc::kRadial2Gradient_CoordMapping;
+ }
+ break;
+ case GrSamplerState::kSweep_SampleMode:
+ stage.fCoordMapping = StageDesc::kSweepGradient_CoordMapping;
+ break;
+ default:
+ GrCrash("Unexpected sample mode!");
+ break;
+ }
+
+ switch (sampler.getFilter()) {
+ // these both can use a regular texture2D()
+ case GrSamplerState::kNearest_Filter:
+ case GrSamplerState::kBilinear_Filter:
+ stage.fFetchMode = StageDesc::kSingle_FetchMode;
+ break;
+ // performs 4 texture2D()s
+ case GrSamplerState::k4x4Downsample_Filter:
+ stage.fFetchMode = StageDesc::k2x2_FetchMode;
+ break;
+ // performs fKernelWidth texture2D()s
+ case GrSamplerState::kConvolution_Filter:
+ stage.fFetchMode = StageDesc::kConvolution_FetchMode;
+ break;
+ default:
+ GrCrash("Unexpected filter!");
+ break;
+ }
+
+ if (sampler.hasTextureDomain()) {
+ GrAssert(GrSamplerState::kClamp_WrapMode ==
+ sampler.getWrapX() &&
+ GrSamplerState::kClamp_WrapMode ==
+ sampler.getWrapY());
+ stage.fOptFlags |= StageDesc::kCustomTextureDomain_OptFlagBit;
+ }
+
+ stage.fInConfigFlags = 0;
+ if (!this->glCaps().fTextureSwizzleSupport) {
+ if (GrPixelConfigIsAlphaOnly(texture->config())) {
+ // if we don't have texture swizzle support then
+ // the shader must do an alpha smear after reading
+ // the texture
+ stage.fInConfigFlags |= StageDesc::kSmearAlpha_InConfigFlag;
+ } else if (sampler.swapsRAndB()) {
+ stage.fInConfigFlags |= StageDesc::kSwapRAndB_InConfigFlag;
+ }
+ }
+ if (GrPixelConfigIsUnpremultiplied(texture->config())) {
+ stage.fInConfigFlags |= StageDesc::kMulRGBByAlpha_InConfigFlag;
+ }
+
+ if (sampler.getFilter() == GrSamplerState::kConvolution_Filter) {
+ stage.fKernelWidth = sampler.getKernelWidth();
+ } else {
+ stage.fKernelWidth = 0;
+ }
} else {
- stage.reset();
- }
- }
- for (int s = firstCoverageStage; s < GrDrawState::kNumStages; ++s) {
- StageDesc& stage = desc.fStages[s];
- bool enabled = !skipCoverage && this->isStageEnabled(s);
- if (enabled) {
- stage.setEnabled(enabled);
- const GrGLTexture* texture =
- static_cast<const GrGLTexture*>(drawState.getTexture(s));
- copy_stage_to_desc(&stage,
- texture,
- drawState.getSampler(s),
- this->glCaps());
- lastEnabledStage = s;
- } else {
- stage.reset();
+ stage.fOptFlags = 0;
+ stage.fCoordMapping = (StageDesc::CoordMapping) 0;
+ stage.fInConfigFlags = 0;
+ stage.fFetchMode = (StageDesc::FetchMode) 0;
+ stage.fKernelWidth = 0;
}
}
@@ -1089,7 +1067,7 @@
// We set field in the desc to kNumStages when either there are no
// coverage stages or the distinction between coverage and color is
// immaterial.
- firstCoverageStage = GrDrawState::kNumStages;
+ int firstCoverageStage = GrDrawState::kNumStages;
desc.fFirstCoverageStage = GrDrawState::kNumStages;
bool hasCoverage = drawState.getFirstCoverageStage() <= lastEnabledStage;
if (hasCoverage) {