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 | 9 |
10 #include "GrAutoLocaleSetter.h" | 10 #include "GrAutoLocaleSetter.h" |
11 #include "GrCoordTransform.h" | 11 #include "GrCoordTransform.h" |
12 #include "GrGLProgramBuilder.h" | 12 #include "GrGLProgramBuilder.h" |
13 #include "GrTexture.h" | 13 #include "GrTexture.h" |
14 #include "SkRTConf.h" | 14 #include "SkRTConf.h" |
15 #include "SkTraceEvent.h" | 15 #include "SkTraceEvent.h" |
16 #include "gl/GrGLGeometryProcessor.h" | 16 #include "gl/GrGLGeometryProcessor.h" |
17 #include "gl/GrGLGpu.h" | 17 #include "gl/GrGLGpu.h" |
18 #include "gl/GrGLProgram.h" | 18 #include "gl/GrGLProgram.h" |
19 #include "gl/GrGLSLPrettyPrint.h" | 19 #include "gl/GrGLSLPrettyPrint.h" |
20 #include "gl/GrGLXferProcessor.h" | 20 #include "gl/GrGLXferProcessor.h" |
21 #include "glsl/GrGLSLCaps.h" | 21 #include "glsl/GrGLSLCaps.h" |
22 #include "glsl/GrGLSLProgramDataManager.h" | 22 #include "glsl/GrGLSLProgramDataManager.h" |
| 23 #include "glsl/GrGLSLTextureSampler.h" |
23 | 24 |
24 #define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X) | 25 #define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X) |
25 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X) | 26 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X) |
26 | 27 |
27 const int GrGLProgramBuilder::kVarsPerBlock = 8; | 28 const int GrGLProgramBuilder::kVarsPerBlock = 8; |
28 | 29 |
29 GrGLProgram* GrGLProgramBuilder::CreateProgram(const DrawArgs& args, GrGLGpu* gp
u) { | 30 GrGLProgram* GrGLProgramBuilder::CreateProgram(const DrawArgs& args, GrGLGpu* gp
u) { |
30 GrAutoLocaleSetter als("C"); | 31 GrAutoLocaleSetter als("C"); |
31 | 32 |
32 // create a builder. This will be handed off to effects so they can use it
to add | 33 // create a builder. This will be handed off to effects so they can use it
to add |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 } | 273 } |
273 | 274 |
274 void GrGLProgramBuilder::emitAndInstallProc(const GrFragmentProcessor& fp, | 275 void GrGLProgramBuilder::emitAndInstallProc(const GrFragmentProcessor& fp, |
275 int index, | 276 int index, |
276 const char* outColor, | 277 const char* outColor, |
277 const char* inColor) { | 278 const char* inColor) { |
278 GrGLInstalledFragProc* ifp = new GrGLInstalledFragProc; | 279 GrGLInstalledFragProc* ifp = new GrGLInstalledFragProc; |
279 | 280 |
280 ifp->fGLProc.reset(fp.createGLInstance()); | 281 ifp->fGLProc.reset(fp.createGLInstance()); |
281 | 282 |
282 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(fp.numTextures()); | 283 SkSTArray<4, GrGLSLTextureSampler> samplers(fp.numTextures()); |
283 this->emitSamplers(fp, &samplers, ifp); | 284 this->emitSamplers(fp, &samplers, ifp); |
284 | 285 |
285 GrGLFragmentProcessor::EmitArgs args(this, fp, outColor, inColor, fOutCoords
[index], samplers); | 286 GrGLFragmentProcessor::EmitArgs args(this, fp, outColor, inColor, fOutCoords
[index], samplers); |
286 ifp->fGLProc->emitCode(args); | 287 ifp->fGLProc->emitCode(args); |
287 | 288 |
288 // We have to check that effects and the code they emit are consistent, ie i
f an effect | 289 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
289 // asks for dst color, then the emit code needs to follow suit | 290 // asks for dst color, then the emit code needs to follow suit |
290 verify(fp); | 291 verify(fp); |
291 fFragmentProcessors->fProcs.push_back(ifp); | 292 fFragmentProcessors->fProcs.push_back(ifp); |
292 } | 293 } |
293 | 294 |
294 void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp, | 295 void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp, |
295 const char* outColor, | 296 const char* outColor, |
296 const char* outCoverage) { | 297 const char* outCoverage) { |
297 SkASSERT(!fGeometryProcessor); | 298 SkASSERT(!fGeometryProcessor); |
298 fGeometryProcessor = new GrGLInstalledGeoProc; | 299 fGeometryProcessor = new GrGLInstalledGeoProc; |
299 | 300 |
300 fGeometryProcessor->fGLProc.reset(gp.createGLInstance(*fGpu->glCaps().glslCa
ps())); | 301 fGeometryProcessor->fGLProc.reset(gp.createGLInstance(*fGpu->glCaps().glslCa
ps())); |
301 | 302 |
302 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(gp.numTextures()); | 303 SkSTArray<4, GrGLSLTextureSampler> samplers(gp.numTextures()); |
303 this->emitSamplers(gp, &samplers, fGeometryProcessor); | 304 this->emitSamplers(gp, &samplers, fGeometryProcessor); |
304 | 305 |
305 GrGLGeometryProcessor::EmitArgs args(this, gp, outColor, outCoverage, sample
rs, | 306 GrGLGeometryProcessor::EmitArgs args(this, gp, outColor, outCoverage, sample
rs, |
306 fCoordTransforms, &fOutCoords); | 307 fCoordTransforms, &fOutCoords); |
307 fGeometryProcessor->fGLProc->emitCode(args); | 308 fGeometryProcessor->fGLProc->emitCode(args); |
308 | 309 |
309 // We have to check that effects and the code they emit are consistent, ie i
f an effect | 310 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
310 // asks for dst color, then the emit code needs to follow suit | 311 // asks for dst color, then the emit code needs to follow suit |
311 verify(gp); | 312 verify(gp); |
312 } | 313 } |
(...skipping 15 matching lines...) Expand all Loading... |
328 } | 329 } |
329 | 330 |
330 if (this->ctxInfo().caps()->glslCaps()->mustDeclareFragmentShaderOutput()) { | 331 if (this->ctxInfo().caps()->glslCaps()->mustDeclareFragmentShaderOutput()) { |
331 fFS.enableCustomOutput(); | 332 fFS.enableCustomOutput(); |
332 } | 333 } |
333 | 334 |
334 SkString openBrace; | 335 SkString openBrace; |
335 openBrace.printf("{ // Xfer Processor: %s\n", xp.name()); | 336 openBrace.printf("{ // Xfer Processor: %s\n", xp.name()); |
336 fFS.codeAppend(openBrace.c_str()); | 337 fFS.codeAppend(openBrace.c_str()); |
337 | 338 |
338 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(xp.numTextures()); | 339 SkSTArray<4, GrGLSLTextureSampler> samplers(xp.numTextures()); |
339 this->emitSamplers(xp, &samplers, fXferProcessor); | 340 this->emitSamplers(xp, &samplers, fXferProcessor); |
340 | 341 |
341 GrGLXferProcessor::EmitArgs args(this, xp, colorIn.c_str(), coverageIn.c_str
(), | 342 GrGLXferProcessor::EmitArgs args(this, xp, colorIn.c_str(), coverageIn.c_str
(), |
342 fFS.getPrimaryColorOutputName(), | 343 fFS.getPrimaryColorOutputName(), |
343 fFS.getSecondaryColorOutputName(), samplers
); | 344 fFS.getSecondaryColorOutputName(), samplers
); |
344 fXferProcessor->fGLProc->emitCode(args); | 345 fXferProcessor->fGLProc->emitCode(args); |
345 | 346 |
346 // We have to check that effects and the code they emit are consistent, ie i
f an effect | 347 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
347 // asks for dst color, then the emit code needs to follow suit | 348 // asks for dst color, then the emit code needs to follow suit |
348 verify(xp); | 349 verify(xp); |
349 fFS.codeAppend("}"); | 350 fFS.codeAppend("}"); |
350 } | 351 } |
351 | 352 |
352 void GrGLProgramBuilder::verify(const GrPrimitiveProcessor& gp) { | 353 void GrGLProgramBuilder::verify(const GrPrimitiveProcessor& gp) { |
353 SkASSERT(fFS.hasReadFragmentPosition() == gp.willReadFragmentPosition()); | 354 SkASSERT(fFS.hasReadFragmentPosition() == gp.willReadFragmentPosition()); |
354 } | 355 } |
355 | 356 |
356 void GrGLProgramBuilder::verify(const GrXferProcessor& xp) { | 357 void GrGLProgramBuilder::verify(const GrXferProcessor& xp) { |
357 SkASSERT(fFS.hasReadDstColor() == xp.willReadDstColor()); | 358 SkASSERT(fFS.hasReadDstColor() == xp.willReadDstColor()); |
358 } | 359 } |
359 | 360 |
360 void GrGLProgramBuilder::verify(const GrFragmentProcessor& fp) { | 361 void GrGLProgramBuilder::verify(const GrFragmentProcessor& fp) { |
361 SkASSERT(fFS.hasReadFragmentPosition() == fp.willReadFragmentPosition()); | 362 SkASSERT(fFS.hasReadFragmentPosition() == fp.willReadFragmentPosition()); |
362 } | 363 } |
363 | 364 |
364 template <class Proc> | 365 template <class Proc> |
365 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, | 366 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, |
366 GrGLProcessor::TextureSamplerArray* outSam
plers, | 367 GrGLSLTextureSampler::TextureSamplerArray*
outSamplers, |
367 GrGLInstalledProc<Proc>* ip) { | 368 GrGLInstalledProc<Proc>* ip) { |
368 SkDEBUGCODE(ip->fSamplersIdx = fSamplerUniforms.count();) | 369 SkDEBUGCODE(ip->fSamplersIdx = fSamplerUniforms.count();) |
369 int numTextures = processor.numTextures(); | 370 int numTextures = processor.numTextures(); |
370 UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextur
es); | 371 UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextur
es); |
371 SkString name; | 372 SkString name; |
372 for (int t = 0; t < numTextures; ++t) { | 373 for (int t = 0; t < numTextures; ++t) { |
373 name.printf("Sampler%d", t); | 374 name.printf("Sampler%d", t); |
374 localSamplerUniforms[t] = this->addUniform(GrGLProgramBuilder::kFragment
_Visibility, | 375 localSamplerUniforms[t] = this->addUniform(GrGLProgramBuilder::kFragment
_Visibility, |
375 kSampler2D_GrSLType, kDefault
_GrSLPrecision, | 376 kSampler2D_GrSLType, kDefault
_GrSLPrecision, |
376 name.c_str()); | 377 name.c_str()); |
377 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, | 378 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLSLTextureSampler, |
378 (localSamplerUniforms[t], processor.textureAccess
(t))); | 379 (localSamplerUniforms[t], processor.textureAccess
(t))); |
379 } | 380 } |
380 } | 381 } |
381 | 382 |
382 GrGLProgram* GrGLProgramBuilder::finalize() { | 383 GrGLProgram* GrGLProgramBuilder::finalize() { |
383 // verify we can get a program id | 384 // verify we can get a program id |
384 GrGLuint programID; | 385 GrGLuint programID; |
385 GL_CALL_RET(programID, CreateProgram()); | 386 GL_CALL_RET(programID, CreateProgram()); |
386 if (0 == programID) { | 387 if (0 == programID) { |
387 return nullptr; | 388 return nullptr; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 } | 519 } |
519 | 520 |
520 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 521 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
521 | 522 |
522 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { | 523 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { |
523 int numProcs = fProcs.count(); | 524 int numProcs = fProcs.count(); |
524 for (int i = 0; i < numProcs; ++i) { | 525 for (int i = 0; i < numProcs; ++i) { |
525 delete fProcs[i]; | 526 delete fProcs[i]; |
526 } | 527 } |
527 } | 528 } |
OLD | NEW |