1 #pragma once
2 
3 #include <mbgl/util/variant.hpp>
4 
5 namespace mbgl {
6 namespace gl {
7 
8 class StencilMode {
9 public:
10     template <uint32_t F>
11     struct SimpleTest {
12         static constexpr uint32_t func = F;
13         static constexpr uint32_t mask = 0;
14     };
15 
16     template <uint32_t F>
17     struct MaskedTest {
18         static constexpr uint32_t func = F;
19         uint32_t mask;
20     };
21 
22     using Never        = SimpleTest<0x0200>;
23     using Less         = MaskedTest<0x0201>;
24     using Equal        = MaskedTest<0x0202>;
25     using LessEqual    = MaskedTest<0x0203>;
26     using Greater      = MaskedTest<0x0204>;
27     using NotEqual     = MaskedTest<0x0205>;
28     using GreaterEqual = MaskedTest<0x0206>;
29     using Always       = SimpleTest<0x0207>;
30 
31     using Test = variant<
32         Never,
33         Less,
34         Equal,
35         LessEqual,
36         Greater,
37         NotEqual,
38         GreaterEqual,
39         Always>;
40 
41     enum Op {
42         Zero          = 0x0000,
43         Keep          = 0x1E00,
44         Replace       = 0x1E01,
45         Increment     = 0x1E02,
46         Decrement     = 0x1E03,
47         Invert        = 0x150A,
48         IncrementWrap = 0x8507,
49         DecrementWrap = 0x8508
50     };
51 
52     Test test;
53     int32_t ref;
54     uint32_t mask;
55 
56     Op fail;
57     Op depthFail;
58     Op pass;
59 
disabled()60     static StencilMode disabled() {
61        return StencilMode { Always(), 0, 0, Keep, Keep, Keep };
62     }
63 };
64 
65 } // namespace gl
66 } // namespace mbgl
67