| 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();
|
|
|