xref: /aosp_15_r20/external/angle/src/libANGLE/Sampler.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2013 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // Sampler.cpp : Implements the Sampler class, which represents a GLES 3
8*8975f5c5SAndroid Build Coastguard Worker // sampler object. Sampler objects store some state needed to sample textures.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Sampler.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/GLImplFactory.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/SamplerImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker namespace gl
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker 
Sampler(rx::GLImplFactory * factory,SamplerID id)18*8975f5c5SAndroid Build Coastguard Worker Sampler::Sampler(rx::GLImplFactory *factory, SamplerID id)
19*8975f5c5SAndroid Build Coastguard Worker     : RefCountObject(factory->generateSerial(), id),
20*8975f5c5SAndroid Build Coastguard Worker       mState(),
21*8975f5c5SAndroid Build Coastguard Worker       mDirty(true),
22*8975f5c5SAndroid Build Coastguard Worker       mSampler(factory->createSampler(mState)),
23*8975f5c5SAndroid Build Coastguard Worker       mLabel()
24*8975f5c5SAndroid Build Coastguard Worker {}
25*8975f5c5SAndroid Build Coastguard Worker 
~Sampler()26*8975f5c5SAndroid Build Coastguard Worker Sampler::~Sampler()
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker     SafeDelete(mSampler);
29*8975f5c5SAndroid Build Coastguard Worker }
30*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const Context * context)31*8975f5c5SAndroid Build Coastguard Worker void Sampler::onDestroy(const Context *context)
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker     if (mSampler)
34*8975f5c5SAndroid Build Coastguard Worker     {
35*8975f5c5SAndroid Build Coastguard Worker         mSampler->onDestroy(context);
36*8975f5c5SAndroid Build Coastguard Worker     }
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker 
setLabel(const Context * context,const std::string & label)39*8975f5c5SAndroid Build Coastguard Worker angle::Result Sampler::setLabel(const Context *context, const std::string &label)
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker     mLabel = label;
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     if (mSampler)
44*8975f5c5SAndroid Build Coastguard Worker     {
45*8975f5c5SAndroid Build Coastguard Worker         return mSampler->onLabelUpdate(context);
46*8975f5c5SAndroid Build Coastguard Worker     }
47*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
48*8975f5c5SAndroid Build Coastguard Worker }
49*8975f5c5SAndroid Build Coastguard Worker 
getLabel() const50*8975f5c5SAndroid Build Coastguard Worker const std::string &Sampler::getLabel() const
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker     return mLabel;
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
setMinFilter(const Context * context,GLenum minFilter)55*8975f5c5SAndroid Build Coastguard Worker void Sampler::setMinFilter(const Context *context, GLenum minFilter)
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker     mState.setMinFilter(minFilter);
58*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker 
getMinFilter() const61*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getMinFilter() const
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker     return mState.getMinFilter();
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker 
setMagFilter(const Context * context,GLenum magFilter)66*8975f5c5SAndroid Build Coastguard Worker void Sampler::setMagFilter(const Context *context, GLenum magFilter)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     mState.setMagFilter(magFilter);
69*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
70*8975f5c5SAndroid Build Coastguard Worker }
71*8975f5c5SAndroid Build Coastguard Worker 
getMagFilter() const72*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getMagFilter() const
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker     return mState.getMagFilter();
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker 
setWrapS(const Context * context,GLenum wrapS)77*8975f5c5SAndroid Build Coastguard Worker void Sampler::setWrapS(const Context *context, GLenum wrapS)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker     mState.setWrapS(wrapS);
80*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
getWrapS() const83*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getWrapS() const
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker     return mState.getWrapS();
86*8975f5c5SAndroid Build Coastguard Worker }
87*8975f5c5SAndroid Build Coastguard Worker 
setWrapT(const Context * context,GLenum wrapT)88*8975f5c5SAndroid Build Coastguard Worker void Sampler::setWrapT(const Context *context, GLenum wrapT)
89*8975f5c5SAndroid Build Coastguard Worker {
90*8975f5c5SAndroid Build Coastguard Worker     mState.setWrapT(wrapT);
91*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker 
getWrapT() const94*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getWrapT() const
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     return mState.getWrapT();
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker 
setWrapR(const Context * context,GLenum wrapR)99*8975f5c5SAndroid Build Coastguard Worker void Sampler::setWrapR(const Context *context, GLenum wrapR)
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker     mState.setWrapR(wrapR);
102*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker 
getWrapR() const105*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getWrapR() const
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker     return mState.getWrapR();
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker 
setMaxAnisotropy(const Context * context,float maxAnisotropy)110*8975f5c5SAndroid Build Coastguard Worker void Sampler::setMaxAnisotropy(const Context *context, float maxAnisotropy)
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker     mState.setMaxAnisotropy(maxAnisotropy);
113*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker 
getMaxAnisotropy() const116*8975f5c5SAndroid Build Coastguard Worker float Sampler::getMaxAnisotropy() const
117*8975f5c5SAndroid Build Coastguard Worker {
118*8975f5c5SAndroid Build Coastguard Worker     return mState.getMaxAnisotropy();
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker 
setMinLod(const Context * context,GLfloat minLod)121*8975f5c5SAndroid Build Coastguard Worker void Sampler::setMinLod(const Context *context, GLfloat minLod)
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker     mState.setMinLod(minLod);
124*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
125*8975f5c5SAndroid Build Coastguard Worker }
126*8975f5c5SAndroid Build Coastguard Worker 
getMinLod() const127*8975f5c5SAndroid Build Coastguard Worker GLfloat Sampler::getMinLod() const
128*8975f5c5SAndroid Build Coastguard Worker {
129*8975f5c5SAndroid Build Coastguard Worker     return mState.getMinLod();
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker 
setMaxLod(const Context * context,GLfloat maxLod)132*8975f5c5SAndroid Build Coastguard Worker void Sampler::setMaxLod(const Context *context, GLfloat maxLod)
133*8975f5c5SAndroid Build Coastguard Worker {
134*8975f5c5SAndroid Build Coastguard Worker     mState.setMaxLod(maxLod);
135*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
136*8975f5c5SAndroid Build Coastguard Worker }
137*8975f5c5SAndroid Build Coastguard Worker 
getMaxLod() const138*8975f5c5SAndroid Build Coastguard Worker GLfloat Sampler::getMaxLod() const
139*8975f5c5SAndroid Build Coastguard Worker {
140*8975f5c5SAndroid Build Coastguard Worker     return mState.getMaxLod();
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker 
setCompareMode(const Context * context,GLenum compareMode)143*8975f5c5SAndroid Build Coastguard Worker void Sampler::setCompareMode(const Context *context, GLenum compareMode)
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker     mState.setCompareMode(compareMode);
146*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
147*8975f5c5SAndroid Build Coastguard Worker }
148*8975f5c5SAndroid Build Coastguard Worker 
getCompareMode() const149*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getCompareMode() const
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker     return mState.getCompareMode();
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker 
setCompareFunc(const Context * context,GLenum compareFunc)154*8975f5c5SAndroid Build Coastguard Worker void Sampler::setCompareFunc(const Context *context, GLenum compareFunc)
155*8975f5c5SAndroid Build Coastguard Worker {
156*8975f5c5SAndroid Build Coastguard Worker     mState.setCompareFunc(compareFunc);
157*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
158*8975f5c5SAndroid Build Coastguard Worker }
159*8975f5c5SAndroid Build Coastguard Worker 
getCompareFunc() const160*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getCompareFunc() const
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker     return mState.getCompareFunc();
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker 
setSRGBDecode(const Context * context,GLenum sRGBDecode)165*8975f5c5SAndroid Build Coastguard Worker void Sampler::setSRGBDecode(const Context *context, GLenum sRGBDecode)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker     mState.setSRGBDecode(sRGBDecode);
168*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
169*8975f5c5SAndroid Build Coastguard Worker }
170*8975f5c5SAndroid Build Coastguard Worker 
getSRGBDecode() const171*8975f5c5SAndroid Build Coastguard Worker GLenum Sampler::getSRGBDecode() const
172*8975f5c5SAndroid Build Coastguard Worker {
173*8975f5c5SAndroid Build Coastguard Worker     return mState.getSRGBDecode();
174*8975f5c5SAndroid Build Coastguard Worker }
175*8975f5c5SAndroid Build Coastguard Worker 
setBorderColor(const Context * context,const ColorGeneric & color)176*8975f5c5SAndroid Build Coastguard Worker void Sampler::setBorderColor(const Context *context, const ColorGeneric &color)
177*8975f5c5SAndroid Build Coastguard Worker {
178*8975f5c5SAndroid Build Coastguard Worker     mState.setBorderColor(color);
179*8975f5c5SAndroid Build Coastguard Worker     signalDirtyState();
180*8975f5c5SAndroid Build Coastguard Worker }
181*8975f5c5SAndroid Build Coastguard Worker 
getBorderColor() const182*8975f5c5SAndroid Build Coastguard Worker const ColorGeneric &Sampler::getBorderColor() const
183*8975f5c5SAndroid Build Coastguard Worker {
184*8975f5c5SAndroid Build Coastguard Worker     return mState.getBorderColor();
185*8975f5c5SAndroid Build Coastguard Worker }
186*8975f5c5SAndroid Build Coastguard Worker 
getSamplerState() const187*8975f5c5SAndroid Build Coastguard Worker const SamplerState &Sampler::getSamplerState() const
188*8975f5c5SAndroid Build Coastguard Worker {
189*8975f5c5SAndroid Build Coastguard Worker     return mState;
190*8975f5c5SAndroid Build Coastguard Worker }
191*8975f5c5SAndroid Build Coastguard Worker 
getImplementation() const192*8975f5c5SAndroid Build Coastguard Worker rx::SamplerImpl *Sampler::getImplementation() const
193*8975f5c5SAndroid Build Coastguard Worker {
194*8975f5c5SAndroid Build Coastguard Worker     return mSampler;
195*8975f5c5SAndroid Build Coastguard Worker }
196*8975f5c5SAndroid Build Coastguard Worker 
syncState(const Context * context)197*8975f5c5SAndroid Build Coastguard Worker angle::Result Sampler::syncState(const Context *context)
198*8975f5c5SAndroid Build Coastguard Worker {
199*8975f5c5SAndroid Build Coastguard Worker     ASSERT(isDirty());
200*8975f5c5SAndroid Build Coastguard Worker     angle::Result result = mSampler->syncState(context, mDirty);
201*8975f5c5SAndroid Build Coastguard Worker     mDirty               = result != angle::Result::Continue;
202*8975f5c5SAndroid Build Coastguard Worker     return result;
203*8975f5c5SAndroid Build Coastguard Worker }
204*8975f5c5SAndroid Build Coastguard Worker 
signalDirtyState()205*8975f5c5SAndroid Build Coastguard Worker void Sampler::signalDirtyState()
206*8975f5c5SAndroid Build Coastguard Worker {
207*8975f5c5SAndroid Build Coastguard Worker     mDirty = true;
208*8975f5c5SAndroid Build Coastguard Worker     onStateChange(angle::SubjectMessage::DirtyBitsFlagged);
209*8975f5c5SAndroid Build Coastguard Worker }
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
212