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