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