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

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

Issue 12462008: Add GrEllipseEdgeEffect (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Cleaned up nits, adjusted some interfaces Created 7 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "GrGLProgram.h" 8 #include "GrGLProgram.h"
9 9
10 #include "GrAllocator.h" 10 #include "GrAllocator.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 118
119 if (!skipCoverage && (desc->fAttribBindings & GrDrawState::kEdge_AttribBindi ngsBit)) { 119 if (!skipCoverage && (desc->fAttribBindings & GrDrawState::kEdge_AttribBindi ngsBit)) {
120 desc->fVertexEdgeType = drawState.getVertexEdgeType(); 120 desc->fVertexEdgeType = drawState.getVertexEdgeType();
121 desc->fDiscardIfOutsideEdge = drawState.getStencil().doesWrite(); 121 desc->fDiscardIfOutsideEdge = drawState.getStencil().doesWrite();
122 } else { 122 } else {
123 // Use canonical values when edge-aa is not enabled to avoid program cac he misses. 123 // Use canonical values when edge-aa is not enabled to avoid program cac he misses.
124 desc->fVertexEdgeType = GrDrawState::kHairLine_EdgeType; 124 desc->fVertexEdgeType = GrDrawState::kHairLine_EdgeType;
125 desc->fDiscardIfOutsideEdge = false; 125 desc->fDiscardIfOutsideEdge = false;
126 } 126 }
127 127
128 desc->fEffectAttributes.reset();
128 for (int s = 0; s < GrDrawState::kNumStages; ++s) { 129 for (int s = 0; s < GrDrawState::kNumStages; ++s) {
129 130
130 bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCove rage; 131 bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCove rage;
131 if (!skip && drawState.isStageEnabled(s)) { 132 if (!skip && drawState.isStageEnabled(s)) {
132 lastEnabledStage = s; 133 lastEnabledStage = s;
133 const GrEffectRef& effect = *drawState.getStage(s).getEffect(); 134 const GrEffectRef& effect = *drawState.getStage(s).getEffect();
134 const GrBackendEffectFactory& factory = effect->getFactory(); 135 const GrBackendEffectFactory& factory = effect->getFactory();
135 desc->fEffectKeys[s] = factory.glEffectKey(drawState.getStage(s), gp u->glCaps()); 136 desc->fEffectKeys[s] = factory.glEffectKey(drawState.getStage(s), gp u->glCaps());
137 int attrCount = drawState.getStage(s).getVertexAttribIndexCount();
138 GrAssert(attrCount == effect.get()->numVertexAttribs());
139 for (int i = 0; i < attrCount; ++i) {
140 Desc::AttribPair pair;
141 pair.fIndex = drawState.getStage(s).getVertexAttribIndices()[i];
142 pair.fName = effect.get()->vertexAttribName(i);
143 desc->fEffectAttributes.push_back(pair);
144 }
136 } else { 145 } else {
137 desc->fEffectKeys[s] = 0; 146 desc->fEffectKeys[s] = 0;
138 } 147 }
139 } 148 }
140 149
141 desc->fDualSrcOutput = Desc::kNone_DualSrcOutput; 150 desc->fDualSrcOutput = Desc::kNone_DualSrcOutput;
142 151
143 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything 152 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything
144 // other than pass through values from the VS to the FS anyway). 153 // other than pass through values from the VS to the FS anyway).
145 #if GR_GL_EXPERIMENTAL_GS 154 #if GR_GL_EXPERIMENTAL_GS
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 builder->fHeader.printf("#extension GL_OES_standard_derivatives: enable\n"); 464 builder->fHeader.printf("#extension GL_OES_standard_derivatives: enable\n");
456 } 465 }
457 break; 466 break;
458 case GrDrawState::kCircle_EdgeType: 467 case GrDrawState::kCircle_EdgeType:
459 builder->fFSCode.append("\tfloat edgeAlpha;\n"); 468 builder->fFSCode.append("\tfloat edgeAlpha;\n");
460 builder->fFSCode.appendf("\tfloat d = distance(%s.xy, %s.xy);\n", bu ilder->fragmentPosition(), fsName); 469 builder->fFSCode.appendf("\tfloat d = distance(%s.xy, %s.xy);\n", bu ilder->fragmentPosition(), fsName);
461 builder->fFSCode.appendf("\tfloat outerAlpha = smoothstep(d - 0.5, d + 0.5, %s.z);\n", fsName); 470 builder->fFSCode.appendf("\tfloat outerAlpha = smoothstep(d - 0.5, d + 0.5, %s.z);\n", fsName);
462 builder->fFSCode.appendf("\tfloat innerAlpha = %s.w == 0.0 ? 1.0 : s moothstep(%s.w - 0.5, %s.w + 0.5, d);\n", fsName, fsName, fsName); 471 builder->fFSCode.appendf("\tfloat innerAlpha = %s.w == 0.0 ? 1.0 : s moothstep(%s.w - 0.5, %s.w + 0.5, d);\n", fsName, fsName, fsName);
463 builder->fFSCode.append("\tedgeAlpha = outerAlpha * innerAlpha;\n"); 472 builder->fFSCode.append("\tedgeAlpha = outerAlpha * innerAlpha;\n");
464 break; 473 break;
465 case GrDrawState::kEllipse_EdgeType:
466 builder->fFSCode.append("\tfloat edgeAlpha;\n");
467 builder->fFSCode.appendf("\tvec2 offset = (%s.xy - %s.xy);\n", build er->fragmentPosition(), fsName);
468 builder->fFSCode.appendf("\toffset.y *= %s.w;\n", fsName);
469 builder->fFSCode.append("\tfloat d = length(offset);\n");
470 builder->fFSCode.appendf("\tedgeAlpha = smoothstep(d - 0.5, d + 0.5, %s.z);\n", fsName);
471 break;
472 default: 474 default:
473 GrCrash("Unknown Edge Type!"); 475 GrCrash("Unknown Edge Type!");
474 break; 476 break;
475 } 477 }
476 if (fDesc.fDiscardIfOutsideEdge) { 478 if (fDesc.fDiscardIfOutsideEdge) {
477 builder->fFSCode.appendf("\tif (edgeAlpha <= 0.0) {\n\t\tdiscard;\n\ t}\n"); 479 builder->fFSCode.appendf("\tif (edgeAlpha <= 0.0) {\n\t\tdiscard;\n\ t}\n");
478 } 480 }
479 *coverageVar = "edgeAlpha"; 481 *coverageVar = "edgeAlpha";
480 return true; 482 return true;
481 } else { 483 } else {
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 *stages[s], 909 *stages[s],
908 fDesc.fEffectKeys[s], 910 fDesc.fEffectKeys[s],
909 inCoverage.size() ? inCovera ge.c_str() : NULL, 911 inCoverage.size() ? inCovera ge.c_str() : NULL,
910 outCoverage.c_str(), 912 outCoverage.c_str(),
911 inCoords, 913 inCoords,
912 &fUniformHandles.fSamplerUni s[s]); 914 &fUniformHandles.fSamplerUni s[s]);
913 builder.setNonStage(); 915 builder.setNonStage();
914 inCoverage = outCoverage; 916 inCoverage = outCoverage;
915 } 917 }
916 } 918 }
919
920 // discard if coverage is zero
921 if (fDesc.fDiscardIfOutsideEdge && !outCoverage.isEmpty()) {
922 builder.fFSCode.appendf("\tif (all(lessThan(%s, vec4(0.0))) {\n\ t\tdiscard;\n\t}\n", outCoverage.c_str());
923 }
917 } 924 }
918 925
919 if (Desc::kNone_DualSrcOutput != fDesc.fDualSrcOutput) { 926 if (Desc::kNone_DualSrcOutput != fDesc.fDualSrcOutput) {
920 builder.fFSOutputs.push_back().set(kVec4f_GrSLType, 927 builder.fFSOutputs.push_back().set(kVec4f_GrSLType,
921 GrGLShaderVar::kOut_TypeModifier, 928 GrGLShaderVar::kOut_TypeModifier,
922 dual_source_output_name()); 929 dual_source_output_name());
923 bool outputIsZero = coverageIsZero; 930 bool outputIsZero = coverageIsZero;
924 SkString coeff; 931 SkString coeff;
925 if (!outputIsZero && 932 if (!outputIsZero &&
926 Desc::kCoverage_DualSrcOutput != fDesc.fDualSrcOutput && !wroteF ragColorZero) { 933 Desc::kCoverage_DualSrcOutput != fDesc.fDualSrcOutput && !wroteF ragColorZero) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_ NAME)); 1023 GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_ NAME));
1017 GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_AT TR_NAME)); 1024 GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_AT TR_NAME));
1018 1025
1019 if (fDesc.fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) { 1026 if (fDesc.fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) {
1020 GL_CALL(BindAttribLocation(fProgramID, fDesc.fEdgeAttributeIndex, EDGE_A TTR_NAME)); 1027 GL_CALL(BindAttribLocation(fProgramID, fDesc.fEdgeAttributeIndex, EDGE_A TTR_NAME));
1021 } 1028 }
1022 if (GrDrawState::AttributesBindExplicitTexCoords(fDesc.fAttribBindings)) { 1029 if (GrDrawState::AttributesBindExplicitTexCoords(fDesc.fAttribBindings)) {
1023 GL_CALL(BindAttribLocation(fProgramID, fDesc.fTexCoordAttributeIndex, TE X_ATTR_NAME)); 1030 GL_CALL(BindAttribLocation(fProgramID, fDesc.fTexCoordAttributeIndex, TE X_ATTR_NAME));
1024 } 1031 }
1025 1032
1033 const Desc::AttribPair* attribEnd = fDesc.fEffectAttributes.end();
1034 for (const Desc::AttribPair* attrib = fDesc.fEffectAttributes.begin();
1035 attrib != attribEnd;
1036 ++attrib) {
1037 GL_CALL(BindAttribLocation(fProgramID, attrib->fIndex, attrib->fName));
1038 }
1039
1026 GL_CALL(LinkProgram(fProgramID)); 1040 GL_CALL(LinkProgram(fProgramID));
1027 1041
1028 GrGLint linked = GR_GL_INIT_ZERO; 1042 GrGLint linked = GR_GL_INIT_ZERO;
1029 GL_CALL(GetProgramiv(fProgramID, GR_GL_LINK_STATUS, &linked)); 1043 GL_CALL(GetProgramiv(fProgramID, GR_GL_LINK_STATUS, &linked));
1030 if (!linked) { 1044 if (!linked) {
1031 GrGLint infoLen = GR_GL_INIT_ZERO; 1045 GrGLint infoLen = GR_GL_INIT_ZERO;
1032 GL_CALL(GetProgramiv(fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen)); 1046 GL_CALL(GetProgramiv(fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen));
1033 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger 1047 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger
1034 if (infoLen > 0) { 1048 if (infoLen > 0) {
1035 // retrieve length even though we don't need it to workaround 1049 // retrieve length even though we don't need it to workaround
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 SkScalarToFloat(m[SkMatrix::kMTransX]), 1228 SkScalarToFloat(m[SkMatrix::kMTransX]),
1215 SkScalarToFloat(m[SkMatrix::kMTransY]), 1229 SkScalarToFloat(m[SkMatrix::kMTransY]),
1216 SkScalarToFloat(m[SkMatrix::kMPersp2]) 1230 SkScalarToFloat(m[SkMatrix::kMPersp2])
1217 }; 1231 };
1218 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); 1232 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt);
1219 fMatrixState.fViewMatrix = drawState.getViewMatrix(); 1233 fMatrixState.fViewMatrix = drawState.getViewMatrix();
1220 fMatrixState.fRenderTargetSize = size; 1234 fMatrixState.fRenderTargetSize = size;
1221 fMatrixState.fRenderTargetOrigin = rt->origin(); 1235 fMatrixState.fRenderTargetOrigin = rt->origin();
1222 } 1236 }
1223 } 1237 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698