Chromium Code Reviews| Index: src/gpu/gl/GrGLShaderBuilder.cpp |
| diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp |
| index 004fb04357cbfa3b66db3c704862bbdb6b8a2ca4..43defac1429dfa80c08fcb3074188a106db5e7c1 100644 |
| --- a/src/gpu/gl/GrGLShaderBuilder.cpp |
| +++ b/src/gpu/gl/GrGLShaderBuilder.cpp |
| @@ -590,25 +590,33 @@ bool GrGLShaderBuilder::finish(GrGLuint* outProgramId) { |
| this->bindProgramLocations(programId); |
| GL_CALL(LinkProgram(programId)); |
| - GrGLint linked = GR_GL_INIT_ZERO; |
| - GL_CALL(GetProgramiv(programId, GR_GL_LINK_STATUS, &linked)); |
| - if (!linked) { |
| - GrGLint infoLen = GR_GL_INIT_ZERO; |
| - GL_CALL(GetProgramiv(programId, 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(programId, |
| - infoLen+1, |
| - &length, |
| - (char*)log.get())); |
| - GrPrintf((char*)log.get()); |
| + |
| + // Calling GetProgramiv is expensive in Chromium. Assume success in release builds. |
| + bool checkLinked = !fGpu->ctxInfo().isChromium(); |
| +#ifdef SK_DEBUG |
| + checkLinked = true; |
| +#endif |
| + if (checkLinked) { |
| + GrGLint linked = GR_GL_INIT_ZERO; |
| + GL_CALL(GetProgramiv(programId, GR_GL_LINK_STATUS, &linked)); |
| + if (!linked) { |
| + GrGLint infoLen = GR_GL_INIT_ZERO; |
| + GL_CALL(GetProgramiv(programId, 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(programId, |
| + infoLen+1, |
| + &length, |
| + (char*)log.get())); |
| + GrPrintf((char*)log.get()); |
| + } |
| + SkDEBUGFAIL("Error linking program"); |
| + GL_CALL(DeleteProgram(programId)); |
| + return false; |
| } |
| - SkDEBUGFAIL("Error linking program"); |
| - GL_CALL(DeleteProgram(programId)); |
| - return false; |
| } |
| fUniformManager.getUniformLocations(programId, fUniforms); |
| @@ -616,13 +624,14 @@ bool GrGLShaderBuilder::finish(GrGLuint* outProgramId) { |
| return true; |
| } |
| -namespace { |
| // Compiles a GL shader, attaches it to a program, and releases the shader's reference. |
| // (That way there's no need to hang on to the GL shader id and delete it later.) |
| -bool attach_shader(const GrGLInterface* gli, |
| - GrGLuint programId, |
| - GrGLenum type, |
| - const SkString& shaderSrc) { |
| +static bool attach_shader(const GrGLContext& glCtx, |
| + GrGLuint programId, |
| + GrGLenum type, |
| + const SkString& shaderSrc) { |
| + const GrGLInterface* gli = glCtx.interface(); |
| + |
| GrGLuint shaderId; |
| GR_GL_CALL_RET(gli, shaderId, CreateShader(type)); |
| if (0 == shaderId) { |
| @@ -633,27 +642,35 @@ bool attach_shader(const GrGLInterface* gli, |
| GrGLint sourceLength = static_cast<GrGLint>(shaderSrc.size()); |
| GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength)); |
| - GrGLint compiled = GR_GL_INIT_ZERO; |
| - GR_GL_CALL(gli, CompileShader(shaderId)); |
| - GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_COMPILE_STATUS, &compiled)); |
| - |
| - if (!compiled) { |
| - GrGLint infoLen = GR_GL_INIT_ZERO; |
| - GR_GL_CALL(gli, GetShaderiv(shaderId, 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; |
| - GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1, |
| - &length, (char*)log.get())); |
| - GrPrintf(shaderSrc.c_str()); |
| - GrPrintf("\n%s", log.get()); |
| + // Calling GetShaderiv in Chromium is quite expensive. Assume success in release builds. |
| + bool checkCompiled = !glCtx.info().isChromium(); |
| +#ifdef SK_DEBUG |
| + checkCompiled = true; |
| +#endif |
| + if (checkCompiled) { |
| + GrGLint compiled = GR_GL_INIT_ZERO; |
|
robertphillips
2013/10/30 19:46:18
I don't think this should be here.
|
| + GR_GL_CALL(gli, CompileShader(shaderId)); |
| + GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_COMPILE_STATUS, &compiled)); |
| + |
| + if (!compiled) { |
| + GrGLint infoLen = GR_GL_INIT_ZERO; |
| + GR_GL_CALL(gli, GetShaderiv(shaderId, 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 Chromium cmd |
| + // buffer param validation. |
| + GrGLsizei length = GR_GL_INIT_ZERO; |
| + GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1, |
| + &length, (char*)log.get())); |
| + GrPrintf(shaderSrc.c_str()); |
| + GrPrintf("\n%s", log.get()); |
| + } |
| + SkDEBUGFAIL("Shader compilation failed!"); |
| + GR_GL_CALL(gli, DeleteShader(shaderId)); |
| + return false; |
| } |
| - SkDEBUGFAIL("Shader compilation failed!"); |
| - GR_GL_CALL(gli, DeleteShader(shaderId)); |
| - return false; |
| - } else if (c_PrintShaders) { |
| + } |
| + if (c_PrintShaders) { |
| GrPrintf(shaderSrc.c_str()); |
| GrPrintf("\n"); |
| } |
| @@ -663,8 +680,6 @@ bool attach_shader(const GrGLInterface* gli, |
| return true; |
| } |
| -} |
| - |
| bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { |
| SkString fragShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); |
| fragShaderSrc.append(fFSExtensions); |
| @@ -680,7 +695,7 @@ bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { |
| fragShaderSrc.append("void main() {\n"); |
| fragShaderSrc.append(fFSCode); |
| fragShaderSrc.append("}\n"); |
| - if (!attach_shader(fGpu->glInterface(), programId, GR_GL_FRAGMENT_SHADER, fragShaderSrc)) { |
| + if (!attach_shader(fGpu->glContext(), programId, GR_GL_FRAGMENT_SHADER, fragShaderSrc)) { |
| return false; |
| } |
| @@ -851,7 +866,7 @@ GrGLProgramEffects* GrGLFullShaderBuilder::createAndEmitEffects( |
| } |
| bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { |
| - const GrGLInterface* glInterface = this->gpu()->glInterface(); |
| + const GrGLContext& glCtx = this->gpu()->glContext(); |
| SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); |
| this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc); |
| this->appendDecls(fVSAttrs, &vertShaderSrc); |
| @@ -859,7 +874,7 @@ bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { |
| vertShaderSrc.append("void main() {\n"); |
| vertShaderSrc.append(fVSCode); |
| vertShaderSrc.append("}\n"); |
| - if (!attach_shader(glInterface, programId, GR_GL_VERTEX_SHADER, vertShaderSrc)) { |
| + if (!attach_shader(glCtx, programId, GR_GL_VERTEX_SHADER, vertShaderSrc)) { |
| return false; |
| } |
| @@ -887,7 +902,7 @@ bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { |
| "\t}\n" |
| "\tEndPrimitive();\n"); |
| geomShaderSrc.append("}\n"); |
| - if (!attach_shader(glInterface, programId, GR_GL_GEOMETRY_SHADER, geomShaderSrc)) { |
| + if (!attach_shader(glCtx, programId, GR_GL_GEOMETRY_SHADER, geomShaderSrc)) { |
| return false; |
| } |
| } |