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

Unified Diff: src/core/SkComposeShader.cpp

Issue 1306163005: Added function CreateFrom2Procs() in new namespace GrXfermodeFragmentProcessor (Closed) Base URL: https://skia.googlesource.com/skia@cs3_testcreate
Patch Set: Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/gpu/effects/GrXfermodeFragmentProcessor.h ('k') | src/gpu/effects/GrXfermodeFragmentProcessor.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkComposeShader.cpp
diff --git a/src/core/SkComposeShader.cpp b/src/core/SkComposeShader.cpp
index d3e29be66c9cba8d08188ab31f118ac0de8fb125..41b978b5c8bd3891abd85f120c01f54358bf69be 100644
--- a/src/core/SkComposeShader.cpp
+++ b/src/core/SkComposeShader.cpp
@@ -196,146 +196,8 @@ void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor re
#if SK_SUPPORT_GPU
-#include "SkGr.h"
-#include "GrProcessor.h"
#include "effects/GrConstColorProcessor.h"
-#include "gl/GrGLBlend.h"
-#include "gl/builders/GrGLProgramBuilder.h"
-
-/////////////////////////////////////////////////////////////////////
-
-class GrComposeEffect : public GrFragmentProcessor {
-public:
-
- static GrFragmentProcessor* Create(const GrFragmentProcessor* fpA,
- const GrFragmentProcessor* fpB, SkXfermode::Mode mode) {
- return SkNEW_ARGS(GrComposeEffect, (fpA, fpB, mode));
- }
- const char* name() const override { return "ComposeShader"; }
- void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
-
- SkXfermode::Mode getMode() const { return fMode; }
-
-protected:
- bool onIsEqual(const GrFragmentProcessor&) const override;
- void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
-
-private:
- GrComposeEffect(const GrFragmentProcessor* fpA, const GrFragmentProcessor* fpB,
- SkXfermode::Mode mode)
- : fMode(mode) {
- this->initClassID<GrComposeEffect>();
- SkDEBUGCODE(int shaderAChildIndex = )this->registerChildProcessor(fpA);
- SkDEBUGCODE(int shaderBChildIndex = )this->registerChildProcessor(fpB);
- SkASSERT(0 == shaderAChildIndex);
- SkASSERT(1 == shaderBChildIndex);
- }
-
- GrGLFragmentProcessor* onCreateGLInstance() const override;
-
- SkXfermode::Mode fMode;
-
- GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
-
- typedef GrFragmentProcessor INHERITED;
-};
-
-/////////////////////////////////////////////////////////////////////
-
-class GrGLComposeEffect : public GrGLFragmentProcessor {
-public:
- GrGLComposeEffect(const GrProcessor& processor) {}
-
- void emitCode(EmitArgs&) override;
-
-private:
- typedef GrGLFragmentProcessor INHERITED;
-};
-
-/////////////////////////////////////////////////////////////////////
-
-GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrComposeEffect);
-
-const GrFragmentProcessor* GrComposeEffect::TestCreate(GrProcessorTestData* d) {
-#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
- // Create two random frag procs.
- // For now, we'll prevent either children from being a shader with children to prevent the
- // possibility of an arbitrarily large tree of procs.
- SkAutoTUnref<const GrFragmentProcessor> fpA;
- do {
- fpA.reset(GrProcessorTestFactory<GrFragmentProcessor>::CreateStage(d));
- SkASSERT(fpA);
- } while (fpA->numChildProcessors() != 0);
- SkAutoTUnref<const GrFragmentProcessor> fpB;
- do {
- fpB.reset(GrProcessorTestFactory<GrFragmentProcessor>::CreateStage(d));
- SkASSERT(fpB);
- } while (fpB->numChildProcessors() != 0);
-
- SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(
- d->fRandom->nextRangeU(0, SkXfermode::kLastCoeffMode));
- return SkNEW_ARGS(GrComposeEffect, (fpA, fpB, mode));
-#else
- SkFAIL("Should not be called if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS");
- return nullptr;
-#endif
-}
-
-bool GrComposeEffect::onIsEqual(const GrFragmentProcessor& other) const {
- const GrComposeEffect& cs = other.cast<GrComposeEffect>();
- return fMode == cs.fMode;
-}
-
-void GrComposeEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
- inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
-}
-
-void GrComposeEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
- b->add32(fMode);
-}
-
-GrGLFragmentProcessor* GrComposeEffect::onCreateGLInstance() const{
- return SkNEW_ARGS(GrGLComposeEffect, (*this));
-}
-
-/////////////////////////////////////////////////////////////////////
-
-void GrGLComposeEffect::emitCode(EmitArgs& args) {
-
- GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
- const GrComposeEffect& cs = args.fFp.cast<GrComposeEffect>();
-
- // Store alpha of input color and un-premultiply the input color by its alpha. We will
- // re-multiply by this alpha after blending the output colors of the two child procs.
- // This is because we don't want the paint's alpha to affect either child proc's output
- // before the blend; we want to apply the paint's alpha AFTER the blend. This mirrors the
- // software implementation of SkComposeShader.
- SkString inputAlpha("inputAlpha");
- fsBuilder->codeAppendf("float %s = %s.a;", inputAlpha.c_str(), args.fInputColor);
- fsBuilder->codeAppendf("%s /= %s.a;", args.fInputColor, args.fInputColor);
-
- // declare outputColor and emit the code for each of the two children
- SkString outputColorA(args.fOutputColor);
- outputColorA.append("_dst");
- fsBuilder->codeAppendf("vec4 %s;\n", outputColorA.c_str());
- this->emitChild(0, args.fInputColor, outputColorA.c_str(), args);
-
- SkString outputColorB(args.fOutputColor);
- outputColorB.append("_src");
- fsBuilder->codeAppendf("vec4 %s;\n", outputColorB.c_str());
- this->emitChild(1, args.fInputColor, outputColorB.c_str(), args);
-
- // emit blend code
- SkXfermode::Mode mode = cs.getMode();
- fsBuilder->codeAppend("{");
- fsBuilder->codeAppendf("// Compose Xfer Mode: %s\n", SkXfermode::ModeName(mode));
- GrGLBlend::AppendPorterDuffBlend(fsBuilder, outputColorB.c_str(),
- outputColorA.c_str(), args.fOutputColor, mode);
- fsBuilder->codeAppend("}");
-
- // re-multiply the output color by the input color's alpha
- fsBuilder->codeAppendf("%s *= %s;", args.fOutputColor, inputAlpha.c_str());
-}
+#include "effects/GrXfermodeFragmentProcessor.h"
/////////////////////////////////////////////////////////////////////
@@ -349,7 +211,7 @@ const GrFragmentProcessor* SkComposeShader::asFragmentProcessor(GrContext* conte
// GrGLBlend::AppendPorterDuffBlend(), which emits the blend code in the shader,
// only supports those modes.
SkXfermode::Mode mode;
- if (!(SkXfermode::AsMode(fMode, &mode) && mode <= SkXfermode::kLastCoeffMode)) {
+ if (!(SkXfermode::AsMode(fMode, &mode) && SkXfermode::kLastCoeffMode >= mode)) {
return nullptr;
}
@@ -375,7 +237,7 @@ const GrFragmentProcessor* SkComposeShader::asFragmentProcessor(GrContext* conte
if (!fpB.get()) {
return nullptr;
}
- return GrComposeEffect::Create(fpA, fpB, mode);
+ return GrXfermodeFragmentProcessor::CreateFromTwoProcessors(fpB, fpA, mode);
}
}
#endif
« no previous file with comments | « include/gpu/effects/GrXfermodeFragmentProcessor.h ('k') | src/gpu/effects/GrXfermodeFragmentProcessor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698