1 //
2 // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 #include "BaseTypes.h"
8
9 #include "common/PackedEnums.h"
10
11 namespace sh
12 {
13 namespace
14 {
15 constexpr gl::BlendEquationBitSet kAdvancedBlendBits{
16 gl::BlendEquationType::Multiply, gl::BlendEquationType::Screen,
17 gl::BlendEquationType::Overlay, gl::BlendEquationType::Darken,
18 gl::BlendEquationType::Lighten, gl::BlendEquationType::Colordodge,
19 gl::BlendEquationType::Colorburn, gl::BlendEquationType::Hardlight,
20 gl::BlendEquationType::Softlight, gl::BlendEquationType::Difference,
21 gl::BlendEquationType::Exclusion, gl::BlendEquationType::HslHue,
22 gl::BlendEquationType::HslSaturation, gl::BlendEquationType::HslColor,
23 gl::BlendEquationType::HslLuminosity,
24 };
25
26 constexpr gl::BlendEquationBitSet kAdvancedBlendHslBits{
27 gl::BlendEquationType::HslHue,
28 gl::BlendEquationType::HslSaturation,
29 gl::BlendEquationType::HslColor,
30 gl::BlendEquationType::HslLuminosity,
31 };
32
IsValidAdvancedBlendBitSet(uint32_t enabledEquations)33 bool IsValidAdvancedBlendBitSet(uint32_t enabledEquations)
34 {
35 return (gl::BlendEquationBitSet(enabledEquations) & ~kAdvancedBlendBits).none();
36 }
37 } // anonymous namespace
38
any() const39 bool AdvancedBlendEquations::any() const
40 {
41 ASSERT(IsValidAdvancedBlendBitSet(mEnabledBlendEquations));
42 return mEnabledBlendEquations != 0;
43 }
44
all() const45 bool AdvancedBlendEquations::all() const
46 {
47 ASSERT(IsValidAdvancedBlendBitSet(mEnabledBlendEquations));
48 return gl::BlendEquationBitSet(mEnabledBlendEquations) == kAdvancedBlendBits;
49 }
50
anyHsl() const51 bool AdvancedBlendEquations::anyHsl() const
52 {
53 ASSERT(IsValidAdvancedBlendBitSet(mEnabledBlendEquations));
54 return (gl::BlendEquationBitSet(mEnabledBlendEquations) & kAdvancedBlendHslBits).any();
55 }
56
setAll()57 void AdvancedBlendEquations::setAll()
58 {
59 ASSERT(IsValidAdvancedBlendBitSet(mEnabledBlendEquations));
60 mEnabledBlendEquations = kAdvancedBlendBits.bits();
61 }
62
set(uint32_t blendEquation)63 void AdvancedBlendEquations::set(uint32_t blendEquation)
64 {
65 gl::BlendEquationType eq = static_cast<gl::BlendEquationType>(blendEquation);
66 mEnabledBlendEquations = gl::BlendEquationBitSet(mEnabledBlendEquations).set(eq).bits();
67 ASSERT(IsValidAdvancedBlendBitSet(mEnabledBlendEquations));
68 }
69
GetLayoutString(uint32_t blendEquation)70 const char *AdvancedBlendEquations::GetLayoutString(uint32_t blendEquation)
71 {
72 switch (static_cast<gl::BlendEquationType>(blendEquation))
73 {
74 case gl::BlendEquationType::Multiply:
75 return "blend_support_multiply";
76 case gl::BlendEquationType::Screen:
77 return "blend_support_screen";
78 case gl::BlendEquationType::Overlay:
79 return "blend_support_overlay";
80 case gl::BlendEquationType::Darken:
81 return "blend_support_darken";
82 case gl::BlendEquationType::Lighten:
83 return "blend_support_lighten";
84 case gl::BlendEquationType::Colordodge:
85 return "blend_support_colordodge";
86 case gl::BlendEquationType::Colorburn:
87 return "blend_support_colorburn";
88 case gl::BlendEquationType::Hardlight:
89 return "blend_support_hardlight";
90 case gl::BlendEquationType::Softlight:
91 return "blend_support_softlight";
92 case gl::BlendEquationType::Difference:
93 return "blend_support_difference";
94 case gl::BlendEquationType::Exclusion:
95 return "blend_support_exclusion";
96 case gl::BlendEquationType::HslHue:
97 return "blend_support_hsl_hue";
98 case gl::BlendEquationType::HslSaturation:
99 return "blend_support_hsl_saturation";
100 case gl::BlendEquationType::HslColor:
101 return "blend_support_hsl_color";
102 case gl::BlendEquationType::HslLuminosity:
103 return "blend_support_hsl_luminosity";
104 default:
105 UNREACHABLE();
106 return nullptr;
107 }
108 }
109
GetAllEquationsLayoutString()110 const char *AdvancedBlendEquations::GetAllEquationsLayoutString()
111 {
112 return "blend_support_all_equations";
113 }
114
115 } // namespace sh
116