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 62 uint32_t dimX; 63 uint32_t dimY; 64 uint32_t dimZ; 65 uint32_t dimArray; 66 67 const uint8_t *ptrIn; 68 uint8_t *ptrOut; 69 uint32_t eStrideIn; 70 uint32_t eStrideOut; 71 uint32_t yStrideIn; 72 uint32_t yStrideOut; 73 uint32_t slot; 74 } RsForEachStubParamStruct; 75 76 /** 77 * Script management functions 78 */ 79 typedef struct { 80 bool (*initGraphics)(const Context *); 81 void (*shutdownGraphics)(const Context *); 82 bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow); 83 void (*swap)(const Context *); 84 85 void (*shutdownDriver)(Context *); 86 void (*getVersion)(unsigned int *major, unsigned int *minor); 87 void (*setPriority)(const Context *, int32_t priority); 88 89 90 91 struct { 92 bool (*init)(const Context *rsc, ScriptC *s, 93 char const *resName, 94 char const *cacheDir, 95 uint8_t const *bitcode, 96 size_t bitcodeSize, 97 uint32_t flags); 98 bool (*initIntrinsic)(const Context *rsc, Script *s, 99 RsScriptIntrinsicID iid, 100 Element *e); 101 102 void (*invokeFunction)(const Context *rsc, Script *s, 103 uint32_t slot, 104 const void *params, 105 size_t paramLength); 106 int (*invokeRoot)(const Context *rsc, Script *s); 107 void (*invokeForEach)(const Context *rsc, 108 Script *s, 109 uint32_t slot, 110 const Allocation * ain, 111 Allocation * aout, 112 const void * usr, 113 uint32_t usrLen, 114 const RsScriptCall *sc); 115 void (*invokeInit)(const Context *rsc, Script *s); 116 void (*invokeFreeChildren)(const Context *rsc, Script *s); 117 118 void (*setGlobalVar)(const Context *rsc, const Script *s, 119 uint32_t slot, 120 void *data, 121 size_t dataLength); 122 void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s, 123 uint32_t slot, 124 void *data, 125 size_t dataLength, 126 const Element *e, 127 const size_t *dims, 128 size_t dimLength); 129 void (*setGlobalBind)(const Context *rsc, const Script *s, 130 uint32_t slot, 131 Allocation *data); 132 void (*setGlobalObj)(const Context *rsc, const Script *s, 133 uint32_t slot, 134 ObjectBase *data); 135 136 void (*destroy)(const Context *rsc, Script *s); 137 } script; 138 139 struct { 140 bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero); 141 void (*destroy)(const Context *rsc, Allocation *alloc); 142 143 void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType, 144 bool zeroNew); 145 void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src); 146 void (*markDirty)(const Context *rsc, const Allocation *alloc); 147 148 int32_t (*initSurfaceTexture)(const Context *rsc, const Allocation *alloc); 149 void (*setSurfaceTexture)(const Context *rsc, Allocation *alloc, ANativeWindow *sur); 150 void (*ioSend)(const Context *rsc, Allocation *alloc); 151 void (*ioReceive)(const Context *rsc, Allocation *alloc); 152 153 void (*data1D)(const Context *rsc, const Allocation *alloc, 154 uint32_t xoff, uint32_t lod, uint32_t count, 155 const void *data, size_t sizeBytes); 156 void (*data2D)(const Context *rsc, const Allocation *alloc, 157 uint32_t xoff, uint32_t yoff, uint32_t lod, 158 RsAllocationCubemapFace face, uint32_t w, uint32_t h, 159 const void *data, size_t sizeBytes); 160 void (*data3D)(const Context *rsc, const Allocation *alloc, 161 uint32_t xoff, uint32_t yoff, uint32_t zoff, 162 uint32_t lod, RsAllocationCubemapFace face, 163 uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes); 164 165 void (*read1D)(const Context *rsc, const Allocation *alloc, 166 uint32_t xoff, uint32_t lod, uint32_t count, 167 void *data, size_t sizeBytes); 168 void (*read2D)(const Context *rsc, const Allocation *alloc, 169 uint32_t xoff, uint32_t yoff, uint32_t lod, 170 RsAllocationCubemapFace face, uint32_t w, uint32_t h, 171 void *data, size_t sizeBytes); 172 void (*read3D)(const Context *rsc, const Allocation *alloc, 173 uint32_t xoff, uint32_t yoff, uint32_t zoff, 174 uint32_t lod, RsAllocationCubemapFace face, 175 uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes); 176 177 // Lock and unlock make a 1D region of memory available to the CPU 178 // for direct access by pointer. Once unlock is called control is 179 // returned to the SOC driver. 180 void * (*lock1D)(const Context *rsc, const Allocation *alloc); 181 void (*unlock1D)(const Context *rsc, const Allocation *alloc); 182 183 // Allocation to allocation copies 184 void (*allocData1D)(const Context *rsc, 185 const Allocation *dstAlloc, 186 uint32_t dstXoff, uint32_t dstLod, uint32_t count, 187 const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod); 188 void (*allocData2D)(const Context *rsc, 189 const Allocation *dstAlloc, 190 uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod, 191 RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h, 192 const Allocation *srcAlloc, 193 uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod, 194 RsAllocationCubemapFace srcFace); 195 void (*allocData3D)(const Context *rsc, 196 const Allocation *dstAlloc, 197 uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, 198 uint32_t dstLod, RsAllocationCubemapFace dstFace, 199 uint32_t w, uint32_t h, uint32_t d, 200 const Allocation *srcAlloc, 201 uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, 202 uint32_t srcLod, RsAllocationCubemapFace srcFace); 203 204 void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x, 205 const void *data, uint32_t elementOff, size_t sizeBytes); 206 void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y, 207 const void *data, uint32_t elementOff, size_t sizeBytes); 208 209 void (*generateMipmaps)(const Context *rsc, const Allocation *alloc); 210 } allocation; 211 212 struct { 213 bool (*init)(const Context *rsc, const ProgramStore *ps); 214 void (*setActive)(const Context *rsc, const ProgramStore *ps); 215 void (*destroy)(const Context *rsc, const ProgramStore *ps); 216 } store; 217 218 struct { 219 bool (*init)(const Context *rsc, const ProgramRaster *ps); 220 void (*setActive)(const Context *rsc, const ProgramRaster *ps); 221 void (*destroy)(const Context *rsc, const ProgramRaster *ps); 222 } raster; 223 224 struct { 225 bool (*init)(const Context *rsc, const ProgramVertex *pv, 226 const char* shader, size_t shaderLen, 227 const char** textureNames, size_t textureNamesCount, 228 const size_t *textureNamesLength); 229 void (*setActive)(const Context *rsc, const ProgramVertex *pv); 230 void (*destroy)(const Context *rsc, const ProgramVertex *pv); 231 } vertex; 232 233 struct { 234 bool (*init)(const Context *rsc, const ProgramFragment *pf, 235 const char* shader, size_t shaderLen, 236 const char** textureNames, size_t textureNamesCount, 237 const size_t *textureNamesLength); 238 void (*setActive)(const Context *rsc, const ProgramFragment *pf); 239 void (*destroy)(const Context *rsc, const ProgramFragment *pf); 240 } fragment; 241 242 struct { 243 bool (*init)(const Context *rsc, const Mesh *m); 244 void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len); 245 void (*destroy)(const Context *rsc, const Mesh *m); 246 } mesh; 247 248 struct { 249 bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops); 250 bool (*initDynamic)(const Context *rsc, const Path *m); 251 void (*draw)(const Context *rsc, const Path *m); 252 void (*destroy)(const Context *rsc, const Path *m); 253 } path; 254 255 struct { 256 bool (*init)(const Context *rsc, const Sampler *m); 257 void (*destroy)(const Context *rsc, const Sampler *m); 258 } sampler; 259 260 struct { 261 bool (*init)(const Context *rsc, const FBOCache *fb); 262 void (*setActive)(const Context *rsc, const FBOCache *fb); 263 void (*destroy)(const Context *rsc, const FBOCache *fb); 264 } framebuffer; 265 266 struct { 267 bool (*init)(const Context *rsc, const ScriptGroup *sg); 268 void (*setInput)(const Context *rsc, const ScriptGroup *sg, 269 const ScriptKernelID *kid, Allocation *); 270 void (*setOutput)(const Context *rsc, const ScriptGroup *sg, 271 const ScriptKernelID *kid, Allocation *); 272 void (*execute)(const Context *rsc, const ScriptGroup *sg); 273 void (*destroy)(const Context *rsc, const ScriptGroup *sg); 274 } scriptgroup; 275 276 } RsdHalFunctions; 277 278 279 } 280 } 281 282 #ifdef __cplusplus 283 extern "C" { 284 #endif 285 286 bool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor); 287 288 #ifdef __cplusplus 289 } 290 #endif 291 292 #endif 293 294