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

Side by Side Diff: src/core/SkXfermode.cpp

Issue 24853002: Make GPU coord transforms automatic (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « include/gpu/GrTBackendEffectFactory.h ('k') | src/effects/SkArithmeticMode.cpp » ('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 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkXfermode.h" 10 #include "SkXfermode.h"
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after
888 void SkProcXfermode::toString(SkString* str) const { 888 void SkProcXfermode::toString(SkString* str) const {
889 str->appendf("SkProcXfermode: %p", fProc); 889 str->appendf("SkProcXfermode: %p", fProc);
890 } 890 }
891 #endif 891 #endif
892 892
893 ////////////////////////////////////////////////////////////////////////////// 893 //////////////////////////////////////////////////////////////////////////////
894 894
895 #if SK_SUPPORT_GPU 895 #if SK_SUPPORT_GPU
896 896
897 #include "GrEffect.h" 897 #include "GrEffect.h"
898 #include "GrCoordTransform.h"
898 #include "GrEffectUnitTest.h" 899 #include "GrEffectUnitTest.h"
899 #include "GrTBackendEffectFactory.h" 900 #include "GrTBackendEffectFactory.h"
900 #include "gl/GrGLEffect.h" 901 #include "gl/GrGLEffect.h"
901 #include "gl/GrGLEffectMatrix.h"
902 902
903 /** 903 /**
904 * GrEffect that implements the all the separable xfer modes that cannot be expr essed as Coeffs. 904 * GrEffect that implements the all the separable xfer modes that cannot be expr essed as Coeffs.
905 */ 905 */
906 class XferEffect : public GrEffect { 906 class XferEffect : public GrEffect {
907 public: 907 public:
908 static bool IsSupportedMode(SkXfermode::Mode mode) { 908 static bool IsSupportedMode(SkXfermode::Mode mode) {
909 return mode > SkXfermode::kLastCoeffMode && mode <= SkXfermode::kLastMod e; 909 return mode > SkXfermode::kLastCoeffMode && mode <= SkXfermode::kLastMod e;
910 } 910 }
911 911
(...skipping 16 matching lines...) Expand all
928 } 928 }
929 929
930 static const char* Name() { return "XferEffect"; } 930 static const char* Name() { return "XferEffect"; }
931 931
932 SkXfermode::Mode mode() const { return fMode; } 932 SkXfermode::Mode mode() const { return fMode; }
933 const GrTextureAccess& backgroundAccess() const { return fBackgroundAccess; } 933 const GrTextureAccess& backgroundAccess() const { return fBackgroundAccess; }
934 934
935 class GLEffect : public GrGLEffect { 935 class GLEffect : public GrGLEffect {
936 public: 936 public:
937 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) 937 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&)
938 : GrGLEffect(factory ) 938 : GrGLEffect(factory) {
939 , fBackgroundEffectMatrix(kCoordsType) {
940 } 939 }
941 virtual void emitCode(GrGLShaderBuilder* builder, 940 virtual void emitCode(GrGLShaderBuilder* builder,
942 const GrDrawEffect& drawEffect, 941 const GrDrawEffect& drawEffect,
943 EffectKey key, 942 EffectKey key,
944 const char* outputColor, 943 const char* outputColor,
945 const char* inputColor, 944 const char* inputColor,
945 const TransformedCoordsArray& coords,
946 const TextureSamplerArray& samplers) SK_OVERRIDE { 946 const TextureSamplerArray& samplers) SK_OVERRIDE {
947 SkXfermode::Mode mode = drawEffect.castEffect<XferEffect>().mode(); 947 SkXfermode::Mode mode = drawEffect.castEffect<XferEffect>().mode();
948 const GrTexture* backgroundTex = drawEffect.castEffect<XferEffect>() .backgroundAccess().getTexture(); 948 const GrTexture* backgroundTex = drawEffect.castEffect<XferEffect>() .backgroundAccess().getTexture();
949 const char* dstColor; 949 const char* dstColor;
950 if (backgroundTex) { 950 if (backgroundTex) {
951 SkString bgCoords;
952 GrSLType bgCoordsType = fBackgroundEffectMatrix.emitCode(builder , key, &bgCoords, NULL, "BG");
953 dstColor = "bgColor"; 951 dstColor = "bgColor";
954 builder->fsCodeAppendf("\t\tvec4 %s = ", dstColor); 952 builder->fsCodeAppendf("\t\tvec4 %s = ", dstColor);
955 builder->fsAppendTextureLookup(samplers[0], bgCoords.c_str(), bg CoordsType); 953 builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), c oords[0].type());
956 builder->fsCodeAppendf(";\n"); 954 builder->fsCodeAppendf(";\n");
957 } else { 955 } else {
958 dstColor = builder->dstColor(); 956 dstColor = builder->dstColor();
959 } 957 }
960 SkASSERT(NULL != dstColor); 958 SkASSERT(NULL != dstColor);
961 959
962 // We don't try to optimize for this case at all 960 // We don't try to optimize for this case at all
963 if (NULL == inputColor) { 961 if (NULL == inputColor) {
964 builder->fsCodeAppendf("\t\tconst vec4 ones = %s;\n", GrGLSLOnes Vecf(4)); 962 builder->fsCodeAppendf("\t\tconst vec4 ones = %s;\n", GrGLSLOnes Vecf(4));
965 inputColor = "ones"; 963 inputColor = "ones";
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 outputColor, inputColor, dstColor, ds tColor, inputColor); 1079 outputColor, inputColor, dstColor, ds tColor, inputColor);
1082 break; 1080 break;
1083 } 1081 }
1084 default: 1082 default:
1085 GrCrash("Unknown XferEffect mode."); 1083 GrCrash("Unknown XferEffect mode.");
1086 break; 1084 break;
1087 } 1085 }
1088 } 1086 }
1089 1087
1090 static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrG LCaps&) { 1088 static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrG LCaps&) {
1091 const XferEffect& xfer = drawEffect.castEffect<XferEffect>(); 1089 return drawEffect.castEffect<XferEffect>().mode();
1092 GrTexture* bgTex = xfer.backgroundAccess().getTexture();
1093 EffectKey bgKey = 0;
1094 if (bgTex) {
1095 bgKey = GrGLEffectMatrix::GenKey(GrEffect::MakeDivByTextureWHMat rix(bgTex),
1096 drawEffect,
1097 GLEffect::kCoordsType,
1098 bgTex);
1099 }
1100 EffectKey modeKey = xfer.mode() << GrGLEffectMatrix::kKeyBits;
1101 return modeKey | bgKey;
1102 }
1103
1104 virtual void setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) SK_OVERRIDE {
1105 const XferEffect& xfer = drawEffect.castEffect<XferEffect>();
1106 GrTexture* bgTex = xfer.backgroundAccess().getTexture();
1107 if (bgTex) {
1108 fBackgroundEffectMatrix.setData(uman,
1109 GrEffect::MakeDivByTextureWHMatr ix(bgTex),
1110 drawEffect,
1111 bgTex);
1112 }
1113 } 1090 }
1114 1091
1115 private: 1092 private:
1116 static void HardLight(GrGLShaderBuilder* builder, 1093 static void HardLight(GrGLShaderBuilder* builder,
1117 const char* final, 1094 const char* final,
1118 const char* src, 1095 const char* src,
1119 const char* dst) { 1096 const char* dst) {
1120 static const char kComponents[] = {'r', 'g', 'b'}; 1097 static const char kComponents[] = {'r', 'g', 'b'};
1121 for (size_t i = 0; i < SK_ARRAY_COUNT(kComponents); ++i) { 1098 for (size_t i = 0; i < SK_ARRAY_COUNT(kComponents); ++i) {
1122 char component = kComponents[i]; 1099 char component = kComponents[i];
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 getFunction.c_str(), helpFunc, helpFunc, helpFunc , helpFunc, 1299 getFunction.c_str(), helpFunc, helpFunc, helpFunc , helpFunc,
1323 helpFunc, helpFunc); 1300 helpFunc, helpFunc);
1324 builder->fsEmitFunction(kVec3f_GrSLType, 1301 builder->fsEmitFunction(kVec3f_GrSLType,
1325 "set_saturation", 1302 "set_saturation",
1326 SK_ARRAY_COUNT(setSatArgs), setSatArgs, 1303 SK_ARRAY_COUNT(setSatArgs), setSatArgs,
1327 setSatBody.c_str(), 1304 setSatBody.c_str(),
1328 setSatFunction); 1305 setSatFunction);
1329 1306
1330 } 1307 }
1331 1308
1332 static const GrEffect::CoordsType kCoordsType = GrEffect::kLocal_CoordsT ype;
1333 GrGLEffectMatrix fBackgroundEffectMatrix;
1334 typedef GrGLEffect INHERITED; 1309 typedef GrGLEffect INHERITED;
1335 }; 1310 };
1336 1311
1337 GR_DECLARE_EFFECT_TEST; 1312 GR_DECLARE_EFFECT_TEST;
1338 1313
1339 private: 1314 private:
1340 XferEffect(SkXfermode::Mode mode, GrTexture* background) 1315 XferEffect(SkXfermode::Mode mode, GrTexture* background)
1341 : fMode(mode) { 1316 : fMode(mode) {
1342 if (background) { 1317 if (background) {
1318 fBackgroundTransform.reset(kLocal_GrCoordSet, background);
1319 this->addCoordTransform(&fBackgroundTransform);
1343 fBackgroundAccess.reset(background); 1320 fBackgroundAccess.reset(background);
1344 this->addTextureAccess(&fBackgroundAccess); 1321 this->addTextureAccess(&fBackgroundAccess);
1345 } else { 1322 } else {
1346 this->setWillReadDstColor(); 1323 this->setWillReadDstColor();
1347 } 1324 }
1348 } 1325 }
1349 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { 1326 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE {
1350 const XferEffect& s = CastEffect<XferEffect>(other); 1327 const XferEffect& s = CastEffect<XferEffect>(other);
1351 return fMode == s.fMode && 1328 return fMode == s.fMode &&
1352 fBackgroundAccess.getTexture() == s.fBackgroundAccess.getTexture( ); 1329 fBackgroundAccess.getTexture() == s.fBackgroundAccess.getTexture( );
1353 } 1330 }
1354 1331
1355 SkXfermode::Mode fMode; 1332 SkXfermode::Mode fMode;
1333 GrCoordTransform fBackgroundTransform;
1356 GrTextureAccess fBackgroundAccess; 1334 GrTextureAccess fBackgroundAccess;
1357 1335
1358 typedef GrEffect INHERITED; 1336 typedef GrEffect INHERITED;
1359 }; 1337 };
1360 1338
1361 GR_DEFINE_EFFECT_TEST(XferEffect); 1339 GR_DEFINE_EFFECT_TEST(XferEffect);
1362 GrEffectRef* XferEffect::TestCreate(SkRandom* rand, 1340 GrEffectRef* XferEffect::TestCreate(SkRandom* rand,
1363 GrContext*, 1341 GrContext*,
1364 const GrDrawTargetCaps&, 1342 const GrDrawTargetCaps&,
1365 GrTexture*[]) { 1343 GrTexture*[]) {
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
1963 return proc16; 1941 return proc16;
1964 } 1942 }
1965 1943
1966 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) 1944 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode)
1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) 1945 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode)
1968 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) 1946 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode)
1969 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) 1947 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode)
1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) 1948 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode)
1971 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) 1949 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode)
1972 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1950 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « include/gpu/GrTBackendEffectFactory.h ('k') | src/effects/SkArithmeticMode.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698