• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <GLES/gl.h>
18 #include <GLES/glext.h>
19 
20 #include "rsContext.h"
21 #include "rsSampler.h"
22 
23 
24 using namespace android;
25 using namespace android::renderscript;
26 
27 
Sampler(Context * rsc)28 Sampler::Sampler(Context *rsc) : ObjectBase(rsc)
29 {
30     mAllocFile = __FILE__;
31     mAllocLine = __LINE__;
32     // Should not get called.
33     rsAssert(0);
34 }
35 
Sampler(Context * rsc,RsSamplerValue magFilter,RsSamplerValue minFilter,RsSamplerValue wrapS,RsSamplerValue wrapT,RsSamplerValue wrapR)36 Sampler::Sampler(Context *rsc,
37                  RsSamplerValue magFilter,
38                  RsSamplerValue minFilter,
39                  RsSamplerValue wrapS,
40                  RsSamplerValue wrapT,
41                  RsSamplerValue wrapR) : ObjectBase(rsc)
42 {
43     mAllocFile = __FILE__;
44     mAllocLine = __LINE__;
45     mMagFilter = magFilter;
46     mMinFilter = minFilter;
47     mWrapS = wrapS;
48     mWrapT = wrapT;
49     mWrapR = wrapR;
50 }
51 
~Sampler()52 Sampler::~Sampler()
53 {
54 }
55 
setupGL()56 void Sampler::setupGL()
57 {
58     GLenum trans[] = {
59         GL_NEAREST, //RS_SAMPLER_NEAREST,
60         GL_LINEAR, //RS_SAMPLER_LINEAR,
61         GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
62         GL_REPEAT, //RS_SAMPLER_WRAP,
63         GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
64 
65     };
66 
67 
68     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
69     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]);
70     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, trans[mWrapS]);
71     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, trans[mWrapT]);
72 
73 }
74 
bindToContext(SamplerState * ss,uint32_t slot)75 void Sampler::bindToContext(SamplerState *ss, uint32_t slot)
76 {
77     ss->mSamplers[slot].set(this);
78     mBoundSlot = slot;
79 }
80 
unbindFromContext(SamplerState * ss)81 void Sampler::unbindFromContext(SamplerState *ss)
82 {
83     int32_t slot = mBoundSlot;
84     mBoundSlot = -1;
85     ss->mSamplers[slot].clear();
86 }
87 
setupGL()88 void SamplerState::setupGL()
89 {
90     for (uint32_t ct=0; ct < RS_MAX_SAMPLER_SLOT; ct++) {
91         Sampler *s = mSamplers[ct].get();
92         if (s) {
93             s->setupGL();
94         } else {
95             glBindTexture(GL_TEXTURE_2D, 0);
96         }
97     }
98 }
99 
100 ////////////////////////////////
101 
102 namespace android {
103 namespace renderscript {
104 
105 
rsi_SamplerBegin(Context * rsc)106 void rsi_SamplerBegin(Context *rsc)
107 {
108     SamplerState * ss = &rsc->mStateSampler;
109 
110     ss->mMagFilter = RS_SAMPLER_LINEAR;
111     ss->mMinFilter = RS_SAMPLER_LINEAR;
112     ss->mWrapS = RS_SAMPLER_WRAP;
113     ss->mWrapT = RS_SAMPLER_WRAP;
114     ss->mWrapR = RS_SAMPLER_WRAP;
115 }
116 
rsi_SamplerSet(Context * rsc,RsSamplerParam param,RsSamplerValue value)117 void rsi_SamplerSet(Context *rsc, RsSamplerParam param, RsSamplerValue value)
118 {
119     SamplerState * ss = &rsc->mStateSampler;
120 
121     switch(param) {
122     case RS_SAMPLER_MAG_FILTER:
123         ss->mMagFilter = value;
124         break;
125     case RS_SAMPLER_MIN_FILTER:
126         ss->mMinFilter = value;
127         break;
128     case RS_SAMPLER_WRAP_S:
129         ss->mWrapS = value;
130         break;
131     case RS_SAMPLER_WRAP_T:
132         ss->mWrapT = value;
133         break;
134     case RS_SAMPLER_WRAP_R:
135         ss->mWrapR = value;
136         break;
137     }
138 
139 }
140 
rsi_SamplerCreate(Context * rsc)141 RsSampler rsi_SamplerCreate(Context *rsc)
142 {
143     SamplerState * ss = &rsc->mStateSampler;
144 
145 
146     Sampler * s = new Sampler(rsc,
147                               ss->mMagFilter,
148                               ss->mMinFilter,
149                               ss->mWrapS,
150                               ss->mWrapT,
151                               ss->mWrapR);
152     s->incUserRef();
153     return s;
154 }
155 
156 
157 }}
158