1 //
2 // Copyright 2013 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 // Sampler.cpp : Implements the Sampler class, which represents a GLES 3
8 // sampler object. Sampler objects store some state needed to sample textures.
9
10 #include "libANGLE/Sampler.h"
11 #include "libANGLE/angletypes.h"
12 #include "libANGLE/renderer/GLImplFactory.h"
13 #include "libANGLE/renderer/SamplerImpl.h"
14
15 namespace gl
16 {
17
Sampler(rx::GLImplFactory * factory,SamplerID id)18 Sampler::Sampler(rx::GLImplFactory *factory, SamplerID id)
19 : RefCountObject(factory->generateSerial(), id),
20 mState(),
21 mDirty(true),
22 mSampler(factory->createSampler(mState)),
23 mLabel()
24 {}
25
~Sampler()26 Sampler::~Sampler()
27 {
28 SafeDelete(mSampler);
29 }
30
onDestroy(const Context * context)31 void Sampler::onDestroy(const Context *context)
32 {
33 if (mSampler)
34 {
35 mSampler->onDestroy(context);
36 }
37 }
38
setLabel(const Context * context,const std::string & label)39 void Sampler::setLabel(const Context *context, const std::string &label)
40 {
41 mLabel = label;
42 }
43
getLabel() const44 const std::string &Sampler::getLabel() const
45 {
46 return mLabel;
47 }
48
setMinFilter(const Context * context,GLenum minFilter)49 void Sampler::setMinFilter(const Context *context, GLenum minFilter)
50 {
51 mState.setMinFilter(minFilter);
52 signalDirtyState();
53 }
54
getMinFilter() const55 GLenum Sampler::getMinFilter() const
56 {
57 return mState.getMinFilter();
58 }
59
setMagFilter(const Context * context,GLenum magFilter)60 void Sampler::setMagFilter(const Context *context, GLenum magFilter)
61 {
62 mState.setMagFilter(magFilter);
63 signalDirtyState();
64 }
65
getMagFilter() const66 GLenum Sampler::getMagFilter() const
67 {
68 return mState.getMagFilter();
69 }
70
setWrapS(const Context * context,GLenum wrapS)71 void Sampler::setWrapS(const Context *context, GLenum wrapS)
72 {
73 mState.setWrapS(wrapS);
74 signalDirtyState();
75 }
76
getWrapS() const77 GLenum Sampler::getWrapS() const
78 {
79 return mState.getWrapS();
80 }
81
setWrapT(const Context * context,GLenum wrapT)82 void Sampler::setWrapT(const Context *context, GLenum wrapT)
83 {
84 mState.setWrapT(wrapT);
85 signalDirtyState();
86 }
87
getWrapT() const88 GLenum Sampler::getWrapT() const
89 {
90 return mState.getWrapT();
91 }
92
setWrapR(const Context * context,GLenum wrapR)93 void Sampler::setWrapR(const Context *context, GLenum wrapR)
94 {
95 mState.setWrapR(wrapR);
96 signalDirtyState();
97 }
98
getWrapR() const99 GLenum Sampler::getWrapR() const
100 {
101 return mState.getWrapR();
102 }
103
setMaxAnisotropy(const Context * context,float maxAnisotropy)104 void Sampler::setMaxAnisotropy(const Context *context, float maxAnisotropy)
105 {
106 mState.setMaxAnisotropy(maxAnisotropy);
107 signalDirtyState();
108 }
109
getMaxAnisotropy() const110 float Sampler::getMaxAnisotropy() const
111 {
112 return mState.getMaxAnisotropy();
113 }
114
setMinLod(const Context * context,GLfloat minLod)115 void Sampler::setMinLod(const Context *context, GLfloat minLod)
116 {
117 mState.setMinLod(minLod);
118 signalDirtyState();
119 }
120
getMinLod() const121 GLfloat Sampler::getMinLod() const
122 {
123 return mState.getMinLod();
124 }
125
setMaxLod(const Context * context,GLfloat maxLod)126 void Sampler::setMaxLod(const Context *context, GLfloat maxLod)
127 {
128 mState.setMaxLod(maxLod);
129 signalDirtyState();
130 }
131
getMaxLod() const132 GLfloat Sampler::getMaxLod() const
133 {
134 return mState.getMaxLod();
135 }
136
setCompareMode(const Context * context,GLenum compareMode)137 void Sampler::setCompareMode(const Context *context, GLenum compareMode)
138 {
139 mState.setCompareMode(compareMode);
140 signalDirtyState();
141 }
142
getCompareMode() const143 GLenum Sampler::getCompareMode() const
144 {
145 return mState.getCompareMode();
146 }
147
setCompareFunc(const Context * context,GLenum compareFunc)148 void Sampler::setCompareFunc(const Context *context, GLenum compareFunc)
149 {
150 mState.setCompareFunc(compareFunc);
151 signalDirtyState();
152 }
153
getCompareFunc() const154 GLenum Sampler::getCompareFunc() const
155 {
156 return mState.getCompareFunc();
157 }
158
setSRGBDecode(const Context * context,GLenum sRGBDecode)159 void Sampler::setSRGBDecode(const Context *context, GLenum sRGBDecode)
160 {
161 mState.setSRGBDecode(sRGBDecode);
162 signalDirtyState();
163 }
164
getSRGBDecode() const165 GLenum Sampler::getSRGBDecode() const
166 {
167 return mState.getSRGBDecode();
168 }
169
setBorderColor(const Context * context,const ColorGeneric & color)170 void Sampler::setBorderColor(const Context *context, const ColorGeneric &color)
171 {
172 mState.setBorderColor(color);
173 signalDirtyState();
174 }
175
getBorderColor() const176 const ColorGeneric &Sampler::getBorderColor() const
177 {
178 return mState.getBorderColor();
179 }
180
getSamplerState() const181 const SamplerState &Sampler::getSamplerState() const
182 {
183 return mState;
184 }
185
getImplementation() const186 rx::SamplerImpl *Sampler::getImplementation() const
187 {
188 return mSampler;
189 }
190
syncState(const Context * context)191 angle::Result Sampler::syncState(const Context *context)
192 {
193 ASSERT(isDirty());
194 angle::Result result = mSampler->syncState(context, mDirty);
195 mDirty = result != angle::Result::Continue;
196 return result;
197 }
198
signalDirtyState()199 void Sampler::signalDirtyState()
200 {
201 mDirty = true;
202 onStateChange(angle::SubjectMessage::DirtyBitsFlagged);
203 }
204
205 } // namespace gl
206