GrProcessorAnalysis.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright 2014 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/gpu/GrGeometryProcessor.h"
  8. #include "src/gpu/GrProcessorAnalysis.h"
  9. #include "src/gpu/ops/GrDrawOp.h"
  10. GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis(
  11. const GrProcessorAnalysisColor& input,
  12. const GrFragmentProcessor* const* processors,
  13. int cnt) {
  14. fCompatibleWithCoverageAsAlpha = true;
  15. fIsOpaque = input.isOpaque();
  16. fUsesLocalCoords = false;
  17. fProcessorsToEliminate = 0;
  18. fKnowOutputColor = input.isConstant(&fLastKnownOutputColor);
  19. for (int i = 0; i < cnt; ++i) {
  20. if (fUsesLocalCoords && !fKnowOutputColor && !fCompatibleWithCoverageAsAlpha &&
  21. !fIsOpaque) {
  22. break;
  23. }
  24. const GrFragmentProcessor* fp = processors[i];
  25. if (fKnowOutputColor &&
  26. fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, &fLastKnownOutputColor)) {
  27. ++fProcessorsToEliminate;
  28. fIsOpaque = fLastKnownOutputColor.isOpaque();
  29. // We reset these since the caller is expected to not use the earlier fragment
  30. // processors.
  31. fCompatibleWithCoverageAsAlpha = true;
  32. fUsesLocalCoords = false;
  33. } else {
  34. fKnowOutputColor = false;
  35. if (fIsOpaque && !fp->preservesOpaqueInput()) {
  36. fIsOpaque = false;
  37. }
  38. if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) {
  39. fCompatibleWithCoverageAsAlpha = false;
  40. }
  41. if (fp->usesLocalCoords()) {
  42. fUsesLocalCoords = true;
  43. }
  44. }
  45. }
  46. }