blob: db2383aca7eb2ab7d15f7c1926a8f642d9bef1df [file] [log] [blame]
Jason Samsd19f10d2009-05-22 14:03:28 -07001/*
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
Alex Sakhartchoukd0f5bd12011-01-31 14:53:24 -080017#include "rsContext.h"
18#ifndef ANDROID_RS_SERIALIZE
Jason Samsd19f10d2009-05-22 14:03:28 -070019#include <GLES/gl.h>
20#include <GLES/glext.h>
Alex Sakhartchoukd0f5bd12011-01-31 14:53:24 -080021#endif //ANDROID_RS_SERIALIZE
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -070022
Jason Samsd19f10d2009-05-22 14:03:28 -070023#include "rsSampler.h"
24
Jason Sams4b962e52009-06-22 17:15:15 -070025
Jason Samsd19f10d2009-05-22 14:03:28 -070026using namespace android;
27using namespace android::renderscript;
28
29
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080030Sampler::Sampler(Context *rsc) : ObjectBase(rsc) {
Jason Samsd19f10d2009-05-22 14:03:28 -070031 // Should not get called.
32 rsAssert(0);
33}
34
Jason Samsa9e7a052009-09-25 14:51:22 -070035Sampler::Sampler(Context *rsc,
36 RsSamplerValue magFilter,
Jason Samsd19f10d2009-05-22 14:03:28 -070037 RsSamplerValue minFilter,
38 RsSamplerValue wrapS,
39 RsSamplerValue wrapT,
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -070040 RsSamplerValue wrapR,
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080041 float aniso) : ObjectBase(rsc) {
Jason Samsd19f10d2009-05-22 14:03:28 -070042 mMagFilter = magFilter;
43 mMinFilter = minFilter;
44 mWrapS = wrapS;
45 mWrapT = wrapT;
46 mWrapR = wrapR;
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -070047 mAniso = aniso;
Jason Samsd19f10d2009-05-22 14:03:28 -070048}
49
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080050Sampler::~Sampler() {
Jason Samsd19f10d2009-05-22 14:03:28 -070051}
52
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080053void Sampler::setupGL(const Context *rsc, const Allocation *tex) {
Jason Sams243e3fb2009-05-28 16:16:24 -070054 GLenum trans[] = {
Jason Sams02fb2cb2009-05-28 15:37:57 -070055 GL_NEAREST, //RS_SAMPLER_NEAREST,
56 GL_LINEAR, //RS_SAMPLER_LINEAR,
Jason Sams243e3fb2009-05-28 16:16:24 -070057 GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
58 GL_REPEAT, //RS_SAMPLER_WRAP,
59 GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
Alex Sakhartchouk08571962010-12-15 09:59:58 -080060 GL_LINEAR_MIPMAP_NEAREST, //RS_SAMPLER_LINEAR_MIP_NEAREST
Jason Sams243e3fb2009-05-28 16:16:24 -070061 };
Jason Sams02fb2cb2009-05-28 15:37:57 -070062
Jason Samscfc04362010-09-14 14:59:03 -070063 GLenum transNP[] = {
64 GL_NEAREST, //RS_SAMPLER_NEAREST,
65 GL_LINEAR, //RS_SAMPLER_LINEAR,
66 GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
67 GL_CLAMP_TO_EDGE, //RS_SAMPLER_WRAP,
68 GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
Alex Sakhartchouk08571962010-12-15 09:59:58 -080069 GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_NEAREST,
Jason Samscfc04362010-09-14 14:59:03 -070070 };
Jason Sams2978bfc2010-02-22 15:37:51 -080071
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -080072 // This tells us the correct texture type
73 GLenum target = (GLenum)tex->getGLTarget();
74
Jason Samsd081fff2010-09-16 18:18:29 -070075 if (!rsc->ext_OES_texture_npot() && tex->getType()->getIsNp2()) {
Jason Sams9333e642011-01-13 17:02:35 -080076 if (tex->getHasGraphicsMipmaps() &&
77 (rsc->ext_GL_NV_texture_npot_2D_mipmap() || rsc->ext_GL_IMG_texture_npot())) {
78 if (rsc->ext_GL_NV_texture_npot_2D_mipmap()) {
79 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
80 } else {
81 switch (trans[mMinFilter]) {
82 case GL_LINEAR_MIPMAP_LINEAR:
83 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
84 break;
85 default:
86 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
87 break;
88 }
89 }
Alex Sakhartchouk581cc642010-10-27 14:10:07 -070090 } else {
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -080091 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[mMinFilter]);
Alex Sakhartchouk581cc642010-10-27 14:10:07 -070092 }
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -080093 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, transNP[mMagFilter]);
94 glTexParameteri(target, GL_TEXTURE_WRAP_S, transNP[mWrapS]);
95 glTexParameteri(target, GL_TEXTURE_WRAP_T, transNP[mWrapT]);
Jason Sams2978bfc2010-02-22 15:37:51 -080096 } else {
Jason Samsd081fff2010-09-16 18:18:29 -070097 if (tex->getHasGraphicsMipmaps()) {
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -080098 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
Jason Samsd081fff2010-09-16 18:18:29 -070099 } else {
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800100 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[mMinFilter]);
Jason Samsd081fff2010-09-16 18:18:29 -0700101 }
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800102 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]);
103 glTexParameteri(target, GL_TEXTURE_WRAP_S, trans[mWrapS]);
104 glTexParameteri(target, GL_TEXTURE_WRAP_T, trans[mWrapT]);
Jason Sams2978bfc2010-02-22 15:37:51 -0800105 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700106
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700107 float anisoValue = rsMin(rsc->ext_texture_max_aniso(), mAniso);
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800108 if (rsc->ext_texture_max_aniso() > 1.0f) {
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800109 glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue);
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700110 }
111
Jason Samscfc04362010-09-14 14:59:03 -0700112 rsc->checkError("Sampler::setupGL2 tex env");
Jason Samsd19f10d2009-05-22 14:03:28 -0700113}
114
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800115void Sampler::bindToContext(SamplerState *ss, uint32_t slot) {
Jason Samsd19f10d2009-05-22 14:03:28 -0700116 ss->mSamplers[slot].set(this);
117 mBoundSlot = slot;
118}
119
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800120void Sampler::unbindFromContext(SamplerState *ss) {
Jason Samsd19f10d2009-05-22 14:03:28 -0700121 int32_t slot = mBoundSlot;
122 mBoundSlot = -1;
123 ss->mSamplers[slot].clear();
124}
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700125
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800126void Sampler::serialize(OStream *stream) const {
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700127}
128
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800129Sampler *Sampler::createFromStream(Context *rsc, IStream *stream) {
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -0700130 return NULL;
131}
132
Jason Samsd19f10d2009-05-22 14:03:28 -0700133////////////////////////////////
134
135namespace android {
136namespace renderscript {
137
138
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800139void rsi_SamplerBegin(Context *rsc) {
Jason Samsd19f10d2009-05-22 14:03:28 -0700140 SamplerState * ss = &rsc->mStateSampler;
141
142 ss->mMagFilter = RS_SAMPLER_LINEAR;
143 ss->mMinFilter = RS_SAMPLER_LINEAR;
144 ss->mWrapS = RS_SAMPLER_WRAP;
145 ss->mWrapT = RS_SAMPLER_WRAP;
146 ss->mWrapR = RS_SAMPLER_WRAP;
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700147 ss->mAniso = 1.0f;
Jason Samsd19f10d2009-05-22 14:03:28 -0700148}
149
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800150void rsi_SamplerSet(Context *rsc, RsSamplerParam param, RsSamplerValue value) {
Jason Samsd19f10d2009-05-22 14:03:28 -0700151 SamplerState * ss = &rsc->mStateSampler;
152
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800153 switch (param) {
Jason Samsd19f10d2009-05-22 14:03:28 -0700154 case RS_SAMPLER_MAG_FILTER:
155 ss->mMagFilter = value;
156 break;
157 case RS_SAMPLER_MIN_FILTER:
158 ss->mMinFilter = value;
159 break;
160 case RS_SAMPLER_WRAP_S:
161 ss->mWrapS = value;
162 break;
163 case RS_SAMPLER_WRAP_T:
164 ss->mWrapT = value;
165 break;
166 case RS_SAMPLER_WRAP_R:
167 ss->mWrapR = value;
168 break;
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700169 default:
170 LOGE("Attempting to set invalid value on sampler");
171 break;
Jason Samsd19f10d2009-05-22 14:03:28 -0700172 }
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700173}
Jason Samsd19f10d2009-05-22 14:03:28 -0700174
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800175void rsi_SamplerSet2(Context *rsc, RsSamplerParam param, float value) {
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700176 SamplerState * ss = &rsc->mStateSampler;
177
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800178 switch (param) {
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700179 case RS_SAMPLER_ANISO:
180 ss->mAniso = value;
181 break;
182 default:
183 LOGE("Attempting to set invalid value on sampler");
184 break;
185 }
Jason Samsd19f10d2009-05-22 14:03:28 -0700186}
187
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800188RsSampler rsi_SamplerCreate(Context *rsc) {
Jason Samsd19f10d2009-05-22 14:03:28 -0700189 SamplerState * ss = &rsc->mStateSampler;
190
Jason Samsa9e7a052009-09-25 14:51:22 -0700191 Sampler * s = new Sampler(rsc,
192 ss->mMagFilter,
Jason Sams7ce033d2009-08-18 14:14:24 -0700193 ss->mMinFilter,
194 ss->mWrapS,
Jason Samsd19f10d2009-05-22 14:03:28 -0700195 ss->mWrapT,
Alex Sakhartchoukf5b35102010-09-30 11:36:37 -0700196 ss->mWrapR,
197 ss->mAniso);
Jason Sams07ae4062009-08-27 20:23:34 -0700198 s->incUserRef();
Jason Samsd19f10d2009-05-22 14:03:28 -0700199 return s;
200}
201
Jason Samsd19f10d2009-05-22 14:03:28 -0700202}}