rsSampler.cpp revision e3150cfb3edb028407669e4a65e087eae77e718c
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