1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLBlend.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlendMode.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkSLTypeShared.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Blend.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLUniformHandler.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLString.h"
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker namespace GrGLSLBlend {
19*c8dee2aaSAndroid Build Coastguard Worker
BlendExpression(const GrProcessor * processor,GrGLSLUniformHandler * uniformHandler,GrGLSLProgramDataManager::UniformHandle * blendUniform,const char * srcColor,const char * dstColor,SkBlendMode mode)20*c8dee2aaSAndroid Build Coastguard Worker std::string BlendExpression(const GrProcessor* processor,
21*c8dee2aaSAndroid Build Coastguard Worker GrGLSLUniformHandler* uniformHandler,
22*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager::UniformHandle* blendUniform,
23*c8dee2aaSAndroid Build Coastguard Worker const char* srcColor,
24*c8dee2aaSAndroid Build Coastguard Worker const char* dstColor,
25*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode mode) {
26*c8dee2aaSAndroid Build Coastguard Worker auto info = skgpu::GetReducedBlendModeInfo(mode);
27*c8dee2aaSAndroid Build Coastguard Worker if (info.fUniformData.empty()) {
28*c8dee2aaSAndroid Build Coastguard Worker return SkSL::String::printf("%s(%s, %s)", info.fFunction, srcColor, dstColor);
29*c8dee2aaSAndroid Build Coastguard Worker }
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker SkSLType skslType = (SkSLType)((int)SkSLType::kHalf + info.fUniformData.size() - 1);
32*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(skslType >= SkSLType::kHalf && skslType <= SkSLType::kHalf4);
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker const char* blendUniName;
35*c8dee2aaSAndroid Build Coastguard Worker *blendUniform = uniformHandler->addUniform(processor, kFragment_GrShaderFlag,
36*c8dee2aaSAndroid Build Coastguard Worker skslType, "blend", &blendUniName);
37*c8dee2aaSAndroid Build Coastguard Worker return SkSL::String::printf("%s(%s, %s, %s)", info.fFunction, blendUniName, srcColor, dstColor);
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker
BlendKey(SkBlendMode mode)40*c8dee2aaSAndroid Build Coastguard Worker int BlendKey(SkBlendMode mode) {
41*c8dee2aaSAndroid Build Coastguard Worker // This switch must be kept in sync with GetReducedBlendModeInfo() in src/gpu/Blend.cpp.
42*c8dee2aaSAndroid Build Coastguard Worker switch (mode) {
43*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOver:
44*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOver:
45*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcIn:
46*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstIn:
47*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOut:
48*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOut:
49*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcATop:
50*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstATop:
51*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kXor:
52*c8dee2aaSAndroid Build Coastguard Worker return -1; // blend_porter_duff
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kHue:
55*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSaturation:
56*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kLuminosity:
57*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kColor:
58*c8dee2aaSAndroid Build Coastguard Worker return -2; // blend_hslc
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kOverlay:
61*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kHardLight:
62*c8dee2aaSAndroid Build Coastguard Worker return -3; // blend_overlay
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDarken:
65*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kLighten:
66*c8dee2aaSAndroid Build Coastguard Worker return -4; // blend_darken
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker default:
69*c8dee2aaSAndroid Build Coastguard Worker return (int)mode; // uses a dedicated SkSL blend function
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker }
72*c8dee2aaSAndroid Build Coastguard Worker
SetBlendModeUniformData(const GrGLSLProgramDataManager & pdman,GrGLSLProgramDataManager::UniformHandle blendUniform,SkBlendMode mode)73*c8dee2aaSAndroid Build Coastguard Worker void SetBlendModeUniformData(const GrGLSLProgramDataManager& pdman,
74*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager::UniformHandle blendUniform,
75*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode mode) {
76*c8dee2aaSAndroid Build Coastguard Worker auto info = skgpu::GetReducedBlendModeInfo(mode);
77*c8dee2aaSAndroid Build Coastguard Worker switch (info.fUniformData.size()) {
78*c8dee2aaSAndroid Build Coastguard Worker case 0:
79*c8dee2aaSAndroid Build Coastguard Worker /* no uniform data necessary */
80*c8dee2aaSAndroid Build Coastguard Worker break;
81*c8dee2aaSAndroid Build Coastguard Worker case 1:
82*c8dee2aaSAndroid Build Coastguard Worker pdman.set1f(blendUniform, info.fUniformData[0]);
83*c8dee2aaSAndroid Build Coastguard Worker break;
84*c8dee2aaSAndroid Build Coastguard Worker case 2:
85*c8dee2aaSAndroid Build Coastguard Worker pdman.set2f(blendUniform, info.fUniformData[0], info.fUniformData[1]);
86*c8dee2aaSAndroid Build Coastguard Worker break;
87*c8dee2aaSAndroid Build Coastguard Worker case 3:
88*c8dee2aaSAndroid Build Coastguard Worker pdman.set3f(blendUniform, info.fUniformData[0], info.fUniformData[1],
89*c8dee2aaSAndroid Build Coastguard Worker info.fUniformData[2]);
90*c8dee2aaSAndroid Build Coastguard Worker break;
91*c8dee2aaSAndroid Build Coastguard Worker case 4:
92*c8dee2aaSAndroid Build Coastguard Worker pdman.set4f(blendUniform, info.fUniformData[0], info.fUniformData[1],
93*c8dee2aaSAndroid Build Coastguard Worker info.fUniformData[2], info.fUniformData[3]);
94*c8dee2aaSAndroid Build Coastguard Worker break;
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker }
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Worker } // namespace GrGLSLBlend
99