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" 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsSampler.h" 19e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rs.h" 201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSampler::Sampler(Context *rsc) : ObjectBase(rsc) { 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // Should not get called. 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(0); 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 30e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsSampler::Sampler(Context *rsc, 31e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams RsSamplerValue magFilter, 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsSamplerValue minFilter, 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsSamplerValue wrapS, 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsSamplerValue wrapT, 351103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk RsSamplerValue wrapR, 36afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float aniso) : ObjectBase(rsc) { 37c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.magFilter = magFilter; 38c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.minFilter = minFilter; 39c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.wrapS = wrapS; 40c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.wrapT = wrapT; 41c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.wrapR = wrapR; 42c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.aniso = aniso; 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 447f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk mRSC->mHal.funcs.sampler.init(mRSC, this); 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 477f126c78a107257090c6675ea40ffac41516a9dcAlex SakhartchoukSampler::~Sampler() { 487f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk mRSC->mHal.funcs.sampler.destroy(mRSC, this); 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 51c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Sampler::preDestroy() const { 52c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < mRSC->mStateSampler.mAllSamplers.size(); ct++) { 53c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (mRSC->mStateSampler.mAllSamplers[ct] == this) { 54c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mRSC->mStateSampler.mAllSamplers.removeAt(ct); 55c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk break; 56c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 57c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 58c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 59c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 60afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Sampler::bindToContext(SamplerState *ss, uint32_t slot) { 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ss->mSamplers[slot].set(this); 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mBoundSlot = slot; 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 65afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Sampler::unbindFromContext(SamplerState *ss) { 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int32_t slot = mBoundSlot; 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mBoundSlot = -1; 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ss->mSamplers[slot].clear(); 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 71e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Sampler::serialize(Context *rsc, OStream *stream) const { 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 73fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 74afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSampler *Sampler::createFromStream(Context *rsc, IStream *stream) { 75fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 76fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 78c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<Sampler> Sampler::getSampler(Context *rsc, 79c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsSamplerValue magFilter, 80c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsSamplerValue minFilter, 81c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsSamplerValue wrapS, 82c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsSamplerValue wrapT, 83c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsSamplerValue wrapR, 84c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk float aniso) { 85c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Sampler> returnRef; 86c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 87c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < rsc->mStateSampler.mAllSamplers.size(); ct++) { 88c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Sampler *existing = rsc->mStateSampler.mAllSamplers[ct]; 89c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.magFilter != magFilter) continue; 90c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.minFilter != minFilter ) continue; 91c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.wrapS != wrapS) continue; 92c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.wrapT != wrapT) continue; 93c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.wrapR != wrapR) continue; 94c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.aniso != aniso) continue; 95c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(existing); 96c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 97c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 99c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 100c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 101c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Sampler *s = new Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso); 102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(s); 103c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 104c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk rsc->mStateSampler.mAllSamplers.push(s); 106c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 107c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 108c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 110c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////// 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 116c2c02a88641620f50a69cc174077ac8bbef40478Alex SakhartchoukRsSampler rsi_SamplerCreate(Context * rsc, 117c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue magFilter, 118c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue minFilter, 119c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue wrapS, 120c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue wrapT, 121c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue wrapR, 122c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk float aniso) { 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Sampler> s = Sampler::getSampler(rsc, magFilter, minFilter, 124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk wrapS, wrapT, wrapR, aniso); 1259397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams s->incUserRef(); 126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return s.get(); 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}} 130