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

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

Issue 929503002: Multi-string shaders (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: windows warning Created 5 years, 10 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
« no previous file with comments | « src/gpu/gl/builders/GrGLShaderBuilder.h ('k') | src/gpu/gl/builders/GrGLShaderStringBuilder.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 2014 Google Inc. 2 * Copyright 2014 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 "GrGLShaderBuilder.h" 8 #include "GrGLShaderBuilder.h"
9 #include "GrGLProgramBuilder.h" 9 #include "GrGLProgramBuilder.h"
10 #include "GrGLProgramBuilder.h" 10 #include "GrGLShaderStringBuilder.h"
11 #include "../GrGLGpu.h" 11 #include "../GrGLGpu.h"
12 #include "../GrGLShaderVar.h" 12 #include "../GrGLShaderVar.h"
13 13
14 namespace { 14 namespace {
15 inline const char* sample_function_name(GrSLType type, GrGLSLGeneration glslGen) { 15 inline const char* sample_function_name(GrSLType type, GrGLSLGeneration glslGen) {
16 if (kVec2f_GrSLType == type) { 16 if (kVec2f_GrSLType == type) {
17 return glslGen >= k130_GrGLSLGeneration ? "texture" : "texture2D"; 17 return glslGen >= k130_GrGLSLGeneration ? "texture" : "texture2D";
18 } else { 18 } else {
19 SkASSERT(kVec3f_GrSLType == type); 19 SkASSERT(kVec3f_GrSLType == type);
20 return glslGen >= k130_GrGLSLGeneration ? "textureProj" : "texture2DProj "; 20 return glslGen >= k130_GrGLSLGeneration ? "textureProj" : "texture2DProj ";
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 if (memcmp(swizzle, "rgba", 4)) { 52 if (memcmp(swizzle, "rgba", 4)) {
53 out->appendf(".%s", swizzle); 53 out->appendf(".%s", swizzle);
54 } 54 }
55 } 55 }
56 } 56 }
57 57
58 GrGLShaderBuilder::GrGLShaderBuilder(GrGLProgramBuilder* program) 58 GrGLShaderBuilder::GrGLShaderBuilder(GrGLProgramBuilder* program)
59 : fProgramBuilder(program) 59 : fProgramBuilder(program)
60 , fInputs(GrGLProgramBuilder::kVarsPerBlock) 60 , fInputs(GrGLProgramBuilder::kVarsPerBlock)
61 , fOutputs(GrGLProgramBuilder::kVarsPerBlock) 61 , fOutputs(GrGLProgramBuilder::kVarsPerBlock)
62 , fFeaturesAddedMask(0) { 62 , fFeaturesAddedMask(0)
63 , fCodeIndex(kCode)
64 , fFinalized(false) {
65 // We push back some dummy pointers which will later become our header
66 for (int i = 0; i <= kCode; i++) {
67 fShaderStrings.push_back();
68 fCompilerStrings.push_back(NULL);
69 fCompilerStringLengths.push_back(0);
70 }
71
72 this->main() = "void main() {";
63 } 73 }
64 74
65 void GrGLShaderBuilder::declAppend(const GrGLShaderVar& var) { 75 void GrGLShaderBuilder::declAppend(const GrGLShaderVar& var) {
66 SkString tempDecl; 76 SkString tempDecl;
67 var.appendDecl(fProgramBuilder->ctxInfo(), &tempDecl); 77 var.appendDecl(fProgramBuilder->ctxInfo(), &tempDecl);
68 this->codeAppendf("%s;", tempDecl.c_str()); 78 this->codeAppendf("%s;", tempDecl.c_str());
69 } 79 }
70 80
71 void GrGLShaderBuilder::emitFunction(GrSLType returnType, 81 void GrGLShaderBuilder::emitFunction(GrSLType returnType,
72 const char* name, 82 const char* name,
73 int argCnt, 83 int argCnt,
74 const GrGLShaderVar* args, 84 const GrGLShaderVar* args,
75 const char* body, 85 const char* body,
76 SkString* outName) { 86 SkString* outName) {
77 fFunctions.append(GrGLSLTypeString(returnType)); 87 this->functions().append(GrGLSLTypeString(returnType));
78 fProgramBuilder->nameVariable(outName, '\0', name); 88 fProgramBuilder->nameVariable(outName, '\0', name);
79 fFunctions.appendf(" %s", outName->c_str()); 89 this->functions().appendf(" %s", outName->c_str());
80 fFunctions.append("("); 90 this->functions().append("(");
81 const GrGLContextInfo& ctxInfo = fProgramBuilder->gpu()->ctxInfo(); 91 const GrGLContextInfo& ctxInfo = fProgramBuilder->gpu()->ctxInfo();
82 for (int i = 0; i < argCnt; ++i) { 92 for (int i = 0; i < argCnt; ++i) {
83 args[i].appendDecl(ctxInfo, &fFunctions); 93 args[i].appendDecl(ctxInfo, &this->functions());
84 if (i < argCnt - 1) { 94 if (i < argCnt - 1) {
85 fFunctions.append(", "); 95 this->functions().append(", ");
86 } 96 }
87 } 97 }
88 fFunctions.append(") {\n"); 98 this->functions().append(") {\n");
89 fFunctions.append(body); 99 this->functions().append(body);
90 fFunctions.append("}\n\n"); 100 this->functions().append("}\n\n");
91 } 101 }
92 102
93 void GrGLShaderBuilder::appendTextureLookup(SkString* out, 103 void GrGLShaderBuilder::appendTextureLookup(SkString* out,
94 const TextureSampler& sampler, 104 const TextureSampler& sampler,
95 const char* coordName, 105 const char* coordName,
96 GrSLType varyingType) const { 106 GrSLType varyingType) const {
97 append_texture_lookup(out, 107 append_texture_lookup(out,
98 fProgramBuilder->gpu(), 108 fProgramBuilder->gpu(),
99 fProgramBuilder->getUniformCStr(sampler.fSamplerUnifor m), 109 fProgramBuilder->getUniformCStr(sampler.fSamplerUnifor m),
100 coordName, 110 coordName,
101 sampler.configComponentMask(), 111 sampler.configComponentMask(),
102 sampler.swizzle(), 112 sampler.swizzle(),
103 varyingType); 113 varyingType);
104 } 114 }
105 115
106 void GrGLShaderBuilder::appendTextureLookup(const TextureSampler& sampler, 116 void GrGLShaderBuilder::appendTextureLookup(const TextureSampler& sampler,
107 const char* coordName, 117 const char* coordName,
108 GrSLType varyingType) { 118 GrSLType varyingType) {
109 this->appendTextureLookup(&fCode, sampler, coordName, varyingType); 119 this->appendTextureLookup(&this->code(), sampler, coordName, varyingType);
110 } 120 }
111 121
112 void GrGLShaderBuilder::appendTextureLookupAndModulate(const char* modulation, 122 void GrGLShaderBuilder::appendTextureLookupAndModulate(const char* modulation,
113 const TextureSampler& sam pler, 123 const TextureSampler& sam pler,
114 const char* coordName, 124 const char* coordName,
115 GrSLType varyingType) { 125 GrSLType varyingType) {
116 SkString lookup; 126 SkString lookup;
117 this->appendTextureLookup(&lookup, sampler, coordName, varyingType); 127 this->appendTextureLookup(&lookup, sampler, coordName, varyingType);
118 this->codeAppend((GrGLSLExpr4(modulation) * GrGLSLExpr4(lookup)).c_str()); 128 this->codeAppend((GrGLSLExpr4(modulation) * GrGLSLExpr4(lookup)).c_str());
119 } 129 }
(...skipping 10 matching lines...) Expand all
130 return gAlphaSmear; 140 return gAlphaSmear;
131 } 141 }
132 } else { 142 } else {
133 static const GrGLenum gStraight[] = { GR_GL_RED, GR_GL_GREEN, GR_GL_BLUE , GR_GL_ALPHA }; 143 static const GrGLenum gStraight[] = { GR_GL_RED, GR_GL_GREEN, GR_GL_BLUE , GR_GL_ALPHA };
134 return gStraight; 144 return gStraight;
135 } 145 }
136 } 146 }
137 147
138 void GrGLShaderBuilder::addFeature(uint32_t featureBit, const char* extensionNam e) { 148 void GrGLShaderBuilder::addFeature(uint32_t featureBit, const char* extensionNam e) {
139 if (!(featureBit & fFeaturesAddedMask)) { 149 if (!(featureBit & fFeaturesAddedMask)) {
140 fExtensions.appendf("#extension %s: require\n", extensionName); 150 this->extensions().appendf("#extension %s: require\n", extensionName);
141 fFeaturesAddedMask |= featureBit; 151 fFeaturesAddedMask |= featureBit;
142 } 152 }
143 } 153 }
144 154
145 void GrGLShaderBuilder::appendDecls(const VarArray& vars, SkString* out) const { 155 void GrGLShaderBuilder::appendDecls(const VarArray& vars, SkString* out) const {
146 for (int i = 0; i < vars.count(); ++i) { 156 for (int i = 0; i < vars.count(); ++i) {
147 vars[i].appendDecl(fProgramBuilder->ctxInfo(), out); 157 vars[i].appendDecl(fProgramBuilder->ctxInfo(), out);
148 out->append(";\n"); 158 out->append(";\n");
149 } 159 }
150 } 160 }
151 161
152 void GrGLShaderBuilder::appendTextureLookup(const char* samplerName, 162 void GrGLShaderBuilder::appendTextureLookup(const char* samplerName,
153 const char* coordName, 163 const char* coordName,
154 uint32_t configComponentMask, 164 uint32_t configComponentMask,
155 const char* swizzle) { 165 const char* swizzle) {
156 append_texture_lookup(&fCode, 166 append_texture_lookup(&this->code(),
157 fProgramBuilder->gpu(), 167 fProgramBuilder->gpu(),
158 samplerName, 168 samplerName,
159 coordName, 169 coordName,
160 configComponentMask, 170 configComponentMask,
161 swizzle, 171 swizzle,
162 kVec2f_GrSLType); 172 kVec2f_GrSLType);
163 } 173 }
174
175 bool
176 GrGLShaderBuilder::finalize(GrGLuint programId, GrGLenum type, SkTDArray<GrGLuin t>* shaderIds) {
177 SkASSERT(!fFinalized);
178 // append the 'footer' to code
179 this->code().append("}");
180
181 for (int i = 0; i <= fCodeIndex; i++) {
182 fCompilerStrings[i] = fShaderStrings[i].c_str();
183 fCompilerStringLengths[i] = (int)fShaderStrings[i].size();
184 }
185
186 GrGLGpu* gpu = fProgramBuilder->gpu();
187 GrGLuint shaderId = GrGLCompileAndAttachShader(gpu->glContext(),
188 programId,
189 type,
190 fCompilerStrings.begin(),
191 fCompilerStringLengths.begin( ),
192 fCompilerStrings.count(),
193 gpu->stats());
194
195 fFinalized = true;
196
197 if (!shaderId) {
198 return false;
199 }
200
201 *shaderIds->append() = shaderId;
202
203 return true;
204 }
OLDNEW
« no previous file with comments | « src/gpu/gl/builders/GrGLShaderBuilder.h ('k') | src/gpu/gl/builders/GrGLShaderStringBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698