Index: src/gpu/gl/GrGLProgramDesc.cpp |
diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp |
index 4a274c6bb1e8806b98043328031b18d12df8ac16..4a182b36e6f1fa45fac607618dc334e4a01f41bc 100644 |
--- a/src/gpu/gl/GrGLProgramDesc.cpp |
+++ b/src/gpu/gl/GrGLProgramDesc.cpp |
@@ -4,15 +4,15 @@ |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file. |
*/ |
- |
-#include "gl/builders/GrGLFragmentShaderBuilder.h" |
#include "GrGLProgramDesc.h" |
+ |
+#include "GrGLProcessor.h" |
#include "GrBackendProcessorFactory.h" |
#include "GrProcessor.h" |
#include "GrGpuGL.h" |
#include "GrOptDrawState.h" |
- |
#include "SkChecksum.h" |
+#include "gl/builders/GrGLFragmentShaderBuilder.h" |
/** |
* The key for an individual coord transform is made up of a matrix type and a bit that |
@@ -176,10 +176,10 @@ struct FragmentProcessorKeyBuilder { |
template <class ProcessorKeyBuilder> |
bool |
-GrGLProgramDesc::BuildStagedProcessorKey(const typename ProcessorKeyBuilder::StagedProcessor& stage, |
+GrGLProgramDescBuilder::BuildStagedProcessorKey(const typename ProcessorKeyBuilder::StagedProcessor& stage, |
const GrGLCaps& caps, |
bool requiresLocalCoordAttrib, |
- GrGLProgramDesc* desc, |
+ GrProgramDesc* desc, |
int* offsetAndSizeIndex) { |
GrProcessorKeyBuilder b(&desc->fKey); |
uint16_t processorKeySize; |
@@ -192,7 +192,7 @@ GrGLProgramDesc::BuildStagedProcessorKey(const typename ProcessorKeyBuilder::Sta |
} |
uint16_t* offsetAndSize = |
- reinterpret_cast<uint16_t*>(desc->fKey.begin() + kEffectKeyOffsetsAndLengthOffset + |
+ reinterpret_cast<uint16_t*>(desc->fKey.begin() + kProcessorKeyOffsetsAndLengthOffset + |
*offsetAndSizeIndex * 2 * sizeof(uint16_t)); |
offsetAndSize[0] = SkToU16(processorOffset); |
offsetAndSize[1] = processorKeySize; |
@@ -200,27 +200,28 @@ GrGLProgramDesc::BuildStagedProcessorKey(const typename ProcessorKeyBuilder::Sta |
return true; |
} |
-bool GrGLProgramDesc::Build(const GrOptDrawState& optState, |
+bool GrGLProgramDescBuilder::Build(const GrOptDrawState& optState, |
+ const GrProgramDesc::DescInfo& descInfo, |
GrGpu::DrawType drawType, |
GrGpuGL* gpu, |
const GrDeviceCoordTexture* dstCopy, |
- GrGLProgramDesc* desc) { |
- bool inputColorIsUsed = optState.inputColorIsUsed(); |
- bool inputCoverageIsUsed = optState.inputCoverageIsUsed(); |
+ GrProgramDesc* desc) { |
+ bool inputColorIsUsed = descInfo.fInputColorIsUsed; |
+ bool inputCoverageIsUsed = descInfo.fInputCoverageIsUsed; |
// 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. |
- bool requiresLocalCoordAttrib = optState.requiresLocalCoordAttrib(); |
+ bool requiresLocalCoordAttrib = descInfo.fRequiresLocalCoordAttrib; |
int numStages = optState.numTotalStages(); |
- GR_STATIC_ASSERT(0 == kEffectKeyOffsetsAndLengthOffset % sizeof(uint32_t)); |
+ GR_STATIC_ASSERT(0 == kProcessorKeyOffsetsAndLengthOffset % sizeof(uint32_t)); |
// Make room for everything up to and including the array of offsets to effect keys. |
desc->fKey.reset(); |
- desc->fKey.push_back_n(kEffectKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_t) * numStages); |
+ desc->fKey.push_back_n(kProcessorKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_t) * numStages); |
int offsetAndSizeIndex = 0; |
@@ -248,7 +249,7 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, |
// --------DO NOT MOVE HEADER ABOVE THIS LINE-------------------------------------------------- |
// Because header is a pointer into the dynamic array, we can't push any new data into the key |
// below here. |
- KeyHeader* header = desc->header(); |
+ GLKeyHeader* header = desc->atOffset<GLKeyHeader, kHeaderOffset>(); |
// make sure any padding in the header is zeroed. |
memset(header, 0, kHeaderSize); |
@@ -266,33 +267,33 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, |
} |
bool hasUniformColor = inputColorIsUsed && |
- (isPathRendering || !optState.hasColorVertexAttribute()); |
+ (isPathRendering || !descInfo.hasColorVertexAttribute()); |
bool hasUniformCoverage = inputCoverageIsUsed && |
- (isPathRendering || !optState.hasCoverageVertexAttribute()); |
+ (isPathRendering || !descInfo.hasCoverageVertexAttribute()); |
if (!inputColorIsUsed) { |
- header->fColorInput = kAllOnes_ColorInput; |
+ header->fColorInput = GrProgramDesc::kAllOnes_ColorInput; |
} else if (hasUniformColor) { |
- header->fColorInput = kUniform_ColorInput; |
+ header->fColorInput = GrProgramDesc::kUniform_ColorInput; |
} else { |
- header->fColorInput = kAttribute_ColorInput; |
+ header->fColorInput = GrProgramDesc::kAttribute_ColorInput; |
SkASSERT(!header->fUseNvpr); |
} |
- bool covIsSolidWhite = !optState.hasCoverageVertexAttribute() && |
+ bool covIsSolidWhite = !descInfo.hasCoverageVertexAttribute() && |
0xffffffff == optState.getCoverageColor(); |
if (covIsSolidWhite || !inputCoverageIsUsed) { |
- header->fCoverageInput = kAllOnes_ColorInput; |
+ header->fCoverageInput = GrProgramDesc::kAllOnes_ColorInput; |
} else if (hasUniformCoverage) { |
- header->fCoverageInput = kUniform_ColorInput; |
+ header->fCoverageInput = GrProgramDesc::kUniform_ColorInput; |
} else { |
- header->fCoverageInput = kAttribute_ColorInput; |
+ header->fCoverageInput = GrProgramDesc::kAttribute_ColorInput; |
SkASSERT(!header->fUseNvpr); |
} |
- if (optState.readsDst()) { |
+ if (descInfo.fReadsDst) { |
SkASSERT(dstCopy || gpu->caps()->dstReadInShaderSupport()); |
const GrTexture* dstCopyTexture = NULL; |
if (dstCopy) { |
@@ -305,7 +306,7 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, |
header->fDstReadKey = 0; |
} |
- if (optState.readsFragPosition()) { |
+ if (descInfo.fReadsFragPosition) { |
header->fFragPosKey = |
GrGLFragmentShaderBuilder::KeyForFragmentPosition(optState.getRenderTarget(), |
gpu->glCaps()); |
@@ -314,14 +315,14 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, |
} |
// Record attribute indices |
- header->fPositionAttributeIndex = optState.positionAttributeIndex(); |
- header->fLocalCoordAttributeIndex = optState.localCoordAttributeIndex(); |
+ header->fPositionAttributeIndex = descInfo.positionAttributeIndex(); |
+ header->fLocalCoordAttributeIndex = descInfo.localCoordAttributeIndex(); |
// For constant color and coverage we need an attribute with an index beyond those already set |
int availableAttributeIndex = optState.getVertexAttribCount(); |
- if (optState.hasColorVertexAttribute()) { |
- header->fColorAttributeIndex = optState.colorVertexAttributeIndex(); |
- } else if (GrGLProgramDesc::kAttribute_ColorInput == header->fColorInput) { |
+ if (descInfo.hasColorVertexAttribute()) { |
+ header->fColorAttributeIndex = descInfo.colorVertexAttributeIndex(); |
+ } else if (GrProgramDesc::kAttribute_ColorInput == header->fColorInput) { |
SkASSERT(availableAttributeIndex < GrDrawState::kMaxVertexAttribCnt); |
header->fColorAttributeIndex = availableAttributeIndex; |
availableAttributeIndex++; |
@@ -329,37 +330,20 @@ bool GrGLProgramDesc::Build(const GrOptDrawState& optState, |
header->fColorAttributeIndex = -1; |
} |
- if (optState.hasCoverageVertexAttribute()) { |
- header->fCoverageAttributeIndex = optState.coverageVertexAttributeIndex(); |
- } else if (GrGLProgramDesc::kAttribute_ColorInput == header->fCoverageInput) { |
+ if (descInfo.hasCoverageVertexAttribute()) { |
+ header->fCoverageAttributeIndex = descInfo.coverageVertexAttributeIndex(); |
+ } else if (GrProgramDesc::kAttribute_ColorInput == header->fCoverageInput) { |
SkASSERT(availableAttributeIndex < GrDrawState::kMaxVertexAttribCnt); |
header->fCoverageAttributeIndex = availableAttributeIndex; |
} else { |
header->fCoverageAttributeIndex = -1; |
} |
- header->fPrimaryOutputType = optState.getPrimaryOutputType(); |
- header->fSecondaryOutputType = optState.getSecondaryOutputType(); |
+ header->fPrimaryOutputType = descInfo.fPrimaryOutputType; |
+ header->fSecondaryOutputType = descInfo.fSecondaryOutputType; |
header->fColorEffectCnt = optState.numColorStages(); |
header->fCoverageEffectCnt = optState.numCoverageStages(); |
desc->finalize(); |
return true; |
} |
- |
-void GrGLProgramDesc::finalize() { |
- int keyLength = fKey.count(); |
- SkASSERT(0 == (keyLength % 4)); |
- *this->atOffset<uint32_t, kLengthOffset>() = SkToU32(keyLength); |
- |
- uint32_t* checksum = this->atOffset<uint32_t, kChecksumOffset>(); |
- *checksum = 0; |
- *checksum = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.begin()), keyLength); |
-} |
- |
-GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) { |
- size_t keyLength = other.keyLength(); |
- fKey.reset(keyLength); |
- memcpy(fKey.begin(), other.fKey.begin(), keyLength); |
- return *this; |
-} |