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

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

Issue 426553011: Make GrGLProgram be available to GrGLProgramDataManager (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix win warning Created 6 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/GrGLShaderBuilder.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLShaderBuilder.cpp
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
index d6679dcc953b167bff549b4f5030da2d8cebf251..fe9a66ae42ff328871c5de08ad38ca92c3e0bb4b 100644
--- a/src/gpu/gl/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -89,25 +89,6 @@ static const char kDstCopyColorName[] = "_dstColor";
///////////////////////////////////////////////////////////////////////////////
-bool GrGLShaderBuilder::GenProgram(GrGpuGL* gpu,
- GrGLProgramDataManager* pdman,
- const GrGLProgramDesc& desc,
- const GrEffectStage* inColorStages[],
- const GrEffectStage* inCoverageStages[],
- GenProgramOutput* output) {
- SkAutoTDelete<GrGLShaderBuilder> builder;
- if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing()) {
- builder.reset(SkNEW_ARGS(GrGLFullShaderBuilder, (gpu, pdman, desc)));
- } else {
- builder.reset(SkNEW_ARGS(GrGLFragmentOnlyShaderBuilder, (gpu, pdman, desc)));
- }
- if (builder->genProgram(inColorStages, inCoverageStages)) {
- *output = builder->getOutput();
- return true;
- }
- return false;
-}
-
bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[],
const GrEffectStage* coverageStages[]) {
const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader();
@@ -125,13 +106,13 @@ bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[],
} else {
configMask = kRGBA_GrColorComponentFlags;
}
- fOutput.fUniformHandles.fDstCopySamplerUni =
+ fUniformHandles.fDstCopySamplerUni =
this->addUniform(kFragment_Visibility, kSampler2D_GrSLType, "DstCopySampler",
&dstCopySamplerName);
- fOutput.fUniformHandles.fDstCopyTopLeftUni =
+ fUniformHandles.fDstCopyTopLeftUni =
this->addUniform(kFragment_Visibility, kVec2f_GrSLType, "DstCopyUpperLeft",
&dstCopyTopLeftName);
- fOutput.fUniformHandles.fDstCopyScaleUni =
+ fUniformHandles.fDstCopyScaleUni =
this->addUniform(kFragment_Visibility, kVec2f_GrSLType, "DstCopyCoordScale",
&dstCopyCoordScaleName);
const char* fragPos = this->fragmentPosition();
@@ -159,7 +140,7 @@ bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[],
if (GrGLProgramDesc::kUniform_ColorInput == header.fColorInput) {
const char* name;
- fOutput.fUniformHandles.fColorUni =
+ fUniformHandles.fColorUni =
this->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "Color",
&name);
inputColor = GrGLSLExpr4(name);
@@ -167,7 +148,7 @@ bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[],
if (GrGLProgramDesc::kUniform_ColorInput == header.fCoverageInput) {
const char* name;
- fOutput.fUniformHandles.fCoverageUni =
+ fUniformHandles.fCoverageUni =
this->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "Coverage",
&name);
inputCoverage = GrGLSLExpr4(name);
@@ -189,17 +170,17 @@ bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[],
GrGLProgramDesc::EffectKeyProvider colorKeyProvider(
&this->desc(), GrGLProgramDesc::EffectKeyProvider::kColor_EffectType);
- fOutput.fColorEffects.reset(this->createAndEmitEffects(colorStages,
- this->desc().numColorEffects(),
- colorKeyProvider,
- &inputColor));
+ fColorEffects.reset(this->createAndEmitEffects(colorStages,
+ this->desc().numColorEffects(),
+ colorKeyProvider,
+ &inputColor));
GrGLProgramDesc::EffectKeyProvider coverageKeyProvider(
&this->desc(), GrGLProgramDesc::EffectKeyProvider::kCoverage_EffectType);
- fOutput.fCoverageEffects.reset(this->createAndEmitEffects(coverageStages,
- this->desc().numCoverageEffects(),
- coverageKeyProvider,
- &inputCoverage));
+ fCoverageEffects.reset(this->createAndEmitEffects(coverageStages,
+ this->desc().numCoverageEffects(),
+ coverageKeyProvider,
+ &inputCoverage));
this->emitCodeAfterEffects();
@@ -247,11 +228,12 @@ bool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[],
//////////////////////////////////////////////////////////////////////////////
GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu,
- GrGLProgramDataManager* programResourceManager,
const GrGLProgramDesc& desc)
- : fDesc(desc)
+ : fHasVertexShader(false)
+ , fTexCoordSetCnt(0)
+ , fProgramID(0)
+ , fDesc(desc)
, fGpu(gpu)
- , fProgramDataManager(SkRef(programResourceManager))
, fFSFeaturesAddedMask(0)
, fFSInputs(kVarsPerBlock)
, fFSOutputs(kMaxFSOutputs)
@@ -315,7 +297,7 @@ const char* GrGLShaderBuilder::dstColor() {
this->addFSFeature(1 << (kLastGLSLPrivateFeature + 1),
fGpu->glCaps().fbFetchExtensionString());
return fGpu->glCaps().fbFetchColorName();
- } else if (fOutput.fUniformHandles.fDstCopySamplerUni.isValid()) {
+ } else if (fUniformHandles.fDstCopySamplerUni.isValid()) {
return kDstCopyColorName;
} else {
return "";
@@ -405,13 +387,7 @@ GrGLProgramDataManager::UniformHandle GrGLShaderBuilder::addUniformArray(uint32_
SkASSERT(0 == (~kVisibilityMask & visibility));
SkASSERT(0 != visibility);
- BuilderUniform& uni = fUniforms.push_back();
- UniformHandle h = GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fUniforms.count() - 1);
- SkDEBUGCODE(UniformHandle h2 =)
- fProgramDataManager->appendUniform(type, count);
- // We expect the uniform manager to initially have no uniforms and that all uniforms are added
- // by this function. Therefore, the handles should match.
- SkASSERT(h2 == h);
+ UniformInfo& uni = fUniforms.push_back();
uni.fVariable.setType(type);
uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier);
this->nameVariable(uni.fVariable.accessName(), 'u', name);
@@ -429,8 +405,7 @@ GrGLProgramDataManager::UniformHandle GrGLShaderBuilder::addUniformArray(uint32_
if (NULL != outName) {
*outName = uni.fVariable.c_str();
}
-
- return h;
+ return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fUniforms.count() - 1);
}
SkString GrGLShaderBuilder::ensureFSCoords2D(const TransformedCoordsArray& coords, int index) {
@@ -483,10 +458,10 @@ const char* GrGLShaderBuilder::fragmentPosition() {
// temporarily change the stage index because we're inserting non-stage code.
CodeStage::AutoStageRestore csar(&fCodeStage, NULL);
- SkASSERT(!fOutput.fUniformHandles.fRTHeightUni.isValid());
+ SkASSERT(!fUniformHandles.fRTHeightUni.isValid());
const char* rtHeightName;
- fOutput.fUniformHandles.fRTHeightUni =
+ fUniformHandles.fRTHeightUni =
this->addUniform(kFragment_Visibility, kFloat_GrSLType, "RTHeight", &rtHeightName);
// Using glFragCoord.zw for the last two components tickles an Adreno driver bug that
@@ -496,7 +471,7 @@ const char* GrGLShaderBuilder::fragmentPosition() {
"1.0);\n", kCoordName, rtHeightName);
fSetupFragPosition = true;
}
- SkASSERT(fOutput.fUniformHandles.fRTHeightUni.isValid());
+ SkASSERT(fUniformHandles.fRTHeightUni.isValid());
return kCoordName;
}
}
@@ -627,25 +602,22 @@ const char* GrGLShaderBuilder::enableSecondaryOutput() {
}
bool GrGLShaderBuilder::finish() {
- SkASSERT(0 == fOutput.fProgramID);
- GL_CALL_RET(fOutput.fProgramID, CreateProgram());
- if (!fOutput.fProgramID) {
+ SkASSERT(0 == fProgramID);
+ GL_CALL_RET(fProgramID, CreateProgram());
+ if (!fProgramID) {
return false;
}
SkTDArray<GrGLuint> shadersToDelete;
- if (!this->compileAndAttachShaders(fOutput.fProgramID, &shadersToDelete)) {
- GL_CALL(DeleteProgram(fOutput.fProgramID));
+ if (!this->compileAndAttachShaders(fProgramID, &shadersToDelete)) {
+ GL_CALL(DeleteProgram(fProgramID));
return false;
}
- this->bindProgramLocations(fOutput.fProgramID);
- if (fProgramDataManager->isUsingBindUniform()) {
- fProgramDataManager->getUniformLocations(fOutput.fProgramID, fUniforms);
- }
+ this->bindProgramLocations(fProgramID);
- GL_CALL(LinkProgram(fOutput.fProgramID));
+ GL_CALL(LinkProgram(fProgramID));
// Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
bool checkLinked = !fGpu->ctxInfo().isChromium();
@@ -654,31 +626,29 @@ bool GrGLShaderBuilder::finish() {
#endif
if (checkLinked) {
GrGLint linked = GR_GL_INIT_ZERO;
- GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_LINK_STATUS, &linked));
+ GL_CALL(GetProgramiv(fProgramID, GR_GL_LINK_STATUS, &linked));
if (!linked) {
GrGLint infoLen = GR_GL_INIT_ZERO;
- GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen));
+ GL_CALL(GetProgramiv(fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen));
SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger
if (infoLen > 0) {
// retrieve length even though we don't need it to workaround
// bug in chrome cmd buffer param validation.
GrGLsizei length = GR_GL_INIT_ZERO;
- GL_CALL(GetProgramInfoLog(fOutput.fProgramID,
+ GL_CALL(GetProgramInfoLog(fProgramID,
infoLen+1,
&length,
(char*)log.get()));
GrPrintf((char*)log.get());
}
SkDEBUGFAIL("Error linking program");
- GL_CALL(DeleteProgram(fOutput.fProgramID));
- fOutput.fProgramID = 0;
+ GL_CALL(DeleteProgram(fProgramID));
+ fProgramID = 0;
return false;
}
}
- if (!fProgramDataManager->isUsingBindUniform()) {
- fProgramDataManager->getUniformLocations(fOutput.fProgramID, fUniforms);
- }
+ this->resolveProgramLocations(fProgramID);
for (int i = 0; i < shadersToDelete.count(); ++i) {
GL_CALL(DeleteShader(shadersToDelete[i]));
@@ -776,13 +746,35 @@ bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId, SkTDArray<Gr
return true;
}
-void GrGLShaderBuilder::bindProgramLocations(GrGLuint programId) const {
+void GrGLShaderBuilder::bindProgramLocations(GrGLuint programId) {
if (fHasCustomColorOutput) {
GL_CALL(BindFragDataLocation(programId, 0, declared_color_output_name()));
}
if (fHasSecondaryOutput) {
GL_CALL(BindFragDataLocationIndexed(programId, 0, 1, dual_source_output_name()));
}
+ // skbug.com/2056
+ bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
+ if (usingBindUniform) {
+ int count = fUniforms.count();
+ for (int i = 0; i < count; ++i) {
+ GL_CALL(BindUniformLocation(programId, i, fUniforms[i].fVariable.c_str()));
+ fUniforms[i].fLocation = i;
+ }
+ }
+}
+
+void GrGLShaderBuilder::resolveProgramLocations(GrGLuint programId) {
+ bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
+ if (!usingBindUniform) {
+ int count = fUniforms.count();
+ for (int i = 0; i < count; ++i) {
+ GrGLint location;
+ GL_CALL_RET(location,
+ GetUniformLocation(programId, fUniforms[i].fVariable.c_str()));
+ fUniforms[i].fLocation = location;
+ }
+ }
}
const GrGLContextInfo& GrGLShaderBuilder::ctxInfo() const {
@@ -792,9 +784,8 @@ const GrGLContextInfo& GrGLShaderBuilder::ctxInfo() const {
////////////////////////////////////////////////////////////////////////////////
GrGLFullShaderBuilder::GrGLFullShaderBuilder(GrGpuGL* gpu,
- GrGLProgramDataManager* programResourceManager,
const GrGLProgramDesc& desc)
- : INHERITED(gpu, programResourceManager, desc)
+ : INHERITED(gpu, desc)
, fVSAttrs(kVarsPerBlock)
, fVSOutputs(kVarsPerBlock)
, fGSInputs(kVarsPerBlock)
@@ -804,7 +795,7 @@ GrGLFullShaderBuilder::GrGLFullShaderBuilder(GrGpuGL* gpu,
void GrGLFullShaderBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) {
const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader();
- fOutput.fHasVertexShader = true;
+ fHasVertexShader = true;
fPositionVar = &fVSAttrs.push_back();
fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "aPosition");
@@ -818,7 +809,7 @@ void GrGLFullShaderBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr
}
const char* viewMName;
- fOutput.fUniformHandles.fViewMatrixUni =
+ fUniformHandles.fViewMatrixUni =
this->addUniform(GrGLShaderBuilder::kVertex_Visibility, kMat33f_GrSLType, "ViewM",
&viewMName);
@@ -854,7 +845,7 @@ void GrGLFullShaderBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr
void GrGLFullShaderBuilder::emitCodeAfterEffects() {
const char* rtAdjustName;
- fOutput.fUniformHandles.fRTAdjustmentUni =
+ fUniformHandles.fRTAdjustmentUni =
this->addUniform(GrGLShaderBuilder::kVertex_Visibility, kVec4f_GrSLType, "rtAdjustment",
&rtAdjustName);
@@ -1006,7 +997,7 @@ bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId,
return this->INHERITED::compileAndAttachShaders(programId, shaderIds);
}
-void GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) const {
+void GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) {
this->INHERITED::bindProgramLocations(programId);
const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader();
@@ -1041,9 +1032,8 @@ void GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) const {
////////////////////////////////////////////////////////////////////////////////
GrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu,
- GrGLProgramDataManager* programResourceManager,
const GrGLProgramDesc& desc)
- : INHERITED(gpu, programResourceManager, desc) {
+ : INHERITED(gpu, desc) {
SkASSERT(!desc.getHeader().fHasVertexCode);
SkASSERT(gpu->glCaps().pathRenderingSupport());
SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorInput);
@@ -1051,9 +1041,9 @@ GrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu,
}
int GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) {
- int firstFreeCoordSet = fOutput.fTexCoordSetCnt;
- fOutput.fTexCoordSetCnt += count;
- SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fOutput.fTexCoordSetCnt);
+ int firstFreeCoordSet = fTexCoordSetCnt;
+ fTexCoordSetCnt += count;
+ SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fTexCoordSetCnt);
return firstFreeCoordSet;
}
« no previous file with comments | « src/gpu/gl/GrGLShaderBuilder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698