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