1 // Copyright 2019 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef SRC_SAMPLER_H_
16 #define SRC_SAMPLER_H_
17 
18 #include <cstdint>
19 #include <memory>
20 #include <string>
21 #include <utility>
22 #include <vector>
23 
24 #include "amber/result.h"
25 #include "amber/value.h"
26 #include "src/command_data.h"
27 #include "src/format.h"
28 
29 namespace amber {
30 
31 enum class FilterType : int8_t { kUnknown = -1, kNearest = 0, kLinear = 1 };
32 
33 enum class AddressMode : int8_t {
34   kUnknown = -1,
35   kRepeat = 0,
36   kMirroredRepeat = 1,
37   kClampToEdge = 2,
38   kClampToBorder = 3,
39   kMirrorClampToEdge = 4
40 };
41 
42 enum class BorderColor : int8_t {
43   kUnknown = -1,
44   kFloatTransparentBlack = 0,
45   kIntTransparentBlack = 1,
46   kFloatOpaqueBlack = 2,
47   kIntOpaqueBlack = 3,
48   kFloatOpaqueWhite = 4,
49   kIntOpaqueWhite = 5
50 };
51 
52 class Sampler {
53  public:
54   Sampler();
55   ~Sampler();
56 
SetName(const std::string & name)57   void SetName(const std::string& name) { name_ = name; }
GetName()58   std::string GetName() const { return name_; }
59 
SetMagFilter(FilterType filter)60   void SetMagFilter(FilterType filter) { mag_filter_ = filter; }
GetMagFilter()61   FilterType GetMagFilter() const { return mag_filter_; }
62 
SetMinFilter(FilterType filter)63   void SetMinFilter(FilterType filter) { min_filter_ = filter; }
GetMinFilter()64   FilterType GetMinFilter() const { return min_filter_; }
65 
SetMipmapMode(FilterType filter)66   void SetMipmapMode(FilterType filter) { mipmap_mode_ = filter; }
GetMipmapMode()67   FilterType GetMipmapMode() const { return mipmap_mode_; }
68 
SetAddressModeU(AddressMode mode)69   void SetAddressModeU(AddressMode mode) { address_mode_u_ = mode; }
GetAddressModeU()70   AddressMode GetAddressModeU() const { return address_mode_u_; }
71 
SetAddressModeV(AddressMode mode)72   void SetAddressModeV(AddressMode mode) { address_mode_v_ = mode; }
GetAddressModeV()73   AddressMode GetAddressModeV() const { return address_mode_v_; }
74 
SetAddressModeW(AddressMode mode)75   void SetAddressModeW(AddressMode mode) { address_mode_w_ = mode; }
GetAddressModeW()76   AddressMode GetAddressModeW() const { return address_mode_w_; }
77 
SetBorderColor(BorderColor color)78   void SetBorderColor(BorderColor color) { border_color_ = color; }
GetBorderColor()79   BorderColor GetBorderColor() const { return border_color_; }
80 
SetMinLOD(float min_lod)81   void SetMinLOD(float min_lod) { min_lod_ = min_lod; }
GetMinLOD()82   float GetMinLOD() const { return min_lod_; }
83 
SetMaxLOD(float max_lod)84   void SetMaxLOD(float max_lod) { max_lod_ = max_lod; }
GetMaxLOD()85   float GetMaxLOD() const { return max_lod_; }
86 
SetNormalizedCoords(bool norm)87   void SetNormalizedCoords(bool norm) { normalized_coords_ = norm; }
GetNormalizedCoords()88   bool GetNormalizedCoords() const { return normalized_coords_; }
89 
SetCompareEnable(bool compare_enable)90   void SetCompareEnable(bool compare_enable) {
91     compare_enable_ = compare_enable;
92   }
GetCompareEnable()93   bool GetCompareEnable() const { return compare_enable_; }
94 
SetCompareOp(CompareOp compare_op)95   void SetCompareOp(CompareOp compare_op) { compare_op_ = compare_op; }
GetCompareOp()96   CompareOp GetCompareOp() const { return compare_op_; }
97 
98  private:
99   std::string name_;
100   FilterType min_filter_ = FilterType::kNearest;
101   FilterType mag_filter_ = FilterType::kNearest;
102   FilterType mipmap_mode_ = FilterType::kNearest;
103   AddressMode address_mode_u_ = AddressMode::kRepeat;
104   AddressMode address_mode_v_ = AddressMode::kRepeat;
105   AddressMode address_mode_w_ = AddressMode::kRepeat;
106   BorderColor border_color_ = BorderColor::kFloatTransparentBlack;
107   float min_lod_ = 0.0f;
108   float max_lod_ = 1.0f;
109   bool normalized_coords_ = true;
110   bool compare_enable_ = false;
111   CompareOp compare_op_ = CompareOp::kNever;
112 };
113 
114 }  // namespace amber
115 
116 #endif  // SRC_SAMPLER_H_
117