blob: fc6b728d130a8d98167507c34e004ee47d1c7823 [file] [log] [blame]
Brian Salomon2bbdcc42017-09-07 12:36:34 -04001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrSamplerState_DEFINED
9#define GrSamplerState_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/gpu/GrTypes.h"
Brian Salomon2bbdcc42017-09-07 12:36:34 -040012
13/**
14 * Represents the filtering and tile modes used to access a texture.
15 */
16class GrSamplerState {
17public:
Michael Ludwigadb12e72019-12-04 16:19:18 -050018 enum class Filter : uint8_t { kNearest, kBilerp, kMipMap, kLast = kMipMap };
19 enum class WrapMode : uint8_t { kClamp, kRepeat, kMirrorRepeat, kClampToBorder,
20 kLast = kClampToBorder };
21
Brian Salomonccb61422020-01-09 10:46:36 -050022 static constexpr int kFilterCount = static_cast<int>(Filter::kLast) + 1;
23 static constexpr int kWrapModeCount = static_cast<int>(WrapMode::kLast) + 1;
Brian Salomon2bbdcc42017-09-07 12:36:34 -040024
Brian Salomonccb61422020-01-09 10:46:36 -050025 constexpr GrSamplerState() = default;
Brian Salomon2bbdcc42017-09-07 12:36:34 -040026
27 constexpr GrSamplerState(WrapMode wrapXAndY, Filter filter)
28 : fWrapModes{wrapXAndY, wrapXAndY}, fFilter(filter) {}
29
Brian Salomonca6b2f42020-01-24 11:31:21 -050030 constexpr GrSamplerState(WrapMode wrapX, WrapMode wrapY, Filter filter)
31 : fWrapModes{wrapX, wrapY}, fFilter(filter) {}
32
Brian Salomon2bbdcc42017-09-07 12:36:34 -040033 constexpr GrSamplerState(const WrapMode wrapModes[2], Filter filter)
34 : fWrapModes{wrapModes[0], wrapModes[1]}, fFilter(filter) {}
35
Brian Salomonccb61422020-01-09 10:46:36 -050036 constexpr /*explicit*/ GrSamplerState(Filter filter) : fFilter(filter) {}
37
Brian Salomon2bbdcc42017-09-07 12:36:34 -040038 constexpr GrSamplerState(const GrSamplerState&) = default;
39
Brian Salomonccb61422020-01-09 10:46:36 -050040 constexpr GrSamplerState& operator=(const GrSamplerState&) = default;
Brian Salomon2bbdcc42017-09-07 12:36:34 -040041
Brian Salomonccb61422020-01-09 10:46:36 -050042 constexpr Filter filter() const { return fFilter; }
Brian Salomon2bbdcc42017-09-07 12:36:34 -040043
Brian Salomonccb61422020-01-09 10:46:36 -050044 constexpr void setFilterMode(Filter filterMode) { fFilter = filterMode; }
Brian Salomon2bbdcc42017-09-07 12:36:34 -040045
Brian Salomonccb61422020-01-09 10:46:36 -050046 constexpr void setWrapModeX(const WrapMode wrap) { fWrapModes[0] = wrap; }
47 constexpr void setWrapModeY(const WrapMode wrap) { fWrapModes[1] = wrap; }
Brian Salomon2bbdcc42017-09-07 12:36:34 -040048
Brian Salomonccb61422020-01-09 10:46:36 -050049 constexpr WrapMode wrapModeX() const { return fWrapModes[0]; }
50 constexpr WrapMode wrapModeY() const { return fWrapModes[1]; }
Brian Salomon2bbdcc42017-09-07 12:36:34 -040051
Brian Salomonccb61422020-01-09 10:46:36 -050052 constexpr bool isRepeated() const {
Michael Ludwigf23a1522018-12-10 11:36:13 -050053 return (WrapMode::kClamp != fWrapModes[0] && WrapMode::kClampToBorder != fWrapModes[0]) ||
54 (WrapMode::kClamp != fWrapModes[1] && WrapMode::kClampToBorder != fWrapModes[1]);
Brian Salomon2bbdcc42017-09-07 12:36:34 -040055 }
56
Brian Salomonccb61422020-01-09 10:46:36 -050057 constexpr bool operator==(GrSamplerState that) const {
Brian Salomon2bbdcc42017-09-07 12:36:34 -040058 return fWrapModes[0] == that.fWrapModes[0] && fWrapModes[1] == that.fWrapModes[1] &&
59 fFilter == that.fFilter;
60 }
61
Brian Salomonccb61422020-01-09 10:46:36 -050062 constexpr bool operator!=(const GrSamplerState& that) const { return !(*this == that); }
Brian Salomon2bbdcc42017-09-07 12:36:34 -040063
Brian Salomonccb61422020-01-09 10:46:36 -050064 constexpr static uint8_t GenerateKey(GrSamplerState samplerState) {
Robert Phillipsf22c57d2019-10-14 14:16:02 -040065 const int kTileModeXShift = 2;
66 const int kTileModeYShift = 4;
67
68 SkASSERT(static_cast<int>(samplerState.filter()) <= 3);
69 uint8_t key = static_cast<uint8_t>(samplerState.filter());
70
71 SkASSERT(static_cast<int>(samplerState.wrapModeX()) <= 3);
72 key |= (static_cast<uint8_t>(samplerState.wrapModeX()) << kTileModeXShift);
73
74 SkASSERT(static_cast<int>(samplerState.wrapModeY()) <= 3);
75 key |= (static_cast<uint8_t>(samplerState.wrapModeY()) << kTileModeYShift);
76
77 return key;
78 }
79
Brian Salomon2bbdcc42017-09-07 12:36:34 -040080private:
Brian Salomonccb61422020-01-09 10:46:36 -050081 WrapMode fWrapModes[2] = {WrapMode::kClamp, WrapMode::kClamp};
82 Filter fFilter = GrSamplerState::Filter::kNearest;
Brian Salomon2bbdcc42017-09-07 12:36:34 -040083};
84
85#endif