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

Side by Side Diff: src/gpu/gl/GrGLShaderBuilder.cpp

Issue 52843003: Don't check if shaders compile or program links in release Chromium (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: actually save file so it gets uploaded Created 7 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/gl/GrGLContext.cpp ('k') | src/gpu/gl/GrGLUtil.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "gl/GrGLShaderBuilder.h" 8 #include "gl/GrGLShaderBuilder.h"
9 #include "gl/GrGLProgram.h" 9 #include "gl/GrGLProgram.h"
10 #include "gl/GrGLUniformHandle.h" 10 #include "gl/GrGLUniformHandle.h"
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 } 583 }
584 584
585 if (!this->compileAndAttachShaders(programId)) { 585 if (!this->compileAndAttachShaders(programId)) {
586 GL_CALL(DeleteProgram(programId)); 586 GL_CALL(DeleteProgram(programId));
587 return false; 587 return false;
588 } 588 }
589 589
590 this->bindProgramLocations(programId); 590 this->bindProgramLocations(programId);
591 591
592 GL_CALL(LinkProgram(programId)); 592 GL_CALL(LinkProgram(programId));
593 GrGLint linked = GR_GL_INIT_ZERO; 593
594 GL_CALL(GetProgramiv(programId, GR_GL_LINK_STATUS, &linked)); 594 // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
595 if (!linked) { 595 bool checkLinked = !fGpu->ctxInfo().isChromium();
596 GrGLint infoLen = GR_GL_INIT_ZERO; 596 #ifdef SK_DEBUG
597 GL_CALL(GetProgramiv(programId, GR_GL_INFO_LOG_LENGTH, &infoLen)); 597 checkLinked = true;
598 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger 598 #endif
599 if (infoLen > 0) { 599 if (checkLinked) {
600 // retrieve length even though we don't need it to workaround 600 GrGLint linked = GR_GL_INIT_ZERO;
601 // bug in chrome cmd buffer param validation. 601 GL_CALL(GetProgramiv(programId, GR_GL_LINK_STATUS, &linked));
602 GrGLsizei length = GR_GL_INIT_ZERO; 602 if (!linked) {
603 GL_CALL(GetProgramInfoLog(programId, 603 GrGLint infoLen = GR_GL_INIT_ZERO;
604 infoLen+1, 604 GL_CALL(GetProgramiv(programId, GR_GL_INFO_LOG_LENGTH, &infoLen));
605 &length, 605 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debug ger
606 (char*)log.get())); 606 if (infoLen > 0) {
607 GrPrintf((char*)log.get()); 607 // retrieve length even though we don't need it to workaround
608 // bug in chrome cmd buffer param validation.
609 GrGLsizei length = GR_GL_INIT_ZERO;
610 GL_CALL(GetProgramInfoLog(programId,
611 infoLen+1,
612 &length,
613 (char*)log.get()));
614 GrPrintf((char*)log.get());
615 }
616 SkDEBUGFAIL("Error linking program");
617 GL_CALL(DeleteProgram(programId));
618 return false;
608 } 619 }
609 SkDEBUGFAIL("Error linking program");
610 GL_CALL(DeleteProgram(programId));
611 return false;
612 } 620 }
613 621
614 fUniformManager.getUniformLocations(programId, fUniforms); 622 fUniformManager.getUniformLocations(programId, fUniforms);
615 *outProgramId = programId; 623 *outProgramId = programId;
616 return true; 624 return true;
617 } 625 }
618 626
619 namespace {
620 // Compiles a GL shader, attaches it to a program, and releases the shader's ref erence. 627 // Compiles a GL shader, attaches it to a program, and releases the shader's ref erence.
621 // (That way there's no need to hang on to the GL shader id and delete it later. ) 628 // (That way there's no need to hang on to the GL shader id and delete it later. )
622 bool attach_shader(const GrGLInterface* gli, 629 static bool attach_shader(const GrGLContext& glCtx,
623 GrGLuint programId, 630 GrGLuint programId,
624 GrGLenum type, 631 GrGLenum type,
625 const SkString& shaderSrc) { 632 const SkString& shaderSrc) {
633 const GrGLInterface* gli = glCtx.interface();
634
626 GrGLuint shaderId; 635 GrGLuint shaderId;
627 GR_GL_CALL_RET(gli, shaderId, CreateShader(type)); 636 GR_GL_CALL_RET(gli, shaderId, CreateShader(type));
628 if (0 == shaderId) { 637 if (0 == shaderId) {
629 return false; 638 return false;
630 } 639 }
631 640
632 const GrGLchar* sourceStr = shaderSrc.c_str(); 641 const GrGLchar* sourceStr = shaderSrc.c_str();
633 GrGLint sourceLength = static_cast<GrGLint>(shaderSrc.size()); 642 GrGLint sourceLength = static_cast<GrGLint>(shaderSrc.size());
634 GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength)); 643 GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength));
644 GR_GL_CALL(gli, CompileShader(shaderId));
635 645
636 GrGLint compiled = GR_GL_INIT_ZERO; 646 // Calling GetShaderiv in Chromium is quite expensive. Assume success in rel ease builds.
637 GR_GL_CALL(gli, CompileShader(shaderId)); 647 bool checkCompiled = !glCtx.info().isChromium();
638 GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_COMPILE_STATUS, &compiled)); 648 #ifdef SK_DEBUG
649 checkCompiled = true;
650 #endif
651 if (checkCompiled) {
652 GrGLint compiled = GR_GL_INIT_ZERO;
653 GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_COMPILE_STATUS, &compiled));
639 654
640 if (!compiled) { 655 if (!compiled) {
641 GrGLint infoLen = GR_GL_INIT_ZERO; 656 GrGLint infoLen = GR_GL_INIT_ZERO;
642 GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_INFO_LOG_LENGTH, &infoLen)); 657 GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_INFO_LOG_LENGTH, &infoLe n));
643 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger 658 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugg er
644 if (infoLen > 0) { 659 if (infoLen > 0) {
645 // retrieve length even though we don't need it to workaround bug in chrome cmd buffer 660 // retrieve length even though we don't need it to workaround bu g in Chromium cmd
646 // param validation. 661 // buffer param validation.
647 GrGLsizei length = GR_GL_INIT_ZERO; 662 GrGLsizei length = GR_GL_INIT_ZERO;
648 GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1, 663 GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1,
649 &length, (char*)log.get())); 664 &length, (char*)log.get()));
650 GrPrintf(shaderSrc.c_str()); 665 GrPrintf(shaderSrc.c_str());
651 GrPrintf("\n%s", log.get()); 666 GrPrintf("\n%s", log.get());
667 }
668 SkDEBUGFAIL("Shader compilation failed!");
669 GR_GL_CALL(gli, DeleteShader(shaderId));
670 return false;
652 } 671 }
653 SkDEBUGFAIL("Shader compilation failed!"); 672 }
654 GR_GL_CALL(gli, DeleteShader(shaderId)); 673 if (c_PrintShaders) {
655 return false;
656 } else if (c_PrintShaders) {
657 GrPrintf(shaderSrc.c_str()); 674 GrPrintf(shaderSrc.c_str());
658 GrPrintf("\n"); 675 GrPrintf("\n");
659 } 676 }
660 677
661 GR_GL_CALL(gli, AttachShader(programId, shaderId)); 678 GR_GL_CALL(gli, AttachShader(programId, shaderId));
662 GR_GL_CALL(gli, DeleteShader(shaderId)); 679 GR_GL_CALL(gli, DeleteShader(shaderId));
663 return true; 680 return true;
664 } 681 }
665 682
666 }
667
668 bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { 683 bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId) const {
669 SkString fragShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); 684 SkString fragShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo()));
670 fragShaderSrc.append(fFSExtensions); 685 fragShaderSrc.append(fFSExtensions);
671 append_default_precision_qualifier(kDefaultFragmentPrecision, 686 append_default_precision_qualifier(kDefaultFragmentPrecision,
672 fGpu->glBinding(), 687 fGpu->glBinding(),
673 &fragShaderSrc); 688 &fragShaderSrc);
674 this->appendUniformDecls(kFragment_Visibility, &fragShaderSrc); 689 this->appendUniformDecls(kFragment_Visibility, &fragShaderSrc);
675 this->appendDecls(fFSInputs, &fragShaderSrc); 690 this->appendDecls(fFSInputs, &fragShaderSrc);
676 // We shouldn't have declared outputs on 1.10 691 // We shouldn't have declared outputs on 1.10
677 SkASSERT(k110_GrGLSLGeneration != fGpu->glslGeneration() || fFSOutputs.empty ()); 692 SkASSERT(k110_GrGLSLGeneration != fGpu->glslGeneration() || fFSOutputs.empty ());
678 this->appendDecls(fFSOutputs, &fragShaderSrc); 693 this->appendDecls(fFSOutputs, &fragShaderSrc);
679 fragShaderSrc.append(fFSFunctions); 694 fragShaderSrc.append(fFSFunctions);
680 fragShaderSrc.append("void main() {\n"); 695 fragShaderSrc.append("void main() {\n");
681 fragShaderSrc.append(fFSCode); 696 fragShaderSrc.append(fFSCode);
682 fragShaderSrc.append("}\n"); 697 fragShaderSrc.append("}\n");
683 if (!attach_shader(fGpu->glInterface(), programId, GR_GL_FRAGMENT_SHADER, fr agShaderSrc)) { 698 if (!attach_shader(fGpu->glContext(), programId, GR_GL_FRAGMENT_SHADER, frag ShaderSrc)) {
684 return false; 699 return false;
685 } 700 }
686 701
687 return true; 702 return true;
688 } 703 }
689 704
690 void GrGLShaderBuilder::bindProgramLocations(GrGLuint programId) const { 705 void GrGLShaderBuilder::bindProgramLocations(GrGLuint programId) const {
691 if (fHasCustomColorOutput) { 706 if (fHasCustomColorOutput) {
692 GL_CALL(BindFragDataLocation(programId, 0, declared_color_output_name()) ); 707 GL_CALL(BindFragDataLocation(programId, 0, declared_color_output_name()) );
693 } 708 }
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); 859 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt);
845 this->INHERITED::createAndEmitEffects(&programEffectsBuilder, 860 this->INHERITED::createAndEmitEffects(&programEffectsBuilder,
846 effectStages, 861 effectStages,
847 effectKeys, 862 effectKeys,
848 effectCnt, 863 effectCnt,
849 inOutFSColor); 864 inOutFSColor);
850 return programEffectsBuilder.finish(); 865 return programEffectsBuilder.finish();
851 } 866 }
852 867
853 bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId) const { 868 bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId) const {
854 const GrGLInterface* glInterface = this->gpu()->glInterface(); 869 const GrGLContext& glCtx = this->gpu()->glContext();
855 SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); 870 SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo()));
856 this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc); 871 this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc);
857 this->appendDecls(fVSAttrs, &vertShaderSrc); 872 this->appendDecls(fVSAttrs, &vertShaderSrc);
858 this->appendDecls(fVSOutputs, &vertShaderSrc); 873 this->appendDecls(fVSOutputs, &vertShaderSrc);
859 vertShaderSrc.append("void main() {\n"); 874 vertShaderSrc.append("void main() {\n");
860 vertShaderSrc.append(fVSCode); 875 vertShaderSrc.append(fVSCode);
861 vertShaderSrc.append("}\n"); 876 vertShaderSrc.append("}\n");
862 if (!attach_shader(glInterface, programId, GR_GL_VERTEX_SHADER, vertShaderSr c)) { 877 if (!attach_shader(glCtx, programId, GR_GL_VERTEX_SHADER, vertShaderSrc)) {
863 return false; 878 return false;
864 } 879 }
865 880
866 #if GR_GL_EXPERIMENTAL_GS 881 #if GR_GL_EXPERIMENTAL_GS
867 if (fDesc.getHeader().fExperimentalGS) { 882 if (fDesc.getHeader().fExperimentalGS) {
868 SkASSERT(this->ctxInfo().glslGeneration() >= k150_GrGLSLGeneration); 883 SkASSERT(this->ctxInfo().glslGeneration() >= k150_GrGLSLGeneration);
869 SkString geomShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); 884 SkString geomShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo()));
870 geomShaderSrc.append("layout(triangles) in;\n" 885 geomShaderSrc.append("layout(triangles) in;\n"
871 "layout(triangle_strip, max_vertices = 6) out;\n"); 886 "layout(triangle_strip, max_vertices = 6) out;\n");
872 this->appendDecls(fGSInputs, &geomShaderSrc); 887 this->appendDecls(fGSInputs, &geomShaderSrc);
873 this->appendDecls(fGSOutputs, &geomShaderSrc); 888 this->appendDecls(fGSOutputs, &geomShaderSrc);
874 geomShaderSrc.append("void main() {\n"); 889 geomShaderSrc.append("void main() {\n");
875 geomShaderSrc.append("\tfor (int i = 0; i < 3; ++i) {\n" 890 geomShaderSrc.append("\tfor (int i = 0; i < 3; ++i) {\n"
876 "\t\tgl_Position = gl_in[i].gl_Position;\n"); 891 "\t\tgl_Position = gl_in[i].gl_Position;\n");
877 if (fDesc.getHeader().fEmitsPointSize) { 892 if (fDesc.getHeader().fEmitsPointSize) {
878 geomShaderSrc.append("\t\tgl_PointSize = 1.0;\n"); 893 geomShaderSrc.append("\t\tgl_PointSize = 1.0;\n");
879 } 894 }
880 SkASSERT(fGSInputs.count() == fGSOutputs.count()); 895 SkASSERT(fGSInputs.count() == fGSOutputs.count());
881 for (int i = 0; i < fGSInputs.count(); ++i) { 896 for (int i = 0; i < fGSInputs.count(); ++i) {
882 geomShaderSrc.appendf("\t\t%s = %s[i];\n", 897 geomShaderSrc.appendf("\t\t%s = %s[i];\n",
883 fGSOutputs[i].getName().c_str(), 898 fGSOutputs[i].getName().c_str(),
884 fGSInputs[i].getName().c_str()); 899 fGSInputs[i].getName().c_str());
885 } 900 }
886 geomShaderSrc.append("\t\tEmitVertex();\n" 901 geomShaderSrc.append("\t\tEmitVertex();\n"
887 "\t}\n" 902 "\t}\n"
888 "\tEndPrimitive();\n"); 903 "\tEndPrimitive();\n");
889 geomShaderSrc.append("}\n"); 904 geomShaderSrc.append("}\n");
890 if (!attach_shader(glInterface, programId, GR_GL_GEOMETRY_SHADER, geomSh aderSrc)) { 905 if (!attach_shader(glCtx, programId, GR_GL_GEOMETRY_SHADER, geomShaderSr c)) {
891 return false; 906 return false;
892 } 907 }
893 } 908 }
894 #endif 909 #endif
895 910
896 return this->INHERITED::compileAndAttachShaders(programId); 911 return this->INHERITED::compileAndAttachShaders(programId);
897 } 912 }
898 913
899 void GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) const { 914 void GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) const {
900 this->INHERITED::bindProgramLocations(programId); 915 this->INHERITED::bindProgramLocations(programId);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 GrGLSLExpr4* inOutFSColor) { 972 GrGLSLExpr4* inOutFSColor) {
958 973
959 GrGLTexGenProgramEffectsBuilder texGenEffectsBuilder(this, effectCnt); 974 GrGLTexGenProgramEffectsBuilder texGenEffectsBuilder(this, effectCnt);
960 this->INHERITED::createAndEmitEffects(&texGenEffectsBuilder, 975 this->INHERITED::createAndEmitEffects(&texGenEffectsBuilder,
961 effectStages, 976 effectStages,
962 effectKeys, 977 effectKeys,
963 effectCnt, 978 effectCnt,
964 inOutFSColor); 979 inOutFSColor);
965 return texGenEffectsBuilder.finish(); 980 return texGenEffectsBuilder.finish();
966 } 981 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLContext.cpp ('k') | src/gpu/gl/GrGLUtil.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698