10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/* 20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project 30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License. 60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at 70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software 110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and 140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License. 150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */ 160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsContext.h" 180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsSampler.h" 190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rs.h" 200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android; 220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript; 230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSampler::Sampler(Context *rsc) : ObjectBase(rsc) { 260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // Should not get called. 270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsAssert(0); 280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSampler::Sampler(Context *rsc, 310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue magFilter, 320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue minFilter, 330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapS, 340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapT, 350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapR, 360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines float aniso) : ObjectBase(rsc) { 370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.magFilter = magFilter; 380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.minFilter = minFilter; 390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.wrapS = wrapS; 400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.wrapT = wrapT; 410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.wrapR = wrapR; 420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mHal.state.aniso = aniso; 430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRSC->mHal.funcs.sampler.init(mRSC, this); 450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSampler::~Sampler() { 480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRSC->mHal.funcs.sampler.destroy(mRSC, this); 490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Sampler::preDestroy() const { 520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines for (uint32_t ct = 0; ct < mRSC->mStateSampler.mAllSamplers.size(); ct++) { 530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRSC->mStateSampler.mAllSamplers[ct] == this) { 540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRSC->mStateSampler.mAllSamplers.removeAt(ct); 550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines break; 560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Sampler::bindToContext(SamplerState *ss, uint32_t slot) { 610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ss->mSamplers[slot].set(this); 620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mBoundSlot = slot; 630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Sampler::unbindFromContext(SamplerState *ss) { 660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines int32_t slot = mBoundSlot; 670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mBoundSlot = -1; 680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ss->mSamplers[slot].clear(); 690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Sampler::serialize(Context *rsc, OStream *stream) const { 720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSampler *Sampler::createFromStream(Context *rsc, IStream *stream) { 750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return NULL; 760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesObjectBaseRef<Sampler> Sampler::getSampler(Context *rsc, 790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue magFilter, 800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue minFilter, 810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapS, 820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapT, 830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapR, 840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines float aniso) { 850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef<Sampler> returnRef; 860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncLock(); 870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines for (uint32_t ct = 0; ct < rsc->mStateSampler.mAllSamplers.size(); ct++) { 880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Sampler *existing = rsc->mStateSampler.mAllSamplers[ct]; 890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (existing->mHal.state.magFilter != magFilter) continue; 900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (existing->mHal.state.minFilter != minFilter ) continue; 910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (existing->mHal.state.wrapS != wrapS) continue; 920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (existing->mHal.state.wrapT != wrapT) continue; 930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (existing->mHal.state.wrapR != wrapR) continue; 940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (existing->mHal.state.aniso != aniso) continue; 950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines returnRef.set(existing); 960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncUnlock(); 970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return returnRef; 980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncUnlock(); 1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Sampler *s = new Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso); 1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines returnRef.set(s); 1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncLock(); 1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsc->mStateSampler.mAllSamplers.push(s); 1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase::asyncUnlock(); 1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return returnRef; 1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//////////////////////////////// 1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android { 1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript { 1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesRsSampler rsi_SamplerCreate(Context * rsc, 1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue magFilter, 1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue minFilter, 1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapS, 1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapT, 1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines RsSamplerValue wrapR, 1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines float aniso) { 1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef<Sampler> s = Sampler::getSampler(rsc, magFilter, minFilter, 1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines wrapS, wrapT, wrapR, aniso); 1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines s->incUserRef(); 1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return s.get(); 1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}} 130