1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 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_PROGRAM_H
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_RS_PROGRAM_H
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
207f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsProgramBase.h"
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsElement.h"
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// ---------------------------------------------------------------------------
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
27e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk#define RS_SHADER_INTERNAL "//rs_shader_internal\n"
28886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk#define RS_SHADER_ATTR "ATTRIB_"
29886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk#define RS_SHADER_UNI "UNI_"
30e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
317f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukclass Program : public ProgramBase {
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic:
33a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct Hal {
34a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mutable void *drv;
35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        struct State {
37a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // The difference between Textures and Constants is how they are accessed
38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // Texture lookups go though a sampler which in effect converts normalized
39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // coordinates into type specific.  Multiple samples may also be taken
40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // and filtered.
41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            //
42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // Constants are strictly accessed by the shader code
43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Allocation **textures;
44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            RsTextureTarget *textureTargets;
45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t texturesCount;
46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Sampler **samplers;
48a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t samplersCount;
49a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
50064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Allocation **constants;
51064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Type **constantTypes;
52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t constantsCount;
53a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Element **inputElements;
55a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t inputElementsCount;
56a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        };
57a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        State state;
58a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    };
59a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    Hal mHal;
60a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
61748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk    Program(Context *, const char * shaderText, size_t shaderLength,
62f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers            const uintptr_t * params, size_t paramLength);
63064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    virtual ~Program();
64064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    virtual bool freeChildren();
65064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
66064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    void bindAllocation(Context *, Allocation *, uint32_t slot);
67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    bool isUserProgram() const {return !mIsInternal;}
69064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
70064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    void bindTexture(Context *, uint32_t slot, Allocation *);
71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    void bindSampler(Context *, uint32_t slot, Sampler *);
72064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected:
74064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Allocation> *mTextures;
75064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Sampler> *mSamplers;
76064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Allocation> *mConstants;
77064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Type> *mConstantTypes;
78064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Element> *mInputElements;
79064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk
80e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    bool mIsInternal;
81f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams    const char *mUserShader;
82f313dc32d5ea68a7c48fb4ec6e131ec2fb97ce2dJason Sams    size_t mUserShaderLen;
8354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    void initMemberVars();
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
887f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#endif // ANDROID_RS_PROGRAM_H
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
92