10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_SAMPLER_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_SAMPLER_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsAllocation.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesconst static uint32_t RS_MAX_SAMPLER_SLOT = 16;
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass SamplerState;
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*****************************************************************************
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * CAUTION
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Any layout changes for this class may require a corresponding change to be
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * a partial copy of the information below.
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *****************************************************************************/
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Sampler : public ObjectBase {
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct Hal {
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mutable void *drv;
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        struct State {
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue magFilter;
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue minFilter;
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue wrapS;
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue wrapT;
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue wrapR;
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            float aniso;
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        };
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        State state;
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    };
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Hal mHal;
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static ObjectBaseRef<Sampler> getSampler(Context *,
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                             RsSamplerValue magFilter,
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                             RsSamplerValue minFilter,
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                             RsSamplerValue wrapS,
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                             RsSamplerValue wrapT,
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                             RsSamplerValue wrapR,
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                             float aniso = 1.0f);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void bindToContext(SamplerState *, uint32_t slot);
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void unbindFromContext(SamplerState *);
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void serialize(Context *rsc, OStream *stream) const;
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SAMPLER; }
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static Sampler *createFromStream(Context *rsc, IStream *stream);
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t mBoundSlot;
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void preDestroy() const;
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual ~Sampler();
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprivate:
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Sampler(Context *);
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Sampler(Context *,
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue magFilter,
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue minFilter,
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue wrapS,
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue wrapT,
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsSamplerValue wrapR,
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            float aniso = 1.0f);
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass SamplerState {
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<Sampler> mSamplers[RS_MAX_SAMPLER_SLOT];
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void init(Context *rsc) {
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void deinit(Context *rsc) {
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (uint32_t i = 0; i < RS_MAX_SAMPLER_SLOT; i ++) {
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mSamplers[i].clear();
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Cache of all existing raster programs.
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Vector<Sampler *> mAllSamplers;
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif //ANDROID_RS_SAMPLER_H
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
106