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