| OLD | NEW |
| 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 "GrGLProgramBuilder.h" | 8 #include "GrGLProgramBuilder.h" |
| 9 #include "gl/GrGLGeometryProcessor.h" | |
| 10 #include "gl/GrGLProgram.h" | 9 #include "gl/GrGLProgram.h" |
| 11 #include "gl/GrGLSLPrettyPrint.h" | 10 #include "gl/GrGLSLPrettyPrint.h" |
| 12 #include "gl/GrGLUniformHandle.h" | 11 #include "gl/GrGLUniformHandle.h" |
| 13 #include "../GrGpuGL.h" | 12 #include "../GrGpuGL.h" |
| 14 #include "GrCoordTransform.h" | 13 #include "GrCoordTransform.h" |
| 15 #include "GrGLLegacyNvprProgramBuilder.h" | 14 #include "GrGLLegacyNvprProgramBuilder.h" |
| 16 #include "GrGLNvprProgramBuilder.h" | 15 #include "GrGLNvprProgramBuilder.h" |
| 17 #include "GrGLProgramBuilder.h" | 16 #include "GrGLProgramBuilder.h" |
| 18 #include "GrTexture.h" | 17 #include "GrTexture.h" |
| 19 #include "SkRTConf.h" | 18 #include "SkRTConf.h" |
| 20 #include "SkTraceEvent.h" | 19 #include "SkTraceEvent.h" |
| 21 | 20 |
| 22 #define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X) | 21 #define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X) |
| 23 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X) | 22 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X) |
| 24 | 23 |
| 25 // ES2 FS only guarantees mediump and lowp support | 24 // ES2 FS only guarantees mediump and lowp support |
| 26 static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar:
:kMedium_Precision; | 25 static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar:
:kMedium_Precision; |
| 27 | 26 |
| 28 ////////////////////////////////////////////////////////////////////////////// | 27 ////////////////////////////////////////////////////////////////////////////// |
| 29 | 28 |
| 30 const int GrGLProgramBuilder::kVarsPerBlock = 8; | 29 const int GrGLProgramBuilder::kVarsPerBlock = 8; |
| 31 | 30 |
| 32 GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, | 31 GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, |
| 33 const GrGLProgramDesc& desc, | 32 const GrGLProgramDesc& desc, |
| 34 GrGpu::DrawType drawType, | 33 GrGpu::DrawType drawType, |
| 35 const GrGeometryStage* geometryPr
ocessor, | |
| 36 const GrFragmentStage* colorStage
s[], | |
| 37 const GrFragmentStage* coverageSt
ages[], | |
| 38 GrGpuGL* gpu) { | 34 GrGpuGL* gpu) { |
| 39 // create a builder. This will be handed off to effects so they can use it
to add | 35 // create a builder. This will be handed off to effects so they can use it
to add |
| 40 // uniforms, varyings, textures, etc | 36 // uniforms, varyings, textures, etc |
| 41 SkAutoTDelete<GrGLProgramBuilder> builder(CreateProgramBuilder(desc, | 37 SkAutoTDelete<GrGLProgramBuilder> builder(CreateProgramBuilder(desc, |
| 42 optState, | 38 optState, |
| 43 drawType, | 39 drawType, |
| 44 SkToBool(geom
etryProcessor), | 40 optState.hasG
eometryProcessor(), |
| 45 gpu)); | 41 gpu)); |
| 46 | 42 |
| 47 GrGLProgramBuilder* pb = builder.get(); | 43 GrGLProgramBuilder* pb = builder.get(); |
| 48 const GrGLProgramDesc::KeyHeader& header = pb->header(); | 44 const GrGLProgramDesc::KeyHeader& header = pb->header(); |
| 49 | 45 |
| 50 // emit code to read the dst copy texture, if necessary | 46 // emit code to read the dst copy texture, if necessary |
| 51 if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != header.fDstReadKey | 47 if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != header.fDstReadKey |
| 52 && !gpu->glCaps().fbFetchSupport()) { | 48 && !gpu->glCaps().fbFetchSupport()) { |
| 53 pb->fFS.emitCodeToReadDstTexture(); | 49 pb->fFS.emitCodeToReadDstTexture(); |
| 54 } | 50 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 67 pb->fVS.codeAppend("gl_PointSize = 1.0;"); | 63 pb->fVS.codeAppend("gl_PointSize = 1.0;"); |
| 68 } | 64 } |
| 69 if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) { | 65 if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) { |
| 70 pb->fVS.setupBuiltinVertexAttribute("Color", &inputColor); | 66 pb->fVS.setupBuiltinVertexAttribute("Color", &inputColor); |
| 71 } | 67 } |
| 72 if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) { | 68 if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) { |
| 73 pb->fVS.setupBuiltinVertexAttribute("Coverage", &inputCoverage); | 69 pb->fVS.setupBuiltinVertexAttribute("Coverage", &inputCoverage); |
| 74 } | 70 } |
| 75 } | 71 } |
| 76 | 72 |
| 77 pb->createAndEmitProcessors(geometryProcessor, colorStages, coverageStages,
&inputColor, | 73 pb->emitAndInstallProcs(optState, &inputColor, &inputCoverage); |
| 78 &inputCoverage); | |
| 79 | 74 |
| 80 if (hasVertexShader) { | 75 if (hasVertexShader) { |
| 81 pb->fVS.transformSkiaToGLCoords(); | 76 pb->fVS.transformSkiaToGLCoords(); |
| 82 } | 77 } |
| 83 | 78 |
| 84 // write the secondary color output if necessary | 79 // write the secondary color output if necessary |
| 85 if (GrOptDrawState::kNone_SecondaryOutputType != header.fSecondaryOutputType
) { | 80 if (GrOptDrawState::kNone_SecondaryOutputType != header.fSecondaryOutputType
) { |
| 86 pb->fFS.enableSecondaryOutput(inputColor, inputCoverage); | 81 pb->fFS.enableSecondaryOutput(inputColor, inputCoverage); |
| 87 } | 82 } |
| 88 | 83 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 109 GrGLPathRendering::SeparableShaders_TexturingMode); | 104 GrGLPathRendering::SeparableShaders_TexturingMode); |
| 110 SkASSERT(!hasGeometryProcessor); | 105 SkASSERT(!hasGeometryProcessor); |
| 111 return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState, desc)); | 106 return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState, desc)); |
| 112 } else { | 107 } else { |
| 113 return SkNEW_ARGS(GrGLProgramBuilder, (gpu, optState, desc)); | 108 return SkNEW_ARGS(GrGLProgramBuilder, (gpu, optState, desc)); |
| 114 } | 109 } |
| 115 } | 110 } |
| 116 | 111 |
| 117 ///////////////////////////////////////////////////////////////////////////// | 112 ///////////////////////////////////////////////////////////////////////////// |
| 118 | 113 |
| 119 GrGLProgramBuilder::GrGLProgramBuilder(GrGpuGL* gpu, const GrOptDrawState& optSt
ate, | 114 GrGLProgramBuilder::GrGLProgramBuilder(GrGpuGL* gpu, |
| 115 const GrOptDrawState& optState, |
| 120 const GrGLProgramDesc& desc) | 116 const GrGLProgramDesc& desc) |
| 121 : fVS(this) | 117 : fVS(this) |
| 122 , fGS(this) | 118 , fGS(this) |
| 123 , fFS(this, desc) | 119 , fFS(this, desc) |
| 124 , fOutOfStage(true) | 120 , fOutOfStage(true) |
| 125 , fStageIndex(-1) | 121 , fStageIndex(-1) |
| 122 , fGeometryProcessor(NULL) |
| 126 , fOptState(optState) | 123 , fOptState(optState) |
| 127 , fDesc(desc) | 124 , fDesc(desc) |
| 128 , fGpu(gpu) | 125 , fGpu(gpu) |
| 129 , fUniforms(kVarsPerBlock) { | 126 , fUniforms(kVarsPerBlock) { |
| 130 } | 127 } |
| 131 | 128 |
| 132 void GrGLProgramBuilder::addVarying(GrSLType type, | 129 void GrGLProgramBuilder::addVarying(GrSLType type, |
| 133 const char* name, | 130 const char* name, |
| 134 const char** vsOutName, | 131 const char** vsOutName, |
| 135 const char** fsInName, | 132 const char** fsInName, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 this->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 215 this->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 219 kVec4f_GrSLType, | 216 kVec4f_GrSLType, |
| 220 "Coverage", | 217 "Coverage", |
| 221 &name); | 218 &name); |
| 222 *inputCoverage = GrGLSLExpr4(name); | 219 *inputCoverage = GrGLSLExpr4(name); |
| 223 } else if (GrGLProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) { | 220 } else if (GrGLProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) { |
| 224 *inputCoverage = GrGLSLExpr4(1); | 221 *inputCoverage = GrGLSLExpr4(1); |
| 225 } | 222 } |
| 226 } | 223 } |
| 227 | 224 |
| 228 void GrGLProgramBuilder::createAndEmitProcessors(const GrGeometryStage* geometry
Processor, | 225 void GrGLProgramBuilder::emitAndInstallProcs(const GrOptDrawState& optState, |
| 229 const GrFragmentStage* colorSta
ges[], | 226 GrGLSLExpr4* inputColor, |
| 230 const GrFragmentStage* coverage
Stages[], | 227 GrGLSLExpr4* inputCoverage) { |
| 231 GrGLSLExpr4* inputColor, | 228 fFragmentProcessors.reset(SkNEW(GrGLInstalledFragProcs)); |
| 232 GrGLSLExpr4* inputCoverage) { | 229 int numProcs = optState.numFragmentStages(); |
| 233 bool useLocalCoords = fVS.hasExplicitLocalCoords(); | 230 this->emitAndInstallFragProcs(0, optState.numColorStages(), inputColor); |
| 234 | 231 if (optState.hasGeometryProcessor()) { |
| 235 EffectKeyProvider colorKeyProvider(&fDesc, EffectKeyProvider::kColor_EffectT
ype); | 232 const GrGeometryProcessor& gp = *optState.getGeometryProcessor(); |
| 236 int numColorEffects = fDesc.numColorEffects(); | 233 fVS.emitAttributes(gp); |
| 237 GrGLInstalledProcessors* ip = SkNEW_ARGS(GrGLInstalledProcessors, (numColorE
ffects, | 234 ProcKeyProvider keyProvider(&fDesc, ProcKeyProvider::kGeometry_Processor
Type); |
| 238 useLocalC
oords)); | 235 GrGLSLExpr4 output; |
| 239 this->createAndEmitProcessors<GrFragmentStage>(colorStages, numColorEffects,
colorKeyProvider, | 236 this->emitAndInstallProc<GrGeometryProcessor>(gp, 0, keyProvider, *input
Coverage, &output); |
| 240 inputColor, ip); | 237 *inputCoverage = output; |
| 241 fColorEffects.reset(ip); | |
| 242 | |
| 243 if (geometryProcessor) { | |
| 244 fVS.emitAttributes(*geometryProcessor->getProcessor()); | |
| 245 EffectKeyProvider gpKeyProvider(&fDesc, EffectKeyProvider::kGeometryProc
essor_EffectType); | |
| 246 ip = SkNEW_ARGS(GrGLInstalledProcessors, (1, useLocalCoords)); | |
| 247 this->createAndEmitProcessors<GrGeometryStage>(&geometryProcessor, 1, gp
KeyProvider, | |
| 248 inputCoverage, ip); | |
| 249 fGeometryProcessor.reset(ip); | |
| 250 } | 238 } |
| 251 | 239 this->emitAndInstallFragProcs(optState.numColorStages(), numProcs, inputCov
erage); |
| 252 EffectKeyProvider coverageKeyProvider(&fDesc, EffectKeyProvider::kCoverage_E
ffectType); | |
| 253 int numCoverageEffects = fDesc.numCoverageEffects(); | |
| 254 ip = SkNEW_ARGS(GrGLInstalledProcessors, (numCoverageEffects, useLocalCoords
)); | |
| 255 this->createAndEmitProcessors<GrFragmentStage>(coverageStages, numCoverageEf
fects, | |
| 256 coverageKeyProvider, inputCov
erage, ip); | |
| 257 fCoverageEffects.reset(ip); | |
| 258 } | 240 } |
| 259 | 241 |
| 260 template <class ProcessorStage> | 242 void GrGLProgramBuilder::emitAndInstallFragProcs(int procOffset, int numProcs, G
rGLSLExpr4* inOut) { |
| 261 void GrGLProgramBuilder::createAndEmitProcessors(const ProcessorStage* processSt
ages[], | 243 ProcKeyProvider keyProvider(&fDesc, ProcKeyProvider::kFragment_ProcessorType
); |
| 262 int effectCnt, | 244 for (int e = procOffset; e < numProcs; ++e) { |
| 263 const EffectKeyProvider& keyPro
vider, | 245 GrGLSLExpr4 output; |
| 264 GrGLSLExpr4* fsInOutColor, | 246 const GrFragmentStage& stage = fOptState.getFragmentStage(e); |
| 265 GrGLInstalledProcessors* instal
ledProcessors) { | 247 this->emitAndInstallProc<GrFragmentStage>(stage, e, keyProvider, *inOut,
&output); |
| 266 bool effectEmitted = false; | 248 *inOut = output; |
| 267 | |
| 268 GrGLSLExpr4 inColor = *fsInOutColor; | |
| 269 GrGLSLExpr4 outColor; | |
| 270 | |
| 271 for (int e = 0; e < effectCnt; ++e) { | |
| 272 // Program builders have a bit of state we need to clear with each effec
t | |
| 273 AutoStageAdvance adv(this); | |
| 274 const ProcessorStage& stage = *processStages[e]; | |
| 275 SkASSERT(stage.getProcessor()); | |
| 276 | |
| 277 if (inColor.isZeros()) { | |
| 278 SkString inColorName; | |
| 279 | |
| 280 // Effects have no way to communicate zeros, they treat an empty str
ing as ones. | |
| 281 this->nameVariable(&inColorName, '\0', "input"); | |
| 282 fFS.codeAppendf("vec4 %s = %s;", inColorName.c_str(), inColor.c_str(
)); | |
| 283 inColor = inColorName; | |
| 284 } | |
| 285 | |
| 286 // create var to hold stage result | |
| 287 SkString outColorName; | |
| 288 this->nameVariable(&outColorName, '\0', "output"); | |
| 289 fFS.codeAppendf("vec4 %s;", outColorName.c_str()); | |
| 290 outColor = outColorName; | |
| 291 | |
| 292 SkASSERT(installedProcessors); | |
| 293 const typename ProcessorStage::Processor& processor = *stage.getProcesso
r(); | |
| 294 SkSTArray<2, GrGLProcessor::TransformedCoords> coords(processor.numTrans
forms()); | |
| 295 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(processor.numTextur
es()); | |
| 296 | |
| 297 this->emitTransforms(stage, &coords, installedProcessors); | |
| 298 this->emitSamplers(processor, &samplers, installedProcessors); | |
| 299 | |
| 300 typename ProcessorStage::GLProcessor* glEffect = | |
| 301 processor.getFactory().createGLInstance(processor); | |
| 302 installedProcessors->addEffect(glEffect); | |
| 303 | |
| 304 // Enclose custom code in a block to avoid namespace conflicts | |
| 305 SkString openBrace; | |
| 306 openBrace.printf("{ // Stage %d: %s\n", fStageIndex, glEffect->name()); | |
| 307 fFS.codeAppend(openBrace.c_str()); | |
| 308 fVS.codeAppend(openBrace.c_str()); | |
| 309 | |
| 310 glEffect->emitCode(this, processor, keyProvider.get(e), outColor.c_str()
, | |
| 311 inColor.isOnes() ? NULL : inColor.c_str(), coords, sa
mplers); | |
| 312 | |
| 313 // We have to check that effects and the code they emit are consistent,
ie if an effect | |
| 314 // asks for dst color, then the emit code needs to follow suit | |
| 315 verify(processor); | |
| 316 fFS.codeAppend("}"); | |
| 317 fVS.codeAppend("}"); | |
| 318 | |
| 319 inColor = outColor; | |
| 320 effectEmitted = true; | |
| 321 } | |
| 322 | |
| 323 if (effectEmitted) { | |
| 324 *fsInOutColor = outColor; | |
| 325 } | 249 } |
| 326 } | 250 } |
| 327 | 251 |
| 252 // TODO Processors cannot output zeros because an empty string is all 1s |
| 253 // the fix is to allow effects to take the GrGLSLExpr4 directly |
| 254 template <class Proc> |
| 255 void GrGLProgramBuilder::emitAndInstallProc(const Proc& proc, |
| 256 int index, |
| 257 const ProcKeyProvider keyProvider, |
| 258 const GrGLSLExpr4& input, |
| 259 GrGLSLExpr4* output) { |
| 260 // Program builders have a bit of state we need to clear with each effect |
| 261 AutoStageAdvance adv(this); |
| 262 |
| 263 // create var to hold stage result |
| 264 SkString outColorName; |
| 265 this->nameVariable(&outColorName, '\0', "output"); |
| 266 fFS.codeAppendf("vec4 %s;", outColorName.c_str()); |
| 267 *output = outColorName; |
| 268 |
| 269 // Enclose custom code in a block to avoid namespace conflicts |
| 270 SkString openBrace; |
| 271 openBrace.printf("{ // Stage %d\n", fStageIndex); |
| 272 fFS.codeAppend(openBrace.c_str()); |
| 273 |
| 274 this->emitAndInstallProc(proc, keyProvider.get(index), output->c_str(), |
| 275 input.isOnes() ? NULL : input.c_str()); |
| 276 |
| 277 fFS.codeAppend("}"); |
| 278 } |
| 279 |
| 280 void GrGLProgramBuilder::emitAndInstallProc(const GrFragmentStage& fs, |
| 281 const GrProcessorKey& key, |
| 282 const char* outColor, |
| 283 const char* inColor) { |
| 284 GrGLInstalledFragProc* ifp = SkNEW_ARGS(GrGLInstalledFragProc, (fVS.hasLocal
Coords())); |
| 285 |
| 286 const GrFragmentProcessor& fp = *fs.getProcessor(); |
| 287 ifp->fGLProc.reset(fp.getFactory().createGLInstance(fp)); |
| 288 |
| 289 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(fp.numTextures()); |
| 290 this->emitSamplers(fp, &samplers, ifp); |
| 291 |
| 292 // Fragment processors can have coord transforms |
| 293 SkSTArray<2, GrGLProcessor::TransformedCoords> coords(fp.numTransforms()); |
| 294 this->emitTransforms(fs, &coords, ifp); |
| 295 |
| 296 ifp->fGLProc->emitCode(this, fp, key, outColor, inColor, coords, samplers); |
| 297 |
| 298 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
| 299 // asks for dst color, then the emit code needs to follow suit |
| 300 verify(fp); |
| 301 fFragmentProcessors->fProcs.push_back(ifp); |
| 302 } |
| 303 |
| 304 void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& gp, |
| 305 const GrProcessorKey& key, |
| 306 const char* outColor, |
| 307 const char* inColor) { |
| 308 SkASSERT(!fGeometryProcessor); |
| 309 fGeometryProcessor = SkNEW(GrGLInstalledGeoProc); |
| 310 |
| 311 fGeometryProcessor->fGLProc.reset(gp.getFactory().createGLInstance(gp)); |
| 312 |
| 313 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(gp.numTextures()); |
| 314 this->emitSamplers(gp, &samplers, fGeometryProcessor); |
| 315 |
| 316 SkSTArray<2, GrGLProcessor::TransformedCoords> coords; |
| 317 |
| 318 // TODO remove coords from emit code signature, probably best to use a struc
t here so these |
| 319 // updates are less painful |
| 320 fGeometryProcessor->fGLProc->emitCode(this, gp, key, outColor, inColor, coor
ds, samplers); |
| 321 |
| 322 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
| 323 // asks for dst color, then the emit code needs to follow suit |
| 324 verify(gp); |
| 325 } |
| 326 |
| 328 void GrGLProgramBuilder::verify(const GrGeometryProcessor& gp) { | 327 void GrGLProgramBuilder::verify(const GrGeometryProcessor& gp) { |
| 329 SkASSERT(fFS.hasReadFragmentPosition() == gp.willReadFragmentPosition()); | 328 SkASSERT(fFS.hasReadFragmentPosition() == gp.willReadFragmentPosition()); |
| 330 } | 329 } |
| 331 | 330 |
| 332 void GrGLProgramBuilder::verify(const GrFragmentProcessor& fp) { | 331 void GrGLProgramBuilder::verify(const GrFragmentProcessor& fp) { |
| 333 SkASSERT(fFS.hasReadFragmentPosition() == fp.willReadFragmentPosition()); | 332 SkASSERT(fFS.hasReadFragmentPosition() == fp.willReadFragmentPosition()); |
| 334 SkASSERT(fFS.hasReadDstColor() == fp.willReadDstColor()); | 333 SkASSERT(fFS.hasReadDstColor() == fp.willReadDstColor()); |
| 335 } | 334 } |
| 336 | 335 |
| 337 void GrGLProgramBuilder::emitTransforms(const GrProcessorStage& effectStage, | 336 void GrGLProgramBuilder::emitTransforms(const GrFragmentStage& effectStage, |
| 338 GrGLProcessor::TransformedCoordsArray* o
utCoords, | 337 GrGLProcessor::TransformedCoordsArray* o
utCoords, |
| 339 GrGLInstalledProcessors* installedProces
sors) { | 338 GrGLInstalledFragProc* ifp) { |
| 340 SkTArray<GrGLInstalledProcessors::Transform, true>& transforms = | 339 const GrFragmentProcessor* effect = effectStage.getProcessor(); |
| 341 installedProcessors->addTransforms(); | |
| 342 const GrProcessor* effect = effectStage.getProcessor(); | |
| 343 int numTransforms = effect->numTransforms(); | 340 int numTransforms = effect->numTransforms(); |
| 344 transforms.push_back_n(numTransforms); | 341 ifp->fTransforms.push_back_n(numTransforms); |
| 345 | 342 |
| 346 for (int t = 0; t < numTransforms; t++) { | 343 for (int t = 0; t < numTransforms; t++) { |
| 347 const char* uniName = "StageMatrix"; | 344 const char* uniName = "StageMatrix"; |
| 348 GrSLType varyingType = | 345 GrSLType varyingType = |
| 349 effectStage.isPerspectiveCoordTransform(t, fVS.hasExplicitLocalC
oords()) ? | 346 effectStage.isPerspectiveCoordTransform(t, fVS.hasLocalCoords())
? |
| 350 kVec3f_GrSLType : | 347 kVec3f_GrSLType : |
| 351 kVec2f_GrSLType; | 348 kVec2f_GrSLType; |
| 352 | 349 |
| 353 SkString suffixedUniName; | 350 SkString suffixedUniName; |
| 354 if (0 != t) { | 351 if (0 != t) { |
| 355 suffixedUniName.append(uniName); | 352 suffixedUniName.append(uniName); |
| 356 suffixedUniName.appendf("_%i", t); | 353 suffixedUniName.appendf("_%i", t); |
| 357 uniName = suffixedUniName.c_str(); | 354 uniName = suffixedUniName.c_str(); |
| 358 } | 355 } |
| 359 transforms[t].fHandle = this->addUniform(GrGLProgramBuilder::kVertex_Vis
ibility, | 356 ifp->fTransforms[t].fHandle = this->addUniform(GrGLProgramBuilder::kVert
ex_Visibility, |
| 360 kMat33f_GrSLType, | 357 kMat33f_GrSLType, |
| 361 uniName, | 358 uniName, |
| 362 &uniName).toShaderBuilderIndex(
); | 359 &uniName).toShaderBuilder
Index(); |
| 363 | 360 |
| 364 const char* varyingName = "MatrixCoord"; | 361 const char* varyingName = "MatrixCoord"; |
| 365 SkString suffixedVaryingName; | 362 SkString suffixedVaryingName; |
| 366 if (0 != t) { | 363 if (0 != t) { |
| 367 suffixedVaryingName.append(varyingName); | 364 suffixedVaryingName.append(varyingName); |
| 368 suffixedVaryingName.appendf("_%i", t); | 365 suffixedVaryingName.appendf("_%i", t); |
| 369 varyingName = suffixedVaryingName.c_str(); | 366 varyingName = suffixedVaryingName.c_str(); |
| 370 } | 367 } |
| 371 const char* vsVaryingName; | 368 const char* vsVaryingName; |
| 372 const char* fsVaryingName; | 369 const char* fsVaryingName; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 386 fVS.codeAppendf("%s = %s * vec3(%s, 1);", | 383 fVS.codeAppendf("%s = %s * vec3(%s, 1);", |
| 387 vsVaryingName, uniName, coords.c_str()); | 384 vsVaryingName, uniName, coords.c_str()); |
| 388 } | 385 } |
| 389 SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords, | 386 SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords, |
| 390 (SkString(fsVaryingName), varyingType)); | 387 (SkString(fsVaryingName), varyingType)); |
| 391 } | 388 } |
| 392 } | 389 } |
| 393 | 390 |
| 394 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, | 391 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, |
| 395 GrGLProcessor::TextureSamplerArray* outSam
plers, | 392 GrGLProcessor::TextureSamplerArray* outSam
plers, |
| 396 GrGLInstalledProcessors* installedProcesso
rs) { | 393 GrGLInstalledProc* ip) { |
| 397 SkTArray<GrGLInstalledProcessors::Sampler, true>& samplers = installedProces
sors->addSamplers(); | |
| 398 int numTextures = processor.numTextures(); | 394 int numTextures = processor.numTextures(); |
| 399 samplers.push_back_n(numTextures); | 395 ip->fSamplers.push_back_n(numTextures); |
| 400 SkString name; | 396 SkString name; |
| 401 for (int t = 0; t < numTextures; ++t) { | 397 for (int t = 0; t < numTextures; ++t) { |
| 402 name.printf("Sampler%d", t); | 398 name.printf("Sampler%d", t); |
| 403 samplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, | 399 ip->fSamplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragme
nt_Visibility, |
| 404 kSampler2D_GrSLType, | 400 kSampler2D_GrSLType, |
| 405 name.c_str()); | 401 name.c_str()); |
| 406 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, | 402 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, |
| 407 (samplers[t].fUniform, processor.textureAccess(t)
)); | 403 (ip->fSamplers[t].fUniform, processor.textureAcce
ss(t))); |
| 408 } | 404 } |
| 409 } | 405 } |
| 410 | 406 |
| 411 GrGLProgram* GrGLProgramBuilder::finalize() { | 407 GrGLProgram* GrGLProgramBuilder::finalize() { |
| 412 // verify we can get a program id | 408 // verify we can get a program id |
| 413 GrGLuint programID; | 409 GrGLuint programID; |
| 414 GL_CALL_RET(programID, CreateProgram()); | 410 GL_CALL_RET(programID, CreateProgram()); |
| 415 if (0 == programID) { | 411 if (0 == programID) { |
| 416 return NULL; | 412 return NULL; |
| 417 } | 413 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 cleanupShaders(shaderIDs); | 495 cleanupShaders(shaderIDs); |
| 500 } | 496 } |
| 501 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { | 497 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { |
| 502 for (int i = 0; i < shaderIDs.count(); ++i) { | 498 for (int i = 0; i < shaderIDs.count(); ++i) { |
| 503 GL_CALL(DeleteShader(shaderIDs[i])); | 499 GL_CALL(DeleteShader(shaderIDs[i])); |
| 504 } | 500 } |
| 505 } | 501 } |
| 506 | 502 |
| 507 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { | 503 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { |
| 508 return SkNEW_ARGS(GrGLProgram, (fGpu, fDesc, fUniformHandles, programID, fUn
iforms, | 504 return SkNEW_ARGS(GrGLProgram, (fGpu, fDesc, fUniformHandles, programID, fUn
iforms, |
| 509 fGeometryProcessor, fColorEffects, fCoverage
Effects)); | 505 fGeometryProcessor, fFragmentProcessors.get(
))); |
| 510 } | 506 } |
| 511 | 507 |
| 512 //////////////////////////////////////////////////////////////////////////////// | 508 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 513 | 509 |
| 514 GrGLInstalledProcessors::~GrGLInstalledProcessors() { | 510 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { |
| 515 int numEffects = fGLProcessors.count(); | 511 int numProcs = fProcs.count(); |
| 516 for (int e = 0; e < numEffects; ++e) { | 512 for (int e = 0; e < numProcs; ++e) { |
| 517 SkDELETE(fGLProcessors[e]); | 513 SkDELETE(fProcs[e]); |
| 518 } | 514 } |
| 519 } | 515 } |
| OLD | NEW |