blob: 924ba860ce60efa2050cd3195bdd9ba8f1a84bda [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Alex Sakhartchouk77d9f4b2011-01-31 14:53:24 -080017#include "rsContext.h"
Jason Sams326e0dd2009-05-22 14:03:28 -070018#include "rsSampler.h"
Alex Sakhartchouke23d2392012-03-09 09:24:39 -080019#include "rs.h"
Jason Sams1aa5a4e2009-06-22 17:15:15 -070020
Jason Sams326e0dd2009-05-22 14:03:28 -070021using namespace android;
22using namespace android::renderscript;
23
24
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080025Sampler::Sampler(Context *rsc) : ObjectBase(rsc) {
Jason Sams326e0dd2009-05-22 14:03:28 -070026 // Should not get called.
27 rsAssert(0);
28}
29
Jason Samse514b452009-09-25 14:51:22 -070030Sampler::Sampler(Context *rsc,
31 RsSamplerValue magFilter,
Jason Sams326e0dd2009-05-22 14:03:28 -070032 RsSamplerValue minFilter,
33 RsSamplerValue wrapS,
34 RsSamplerValue wrapT,
Alex Sakhartchouk1103d8e2010-09-30 11:36:37 -070035 RsSamplerValue wrapR,
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080036 float aniso) : ObjectBase(rsc) {
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -070037 mHal.state.magFilter = magFilter;
38 mHal.state.minFilter = minFilter;
39 mHal.state.wrapS = wrapS;
40 mHal.state.wrapT = wrapT;
41 mHal.state.wrapR = wrapR;
42 mHal.state.aniso = aniso;
Alex Sakhartchouk7f126c72011-05-05 16:56:27 -070043
44 mRSC->mHal.funcs.sampler.init(mRSC, this);
Jason Sams326e0dd2009-05-22 14:03:28 -070045}
46
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080047Sampler::~Sampler() {
Alex Sakhartchouk7f126c72011-05-05 16:56:27 -070048 mRSC->mHal.funcs.sampler.destroy(mRSC, this);
Jason Sams326e0dd2009-05-22 14:03:28 -070049}
50
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070051void Sampler::preDestroy() const {
Chris Wailes93d6bc82014-07-28 16:54:38 -070052 auto &samplers = mRSC->mStateSampler.mAllSamplers;
53
54 for (auto sampleIter = samplers.begin(), endIter = samplers.end();
55 sampleIter != endIter; sampleIter++) {
56
57 if (this == *sampleIter) {
58 samplers.erase(sampleIter);
59 return;
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070060 }
61 }
62}
63
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080064void Sampler::bindToContext(SamplerState *ss, uint32_t slot) {
Jason Sams326e0dd2009-05-22 14:03:28 -070065 ss->mSamplers[slot].set(this);
66 mBoundSlot = slot;
67}
68
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080069void Sampler::unbindFromContext(SamplerState *ss) {
Jason Sams326e0dd2009-05-22 14:03:28 -070070 int32_t slot = mBoundSlot;
71 mBoundSlot = -1;
72 ss->mSamplers[slot].clear();
73}
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070074
Jason Samse3150cf2012-07-24 18:10:20 -070075void Sampler::serialize(Context *rsc, OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070076}
77
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080078Sampler *Sampler::createFromStream(Context *rsc, IStream *stream) {
Chris Wailes44bef6f2014-08-12 13:51:10 -070079 return nullptr;
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070080}
81
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070082ObjectBaseRef<Sampler> Sampler::getSampler(Context *rsc,
83 RsSamplerValue magFilter,
84 RsSamplerValue minFilter,
85 RsSamplerValue wrapS,
86 RsSamplerValue wrapT,
87 RsSamplerValue wrapR,
88 float aniso) {
89 ObjectBaseRef<Sampler> returnRef;
90 ObjectBase::asyncLock();
91 for (uint32_t ct = 0; ct < rsc->mStateSampler.mAllSamplers.size(); ct++) {
92 Sampler *existing = rsc->mStateSampler.mAllSamplers[ct];
93 if (existing->mHal.state.magFilter != magFilter) continue;
94 if (existing->mHal.state.minFilter != minFilter ) continue;
95 if (existing->mHal.state.wrapS != wrapS) continue;
96 if (existing->mHal.state.wrapT != wrapT) continue;
97 if (existing->mHal.state.wrapR != wrapR) continue;
98 if (existing->mHal.state.aniso != aniso) continue;
99 returnRef.set(existing);
100 ObjectBase::asyncUnlock();
101 return returnRef;
102 }
103 ObjectBase::asyncUnlock();
104
Ling Wan3abc05b2013-03-15 16:21:50 -0700105 void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Sampler), 0);
106 if (!allocMem) {
107 rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Allocation");
Chris Wailes44bef6f2014-08-12 13:51:10 -0700108 return nullptr;
Ling Wan3abc05b2013-03-15 16:21:50 -0700109 }
110
111 Sampler *s = new (allocMem) Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700112 returnRef.set(s);
113
Tim Murraye3af53b2014-06-10 09:46:51 -0700114#ifdef RS_FIND_OFFSETS
115 ALOGE("pointer for sampler: %p", s);
116 ALOGE("pointer for sampler.drv: %p", &s->mHal.drv);
117#endif
118
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700119 ObjectBase::asyncLock();
Chris Wailes93d6bc82014-07-28 16:54:38 -0700120 rsc->mStateSampler.mAllSamplers.push_back(s);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700121 ObjectBase::asyncUnlock();
122
123 return returnRef;
124}
125
Ling Wan3abc05b2013-03-15 16:21:50 -0700126void Sampler::operator delete(void* ptr) {
127 if (ptr) {
128 Sampler *s = (Sampler*) ptr;
129 s->getContext()->mHal.funcs.freeRuntimeMem(ptr);
130 }
131}
132
133
Jason Sams326e0dd2009-05-22 14:03:28 -0700134////////////////////////////////
135
136namespace android {
137namespace renderscript {
138
Alex Sakhartchoukc2c02a82011-05-04 17:45:36 -0700139RsSampler rsi_SamplerCreate(Context * rsc,
140 RsSamplerValue magFilter,
141 RsSamplerValue minFilter,
142 RsSamplerValue wrapS,
143 RsSamplerValue wrapT,
144 RsSamplerValue wrapR,
145 float aniso) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700146 ObjectBaseRef<Sampler> s = Sampler::getSampler(rsc, magFilter, minFilter,
147 wrapS, wrapT, wrapR, aniso);
Jason Sams9397e302009-08-27 20:23:34 -0700148 s->incUserRef();
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700149 return s.get();
Jason Sams326e0dd2009-05-22 14:03:28 -0700150}
151
Jason Sams326e0dd2009-05-22 14:03:28 -0700152}}