rsSampler.cpp revision 77d9f4bd05b2d2a161f30c12a2248f9c97eaac42
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1777d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#include "rsContext.h"
1877d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <GLES/gl.h>
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <GLES/glext.h>
2177d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsSampler.h"
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
251aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSampler::Sampler(Context *rsc) : ObjectBase(rsc) {
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // Should not get called.
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(0);
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
35e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsSampler::Sampler(Context *rsc,
36e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams                 RsSamplerValue magFilter,
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue minFilter,
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue wrapS,
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue wrapT,
401103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk                 RsSamplerValue wrapR,
41afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                 float aniso) : ObjectBase(rsc) {
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMagFilter = magFilter;
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMinFilter = minFilter;
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mWrapS = wrapS;
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mWrapT = wrapT;
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mWrapR = wrapR;
471103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    mAniso = aniso;
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
50afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSampler::~Sampler() {
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Sampler::setupGL(const Context *rsc, const Allocation *tex) {
542f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    GLenum trans[] = {
5539c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        GL_NEAREST, //RS_SAMPLER_NEAREST,
5639c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        GL_LINEAR, //RS_SAMPLER_LINEAR,
572f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams        GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
582f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams        GL_REPEAT, //RS_SAMPLER_WRAP,
592f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams        GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
60a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk        GL_LINEAR_MIPMAP_NEAREST, //RS_SAMPLER_LINEAR_MIP_NEAREST
614c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams    };
6239c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams
634c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams    GLenum transNP[] = {
644c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams        GL_NEAREST, //RS_SAMPLER_NEAREST,
654c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams        GL_LINEAR, //RS_SAMPLER_LINEAR,
664c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams        GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
674c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams        GL_CLAMP_TO_EDGE, //RS_SAMPLER_WRAP,
684c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams        GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
69a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk        GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_NEAREST,
702f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    };
7139c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams
7284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // This tells us the correct texture type
7384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum target = (GLenum)tex->getGLTarget();
7484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
75900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams    if (!rsc->ext_OES_texture_npot() && tex->getType()->getIsNp2()) {
760f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams        if (tex->getHasGraphicsMipmaps() &&
770f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams            (rsc->ext_GL_NV_texture_npot_2D_mipmap() || rsc->ext_GL_IMG_texture_npot())) {
780f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams            if (rsc->ext_GL_NV_texture_npot_2D_mipmap()) {
790f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
800f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams            } else {
810f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                switch (trans[mMinFilter]) {
820f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                case GL_LINEAR_MIPMAP_LINEAR:
830f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
840f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                    break;
850f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                default:
860f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
870f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                    break;
880f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams                }
890f7785c4542855ad5e22e6b720c6bdad1817ac61Jason Sams            }
90dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk        } else {
9184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[mMinFilter]);
92dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk        }
9384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameteri(target, GL_TEXTURE_MAG_FILTER, transNP[mMagFilter]);
9484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameteri(target, GL_TEXTURE_WRAP_S, transNP[mWrapS]);
9584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameteri(target, GL_TEXTURE_WRAP_T, transNP[mWrapT]);
96ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    } else {
97900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams        if (tex->getHasGraphicsMipmaps()) {
9884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
99900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams        } else {
10084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[mMinFilter]);
101900f1616bf33c7ba13cf2a737832a95bcd176388Jason Sams        }
10284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameteri(target, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]);
10384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameteri(target, GL_TEXTURE_WRAP_S, trans[mWrapS]);
10484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameteri(target, GL_TEXTURE_WRAP_T, trans[mWrapT]);
105ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1071103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    float anisoValue = rsMin(rsc->ext_texture_max_aniso(), mAniso);
108afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (rsc->ext_texture_max_aniso() > 1.0f) {
10984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue);
1101103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    }
1111103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk
1124c5f99e3d27a0487878435010a23f37b2e9d721bJason Sams    rsc->checkError("Sampler::setupGL2 tex env");
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
115afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Sampler::bindToContext(SamplerState *ss, uint32_t slot) {
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mSamplers[slot].set(this);
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBoundSlot = slot;
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
120afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Sampler::unbindFromContext(SamplerState *ss) {
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t slot = mBoundSlot;
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBoundSlot = -1;
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mSamplers[slot].clear();
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
126afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Sampler::serialize(OStream *stream) const {
127fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSampler *Sampler::createFromStream(Context *rsc, IStream *stream) {
130fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return NULL;
131fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
132fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
139afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_SamplerBegin(Context *rsc) {
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SamplerState * ss = &rsc->mStateSampler;
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mMagFilter = RS_SAMPLER_LINEAR;
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mMinFilter = RS_SAMPLER_LINEAR;
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mWrapS = RS_SAMPLER_WRAP;
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mWrapT = RS_SAMPLER_WRAP;
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mWrapR = RS_SAMPLER_WRAP;
1471103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    ss->mAniso = 1.0f;
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
150afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_SamplerSet(Context *rsc, RsSamplerParam param, RsSamplerValue value) {
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SamplerState * ss = &rsc->mStateSampler;
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
153afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (param) {
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_MAG_FILTER:
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mMagFilter = value;
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_MIN_FILTER:
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mMinFilter = value;
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_WRAP_S:
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mWrapS = value;
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_WRAP_T:
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mWrapT = value;
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_WRAP_R:
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mWrapR = value;
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
1691103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    default:
1701103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk        LOGE("Attempting to set invalid value on sampler");
1711103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk        break;
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
1731103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk}
1741103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk
175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_SamplerSet2(Context *rsc, RsSamplerParam param, float value) {
1761103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    SamplerState * ss = &rsc->mStateSampler;
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
178afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (param) {
1791103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    case RS_SAMPLER_ANISO:
1801103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk        ss->mAniso = value;
1811103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk        break;
1821103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    default:
1831103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk        LOGE("Attempting to set invalid value on sampler");
1841103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk        break;
1851103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk    }
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
188afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsSampler rsi_SamplerCreate(Context *rsc) {
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SamplerState * ss = &rsc->mStateSampler;
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
191e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Sampler * s = new Sampler(rsc,
192e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams                              ss->mMagFilter,
193707aaf341a4b068e6ccadf923af85acdd85fd775Jason Sams                              ss->mMinFilter,
194707aaf341a4b068e6ccadf923af85acdd85fd775Jason Sams                              ss->mWrapS,
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                              ss->mWrapT,
1961103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk                              ss->mWrapR,
1971103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk                              ss->mAniso);
1989397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}}
203