Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2011-2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef RS_HAL_H
     18 #define RS_HAL_H
     19 
     20 #include <rsDefines.h>
     21 
     22 struct ANativeWindow;
     23 
     24 namespace android {
     25 namespace renderscript {
     26 
     27 class Context;
     28 class ObjectBase;
     29 class Element;
     30 class Type;
     31 class Allocation;
     32 class Script;
     33 class ScriptKernelID;
     34 class ScriptFieldID;
     35 class ScriptMethodID;
     36 class ScriptC;
     37 class ScriptGroup;
     38 class Path;
     39 class Program;
     40 class ProgramStore;
     41 class ProgramRaster;
     42 class ProgramVertex;
     43 class ProgramFragment;
     44 class Mesh;
     45 class Sampler;
     46 class FBOCache;
     47 
     48 typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
     49 
     50 typedef struct {
     51     const void *in;
     52     void *out;
     53     const void *usr;
     54     size_t usrLen;
     55     uint32_t x;
     56     uint32_t y;
     57     uint32_t z;
     58     uint32_t lod;
     59     RsAllocationCubemapFace face;
     60     uint32_t ar[16];
     61     uint32_t lid;
     62 
     63     uint32_t dimX;
     64     uint32_t dimY;
     65     uint32_t dimZ;
     66     uint32_t dimArray;
     67 
     68     const uint8_t *ptrIn;
     69     uint8_t *ptrOut;
     70     uint32_t eStrideIn;
     71     uint32_t eStrideOut;
     72     uint32_t yStrideIn;
     73     uint32_t yStrideOut;
     74     uint32_t slot;
     75 } RsForEachStubParamStruct;
     76 
     77 /**
     78  * Script management functions
     79  */
     80 typedef struct {
     81     bool (*initGraphics)(const Context *);
     82     void (*shutdownGraphics)(const Context *);
     83     bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
     84     void (*swap)(const Context *);
     85 
     86     void (*shutdownDriver)(Context *);
     87     void (*getVersion)(unsigned int *major, unsigned int *minor);
     88     void (*setPriority)(const Context *, int32_t priority);
     89 
     90     void* (*allocRuntimeMem)(size_t size, uint32_t flags);
     91     void (*freeRuntimeMem)(void* ptr);
     92 
     93     struct {
     94         bool (*init)(const Context *rsc, ScriptC *s,
     95                      char const *resName,
     96                      char const *cacheDir,
     97                      uint8_t const *bitcode,
     98                      size_t bitcodeSize,
     99                      uint32_t flags);
    100         bool (*initIntrinsic)(const Context *rsc, Script *s,
    101                               RsScriptIntrinsicID iid,
    102                               Element *e);
    103 
    104         void (*invokeFunction)(const Context *rsc, Script *s,
    105                                uint32_t slot,
    106                                const void *params,
    107                                size_t paramLength);
    108         int (*invokeRoot)(const Context *rsc, Script *s);
    109         void (*invokeForEach)(const Context *rsc,
    110                               Script *s,
    111                               uint32_t slot,
    112                               const Allocation * ain,
    113                               Allocation * aout,
    114                               const void * usr,
    115                               size_t usrLen,
    116                               const RsScriptCall *sc);
    117         void (*invokeInit)(const Context *rsc, Script *s);
    118         void (*invokeFreeChildren)(const Context *rsc, Script *s);
    119 
    120         void (*setGlobalVar)(const Context *rsc, const Script *s,
    121                              uint32_t slot,
    122                              void *data,
    123                              size_t dataLength);
    124         void (*getGlobalVar)(const Context *rsc, const Script *s,
    125                              uint32_t slot,
    126                              void *data,
    127                              size_t dataLength);
    128         void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
    129                                          uint32_t slot,
    130                                          void *data,
    131                                          size_t dataLength,
    132                                          const Element *e,
    133                                          const size_t *dims,
    134                                          size_t dimLength);
    135         void (*setGlobalBind)(const Context *rsc, const Script *s,
    136                               uint32_t slot,
    137                               Allocation *data);
    138         void (*setGlobalObj)(const Context *rsc, const Script *s,
    139                              uint32_t slot,
    140                              ObjectBase *data);
    141 
    142         void (*destroy)(const Context *rsc, Script *s);
    143     } script;
    144 
    145     struct {
    146         bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
    147         void (*destroy)(const Context *rsc, Allocation *alloc);
    148         uint32_t (*grallocBits)(const Context *rsc, Allocation *alloc);
    149 
    150         void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
    151                        bool zeroNew);
    152         void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
    153         void (*markDirty)(const Context *rsc, const Allocation *alloc);
    154 
    155         void (*setSurface)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
    156         void (*ioSend)(const Context *rsc, Allocation *alloc);
    157 
    158         /**
    159          * A new gralloc buffer is in use. The pointers and strides in
    160          * mHal.drvState.lod[0-2] will be updated with the new values.
    161          *
    162          * The new gralloc handle is provided in mHal.state.nativeBuffer
    163          *
    164          */
    165         void (*ioReceive)(const Context *rsc, Allocation *alloc);
    166 
    167         void (*data1D)(const Context *rsc, const Allocation *alloc,
    168                        uint32_t xoff, uint32_t lod, size_t count,
    169                        const void *data, size_t sizeBytes);
    170         void (*data2D)(const Context *rsc, const Allocation *alloc,
    171                        uint32_t xoff, uint32_t yoff, uint32_t lod,
    172                        RsAllocationCubemapFace face, uint32_t w, uint32_t h,
    173                        const void *data, size_t sizeBytes, size_t stride);
    174         void (*data3D)(const Context *rsc, const Allocation *alloc,
    175                        uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
    176                        uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes,
    177                        size_t stride);
    178 
    179         void (*read1D)(const Context *rsc, const Allocation *alloc,
    180                        uint32_t xoff, uint32_t lod, size_t count,
    181                        void *data, size_t sizeBytes);
    182         void (*read2D)(const Context *rsc, const Allocation *alloc,
    183                        uint32_t xoff, uint32_t yoff, uint32_t lod,
    184                        RsAllocationCubemapFace face, uint32_t w, uint32_t h,
    185                        void *data, size_t sizeBytes, size_t stride);
    186         void (*read3D)(const Context *rsc, const Allocation *alloc,
    187                        uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
    188                        uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes,
    189                        size_t stride);
    190 
    191         // Lock and unlock make a 1D region of memory available to the CPU
    192         // for direct access by pointer.  Once unlock is called control is
    193         // returned to the SOC driver.
    194         void * (*lock1D)(const Context *rsc, const Allocation *alloc);
    195         void (*unlock1D)(const Context *rsc, const Allocation *alloc);
    196 
    197         // Allocation to allocation copies
    198         void (*allocData1D)(const Context *rsc,
    199                             const Allocation *dstAlloc,
    200                             uint32_t dstXoff, uint32_t dstLod, size_t count,
    201                             const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
    202         void (*allocData2D)(const Context *rsc,
    203                             const Allocation *dstAlloc,
    204                             uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
    205                             RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
    206                             const Allocation *srcAlloc,
    207                             uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
    208                             RsAllocationCubemapFace srcFace);
    209         void (*allocData3D)(const Context *rsc,
    210                             const Allocation *dstAlloc,
    211                             uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
    212                             uint32_t dstLod,
    213                             uint32_t w, uint32_t h, uint32_t d,
    214                             const Allocation *srcAlloc,
    215                             uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
    216                             uint32_t srcLod);
    217 
    218         void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x,
    219                               const void *data, uint32_t elementOff, size_t sizeBytes);
    220         void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y,
    221                               const void *data, uint32_t elementOff, size_t sizeBytes);
    222 
    223         void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
    224     } allocation;
    225 
    226     struct {
    227         bool (*init)(const Context *rsc, const ProgramStore *ps);
    228         void (*setActive)(const Context *rsc, const ProgramStore *ps);
    229         void (*destroy)(const Context *rsc, const ProgramStore *ps);
    230     } store;
    231 
    232     struct {
    233         bool (*init)(const Context *rsc, const ProgramRaster *ps);
    234         void (*setActive)(const Context *rsc, const ProgramRaster *ps);
    235         void (*destroy)(const Context *rsc, const ProgramRaster *ps);
    236     } raster;
    237 
    238     struct {
    239         bool (*init)(const Context *rsc, const ProgramVertex *pv,
    240                      const char* shader, size_t shaderLen,
    241                      const char** textureNames, size_t textureNamesCount,
    242                      const size_t *textureNamesLength);
    243         void (*setActive)(const Context *rsc, const ProgramVertex *pv);
    244         void (*destroy)(const Context *rsc, const ProgramVertex *pv);
    245     } vertex;
    246 
    247     struct {
    248         bool (*init)(const Context *rsc, const ProgramFragment *pf,
    249                      const char* shader, size_t shaderLen,
    250                      const char** textureNames, size_t textureNamesCount,
    251                      const size_t *textureNamesLength);
    252         void (*setActive)(const Context *rsc, const ProgramFragment *pf);
    253         void (*destroy)(const Context *rsc, const ProgramFragment *pf);
    254     } fragment;
    255 
    256     struct {
    257         bool (*init)(const Context *rsc, const Mesh *m);
    258         void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
    259         void (*destroy)(const Context *rsc, const Mesh *m);
    260     } mesh;
    261 
    262     struct {
    263         bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops);
    264         bool (*initDynamic)(const Context *rsc, const Path *m);
    265         void (*draw)(const Context *rsc, const Path *m);
    266         void (*destroy)(const Context *rsc, const Path *m);
    267     } path;
    268 
    269     struct {
    270         bool (*init)(const Context *rsc, const Sampler *m);
    271         void (*destroy)(const Context *rsc, const Sampler *m);
    272     } sampler;
    273 
    274     struct {
    275         bool (*init)(const Context *rsc, const FBOCache *fb);
    276         void (*setActive)(const Context *rsc, const FBOCache *fb);
    277         void (*destroy)(const Context *rsc, const FBOCache *fb);
    278     } framebuffer;
    279 
    280     struct {
    281         bool (*init)(const Context *rsc, ScriptGroup *sg);
    282         void (*setInput)(const Context *rsc, const ScriptGroup *sg,
    283                          const ScriptKernelID *kid, Allocation *);
    284         void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
    285                           const ScriptKernelID *kid, Allocation *);
    286         void (*execute)(const Context *rsc, const ScriptGroup *sg);
    287         void (*destroy)(const Context *rsc, const ScriptGroup *sg);
    288     } scriptgroup;
    289 
    290 } RsdHalFunctions;
    291 
    292 
    293 }
    294 }
    295 
    296 #ifdef __cplusplus
    297 extern "C" {
    298 #endif
    299 
    300 bool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
    301 
    302 #ifdef __cplusplus
    303 }
    304 #endif
    305 
    306 #endif
    307 
    308