| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrGLProgramDesc.h" | 8 #include "GrGLProgramDesc.h" |
| 9 #include "GrBackendEffectFactory.h" | 9 #include "GrBackendEffectFactory.h" |
| 10 #include "GrDrawEffect.h" | 10 #include "GrDrawEffect.h" |
| 11 #include "GrEffect.h" | 11 #include "GrEffect.h" |
| 12 #include "GrGLShaderBuilder.h" | 12 #include "GrGLShaderBuilder.h" |
| 13 #include "GrGpuGL.h" | 13 #include "GrGpuGL.h" |
| 14 | 14 |
| 15 #include "SkChecksum.h" | 15 #include "SkChecksum.h" |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 inline GrGLEffect::EffectKey get_key_and_update_stats(const GrEffectStage& stage
, | 18 inline GrGLEffect::EffectKey get_key_and_update_stats(const GrEffectStage& stage
, |
| 19 const GrGLCaps& caps, | 19 const GrGLCaps& caps, |
| 20 bool useExplicitLocalCoord
s, | 20 bool useExplicitLocalCoord
s, |
| 21 bool* setTrueIfReadsDst, | 21 bool* setTrueIfReadsDst, |
| 22 bool* setTrueIfReadsPos) { | 22 bool* setTrueIfReadsPos, |
| 23 bool* setTrueIfHasVertexCo
de) { |
| 23 const GrEffectRef& effect = *stage.getEffect(); | 24 const GrEffectRef& effect = *stage.getEffect(); |
| 24 const GrBackendEffectFactory& factory = effect->getFactory(); | 25 const GrBackendEffectFactory& factory = effect->getFactory(); |
| 25 GrDrawEffect drawEffect(stage, useExplicitLocalCoords); | 26 GrDrawEffect drawEffect(stage, useExplicitLocalCoords); |
| 26 if (effect->willReadDstColor()) { | 27 if (effect->willReadDstColor()) { |
| 27 *setTrueIfReadsDst = true; | 28 *setTrueIfReadsDst = true; |
| 28 } | 29 } |
| 29 if (effect->willReadFragmentPosition()) { | 30 if (effect->willReadFragmentPosition()) { |
| 30 *setTrueIfReadsPos = true; | 31 *setTrueIfReadsPos = true; |
| 31 } | 32 } |
| 33 if (effect->hasVertexCode()) { |
| 34 *setTrueIfHasVertexCode = true; |
| 35 } |
| 32 return factory.glEffectKey(drawEffect, caps); | 36 return factory.glEffectKey(drawEffect, caps); |
| 33 } | 37 } |
| 34 } | 38 } |
| 35 void GrGLProgramDesc::Build(const GrDrawState& drawState, | 39 void GrGLProgramDesc::Build(const GrDrawState& drawState, |
| 36 bool isPoints, | 40 bool isPoints, |
| 37 GrDrawState::BlendOptFlags blendOpts, | 41 GrDrawState::BlendOptFlags blendOpts, |
| 38 GrBlendCoeff srcCoeff, | 42 GrBlendCoeff srcCoeff, |
| 39 GrBlendCoeff dstCoeff, | 43 GrBlendCoeff dstCoeff, |
| 40 const GrGpuGL* gpu, | 44 const GrGpuGL* gpu, |
| 41 const GrDeviceCoordTexture* dstCopy, | 45 const GrDeviceCoordTexture* dstCopy, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 } | 84 } |
| 81 // write the key length | 85 // write the key length |
| 82 *desc->atOffset<uint32_t, kLengthOffset>() = newKeyLength; | 86 *desc->atOffset<uint32_t, kLengthOffset>() = newKeyLength; |
| 83 | 87 |
| 84 KeyHeader* header = desc->header(); | 88 KeyHeader* header = desc->header(); |
| 85 EffectKey* effectKeys = desc->effectKeys(); | 89 EffectKey* effectKeys = desc->effectKeys(); |
| 86 | 90 |
| 87 int currEffectKey = 0; | 91 int currEffectKey = 0; |
| 88 bool readsDst = false; | 92 bool readsDst = false; |
| 89 bool readFragPosition = false; | 93 bool readFragPosition = false; |
| 94 bool hasVertexCode = false; |
| 90 if (!skipColor) { | 95 if (!skipColor) { |
| 91 for (int s = 0; s < drawState.numColorStages(); ++s) { | 96 for (int s = 0; s < drawState.numColorStages(); ++s) { |
| 92 effectKeys[currEffectKey++] = | 97 effectKeys[currEffectKey++] = |
| 93 get_key_and_update_stats(drawState.getColorStage(s), gpu->glCaps
(), | 98 get_key_and_update_stats(drawState.getColorStage(s), gpu->glCaps
(), |
| 94 requiresLocalCoordAttrib, &readsDst, &r
eadFragPosition); | 99 requiresLocalCoordAttrib, &readsDst, &r
eadFragPosition, |
| 100 &hasVertexCode); |
| 95 } | 101 } |
| 96 } | 102 } |
| 97 if (!skipCoverage) { | 103 if (!skipCoverage) { |
| 98 for (int s = 0; s < drawState.numCoverageStages(); ++s) { | 104 for (int s = 0; s < drawState.numCoverageStages(); ++s) { |
| 99 effectKeys[currEffectKey++] = | 105 effectKeys[currEffectKey++] = |
| 100 get_key_and_update_stats(drawState.getCoverageStage(s), gpu->glC
aps(), | 106 get_key_and_update_stats(drawState.getCoverageStage(s), gpu->glC
aps(), |
| 101 requiresLocalCoordAttrib, &readsDst, &r
eadFragPosition); | 107 requiresLocalCoordAttrib, &readsDst, &r
eadFragPosition, |
| 108 &hasVertexCode); |
| 102 } | 109 } |
| 103 } | 110 } |
| 104 | 111 |
| 112 header->fHasVertexCode = hasVertexCode || requiresLocalCoordAttrib; |
| 105 header->fEmitsPointSize = isPoints; | 113 header->fEmitsPointSize = isPoints; |
| 106 header->fColorFilterXfermode = skipColor ? SkXfermode::kDst_Mode : drawState
.getColorFilterMode(); | 114 header->fColorFilterXfermode = skipColor ? SkXfermode::kDst_Mode : drawState
.getColorFilterMode(); |
| 107 | 115 |
| 108 // Currently the experimental GS will only work with triangle prims (and it
doesn't do anything | 116 // Currently the experimental GS will only work with triangle prims (and it
doesn't do anything |
| 109 // other than pass through values from the VS to the FS anyway). | 117 // other than pass through values from the VS to the FS anyway). |
| 110 #if GR_GL_EXPERIMENTAL_GS | 118 #if GR_GL_EXPERIMENTAL_GS |
| 111 #if 0 | 119 #if 0 |
| 112 header->fExperimentalGS = gpu->caps().geometryShaderSupport(); | 120 header->fExperimentalGS = gpu->caps().geometryShaderSupport(); |
| 113 #else | 121 #else |
| 114 header->fExperimentalGS = false; | 122 header->fExperimentalGS = false; |
| 115 #endif | 123 #endif |
| 116 #endif | 124 #endif |
| 117 if (colorIsTransBlack) { | 125 if (colorIsTransBlack) { |
| 118 header->fColorInput = kTransBlack_ColorInput; | 126 header->fColorInput = kTransBlack_ColorInput; |
| 119 } else if (colorIsSolidWhite) { | 127 } else if (colorIsSolidWhite) { |
| 120 header->fColorInput = kSolidWhite_ColorInput; | 128 header->fColorInput = kSolidWhite_ColorInput; |
| 121 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresColorAttrib) { | 129 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresColorAttrib) { |
| 122 header->fColorInput = kUniform_ColorInput; | 130 header->fColorInput = kUniform_ColorInput; |
| 123 } else { | 131 } else { |
| 124 header->fColorInput = kAttribute_ColorInput; | 132 header->fColorInput = kAttribute_ColorInput; |
| 133 header->fHasVertexCode = true; |
| 125 } | 134 } |
| 126 | 135 |
| 127 bool covIsSolidWhite = !requiresCoverageAttrib && 0xffffffff == drawState.ge
tCoverage(); | 136 bool covIsSolidWhite = !requiresCoverageAttrib && 0xffffffff == drawState.ge
tCoverage(); |
| 128 | 137 |
| 129 if (skipCoverage) { | 138 if (skipCoverage) { |
| 130 header->fCoverageInput = kTransBlack_ColorInput; | 139 header->fCoverageInput = kTransBlack_ColorInput; |
| 131 } else if (covIsSolidWhite) { | 140 } else if (covIsSolidWhite) { |
| 132 header->fCoverageInput = kSolidWhite_ColorInput; | 141 header->fCoverageInput = kSolidWhite_ColorInput; |
| 133 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresCoverageAttrib) { | 142 } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresCoverageAttrib) { |
| 134 header->fCoverageInput = kUniform_ColorInput; | 143 header->fCoverageInput = kUniform_ColorInput; |
| 135 } else { | 144 } else { |
| 136 header->fCoverageInput = kAttribute_ColorInput; | 145 header->fCoverageInput = kAttribute_ColorInput; |
| 146 header->fHasVertexCode = true; |
| 137 } | 147 } |
| 138 | 148 |
| 139 if (readsDst) { | 149 if (readsDst) { |
| 140 SkASSERT(NULL != dstCopy || gpu->caps()->dstReadInShaderSupport()); | 150 SkASSERT(NULL != dstCopy || gpu->caps()->dstReadInShaderSupport()); |
| 141 const GrTexture* dstCopyTexture = NULL; | 151 const GrTexture* dstCopyTexture = NULL; |
| 142 if (NULL != dstCopy) { | 152 if (NULL != dstCopy) { |
| 143 dstCopyTexture = dstCopy->texture(); | 153 dstCopyTexture = dstCopy->texture(); |
| 144 } | 154 } |
| 145 header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, g
pu->glCaps()); | 155 header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, g
pu->glCaps()); |
| 146 SkASSERT(0 != header->fDstReadKey); | 156 SkASSERT(0 != header->fDstReadKey); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 | 262 |
| 253 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) { | 263 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) { |
| 254 fInitialized = other.fInitialized; | 264 fInitialized = other.fInitialized; |
| 255 if (fInitialized) { | 265 if (fInitialized) { |
| 256 size_t keyLength = other.keyLength(); | 266 size_t keyLength = other.keyLength(); |
| 257 fKey.reset(keyLength); | 267 fKey.reset(keyLength); |
| 258 memcpy(fKey.get(), other.fKey.get(), keyLength); | 268 memcpy(fKey.get(), other.fKey.get(), keyLength); |
| 259 } | 269 } |
| 260 return *this; | 270 return *this; |
| 261 } | 271 } |
| OLD | NEW |