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
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#ifndef ANDROID_RS_SAMPLER_H
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_RS_SAMPLER_H
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsAllocation.h"
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// ---------------------------------------------------------------------------
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsconst static uint32_t RS_MAX_SAMPLER_SLOT = 16;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass SamplerState;
29407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk/*****************************************************************************
30407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk * CAUTION
31407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk *
32407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk * Any layout changes for this class may require a corresponding change to be
33407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
34407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk * a partial copy of the information below.
35407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk *
36407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk *****************************************************************************/
37afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Sampler : public ObjectBase {
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic:
39c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk    struct Hal {
40c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk        mutable void *drv;
41c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk
42c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk        struct State {
43c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk            RsSamplerValue magFilter;
44c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk            RsSamplerValue minFilter;
45c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk            RsSamplerValue wrapS;
46c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk            RsSamplerValue wrapT;
47c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk            RsSamplerValue wrapR;
48c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk            float aniso;
49c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk        };
50c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk        State state;
51c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk    };
52c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchouk    Hal mHal;
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
543abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan    void operator delete(void* ptr);
553abc05bba372af0f6f89e54071f87777f5efeb49Ling Wan
56407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk    static ObjectBaseRef<Sampler> getSampler(Context *,
57407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk                                             RsSamplerValue magFilter,
58407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk                                             RsSamplerValue minFilter,
59407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk                                             RsSamplerValue wrapS,
60407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk                                             RsSamplerValue wrapT,
61407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk                                             RsSamplerValue wrapR,
62407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk                                             float aniso = 1.0f);
63407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk    void bindToContext(SamplerState *, uint32_t slot);
64407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk    void unbindFromContext(SamplerState *);
65407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk
66e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    virtual void serialize(Context *rsc, OStream *stream) const;
67407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SAMPLER; }
68407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk    static Sampler *createFromStream(Context *rsc, IStream *stream);
69407f8ca5a1cd2269dba356f40ab32a5ff934a6a2Alex Sakhartchouk
70c2c02a88641620f50a69cc174077ac8bbef40478Alex Sakhartchoukprotected:
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t mBoundSlot;
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
73c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    virtual void preDestroy() const;
74c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    virtual ~Sampler();
75c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprivate:
77e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Sampler(Context *);
78c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    Sampler(Context *,
79c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            RsSamplerValue magFilter,
80c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            RsSamplerValue minFilter,
81c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            RsSamplerValue wrapS,
82c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            RsSamplerValue wrapT,
83c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            RsSamplerValue wrapR,
84c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            float aniso = 1.0f);
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass SamplerState {
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic:
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ObjectBaseRef<Sampler> mSamplers[RS_MAX_SAMPLER_SLOT];
91c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    void init(Context *rsc) {
92c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    }
93c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    void deinit(Context *rsc) {
94c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        for (uint32_t i = 0; i < RS_MAX_SAMPLER_SLOT; i ++) {
95c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            mSamplers[i].clear();
96c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        }
97c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    }
98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    // Cache of all existing raster programs.
99b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    Vector<Sampler *> mAllSamplers;
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif //ANDROID_RS_SAMPLER_H
105b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni
106b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni
107b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni
108