blob: 670d07e04ef42418c942f40ca1741d5e925ffc68 [file] [log] [blame]
Jason Sams326e0dd2009-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 Sakhartchouk77d9f4b2011-01-31 14:53:24 -080017#include "rsContext.h"
18#ifndef ANDROID_RS_SERIALIZE
Jason Sams326e0dd2009-05-22 14:03:28 -070019#include <GLES/gl.h>
20#include <GLES/glext.h>
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -080021#endif //ANDROID_RS_SERIALIZE
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070022
Jason Sams326e0dd2009-05-22 14:03:28 -070023#include "rsSampler.h"
24
Jason Sams1aa5a4e2009-06-22 17:15:15 -070025
Jason Sams326e0dd2009-05-22 14:03:28 -070026using namespace android;
27using namespace android::renderscript;
28
29
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080030Sampler::Sampler(Context *rsc) : ObjectBase(rsc) {
Jason Sams326e0dd2009-05-22 14:03:28 -070031 // Should not get called.
32 rsAssert(0);
33}
34
Jason Samse514b452009-09-25 14:51:22 -070035Sampler::Sampler(Context *rsc,
36 RsSamplerValue magFilter,
Jason Sams326e0dd2009-05-22 14:03:28 -070037 RsSamplerValue minFilter,
38 RsSamplerValue wrapS,
39 RsSamplerValue wrapT,
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070040 RsSamplerValue wrapR,
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080041 float aniso) : ObjectBase(rsc) {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070042 mHal.state.magFilter = magFilter;
43 mHal.state.minFilter = minFilter;
44 mHal.state.wrapS = wrapS;
45 mHal.state.wrapT = wrapT;
46 mHal.state.wrapR = wrapR;
47 mHal.state.aniso = aniso;
Jason Sams326e0dd2009-05-22 14:03:28 -070048}
49
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080050Sampler::~Sampler() {
Jason Sams326e0dd2009-05-22 14:03:28 -070051}
52
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080053void Sampler::setupGL(const Context *rsc, const Allocation *tex) {
Jason Sams2f2898c2009-05-28 16:16:24 -070054 GLenum trans[] = {
Jason Sams39c8bc72009-05-28 15:37:57 -070055 GL_NEAREST, //RS_SAMPLER_NEAREST,
56 GL_LINEAR, //RS_SAMPLER_LINEAR,
Jason Sams2f2898c2009-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 Sakhartchouka2aab8b2010-12-15 09:59:58 -080060 GL_LINEAR_MIPMAP_NEAREST, //RS_SAMPLER_LINEAR_MIP_NEAREST
Jason Sams2f2898c2009-05-28 16:16:24 -070061 };
Jason Sams39c8bc72009-05-28 15:37:57 -070062
Jason Sams4c5f99e2010-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 Sakhartchouka2aab8b2010-12-15 09:59:58 -080069 GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_NEAREST,
Jason Sams4c5f99e2010-09-14 14:59:03 -070070 };
Jason Samsef21edc2010-02-22 15:37:51 -080071
Alex Sakhartchouk84e40272010-11-18 15:22:43 -080072 // This tells us the correct texture type
73 GLenum target = (GLenum)tex->getGLTarget();
74
Jason Sams900f1612010-09-16 18:18:29 -070075 if (!rsc->ext_OES_texture_npot() && tex->getType()->getIsNp2()) {
Jason Sams0f7785c2011-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()) {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070079 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mHal.state.minFilter]);
Jason Sams0f7785c2011-01-13 17:02:35 -080080 } else {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070081 switch (trans[mHal.state.minFilter]) {
Jason Sams0f7785c2011-01-13 17:02:35 -080082 case GL_LINEAR_MIPMAP_LINEAR:
83 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
84 break;
85 default:
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070086 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mHal.state.minFilter]);
Jason Sams0f7785c2011-01-13 17:02:35 -080087 break;
88 }
89 }
Alex Sakhartchoukdc763f32010-10-27 14:10:07 -070090 } else {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070091 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[mHal.state.minFilter]);
Alex Sakhartchoukdc763f32010-10-27 14:10:07 -070092 }
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070093 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, transNP[mHal.state.magFilter]);
94 glTexParameteri(target, GL_TEXTURE_WRAP_S, transNP[mHal.state.wrapS]);
95 glTexParameteri(target, GL_TEXTURE_WRAP_T, transNP[mHal.state.wrapT]);
Jason Samsef21edc2010-02-22 15:37:51 -080096 } else {
Jason Sams900f1612010-09-16 18:18:29 -070097 if (tex->getHasGraphicsMipmaps()) {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070098 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mHal.state.minFilter]);
Jason Sams900f1612010-09-16 18:18:29 -070099 } else {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -0700100 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[mHal.state.minFilter]);
Jason Sams900f1612010-09-16 18:18:29 -0700101 }
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -0700102 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, trans[mHal.state.magFilter]);
103 glTexParameteri(target, GL_TEXTURE_WRAP_S, trans[mHal.state.wrapS]);
104 glTexParameteri(target, GL_TEXTURE_WRAP_T, trans[mHal.state.wrapT]);
Jason Samsef21edc2010-02-22 15:37:51 -0800105 }
Jason Sams326e0dd2009-05-22 14:03:28 -0700106
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -0700107 float anisoValue = rsMin(rsc->ext_texture_max_aniso(), mHal.state.aniso);
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800108 if (rsc->ext_texture_max_aniso() > 1.0f) {
Alex Sakhartchouk84e40272010-11-18 15:22:43 -0800109 glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue);
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -0700110 }
111
Jason Sams4c5f99e2010-09-14 14:59:03 -0700112 rsc->checkError("Sampler::setupGL2 tex env");
Jason Sams326e0dd2009-05-22 14:03:28 -0700113}
114
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800115void Sampler::bindToContext(SamplerState *ss, uint32_t slot) {
Jason Sams326e0dd2009-05-22 14:03:28 -0700116 ss->mSamplers[slot].set(this);
117 mBoundSlot = slot;
118}
119
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800120void Sampler::unbindFromContext(SamplerState *ss) {
Jason Sams326e0dd2009-05-22 14:03:28 -0700121 int32_t slot = mBoundSlot;
122 mBoundSlot = -1;
123 ss->mSamplers[slot].clear();
124}
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700125
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800126void Sampler::serialize(OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700127}
128
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800129Sampler *Sampler::createFromStream(Context *rsc, IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700130 return NULL;
131}
132
Jason Sams326e0dd2009-05-22 14:03:28 -0700133////////////////////////////////
134
135namespace android {
136namespace renderscript {
137
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -0700138RsSampler rsi_SamplerCreate(Context * rsc,
139 RsSamplerValue magFilter,
140 RsSamplerValue minFilter,
141 RsSamplerValue wrapS,
142 RsSamplerValue wrapT,
143 RsSamplerValue wrapR,
144 float aniso) {
145 Sampler * s = new Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
Jason Sams9397e302009-08-27 20:23:34 -0700146 s->incUserRef();
Jason Sams326e0dd2009-05-22 14:03:28 -0700147 return s;
148}
149
Jason Sams326e0dd2009-05-22 14:03:28 -0700150}}