Index: src/gpu/gl/GrGLShaderBuilder.h |
=================================================================== |
--- src/gpu/gl/GrGLShaderBuilder.h (revision 8448) |
+++ src/gpu/gl/GrGLShaderBuilder.h (working copy) |
@@ -19,6 +19,7 @@ |
class GrGLContextInfo; |
class GrEffectStage; |
+class GrGLProgramDesc; |
/** |
Contains all the incremental state of a shader as it is being built,as well as helpers to |
@@ -55,6 +56,8 @@ |
const char* swizzle() const { return fSwizzle; } |
+ bool isInitialized() const { return 0 != fConfigComponentMask; } |
+ |
private: |
// The idx param is used to ensure multiple samplers within a single effect have unique |
// uniform names. swizzle is a four char max string made up of chars 'r', 'g', 'b', and 'a'. |
@@ -62,7 +65,8 @@ |
uint32_t configComponentMask, |
const char* swizzle, |
int idx) { |
- GrAssert(0 == fConfigComponentMask); |
+ GrAssert(!this->isInitialized()); |
+ GrAssert(0 != configComponentMask); |
GrAssert(GrGLUniformManager::kInvalidUniformHandle == fSamplerUniform); |
GrAssert(NULL != builder); |
@@ -100,7 +104,7 @@ |
kFragment_ShaderType = 0x4, |
}; |
- GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, bool explicitLocalCoords); |
+ GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLProgramDesc&); |
/** |
* Called by GrGLEffects to add code to one of the shaders. |
@@ -172,6 +176,13 @@ |
static GrBackendEffectFactory::EffectKey KeyForTextureAccess(const GrTextureAccess&, |
const GrGLCaps&); |
+ typedef uint8_t DstReadKey; |
+ |
+ /** Returns a key for adding code to read the copy-of-dst color in service of effects that |
+ require reading the dst. It must not return 0 because 0 indicates that there is no dst |
+ copy read at all. */ |
+ static DstReadKey KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps&); |
+ |
/** If texture swizzling is available using tex parameters then it is preferred over mangling |
the generated shader code. This potentially allows greater reuse of cached shaders. */ |
static const GrGLenum* GetTexParamSwizzle(GrPixelConfig config, const GrGLCaps& caps); |
@@ -230,6 +241,10 @@ |
specified explicit local coords or not in the GrDrawState. */ |
const GrGLShaderVar& localCoordsAttribute() const { return *fLocalCoordsVar; } |
+ /** Returns the color of the destination pixel. This may be NULL if no effect advertised |
+ that it will read the destination. */ |
+ const char* dstColor() const; |
+ |
/** |
* Are explicit local coordinates provided as input to the vertex shader. |
*/ |
@@ -254,7 +269,17 @@ |
const char* fsInColor, // NULL means no incoming color |
const char* fsOutColor, |
SkTArray<GrGLUniformManager::UniformHandle, true>* samplerHandles); |
+ |
GrGLUniformManager::UniformHandle getRTHeightUniform() const { return fRTHeightUniform; } |
+ GrGLUniformManager::UniformHandle getDstCopyTopLeftUniform() const { |
+ return fDstCopyTopLeftUniform; |
+ } |
+ GrGLUniformManager::UniformHandle getDstCopyScaleUniform() const { |
+ return fDstCopyScaleUniform; |
+ } |
+ GrGLUniformManager::UniformHandle getDstCopySamplerUniform() const { |
+ return fDstCopySampler.fSamplerUniform; |
+ } |
struct AttributePair { |
void set(int index, const SkString& name) { |
@@ -263,7 +288,7 @@ |
int fIndex; |
SkString fName; |
}; |
- const SkSTArray<10, AttributePair, true>& getEffectAttributes() const { |
+ const SkTArray<AttributePair, true>& getEffectAttributes() const { |
return fEffectAttributes; |
} |
const SkString* getEffectAttributeName(int attributeIndex) const; |
@@ -296,25 +321,38 @@ |
VarArray fFSInputs; |
SkString fGSHeader; // layout qualifiers specific to GS |
VarArray fFSOutputs; |
- bool fUsesGS; |
private: |
enum { |
kNonStageIdx = -1, |
}; |
+ // Interpretation of DstReadKey when generating code |
+ enum { |
+ kNoDstRead_DstReadKey = 0, |
+ kYesDstRead_DstReadKeyBit = 0x1, // Set if we do a dst-copy-read. |
+ kUseAlphaConfig_DstReadKeyBit = 0x2, // Set if dst-copy config is alpha only. |
+ kTopLeftOrigin_DstReadKeyBit = 0x4, // Set if dst-copy origin is top-left. |
+ }; |
+ |
const GrGLContextInfo& fCtxInfo; |
GrGLUniformManager& fUniformManager; |
int fCurrentStageIdx; |
SkString fFSFunctions; |
SkString fFSHeader; |
+ bool fUsesGS; |
+ |
SkString fFSCode; |
SkString fVSCode; |
SkString fGSCode; |
bool fSetupFragPosition; |
+ TextureSampler fDstCopySampler; |
+ |
GrGLUniformManager::UniformHandle fRTHeightUniform; |
+ GrGLUniformManager::UniformHandle fDstCopyTopLeftUniform; |
+ GrGLUniformManager::UniformHandle fDstCopyScaleUniform; |
SkSTArray<10, AttributePair, true> fEffectAttributes; |