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 2111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android { 2211496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript { 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSampler::Sampler(Context *rsc) : ObjectBase(rsc) { 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // Should not get called. 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(0); 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 29e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsSampler::Sampler(Context *rsc, 30e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams RsSamplerValue magFilter, 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsSamplerValue minFilter, 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsSamplerValue wrapS, 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsSamplerValue wrapT, 341103d8eade6af4f373ba143752cab2344893babfAlex Sakhartchouk RsSamplerValue wrapR, 35afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk float aniso) : ObjectBase(rsc) { 36c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.magFilter = magFilter; 37c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.minFilter = minFilter; 38c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.wrapS = wrapS; 39c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.wrapT = wrapT; 40c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.wrapR = wrapR; 41c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk mHal.state.aniso = aniso; 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 437f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk mRSC->mHal.funcs.sampler.init(mRSC, this); 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 467f126c78a107257090c6675ea40ffac41516a9dcAlex SakhartchoukSampler::~Sampler() { 477f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk mRSC->mHal.funcs.sampler.destroy(mRSC, this); 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 50c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid Sampler::preDestroy() const { 5182e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang auto& allSamplers = mRSC->mStateSampler.mAllSamplers; 5282e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang for (uint32_t ct = 0; ct < allSamplers.size(); ct++) { 5382e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang if (allSamplers[ct] == this) { 5482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang allSamplers.erase(allSamplers.begin() + ct); 55b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni 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) { 7544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 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 1013abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Sampler), 0); 1023abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan if (!allocMem) { 1033abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Allocation"); 10444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 1053abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan } 1063abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan 1073abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan Sampler *s = new (allocMem) Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso); 108c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(s); 109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 110e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#ifdef RS_FIND_OFFSETS 111e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray ALOGE("pointer for sampler: %p", s); 112e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray ALOGE("pointer for sampler.drv: %p", &s->mHal.drv); 113e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray#endif 114e3af53b643677c40d228ffd3624cf259f4dc68edTim Murray 115c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 11682e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang rsc->mStateSampler.mAllSamplers.push_back(s); 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 121c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 1223abc05bba372af0f6f89e54071f87777f5efeb49Ling Wanvoid Sampler::operator delete(void* ptr) { 1233abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan if (ptr) { 1243abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan Sampler *s = (Sampler*) ptr; 1253abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan s->getContext()->mHal.funcs.freeRuntimeMem(ptr); 1263abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan } 1273abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan} 1283abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan 1293abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////// 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 132c2c02a88641620f50a69cc174077ac8bbef40478Alex SakhartchoukRsSampler rsi_SamplerCreate(Context * rsc, 133c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue magFilter, 134c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue minFilter, 135c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue wrapS, 136c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue wrapT, 137c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk RsSamplerValue wrapR, 138c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk float aniso) { 139c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Sampler> s = Sampler::getSampler(rsc, magFilter, minFilter, 140c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk wrapS, wrapT, wrapR, aniso); 1419397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams s->incUserRef(); 142c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return s.get(); 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 14511496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript 14611496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android 147