10835d42be9b215f845e30db03211c86670cfa12aJason Sams/*
20835d42be9b215f845e30db03211c86670cfa12aJason Sams * Copyright (C) 2008 The Android Open Source Project
30835d42be9b215f845e30db03211c86670cfa12aJason Sams *
40835d42be9b215f845e30db03211c86670cfa12aJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
50835d42be9b215f845e30db03211c86670cfa12aJason Sams * you may not use this file except in compliance with the License.
60835d42be9b215f845e30db03211c86670cfa12aJason Sams * You may obtain a copy of the License at
70835d42be9b215f845e30db03211c86670cfa12aJason Sams *
80835d42be9b215f845e30db03211c86670cfa12aJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
90835d42be9b215f845e30db03211c86670cfa12aJason Sams *
100835d42be9b215f845e30db03211c86670cfa12aJason Sams * Unless required by applicable law or agreed to in writing, software
110835d42be9b215f845e30db03211c86670cfa12aJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
120835d42be9b215f845e30db03211c86670cfa12aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130835d42be9b215f845e30db03211c86670cfa12aJason Sams * See the License for the specific language governing permissions and
140835d42be9b215f845e30db03211c86670cfa12aJason Sams * limitations under the License.
150835d42be9b215f845e30db03211c86670cfa12aJason Sams */
160835d42be9b215f845e30db03211c86670cfa12aJason Sams
170835d42be9b215f845e30db03211c86670cfa12aJason Samspackage android.renderscript;
180835d42be9b215f845e30db03211c86670cfa12aJason Sams
199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
20c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Sampler object that defines how Allocations can be read as textures within a
21c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel. Samplers are used in conjunction with the {@code rsSample} runtime
22c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * function to return values from normalized coordinates.
23c11e25c4e653124def1fb18e203b894f42106cbeTim Murray *
24c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Any Allocation used with a Sampler must have been created with {@link
25c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE}; using a Sampler on
26c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * an {@link android.renderscript.Allocation} that was not created with {@link
27c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE} is undefined.
280835d42be9b215f845e30db03211c86670cfa12aJason Sams **/
290835d42be9b215f845e30db03211c86670cfa12aJason Samspublic class Sampler extends BaseObj {
300835d42be9b215f845e30db03211c86670cfa12aJason Sams    public enum Value {
310835d42be9b215f845e30db03211c86670cfa12aJason Sams        NEAREST (0),
320835d42be9b215f845e30db03211c86670cfa12aJason Sams        LINEAR (1),
330835d42be9b215f845e30db03211c86670cfa12aJason Sams        LINEAR_MIP_LINEAR (2),
340857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk        LINEAR_MIP_NEAREST (5),
350835d42be9b215f845e30db03211c86670cfa12aJason Sams        WRAP (3),
366b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        CLAMP (4),
376b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        MIRRORED_REPEAT (6);
380835d42be9b215f845e30db03211c86670cfa12aJason Sams
390835d42be9b215f845e30db03211c86670cfa12aJason Sams        int mID;
400835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value(int id) {
410835d42be9b215f845e30db03211c86670cfa12aJason Sams            mID = id;
420835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
430835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
440835d42be9b215f845e30db03211c86670cfa12aJason Sams
457d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mMin;
467d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mMag;
477d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapS;
487d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapT;
497d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapR;
507d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    float mAniso;
517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
520e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat    Sampler(long id, RenderScript rs) {
530de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
546484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        guard.open("destroy");
550835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
560835d42be9b215f845e30db03211c86670cfa12aJason Sams
579c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return minification setting for the sampler
597d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
607d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMinification() {
617d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMin;
627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return magnification setting for the sampler
667d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
677d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMagnification() {
687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMag;
697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
719c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return S wrapping mode for the sampler
737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapS() {
757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapS;
767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return T wrapping mode for the sampler
807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapT() {
827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapT;
837d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
867d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return anisotropy setting for the sampler
877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
887d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public float getAnisotropy() {
897d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mAniso;
907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
929c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
93bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
94bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
95bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
96f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
97bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
98bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
99bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1004d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_NEAREST(RenderScript rs) {
10133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_CLAMP_NEAREST == null) {
10233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
10333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_CLAMP_NEAREST == null) {
10433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
10533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.NEAREST);
10633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.NEAREST);
10733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.CLAMP);
10833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.CLAMP);
10933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_CLAMP_NEAREST = b.create();
11033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
11133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
1124d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1134d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_NEAREST;
1144d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1169c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
117bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to linear and wrap modes set to
118bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
119bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
120f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
121bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
122bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
123bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1244d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR(RenderScript rs) {
12533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_CLAMP_LINEAR == null) {
12633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
12733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_CLAMP_LINEAR == null) {
12833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
12933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.LINEAR);
13033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.LINEAR);
13133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.CLAMP);
13233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.CLAMP);
13333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_CLAMP_LINEAR = b.create();
13433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
13533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
1364d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1374d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR;
1384d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1394d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1416b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
1426b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * wrap modes set to clamp.
143bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
144f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
145bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
146bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
147bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1484d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
14933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
15033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
15133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
15233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
15333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.LINEAR_MIP_LINEAR);
15433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.LINEAR);
15533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.CLAMP);
15633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.CLAMP);
15733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
15833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
15933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
1604d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1614d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR_MIP_LINEAR;
1624d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1634d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
165bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
166bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
167bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
168f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
169bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
170bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
171bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1724d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_NEAREST(RenderScript rs) {
17333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_WRAP_NEAREST == null) {
17433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
17533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_WRAP_NEAREST == null) {
17633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
17733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.NEAREST);
17833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.NEAREST);
17933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.WRAP);
18033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.WRAP);
18133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_WRAP_NEAREST = b.create();
18233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
18333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
1844d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1854d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_NEAREST;
1864d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1874d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1889c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1896b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to linear and wrap modes set to
190bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
191bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
192f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
193bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
194bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
195bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1964d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR(RenderScript rs) {
19733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_WRAP_LINEAR == null) {
19833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
19933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_WRAP_LINEAR == null) {
20033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
20133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.LINEAR);
20233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.LINEAR);
20333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.WRAP);
20433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.WRAP);
20533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_WRAP_LINEAR = b.create();
20633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
20733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
2084d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
2094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR;
2104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2129c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
2136b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
2146b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * wrap modes set to wrap.
215bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
216f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
217bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
218bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
219bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
22133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
22233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
22333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
22433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
22533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.LINEAR_MIP_LINEAR);
22633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.LINEAR);
22733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.WRAP);
22833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.WRAP);
22933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
23033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
23133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
2324d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
2334d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR_MIP_LINEAR;
2344d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2354d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2366b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    /**
2376b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
2386b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * mirrored repeat.
2396b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2406b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @param rs Context to which the sampler will belong.
2416b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2426b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @return Sampler
2436b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     */
2446b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public static Sampler MIRRORED_REPEAT_NEAREST(RenderScript rs) {
24533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_MIRRORED_REPEAT_NEAREST == null) {
24633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
24733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_MIRRORED_REPEAT_NEAREST == null) {
24833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
24933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.NEAREST);
25033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.NEAREST);
25133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.MIRRORED_REPEAT);
25233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.MIRRORED_REPEAT);
25333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_MIRRORED_REPEAT_NEAREST = b.create();
25433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
25533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
2566b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        }
2576b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        return rs.mSampler_MIRRORED_REPEAT_NEAREST;
2586b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    }
2596b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2606b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    /**
2616b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2626b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * mirrored repeat.
2636b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2646b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @param rs Context to which the sampler will belong.
2656b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2666b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @return Sampler
2676b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     */
2686b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public static Sampler MIRRORED_REPEAT_LINEAR(RenderScript rs) {
26933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_MIRRORED_REPEAT_LINEAR == null) {
27033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
27133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_MIRRORED_REPEAT_LINEAR == null) {
27233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
27333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.LINEAR);
27433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.LINEAR);
27533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.MIRRORED_REPEAT);
27633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.MIRRORED_REPEAT);
27733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_MIRRORED_REPEAT_LINEAR = b.create();
27833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
27933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
2806b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        }
2816b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        return rs.mSampler_MIRRORED_REPEAT_LINEAR;
2826b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    }
2836b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2846b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    /**
2856b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2866b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * mirrored repeat.
2876b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2886b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @param rs Context to which the sampler will belong.
2896b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2906b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @return Sampler
2916b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     */
2926b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public static Sampler MIRRORED_REPEAT_LINEAR_MIP_LINEAR(RenderScript rs) {
29333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni        if (rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR == null) {
29433703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            synchronized (rs) {
29533703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                if (rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR == null) {
29633703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    Builder b = new Builder(rs);
29733703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMinification(Value.LINEAR_MIP_LINEAR);
29833703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setMagnification(Value.LINEAR);
29933703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapS(Value.MIRRORED_REPEAT);
30033703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    b.setWrapT(Value.MIRRORED_REPEAT);
30133703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                    rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR = b.create();
30233703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni                }
30333703f0c4e9b16bda5fd72e71d7d89359ee0db17Yang Ni            }
3046b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        }
3056b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        return rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
3066b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    }
3074d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
3089c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
309c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Builder for creating non-standard samplers.  This is only necessary if
310c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * a Sampler with different min and mag modes is desired.
311bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
3120835d42be9b215f845e30db03211c86670cfa12aJason Sams    public static class Builder {
3130835d42be9b215f845e30db03211c86670cfa12aJason Sams        RenderScript mRS;
3140835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMin;
3150835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMag;
3160835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapS;
3170835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapT;
3180835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapR;
319f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        float mAniso;
3200835d42be9b215f845e30db03211c86670cfa12aJason Sams
3210835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Builder(RenderScript rs) {
3220835d42be9b215f845e30db03211c86670cfa12aJason Sams            mRS = rs;
3230835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMin = Value.NEAREST;
3240835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMag = Value.NEAREST;
3250835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapS = Value.WRAP;
3260835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapT = Value.WRAP;
3270835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapR = Value.WRAP;
328f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            mAniso = 1.0f;
3290835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3300835d42be9b215f845e30db03211c86670cfa12aJason Sams
331b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMinification(Value v) {
3328bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST ||
3338bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                v == Value.LINEAR ||
3340857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_LINEAR ||
3350857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_NEAREST) {
3368bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMin = v;
3378bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3388bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3398bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3400835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3410835d42be9b215f845e30db03211c86670cfa12aJason Sams
342b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMagnification(Value v) {
3438bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST || v == Value.LINEAR) {
3448bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMag = v;
3458bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3468bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3478bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3480835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3490835d42be9b215f845e30db03211c86670cfa12aJason Sams
3500835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapS(Value v) {
3516b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
3528bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapS = v;
3538bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3548bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3558bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3560835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3570835d42be9b215f845e30db03211c86670cfa12aJason Sams
3580835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapT(Value v) {
3596b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
3608bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapT = v;
3618bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3628bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3638bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3640835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3650835d42be9b215f845e30db03211c86670cfa12aJason Sams
366f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        public void setAnisotropy(float v) {
367f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            if(v >= 0.0f) {
368f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                mAniso = v;
369f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            } else {
370f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                throw new IllegalArgumentException("Invalid value");
371f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            }
372f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        }
373f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk
3740835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Sampler create() {
375771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
3760e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat            long id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
3777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                                        mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
3787d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            Sampler sampler = new Sampler(id, mRS);
3797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMin = mMin;
3807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMag = mMag;
3817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapS = mWrapS;
3827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapT = mWrapT;
3837d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapR = mWrapR;
3847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mAniso = mAniso;
3857d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            return sampler;
3860835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3870835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
3880835d42be9b215f845e30db03211c86670cfa12aJason Sams
3890835d42be9b215f845e30db03211c86670cfa12aJason Sams}
3900835d42be9b215f845e30db03211c86670cfa12aJason Sams
391