1729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray/*
2729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * Copyright (C) 2008-2012 The Android Open Source Project
3729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray *
4729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * Licensed under the Apache License, Version 2.0 (the "License");
5729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * you may not use this file except in compliance with the License.
6729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * You may obtain a copy of the License at
7729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray *
8729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray *      http://www.apache.org/licenses/LICENSE-2.0
9729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray *
10729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * Unless required by applicable law or agreed to in writing, software
11729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * distributed under the License is distributed on an "AS IS" BASIS,
12729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * See the License for the specific language governing permissions and
14729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray * limitations under the License.
15729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray */
16729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
17729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray#include "RenderScript.h"
1866f0a168c4227d4e302f4ffb21ec7e9d7b9ca828Jason Sams#include "rsCppInternal.h"
19729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
20729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murrayusing namespace android;
21729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murrayusing namespace RSC;
22729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
23729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim MurraySampler::Sampler(sp<RS> rs, void* id):
24729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    BaseObj(id, rs)
25729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray{
26729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mMin = RS_SAMPLER_INVALID;
27729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mMag = RS_SAMPLER_INVALID;
28e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsSamplerValue mWrapS = RS_SAMPLER_INVALID;
29e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsSamplerValue mWrapT = RS_SAMPLER_INVALID;
30729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    float mAniso = 0.f;
31729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
32729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
33e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao WangSampler::Sampler(sp<RS> rs, void* id, RsSamplerValue min, RsSamplerValue mag,
34e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                 RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy):
35e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    BaseObj(id, rs)
36e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang{
37e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsSamplerValue mMin = min;
38e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsSamplerValue mMag = mag;
39e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsSamplerValue mWrapS = wrapS;
40e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsSamplerValue mWrapT = wrapT;
41e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    float mAniso = anisotropy;
42e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
43e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
44729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim MurrayRsSamplerValue Sampler::getMinification() {
45729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    return mMin;
46729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
47729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
48729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim MurrayRsSamplerValue Sampler::getMagnification() {
49729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    return mMag;
50729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
51729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
52729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim MurrayRsSamplerValue Sampler::getWrapS() {
53729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    return mWrapS;
54729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
55729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
56729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim MurrayRsSamplerValue Sampler::getWrapT() {
57729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    return mWrapT;
58729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
59729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
60729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murrayfloat Sampler::getAnisotropy() {
61729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    return mAniso;
62729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
63729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
64e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangsp<Sampler> Sampler::create(sp<RS> rs, RsSamplerValue min, RsSamplerValue mag,
65e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                            RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy) {
66729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    // we aren't supporting wrapR in C++ API atm, so always pass wrap for that
67e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    void* id = RS::dispatch->SamplerCreate(rs->getContext(), min, mag, wrapS, wrapT,
68e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                           RS_SAMPLER_WRAP, anisotropy);
69e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    return new Sampler(rs, id, min, mag, wrapS, wrapT, anisotropy);
70729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray}
71729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
72729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray#define CREATE_SAMPLER(N, MIN, MAG, WRAPS, WRAPT) sp<const Sampler> Sampler::N(sp<RS> rs) { \
7344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        if (rs->mSamplers.N == nullptr) {                                \
7489daad6bae798779e57f252e9da4fe4e62337124Tim Murray            rs->mSamplers.N = (create(rs, MIN, MAG, WRAPS, WRAPT, 0.f)); \
7544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        }                                                                \
7644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return rs->mSamplers.N;                                          \
77729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    }
78729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
797fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(CLAMP_NEAREST, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST, RS_SAMPLER_CLAMP, RS_SAMPLER_CLAMP);
807fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(CLAMP_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_CLAMP, RS_SAMPLER_CLAMP);
817fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(CLAMP_LINEAR_MIP_LINEAR, RS_SAMPLER_LINEAR_MIP_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_CLAMP, RS_SAMPLER_CLAMP);
827fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(WRAP_NEAREST, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST, RS_SAMPLER_WRAP, RS_SAMPLER_WRAP);
837fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(WRAP_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_WRAP, RS_SAMPLER_WRAP);
847fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(WRAP_LINEAR_MIP_LINEAR, RS_SAMPLER_LINEAR_MIP_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_WRAP, RS_SAMPLER_WRAP);
857fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(MIRRORED_REPEAT_NEAREST, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST, RS_SAMPLER_MIRRORED_REPEAT, RS_SAMPLER_MIRRORED_REPEAT);
867fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(MIRRORED_REPEAT_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_MIRRORED_REPEAT, RS_SAMPLER_MIRRORED_REPEAT);
877fbf6e4dc196af808054a24c07502d6f65df663eMiao WangCREATE_SAMPLER(MIRRORED_REPEAT_LINEAR_MIP_LINEAR, RS_SAMPLER_LINEAR_MIP_LINEAR, RS_SAMPLER_LINEAR, RS_SAMPLER_MIRRORED_REPEAT, RS_SAMPLER_MIRRORED_REPEAT);
88