Index: src/gpu/gl/GrGLProgram.cpp |
=================================================================== |
--- src/gpu/gl/GrGLProgram.cpp (revision 8448) |
+++ src/gpu/gl/GrGLProgram.cpp (working copy) |
@@ -389,7 +389,9 @@ |
return false; |
} |
- if (builder.fUsesGS) { |
+ fGShaderID = 0; |
+#if GR_GL_EXPERIMENTAL_GS |
+ if (fDesc.fExperimentalGS) { |
builder.getShader(GrGLShaderBuilder::kGeometry_ShaderType, &shader); |
if (c_PrintShaders) { |
GrPrintf(shader.c_str()); |
@@ -398,9 +400,8 @@ |
if (!(fGShaderID = compile_shader(fContext, GR_GL_GEOMETRY_SHADER, shader))) { |
return false; |
} |
- } else { |
- fGShaderID = 0; |
} |
+#endif |
builder.getShader(GrGLShaderBuilder::kFragment_ShaderType, &shader); |
if (c_PrintShaders) { |
@@ -417,15 +418,8 @@ |
bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
GrAssert(0 == fProgramID); |
- const GrAttribBindings& attribBindings = fDesc.fAttribBindings; |
- bool hasExplicitLocalCoords = |
- SkToBool(attribBindings & GrDrawState::kLocalCoords_AttribBindingsBit); |
- GrGLShaderBuilder builder(fContext.info(), fUniformManager, hasExplicitLocalCoords); |
+ GrGLShaderBuilder builder(fContext.info(), fUniformManager, fDesc); |
-#if GR_GL_EXPERIMENTAL_GS |
- builder.fUsesGS = fDesc.fExperimentalGS; |
-#endif |
- |
SkXfermode::Coeff colorCoeff, uniformCoeff; |
// The rest of transfer mode color filters have not been implemented |
if (fDesc.fColorFilterXfermode < SkXfermode::kCoeffModesCnt) { |
@@ -496,7 +490,11 @@ |
} |
// we output point size in the GS if present |
- if (fDesc.fEmitsPointSize && !builder.fUsesGS){ |
+ if (fDesc.fEmitsPointSize |
+#if GR_GL_EXPERIMENTAL_GS |
+ && !fDesc.fExperimentalGS |
+#endif |
+ ) { |
builder.vsCodeAppend("\tgl_PointSize = 1.0;\n"); |
} |
@@ -519,7 +517,7 @@ |
fDesc.fEffectKeys[s], |
inColor.size() ? inColor.c_str() : NULL, |
outColor.c_str(), |
- &fUniformHandles.fSamplerUnis[s]); |
+ &fUniformHandles.fEffectSamplerUnis[s]); |
builder.setNonStage(); |
inColor = outColor; |
} |
@@ -598,7 +596,7 @@ |
fDesc.fEffectKeys[s], |
inCoverage.size() ? inCoverage.c_str() : NULL, |
outCoverage.c_str(), |
- &fUniformHandles.fSamplerUnis[s]); |
+ &fUniformHandles.fEffectSamplerUnis[s]); |
builder.setNonStage(); |
inCoverage = outCoverage; |
} |
@@ -674,8 +672,12 @@ |
} |
builder.finished(fProgramID); |
+ fUniformHandles.fRTHeightUni = builder.getRTHeightUniform(); |
+ fUniformHandles.fDstCopyTopLeftUni = builder.getDstCopyTopLeftUniform(); |
+ fUniformHandles.fDstCopyScaleUni = builder.getDstCopyScaleUniform(); |
+ fUniformHandles.fDstCopySamplerUni = builder.getDstCopySamplerUniform(); |
+ // This must be called after we set fDstCopySamplerUni above. |
this->initSamplerUniforms(); |
- fUniformHandles.fRTHeightUni = builder.getRTHeightUniform(); |
return true; |
} |
@@ -749,13 +751,18 @@ |
void GrGLProgram::initSamplerUniforms() { |
GL_CALL(UseProgram(fProgramID)); |
- // We simply bind the uniforms to successive texture units beginning at 0. setData() assumes this |
- // behavior. |
+ // We simply bind the uniforms to successive texture units beginning at 0. setData() assumes |
+ // this behavior. |
GrGLint texUnitIdx = 0; |
+ if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySamplerUni) { |
+ fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx); |
+ ++texUnitIdx; |
+ } |
+ |
for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
- int numSamplers = fUniformHandles.fSamplerUnis[s].count(); |
+ int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count(); |
for (int u = 0; u < numSamplers; ++u) { |
- UniformHandle handle = fUniformHandles.fSamplerUnis[s][u]; |
+ UniformHandle handle = fUniformHandles.fEffectSamplerUnis[s][u]; |
if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
fUniformManager.setSampler(handle, texUnitIdx); |
++texUnitIdx; |
@@ -769,6 +776,7 @@ |
void GrGLProgram::setData(GrGpuGL* gpu, |
GrColor color, |
GrColor coverage, |
+ const GrDeviceCoordTexture* dstCopy, |
SharedGLState* sharedState) { |
const GrDrawState& drawState = gpu->getDrawState(); |
@@ -786,6 +794,35 @@ |
} |
GrGLint texUnitIdx = 0; |
+ if (NULL != dstCopy) { |
+ if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyTopLeftUni) { |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyScaleUni); |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle != |
+ fUniformHandles.fDstCopySamplerUni); |
+ fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, |
+ static_cast<GrGLfloat>(dstCopy->offset().fX), |
+ static_cast<GrGLfloat>(dstCopy->offset().fY)); |
+ fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni, |
+ 1.f / dstCopy->texture()->width(), |
+ 1.f / dstCopy->texture()->height()); |
+ GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()); |
+ static GrTextureParams kParams; // the default is clamp, nearest filtering. |
+ gpu->bindTexture(texUnitIdx, kParams, texture); |
+ ++texUnitIdx; |
+ } else { |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
+ fUniformHandles.fDstCopyScaleUni); |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
+ fUniformHandles.fDstCopySamplerUni); |
+ } |
+ } else { |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
+ fUniformHandles.fDstCopyTopLeftUni); |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
+ fUniformHandles.fDstCopyScaleUni); |
+ GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
+ fUniformHandles.fDstCopySamplerUni); |
+ } |
for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
if (NULL != fEffects[s]) { |
const GrEffectStage& stage = drawState.getStage(s); |
@@ -795,9 +832,9 @@ |
(fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit); |
GrDrawEffect drawEffect(stage, explicitLocalCoords); |
fEffects[s]->setData(fUniformManager, drawEffect); |
- int numSamplers = fUniformHandles.fSamplerUnis[s].count(); |
+ int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count(); |
for (int u = 0; u < numSamplers; ++u) { |
- UniformHandle handle = fUniformHandles.fSamplerUnis[s][u]; |
+ UniformHandle handle = fUniformHandles.fEffectSamplerUnis[s][u]; |
if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
const GrTextureAccess& access = (*stage.getEffect())->textureAccess(u); |
GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture()); |