aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-27 19:50:27 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-27 19:50:27 +0000
commit798c8c4fe61f2172ae52cb626843a64069e18882 (patch)
treee080b69a7bf29b8026fd8cc563028334c0581194 /src
parentdb4462566af6698bd919e24bf44591533a22b9c2 (diff)
Move GrGLProgramDesc::Build to new cpp file.
Review URL: https://codereview.chromium.org/13097007 git-svn-id: http://skia.googlecode.com/svn/trunk@8414 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/gpu/gl/GrGLProgram.cpp188
-rw-r--r--src/gpu/gl/GrGLProgram.h1
-rw-r--r--src/gpu/gl/GrGLProgramDesc.cpp197
-rw-r--r--src/gpu/gl/GrGLProgramDesc.h1
4 files changed, 198 insertions, 189 deletions
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 5c5dabfd70..52eb970842 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -13,7 +13,6 @@
#include "GrGLEffect.h"
#include "GrGpuGL.h"
#include "GrGLShaderVar.h"
-#include "GrBackendEffectFactory.h"
#include "SkTrace.h"
#include "SkXfermode.h"
@@ -36,193 +35,6 @@ inline const char* declared_color_output_name() { return "fsColorOut"; }
inline const char* dual_source_output_name() { return "dualSourceOut"; }
}
-void GrGLProgramDesc::Build(const GrDrawState& drawState,
- bool isPoints,
- GrDrawState::BlendOptFlags blendOpts,
- GrBlendCoeff srcCoeff,
- GrBlendCoeff dstCoeff,
- const GrGpuGL* gpu,
- GrGLProgramDesc* desc) {
-
- // This should already have been caught
- GrAssert(!(GrDrawState::kSkipDraw_BlendOptFlag & blendOpts));
-
- bool skipCoverage = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag);
-
- bool skipColor = SkToBool(blendOpts & (GrDrawState::kEmitTransBlack_BlendOptFlag |
- GrDrawState::kEmitCoverage_BlendOptFlag));
-
- // The descriptor is used as a cache key. Thus when a field of the
- // descriptor will not affect program generation (because of the attribute
- // bindings in use or other descriptor field settings) it should be set
- // to a canonical value to avoid duplicate programs with different keys.
-
- // Must initialize all fields or cache will have false negatives!
- desc->fAttribBindings = drawState.getAttribBindings();
-
- desc->fEmitsPointSize = isPoints;
-
- bool requiresAttributeColors =
- !skipColor && SkToBool(desc->fAttribBindings & GrDrawState::kColor_AttribBindingsBit);
- bool requiresAttributeCoverage =
- !skipCoverage && SkToBool(desc->fAttribBindings & GrDrawState::kCoverage_AttribBindingsBit);
-
- // fColorInput/fCoverageInput records how colors are specified for the program So we strip the
- // bits from the bindings to avoid false negatives when searching for an existing program in the
- // cache.
- desc->fAttribBindings &=
- ~(GrDrawState::kColor_AttribBindingsBit | GrDrawState::kCoverage_AttribBindingsBit);
-
- desc->fColorFilterXfermode = skipColor ?
- SkXfermode::kDst_Mode :
- drawState.getColorFilterMode();
-
- // no reason to do edge aa or look at per-vertex coverage if coverage is ignored
- if (skipCoverage) {
- desc->fAttribBindings &= ~(GrDrawState::kCoverage_AttribBindingsBit);
- }
-
- bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag);
- bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) ||
- (!requiresAttributeColors && 0xffffffff == drawState.getColor());
- if (colorIsTransBlack) {
- desc->fColorInput = kTransBlack_ColorInput;
- } else if (colorIsSolidWhite) {
- desc->fColorInput = kSolidWhite_ColorInput;
- } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeColors) {
- desc->fColorInput = kUniform_ColorInput;
- } else {
- desc->fColorInput = kAttribute_ColorInput;
- }
-
- bool covIsSolidWhite = !requiresAttributeCoverage && 0xffffffff == drawState.getCoverage();
-
- if (skipCoverage) {
- desc->fCoverageInput = kTransBlack_ColorInput;
- } else if (covIsSolidWhite) {
- desc->fCoverageInput = kSolidWhite_ColorInput;
- } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeCoverage) {
- desc->fCoverageInput = kUniform_ColorInput;
- } else {
- desc->fCoverageInput = kAttribute_ColorInput;
- }
-
- int lastEnabledStage = -1;
-
- for (int s = 0; s < GrDrawState::kNumStages; ++s) {
-
- bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCoverage;
- if (!skip && drawState.isStageEnabled(s)) {
- lastEnabledStage = s;
- const GrEffectRef& effect = *drawState.getStage(s).getEffect();
- const GrBackendEffectFactory& factory = effect->getFactory();
- bool explicitLocalCoords = (drawState.getAttribBindings() &
- GrDrawState::kLocalCoords_AttribBindingsBit);
- GrDrawEffect drawEffect(drawState.getStage(s), explicitLocalCoords);
- desc->fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
- } else {
- desc->fEffectKeys[s] = 0;
- }
- }
-
- desc->fDualSrcOutput = kNone_DualSrcOutput;
-
- // Currently the experimental GS will only work with triangle prims (and it doesn't do anything
- // other than pass through values from the VS to the FS anyway).
-#if GR_GL_EXPERIMENTAL_GS
-#if 0
- desc->fExperimentalGS = gpu->caps().geometryShaderSupport();
-#else
- desc->fExperimentalGS = false;
-#endif
-#endif
-
- // We leave this set to kNumStages until we discover that the coverage/color distinction is
- // material to the generated program. We do this to avoid distinct keys that generate equivalent
- // programs.
- desc->fFirstCoverageStage = GrDrawState::kNumStages;
- // This tracks the actual first coverage stage.
- int firstCoverageStage = GrDrawState::kNumStages;
- desc->fDiscardIfZeroCoverage = false; // Enabled below if stenciling and there is coverage.
- bool hasCoverage = false;
- // If we're rendering coverage-as-color then its as though there are no coverage stages.
- if (!drawState.isCoverageDrawing()) {
- // We can have coverage either through a stage or coverage vertex attributes.
- if (drawState.getFirstCoverageStage() <= lastEnabledStage) {
- firstCoverageStage = drawState.getFirstCoverageStage();
- hasCoverage = true;
- } else {
- hasCoverage = requiresAttributeCoverage;
- }
- }
-
- if (hasCoverage) {
- // color filter is applied between color/coverage computation
- if (SkXfermode::kDst_Mode != desc->fColorFilterXfermode) {
- desc->fFirstCoverageStage = firstCoverageStage;
- }
-
- // If we're stenciling then we want to discard samples that have zero coverage
- if (drawState.getStencil().doesWrite()) {
- desc->fDiscardIfZeroCoverage = true;
- desc->fFirstCoverageStage = firstCoverageStage;
- }
-
- if (gpu->caps()->dualSourceBlendingSupport() &&
- !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag |
- GrDrawState::kCoverageAsAlpha_BlendOptFlag))) {
- if (kZero_GrBlendCoeff == dstCoeff) {
- // write the coverage value to second color
- desc->fDualSrcOutput = kCoverage_DualSrcOutput;
- desc->fFirstCoverageStage = firstCoverageStage;
- } else if (kSA_GrBlendCoeff == dstCoeff) {
- // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
- desc->fDualSrcOutput = kCoverageISA_DualSrcOutput;
- desc->fFirstCoverageStage = firstCoverageStage;
- } else if (kSC_GrBlendCoeff == dstCoeff) {
- // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
- desc->fDualSrcOutput = kCoverageISC_DualSrcOutput;
- desc->fFirstCoverageStage = firstCoverageStage;
- }
- }
- }
-
- desc->fPositionAttributeIndex = drawState.getAttribIndex(GrDrawState::kPosition_AttribIndex);
- if (requiresAttributeColors) {
- desc->fColorAttributeIndex = drawState.getAttribIndex(GrDrawState::kColor_AttribIndex);
- } else {
- desc->fColorAttributeIndex = GrDrawState::kColorOverrideAttribIndexValue;
- }
- if (requiresAttributeCoverage) {
- desc->fCoverageAttributeIndex = drawState.getAttribIndex(GrDrawState::kCoverage_AttribIndex);
- } else {
- desc->fCoverageAttributeIndex = GrDrawState::kCoverageOverrideAttribIndexValue;
- }
- if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
- desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState::kLocalCoords_AttribIndex);
- }
-
-#if GR_DEBUG
- // Verify valid vertex attribute state. These assertions should probably be done somewhere
- // higher up the callstack
- const GrVertexAttrib* vertexAttribs = drawState.getVertexAttribs();
- GrAssert(desc->fPositionAttributeIndex < GrDrawState::kVertexAttribCnt);
- GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fPositionAttributeIndex].fType).fCount == 2);
- if (requiresAttributeColors) {
- GrAssert(desc->fColorAttributeIndex < GrDrawState::kVertexAttribCnt);
- GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fColorAttributeIndex].fType).fCount == 4);
- }
- if (requiresAttributeCoverage) {
- GrAssert(desc->fCoverageAttributeIndex < GrDrawState::kVertexAttribCnt);
- GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fCoverageAttributeIndex].fType).fCount == 4);
- }
- if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
- GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCnt);
- GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fLocalCoordsAttributeIndex].fType).fCount == 2);
- }
-#endif
-}
-
GrGLProgram* GrGLProgram::Create(const GrGLContext& gl,
const GrGLProgramDesc& desc,
const GrEffectStage* stages[]) {
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index df46e9b58d..f5fd06edf8 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -22,7 +22,6 @@
class GrBinHashKeyBuilder;
class GrGLEffect;
class GrGLShaderBuilder;
-class SkMWCRandom;
/**
* This class manages a GPU program and records per-program information.
diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp
new file mode 100644
index 0000000000..98280e297c
--- /dev/null
+++ b/src/gpu/gl/GrGLProgramDesc.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrGLProgramDesc.h"
+#include "GrBackendEffectFactory.h"
+#include "GrDrawEffect.h"
+#include "GrEffect.h"
+#include "GrGpuGL.h"
+
+void GrGLProgramDesc::Build(const GrDrawState& drawState,
+ bool isPoints,
+ GrDrawState::BlendOptFlags blendOpts,
+ GrBlendCoeff srcCoeff,
+ GrBlendCoeff dstCoeff,
+ const GrGpuGL* gpu,
+ GrGLProgramDesc* desc) {
+
+ // This should already have been caught
+ GrAssert(!(GrDrawState::kSkipDraw_BlendOptFlag & blendOpts));
+
+ bool skipCoverage = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag);
+
+ bool skipColor = SkToBool(blendOpts & (GrDrawState::kEmitTransBlack_BlendOptFlag |
+ GrDrawState::kEmitCoverage_BlendOptFlag));
+
+ // The descriptor is used as a cache key. Thus when a field of the
+ // descriptor will not affect program generation (because of the attribute
+ // bindings in use or other descriptor field settings) it should be set
+ // to a canonical value to avoid duplicate programs with different keys.
+
+ // Must initialize all fields or cache will have false negatives!
+ desc->fAttribBindings = drawState.getAttribBindings();
+
+ desc->fEmitsPointSize = isPoints;
+
+ bool requiresAttributeColors =
+ !skipColor && SkToBool(desc->fAttribBindings & GrDrawState::kColor_AttribBindingsBit);
+ bool requiresAttributeCoverage =
+ !skipCoverage && SkToBool(desc->fAttribBindings & GrDrawState::kCoverage_AttribBindingsBit);
+
+ // fColorInput/fCoverageInput records how colors are specified for the program so we strip the
+ // bits from the bindings to avoid false negatives when searching for an existing program in the
+ // cache.
+ desc->fAttribBindings &=
+ ~(GrDrawState::kColor_AttribBindingsBit | GrDrawState::kCoverage_AttribBindingsBit);
+
+ desc->fColorFilterXfermode = skipColor ? SkXfermode::kDst_Mode : drawState.getColorFilterMode();
+
+ // no reason to do edge aa or look at per-vertex coverage if coverage is ignored
+ if (skipCoverage) {
+ desc->fAttribBindings &= ~(GrDrawState::kCoverage_AttribBindingsBit);
+ }
+
+ bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag);
+ bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) ||
+ (!requiresAttributeColors && 0xffffffff == drawState.getColor());
+ if (colorIsTransBlack) {
+ desc->fColorInput = kTransBlack_ColorInput;
+ } else if (colorIsSolidWhite) {
+ desc->fColorInput = kSolidWhite_ColorInput;
+ } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeColors) {
+ desc->fColorInput = kUniform_ColorInput;
+ } else {
+ desc->fColorInput = kAttribute_ColorInput;
+ }
+
+ bool covIsSolidWhite = !requiresAttributeCoverage && 0xffffffff == drawState.getCoverage();
+
+ if (skipCoverage) {
+ desc->fCoverageInput = kTransBlack_ColorInput;
+ } else if (covIsSolidWhite) {
+ desc->fCoverageInput = kSolidWhite_ColorInput;
+ } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresAttributeCoverage) {
+ desc->fCoverageInput = kUniform_ColorInput;
+ } else {
+ desc->fCoverageInput = kAttribute_ColorInput;
+ }
+
+ int lastEnabledStage = -1;
+
+ for (int s = 0; s < GrDrawState::kNumStages; ++s) {
+
+ bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCoverage;
+ if (!skip && drawState.isStageEnabled(s)) {
+ lastEnabledStage = s;
+ const GrEffectRef& effect = *drawState.getStage(s).getEffect();
+ const GrBackendEffectFactory& factory = effect->getFactory();
+ bool explicitLocalCoords = (drawState.getAttribBindings() &
+ GrDrawState::kLocalCoords_AttribBindingsBit);
+ GrDrawEffect drawEffect(drawState.getStage(s), explicitLocalCoords);
+ desc->fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
+ } else {
+ desc->fEffectKeys[s] = 0;
+ }
+ }
+
+ desc->fDualSrcOutput = kNone_DualSrcOutput;
+
+ // Currently the experimental GS will only work with triangle prims (and it doesn't do anything
+ // other than pass through values from the VS to the FS anyway).
+#if GR_GL_EXPERIMENTAL_GS
+#if 0
+ desc->fExperimentalGS = gpu->caps().geometryShaderSupport();
+#else
+ desc->fExperimentalGS = false;
+#endif
+#endif
+
+ // We leave this set to kNumStages until we discover that the coverage/color distinction is
+ // material to the generated program. We do this to avoid distinct keys that generate equivalent
+ // programs.
+ desc->fFirstCoverageStage = GrDrawState::kNumStages;
+ // This tracks the actual first coverage stage.
+ int firstCoverageStage = GrDrawState::kNumStages;
+ desc->fDiscardIfZeroCoverage = false; // Enabled below if stenciling and there is coverage.
+ bool hasCoverage = false;
+ // If we're rendering coverage-as-color then it's as though there are no coverage stages.
+ if (!drawState.isCoverageDrawing()) {
+ // We can have coverage either through a stage or coverage vertex attributes.
+ if (drawState.getFirstCoverageStage() <= lastEnabledStage) {
+ firstCoverageStage = drawState.getFirstCoverageStage();
+ hasCoverage = true;
+ } else {
+ hasCoverage = requiresAttributeCoverage;
+ }
+ }
+
+ if (hasCoverage) {
+ // color filter is applied between color/coverage computation
+ if (SkXfermode::kDst_Mode != desc->fColorFilterXfermode) {
+ desc->fFirstCoverageStage = firstCoverageStage;
+ }
+
+ // If we're stenciling then we want to discard samples that have zero coverage
+ if (drawState.getStencil().doesWrite()) {
+ desc->fDiscardIfZeroCoverage = true;
+ desc->fFirstCoverageStage = firstCoverageStage;
+ }
+
+ if (gpu->caps()->dualSourceBlendingSupport() &&
+ !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag |
+ GrDrawState::kCoverageAsAlpha_BlendOptFlag))) {
+ if (kZero_GrBlendCoeff == dstCoeff) {
+ // write the coverage value to second color
+ desc->fDualSrcOutput = kCoverage_DualSrcOutput;
+ desc->fFirstCoverageStage = firstCoverageStage;
+ } else if (kSA_GrBlendCoeff == dstCoeff) {
+ // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
+ desc->fDualSrcOutput = kCoverageISA_DualSrcOutput;
+ desc->fFirstCoverageStage = firstCoverageStage;
+ } else if (kSC_GrBlendCoeff == dstCoeff) {
+ // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
+ desc->fDualSrcOutput = kCoverageISC_DualSrcOutput;
+ desc->fFirstCoverageStage = firstCoverageStage;
+ }
+ }
+ }
+
+ desc->fPositionAttributeIndex = drawState.getAttribIndex(GrDrawState::kPosition_AttribIndex);
+ if (requiresAttributeColors) {
+ desc->fColorAttributeIndex = drawState.getAttribIndex(GrDrawState::kColor_AttribIndex);
+ } else {
+ desc->fColorAttributeIndex = GrDrawState::kColorOverrideAttribIndexValue;
+ }
+ if (requiresAttributeCoverage) {
+ desc->fCoverageAttributeIndex = drawState.getAttribIndex(GrDrawState::kCoverage_AttribIndex);
+ } else {
+ desc->fCoverageAttributeIndex = GrDrawState::kCoverageOverrideAttribIndexValue;
+ }
+ if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
+ desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState::kLocalCoords_AttribIndex);
+ }
+
+#if GR_DEBUG
+ // Verify valid vertex attribute state. These assertions should probably be done somewhere
+ // higher up the callstack
+ const GrVertexAttrib* vertexAttribs = drawState.getVertexAttribs();
+ GrAssert(desc->fPositionAttributeIndex < GrDrawState::kVertexAttribCnt);
+ GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fPositionAttributeIndex].fType).fCount == 2);
+ if (requiresAttributeColors) {
+ GrAssert(desc->fColorAttributeIndex < GrDrawState::kVertexAttribCnt);
+ GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fColorAttributeIndex].fType).fCount == 4);
+ }
+ if (requiresAttributeCoverage) {
+ GrAssert(desc->fCoverageAttributeIndex < GrDrawState::kVertexAttribCnt);
+ GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fCoverageAttributeIndex].fType).fCount == 4);
+ }
+ if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
+ GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCnt);
+ GrAssert(GrGLAttribTypeToLayout(vertexAttribs[desc->fLocalCoordsAttributeIndex].fType).fCount == 2);
+ }
+#endif
+}
diff --git a/src/gpu/gl/GrGLProgramDesc.h b/src/gpu/gl/GrGLProgramDesc.h
index 2835259868..135d46c74b 100644
--- a/src/gpu/gl/GrGLProgramDesc.h
+++ b/src/gpu/gl/GrGLProgramDesc.h
@@ -9,6 +9,7 @@
#define GrGLProgramDesc_DEFINED
#include "GrGLEffect.h"
+#include "GrDrawState.h"
class GrGpuGL;