xref: /aosp_15_r20/external/skia/src/gpu/ganesh/glsl/GrGLSLBlend.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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