Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Unified Diff: src/gpu/gl/GrGLProgram.cpp

Issue 23018003: Rename GrGLUniformManager to GrGLUniform and ref GrGLUniforms directly Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLShaderBuilder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLShaderBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698