| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkArithmeticMode_gpu.h" | 8 #include "SkArithmeticMode_gpu.h" |
| 9 | 9 |
| 10 #if SK_SUPPORT_GPU | 10 #if SK_SUPPORT_GPU |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 outputColor, outputColor, outputColor); | 51 outputColor, outputColor, outputColor); |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 class GLArithmeticFP : public GrGLFragmentProcessor { | 55 class GLArithmeticFP : public GrGLFragmentProcessor { |
| 56 public: | 56 public: |
| 57 GLArithmeticFP(const GrProcessor&) | 57 GLArithmeticFP(const GrProcessor&) |
| 58 : fEnforcePMColor(true) { | 58 : fEnforcePMColor(true) { |
| 59 } | 59 } |
| 60 | 60 |
| 61 ~GLArithmeticFP() SK_OVERRIDE {} | 61 ~GLArithmeticFP() override {} |
| 62 | 62 |
| 63 void emitCode(GrGLFPBuilder* builder, | 63 void emitCode(GrGLFPBuilder* builder, |
| 64 const GrFragmentProcessor& fp, | 64 const GrFragmentProcessor& fp, |
| 65 const char* outputColor, | 65 const char* outputColor, |
| 66 const char* inputColor, | 66 const char* inputColor, |
| 67 const TransformedCoordsArray& coords, | 67 const TransformedCoordsArray& coords, |
| 68 const TextureSamplerArray& samplers) SK_OVERRIDE { | 68 const TextureSamplerArray& samplers) override { |
| 69 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 69 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
| 70 fsBuilder->codeAppend("vec4 bgColor = "); | 70 fsBuilder->codeAppend("vec4 bgColor = "); |
| 71 fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0]
.getType()); | 71 fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0]
.getType()); |
| 72 fsBuilder->codeAppendf(";"); | 72 fsBuilder->codeAppendf(";"); |
| 73 const char* dstColor = "bgColor"; | 73 const char* dstColor = "bgColor"; |
| 74 | 74 |
| 75 fKUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 75 fKUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 76 kVec4f_GrSLType, kDefault_GrSLPrecision, | 76 kVec4f_GrSLType, kDefault_GrSLPrecision, |
| 77 "k"); | 77 "k"); |
| 78 const char* kUni = builder->getUniformCStr(fKUni); | 78 const char* kUni = builder->getUniformCStr(fKUni); |
| 79 | 79 |
| 80 add_arithmetic_code(fsBuilder, inputColor, dstColor, outputColor, kUni,
fEnforcePMColor); | 80 add_arithmetic_code(fsBuilder, inputColor, dstColor, outputColor, kUni,
fEnforcePMColor); |
| 81 } | 81 } |
| 82 | 82 |
| 83 void setData(const GrGLProgramDataManager& pdman, const GrProcessor& proc) S
K_OVERRIDE { | 83 void setData(const GrGLProgramDataManager& pdman, const GrProcessor& proc) o
verride { |
| 84 const GrArithmeticFP& arith = proc.cast<GrArithmeticFP>(); | 84 const GrArithmeticFP& arith = proc.cast<GrArithmeticFP>(); |
| 85 pdman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4()); | 85 pdman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4()); |
| 86 fEnforcePMColor = arith.enforcePMColor(); | 86 fEnforcePMColor = arith.enforcePMColor(); |
| 87 } | 87 } |
| 88 | 88 |
| 89 static void GenKey(const GrProcessor& proc, const GrGLCaps& caps, GrProcesso
rKeyBuilder* b) { | 89 static void GenKey(const GrProcessor& proc, const GrGLCaps& caps, GrProcesso
rKeyBuilder* b) { |
| 90 const GrArithmeticFP& arith = proc.cast<GrArithmeticFP>(); | 90 const GrArithmeticFP& arith = proc.cast<GrArithmeticFP>(); |
| 91 uint32_t key = arith.enforcePMColor() ? 1 : 0; | 91 uint32_t key = arith.enforcePMColor() ? 1 : 0; |
| 92 b->add32(key); | 92 b->add32(key); |
| 93 } | 93 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 | 160 |
| 161 class ArithmeticXP : public GrXferProcessor { | 161 class ArithmeticXP : public GrXferProcessor { |
| 162 public: | 162 public: |
| 163 static GrXferProcessor* Create(float k1, float k2, float k3, float k4, bool
enforcePMColor, | 163 static GrXferProcessor* Create(float k1, float k2, float k3, float k4, bool
enforcePMColor, |
| 164 const GrDeviceCoordTexture* dstCopy, | 164 const GrDeviceCoordTexture* dstCopy, |
| 165 bool willReadDstColor) { | 165 bool willReadDstColor) { |
| 166 return SkNEW_ARGS(ArithmeticXP, (k1, k2, k3, k4, enforcePMColor, dstCopy
, | 166 return SkNEW_ARGS(ArithmeticXP, (k1, k2, k3, k4, enforcePMColor, dstCopy
, |
| 167 willReadDstColor)); | 167 willReadDstColor)); |
| 168 } | 168 } |
| 169 | 169 |
| 170 ~ArithmeticXP() SK_OVERRIDE {}; | 170 ~ArithmeticXP() override {}; |
| 171 | 171 |
| 172 const char* name() const SK_OVERRIDE { return "Arithmetic"; } | 172 const char* name() const override { return "Arithmetic"; } |
| 173 | 173 |
| 174 GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; | 174 GrGLXferProcessor* createGLInstance() const override; |
| 175 | 175 |
| 176 bool hasSecondaryOutput() const SK_OVERRIDE { return false; } | 176 bool hasSecondaryOutput() const override { return false; } |
| 177 | 177 |
| 178 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, | 178 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, |
| 179 const GrProcOptInfo& coveragePOI, | 179 const GrProcOptInfo& coveragePOI, |
| 180 bool doesStencilWrite, | 180 bool doesStencilWrite, |
| 181 GrColor* overrideColor, | 181 GrColor* overrideColor, |
| 182 const GrDrawTargetCaps& caps) SK_
OVERRIDE; | 182 const GrDrawTargetCaps& caps) ove
rride; |
| 183 | 183 |
| 184 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE { | 184 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const override { |
| 185 blendInfo->fSrcBlend = kOne_GrBlendCoeff; | 185 blendInfo->fSrcBlend = kOne_GrBlendCoeff; |
| 186 blendInfo->fDstBlend = kZero_GrBlendCoeff; | 186 blendInfo->fDstBlend = kZero_GrBlendCoeff; |
| 187 blendInfo->fBlendConstant = 0; | 187 blendInfo->fBlendConstant = 0; |
| 188 } | 188 } |
| 189 | 189 |
| 190 float k1() const { return fK1; } | 190 float k1() const { return fK1; } |
| 191 float k2() const { return fK2; } | 191 float k2() const { return fK2; } |
| 192 float k3() const { return fK3; } | 192 float k3() const { return fK3; } |
| 193 float k4() const { return fK4; } | 193 float k4() const { return fK4; } |
| 194 bool enforcePMColor() const { return fEnforcePMColor; } | 194 bool enforcePMColor() const { return fEnforcePMColor; } |
| 195 | 195 |
| 196 private: | 196 private: |
| 197 ArithmeticXP(float k1, float k2, float k3, float k4, bool enforcePMColor, | 197 ArithmeticXP(float k1, float k2, float k3, float k4, bool enforcePMColor, |
| 198 const GrDeviceCoordTexture* dstCopy, bool willReadDstColor); | 198 const GrDeviceCoordTexture* dstCopy, bool willReadDstColor); |
| 199 | 199 |
| 200 void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) con
st SK_OVERRIDE; | 200 void onGetGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) con
st override; |
| 201 | 201 |
| 202 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { | 202 bool onIsEqual(const GrXferProcessor& xpBase) const override { |
| 203 const ArithmeticXP& xp = xpBase.cast<ArithmeticXP>(); | 203 const ArithmeticXP& xp = xpBase.cast<ArithmeticXP>(); |
| 204 if (fK1 != xp.fK1 || | 204 if (fK1 != xp.fK1 || |
| 205 fK2 != xp.fK2 || | 205 fK2 != xp.fK2 || |
| 206 fK3 != xp.fK3 || | 206 fK3 != xp.fK3 || |
| 207 fK4 != xp.fK4 || | 207 fK4 != xp.fK4 || |
| 208 fEnforcePMColor != xp.fEnforcePMColor) { | 208 fEnforcePMColor != xp.fEnforcePMColor) { |
| 209 return false; | 209 return false; |
| 210 } | 210 } |
| 211 return true; | 211 return true; |
| 212 } | 212 } |
| 213 | 213 |
| 214 float fK1, fK2, fK3, fK4; | 214 float fK1, fK2, fK3, fK4; |
| 215 bool fEnforcePMColor; | 215 bool fEnforcePMColor; |
| 216 | 216 |
| 217 typedef GrXferProcessor INHERITED; | 217 typedef GrXferProcessor INHERITED; |
| 218 }; | 218 }; |
| 219 | 219 |
| 220 /////////////////////////////////////////////////////////////////////////////// | 220 /////////////////////////////////////////////////////////////////////////////// |
| 221 | 221 |
| 222 class GLArithmeticXP : public GrGLXferProcessor { | 222 class GLArithmeticXP : public GrGLXferProcessor { |
| 223 public: | 223 public: |
| 224 GLArithmeticXP(const GrProcessor&) | 224 GLArithmeticXP(const GrProcessor&) |
| 225 : fEnforcePMColor(true) { | 225 : fEnforcePMColor(true) { |
| 226 } | 226 } |
| 227 | 227 |
| 228 ~GLArithmeticXP() SK_OVERRIDE {} | 228 ~GLArithmeticXP() override {} |
| 229 | 229 |
| 230 static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, | 230 static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, |
| 231 GrProcessorKeyBuilder* b) { | 231 GrProcessorKeyBuilder* b) { |
| 232 const ArithmeticXP& arith = processor.cast<ArithmeticXP>(); | 232 const ArithmeticXP& arith = processor.cast<ArithmeticXP>(); |
| 233 uint32_t key = arith.enforcePMColor() ? 1 : 0; | 233 uint32_t key = arith.enforcePMColor() ? 1 : 0; |
| 234 b->add32(key); | 234 b->add32(key); |
| 235 } | 235 } |
| 236 | 236 |
| 237 private: | 237 private: |
| 238 void onEmitCode(const EmitArgs& args) SK_OVERRIDE { | 238 void onEmitCode(const EmitArgs& args) override { |
| 239 GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 239 GrGLFPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 240 | 240 |
| 241 const char* dstColor = fsBuilder->dstColor(); | 241 const char* dstColor = fsBuilder->dstColor(); |
| 242 | 242 |
| 243 fKUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 243 fKUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 244 kVec4f_GrSLType, kDefault_GrSLPrecision, | 244 kVec4f_GrSLType, kDefault_GrSLPrecision, |
| 245 "k"); | 245 "k"); |
| 246 const char* kUni = args.fPB->getUniformCStr(fKUni); | 246 const char* kUni = args.fPB->getUniformCStr(fKUni); |
| 247 | 247 |
| 248 add_arithmetic_code(fsBuilder, args.fInputColor, dstColor, args.fOutputP
rimary, kUni, | 248 add_arithmetic_code(fsBuilder, args.fInputColor, dstColor, args.fOutputP
rimary, kUni, |
| 249 fEnforcePMColor); | 249 fEnforcePMColor); |
| 250 | 250 |
| 251 fsBuilder->codeAppendf("%s = %s * %s + (vec4(1.0) - %s) * %s;", | 251 fsBuilder->codeAppendf("%s = %s * %s + (vec4(1.0) - %s) * %s;", |
| 252 args.fOutputPrimary, args.fOutputPrimary, args.fI
nputCoverage, | 252 args.fOutputPrimary, args.fOutputPrimary, args.fI
nputCoverage, |
| 253 args.fInputCoverage, dstColor); | 253 args.fInputCoverage, dstColor); |
| 254 } | 254 } |
| 255 | 255 |
| 256 void onSetData(const GrGLProgramDataManager& pdman, | 256 void onSetData(const GrGLProgramDataManager& pdman, |
| 257 const GrXferProcessor& processor) SK_OVERRIDE { | 257 const GrXferProcessor& processor) override { |
| 258 const ArithmeticXP& arith = processor.cast<ArithmeticXP>(); | 258 const ArithmeticXP& arith = processor.cast<ArithmeticXP>(); |
| 259 pdman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4()); | 259 pdman.set4f(fKUni, arith.k1(), arith.k2(), arith.k3(), arith.k4()); |
| 260 fEnforcePMColor = arith.enforcePMColor(); | 260 fEnforcePMColor = arith.enforcePMColor(); |
| 261 }; | 261 }; |
| 262 | 262 |
| 263 GrGLProgramDataManager::UniformHandle fKUni; | 263 GrGLProgramDataManager::UniformHandle fKUni; |
| 264 bool fEnforcePMColor; | 264 bool fEnforcePMColor; |
| 265 | 265 |
| 266 typedef GrGLXferProcessor INHERITED; | 266 typedef GrGLXferProcessor INHERITED; |
| 267 }; | 267 }; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 float k1 = random->nextF(); | 333 float k1 = random->nextF(); |
| 334 float k2 = random->nextF(); | 334 float k2 = random->nextF(); |
| 335 float k3 = random->nextF(); | 335 float k3 = random->nextF(); |
| 336 float k4 = random->nextF(); | 336 float k4 = random->nextF(); |
| 337 bool enforcePMColor = random->nextBool(); | 337 bool enforcePMColor = random->nextBool(); |
| 338 | 338 |
| 339 return GrArithmeticXPFactory::Create(k1, k2, k3, k4, enforcePMColor); | 339 return GrArithmeticXPFactory::Create(k1, k2, k3, k4, enforcePMColor); |
| 340 } | 340 } |
| 341 | 341 |
| 342 #endif | 342 #endif |
| OLD | NEW |