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