Index: src/gpu/gl/GrGLProgram.cpp |
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
index 8a24d60c14d409fa104ae27c0c184c5f31703940..c3087c601e49386f27cc36b8e50cb16b7681573b 100644 |
--- a/src/gpu/gl/GrGLProgram.cpp |
+++ b/src/gpu/gl/GrGLProgram.cpp |
@@ -7,7 +7,6 @@ |
#include "GrGLProgram.h" |
-#include "GrAllocator.h" |
#include "GrEffect.h" |
#include "GrDrawEffect.h" |
#include "GrGLEffect.h" |
@@ -34,6 +33,10 @@ SK_CONF_DECLARE(bool, c_PrintShaders, "gpu.printShaders", false, |
namespace { |
inline const char* declared_color_output_name() { return "fsColorOut"; } |
inline const char* dual_source_output_name() { return "dualSourceOut"; } |
+enum { |
+ // Number of uniforms in a single allocation block. |
+ kUniformsPerBlock = 8 |
+}; |
} |
GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, |
@@ -52,8 +55,8 @@ GrGLProgram::GrGLProgram(const GrGLContext& gl, |
const GrGLProgramDesc& desc, |
const GrEffectStage* colorStages[], |
const GrEffectStage* coverageStages[]) |
-: fContext(gl) |
-, fUniformManager(gl) { |
+ : fContext(gl) |
+ , fUniforms(kUniformsPerBlock) { |
fDesc = desc; |
fVShaderID = 0; |
fGShaderID = 0; |
@@ -231,8 +234,8 @@ GrSLConstantVec GrGLProgram::genInputColor(GrGLShaderBuilder* builder, SkString* |
} |
case GrGLProgramDesc::kUniform_ColorInput: { |
const char* name; |
- fUniformHandles.fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
- kVec4f_GrSLType, "Color", &name); |
+ fNamedUniforms.fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
+ kVec4f_GrSLType, "Color", &name)->glUniform(); |
*inColor = name; |
return kNone_GrSLConstantVec; |
} |
@@ -260,9 +263,9 @@ GrSLConstantVec GrGLProgram::genInputCoverage(GrGLShaderBuilder* builder, SkStri |
} |
case GrGLProgramDesc::kUniform_ColorInput: { |
const char* name; |
- fUniformHandles.fCoverageUni = |
+ fNamedUniforms.fCoverageUni = |
builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
- kVec4f_GrSLType, "Coverage", &name); |
+ kVec4f_GrSLType, "Coverage", &name)->glUniform(); |
*inCoverage = name; |
return kNone_GrSLConstantVec; |
} |
@@ -441,7 +444,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); |
- GrGLShaderBuilder builder(fContext.info(), fUniformManager, fDesc); |
+ GrGLShaderBuilder builder(fContext.info(), *this, fDesc); |
// the dual source output has no canonical var name, have to |
// declare an output, which is incompatible with gl_FragColor/gl_FragData. |
@@ -456,8 +459,8 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
} |
const char* viewMName; |
- fUniformHandles.fViewMatrixUni = builder.addUniform(GrGLShaderBuilder::kVertex_ShaderType, |
- kMat33f_GrSLType, "ViewM", &viewMName); |
+ fNamedUniforms.fViewMatrixUni = builder.addUniform(GrGLShaderBuilder::kVertex_ShaderType, |
+ kMat33f_GrSLType, "ViewM", &viewMName)->glUniform(); |
builder.vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n" |
@@ -488,7 +491,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor); |
// used in order for builder to return the per-stage uniform handles. |
- typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr; |
+ typedef SkTArray<GrGLUniform*, true>* UniHandleArrayPtr; |
int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverageEffects()); |
SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt); |
SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt); |
@@ -514,9 +517,9 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
// Insert the color filter. This will soon be replaced by a color effect. |
if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) { |
const char* colorFilterColorUniName = NULL; |
- fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
- kVec4f_GrSLType, "FilterColor", |
- &colorFilterColorUniName); |
+ fNamedUniforms.fColorFilterUni = builder.addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
+ kVec4f_GrSLType, "FilterColor", |
+ &colorFilterColorUniName)->glUniform(); |
builder.fsCodeAppend("\tvec4 filteredColor;\n"); |
const char* color; |
@@ -667,11 +670,11 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], |
return false; |
} |
- builder.finished(fProgramID); |
- fUniformHandles.fRTHeightUni = builder.getRTHeightUniform(); |
- fUniformHandles.fDstCopyTopLeftUni = builder.getDstCopyTopLeftUniform(); |
- fUniformHandles.fDstCopyScaleUni = builder.getDstCopyScaleUniform(); |
- fUniformHandles.fDstCopySamplerUni = builder.getDstCopySamplerUniform(); |
+ builder.finished(fContext, fProgramID); |
+ fNamedUniforms.fRTHeightUni = builder.getRTHeightUniform(); |
+ fNamedUniforms.fDstCopyTopLeftUni = builder.getDstCopyTopLeftUniform(); |
+ fNamedUniforms.fDstCopyScaleUni = builder.getDstCopyScaleUniform(); |
+ fNamedUniforms.fDstCopySamplerUni = builder.getDstCopySamplerUniform(); |
// This must be called after we set fDstCopySamplerUni above. |
this->initSamplerUniforms(); |
@@ -753,8 +756,8 @@ bool GrGLProgram::bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& buil |
void GrGLProgram::initSamplerUniforms() { |
GL_CALL(UseProgram(fProgramID)); |
GrGLint texUnitIdx = 0; |
- if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySamplerUni) { |
- fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx); |
+ if (NULL != fNamedUniforms.fDstCopySamplerUni) { |
+ fNamedUniforms.fDstCopySamplerUni->setSampler(fContext, texUnitIdx); |
fDstCopyTexUnit = texUnitIdx++; |
} |
@@ -771,9 +774,9 @@ void GrGLProgram::initEffectSamplerUniforms(EffectAndSamplers* effect, int* texU |
int numSamplers = effect->fSamplerUnis.count(); |
effect->fTextureUnits.reset(numSamplers); |
for (int s = 0; s < numSamplers; ++s) { |
- UniformHandle handle = effect->fSamplerUnis[s]; |
- if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
- fUniformManager.setSampler(handle, *texUnitIdx); |
+ GrGLUniform* handle = effect->fSamplerUnis[s]; |
+ if (NULL != handle) { |
+ handle->setSampler(fContext, *texUnitIdx); |
effect->fTextureUnits[s] = (*texUnitIdx)++; |
} |
} |
@@ -788,14 +791,14 @@ void GrGLProgram::setEffectData(GrGpuGL* gpu, |
// Let the GrGLEffect set its data. |
bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex; |
GrDrawEffect drawEffect(stage, explicitLocalCoords); |
- effect.fGLEffect->setData(fUniformManager, drawEffect); |
+ effect.fGLEffect->setData(fContext, drawEffect); |
// Bind the texures for the effect. |
int numSamplers = effect.fSamplerUnis.count(); |
GrAssert((*stage.getEffect())->numTextures() == numSamplers); |
for (int s = 0; s < numSamplers; ++s) { |
- UniformHandle handle = effect.fSamplerUnis[s]; |
- if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
+ GrGLUniform* handle = effect.fSamplerUnis[s]; |
+ if (NULL != handle) { |
const GrTextureAccess& access = (*stage.getEffect())->textureAccess(s); |
GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture()); |
int unit = effect.fTextureUnits[s]; |
@@ -830,38 +833,33 @@ void GrGLProgram::setData(GrGpuGL* gpu, |
this->setMatrixAndRenderTargetHeight(drawState); |
// Setup the SkXfermode::Mode-based colorfilter uniform if necessary |
- if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fColorFilterUni && |
+ if (NULL != fNamedUniforms.fColorFilterUni && |
fColorFilterColor != drawState.getColorFilterColor()) { |
GrGLfloat c[4]; |
GrColorToRGBAFloat(drawState.getColorFilterColor(), c); |
- fUniformManager.set4fv(fUniformHandles.fColorFilterUni, 0, 1, c); |
+ fNamedUniforms.fColorFilterUni->set4fv(fContext, 0, 1, c); |
fColorFilterColor = drawState.getColorFilterColor(); |
} |
if (NULL != dstCopy) { |
- if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyTopLeftUni) { |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyScaleUni); |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle != |
- fUniformHandles.fDstCopySamplerUni); |
- fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, |
+ if (NULL != fNamedUniforms.fDstCopyTopLeftUni) { |
+ fNamedUniforms.fDstCopyTopLeftUni->set2f(fContext, |
static_cast<GrGLfloat>(dstCopy->offset().fX), |
static_cast<GrGLfloat>(dstCopy->offset().fY)); |
- fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni, |
+ fNamedUniforms.fDstCopyScaleUni->set2f(fContext, |
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(fDstCopyTexUnit, kParams, texture); |
} else { |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
- fUniformHandles.fDstCopyScaleUni); |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
- fUniformHandles.fDstCopySamplerUni); |
+ GrAssert(NULL == fNamedUniforms.fDstCopyScaleUni); |
+ GrAssert(NULL == fNamedUniforms.fDstCopySamplerUni); |
} |
} else { |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopyTopLeftUni); |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopyScaleUni); |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopySamplerUni); |
+ GrAssert(NULL == fNamedUniforms.fDstCopyTopLeftUni); |
+ GrAssert(NULL == fNamedUniforms.fDstCopyScaleUni); |
+ GrAssert(NULL == fNamedUniforms.fDstCopySamplerUni); |
} |
for (int e = 0; e < fColorEffects.count(); ++e) { |
@@ -902,9 +900,7 @@ void GrGLProgram::setColor(const GrDrawState& drawState, |
// OpenGL ES doesn't support unsigned byte varieties of glUniform |
GrGLfloat c[4]; |
GrColorToRGBAFloat(color, c); |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle != |
- fUniformHandles.fColorUni); |
- fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c); |
+ fNamedUniforms.fColorUni->set4fv(fContext, 0, 1, c); |
fColor = color; |
} |
sharedState->fConstAttribColorIndex = -1; |
@@ -943,9 +939,7 @@ void GrGLProgram::setCoverage(const GrDrawState& drawState, |
// OpenGL ES doesn't support unsigned byte varieties of glUniform |
GrGLfloat c[4]; |
GrColorToRGBAFloat(coverage, c); |
- GrAssert(GrGLUniformManager::kInvalidUniformHandle != |
- fUniformHandles.fCoverageUni); |
- fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c); |
+ fNamedUniforms.fCoverageUni->set4fv(fContext, 0, 1, c); |
fCoverage = coverage; |
} |
sharedState->fConstAttribCoverageIndex = -1; |
@@ -968,9 +962,9 @@ void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { |
size.set(rt->width(), rt->height()); |
// Load the RT height uniform if it is needed to y-flip gl_FragCoord. |
- if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fRTHeightUni && |
+ if (NULL != fNamedUniforms.fRTHeightUni && |
fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { |
- fUniformManager.set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.fHeight)); |
+ fNamedUniforms.fRTHeightUni->set1f(fContext, SkIntToScalar(size.fHeight)); |
} |
if (fMatrixState.fRenderTargetOrigin != rt->origin() || |
@@ -1002,7 +996,7 @@ void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { |
SkScalarToFloat(m[SkMatrix::kMTransY]), |
SkScalarToFloat(m[SkMatrix::kMPersp2]) |
}; |
- fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); |
+ fNamedUniforms.fViewMatrixUni->setMatrix3f(fContext, mt); |
fMatrixState.fViewMatrix = drawState.getViewMatrix(); |
fMatrixState.fRenderTargetSize = size; |
fMatrixState.fRenderTargetOrigin = rt->origin(); |