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
22struct ANativeWindow;
23
24namespace android {
25namespace renderscript {
26
27class Context;
28class ObjectBase;
29class Element;
30class Type;
31class Allocation;
32class Script;
33class ScriptKernelID;
34class ScriptFieldID;
35class ScriptMethodID;
36class ScriptC;
37class ScriptGroup;
38class Path;
39class Program;
40class ProgramStore;
41class ProgramRaster;
42class ProgramVertex;
43class ProgramFragment;
44class Mesh;
45class Sampler;
46class FBOCache;
47
48/**
49 * Define the internal object types.  This ia a mirror of the
50 * definition in rs_types.rsh except with the p value typed
51 * correctly.
52 *
53 * p = pointer to internal object implementation
54 * r = reserved by libRS runtime
55 * v1 = Mirror of p->mHal.drv
56 * v2 = reserved for use by vendor drivers
57 */
58
59#ifndef __LP64__
60#define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; } __attribute__((packed, aligned(4)))
61#else
62#define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; const void* r; const void* v1; const void* v2; }
63#endif
64
65RS_BASE_OBJ(ObjectBase) rs_object_base;
66RS_BASE_OBJ(Element) rs_element;
67RS_BASE_OBJ(Type) rs_type;
68RS_BASE_OBJ(Allocation) rs_allocation;
69RS_BASE_OBJ(Sampler) rs_sampler;
70RS_BASE_OBJ(Script) rs_script;
71RS_BASE_OBJ(ScriptGroup) rs_script_group;
72
73#ifndef __LP64__
74typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_mesh;
75typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_path;
76typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_fragment;
77typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_vertex;
78typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_raster;
79typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_store;
80typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_font;
81#endif // __LP64__
82
83
84typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
85
86/**
87 * Script management functions
88 */
89typedef struct {
90    bool (*initGraphics)(const Context *);
91    void (*shutdownGraphics)(const Context *);
92    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
93    void (*swap)(const Context *);
94
95    void (*shutdownDriver)(Context *);
96    void (*getVersion)(unsigned int *major, unsigned int *minor);
97    void (*setPriority)(const Context *, int32_t priority);
98
99    void* (*allocRuntimeMem)(size_t size, uint32_t flags);
100    void (*freeRuntimeMem)(void* ptr);
101
102    struct {
103        bool (*init)(const Context *rsc, ScriptC *s,
104                     char const *resName,
105                     char const *cacheDir,
106                     uint8_t const *bitcode,
107                     size_t bitcodeSize,
108                     uint32_t flags);
109        bool (*initIntrinsic)(const Context *rsc, Script *s,
110                              RsScriptIntrinsicID iid,
111                              Element *e);
112
113        void (*invokeFunction)(const Context *rsc, Script *s,
114                               uint32_t slot,
115                               const void *params,
116                               size_t paramLength);
117        int (*invokeRoot)(const Context *rsc, Script *s);
118        void (*invokeForEach)(const Context *rsc,
119                              Script *s,
120                              uint32_t slot,
121                              const Allocation * ain,
122                              Allocation * aout,
123                              const void * usr,
124                              size_t usrLen,
125                              const RsScriptCall *sc);
126        void (*invokeInit)(const Context *rsc, Script *s);
127        void (*invokeFreeChildren)(const Context *rsc, Script *s);
128
129        void (*setGlobalVar)(const Context *rsc, const Script *s,
130                             uint32_t slot,
131                             void *data,
132                             size_t dataLength);
133        void (*getGlobalVar)(const Context *rsc, const Script *s,
134                             uint32_t slot,
135                             void *data,
136                             size_t dataLength);
137        void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
138                                         uint32_t slot,
139                                         void *data,
140                                         size_t dataLength,
141                                         const Element *e,
142                                         const uint32_t *dims,
143                                         size_t dimLength);
144        void (*setGlobalBind)(const Context *rsc, const Script *s,
145                              uint32_t slot,
146                              Allocation *data);
147        void (*setGlobalObj)(const Context *rsc, const Script *s,
148                             uint32_t slot,
149                             ObjectBase *data);
150
151        void (*destroy)(const Context *rsc, Script *s);
152        void (*invokeForEachMulti)(const Context *rsc,
153                                   Script *s,
154                                   uint32_t slot,
155                                   const Allocation ** ains,
156                                   size_t inLen,
157                                   Allocation * aout,
158                                   const void * usr,
159                                   size_t usrLen,
160                                   const RsScriptCall *sc);
161        void (*updateCachedObject)(const Context *rsc, const Script *, rs_script *obj);
162    } script;
163
164    struct {
165        bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
166        void (*destroy)(const Context *rsc, Allocation *alloc);
167        uint32_t (*grallocBits)(const Context *rsc, Allocation *alloc);
168
169        void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
170                       bool zeroNew);
171        void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
172        void (*markDirty)(const Context *rsc, const Allocation *alloc);
173
174        void (*setSurface)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
175        void (*ioSend)(const Context *rsc, Allocation *alloc);
176
177        /**
178         * A new gralloc buffer is in use. The pointers and strides in
179         * mHal.drvState.lod[0-2] will be updated with the new values.
180         *
181         * The new gralloc handle is provided in mHal.state.nativeBuffer
182         *
183         */
184        void (*ioReceive)(const Context *rsc, Allocation *alloc);
185
186        void (*data1D)(const Context *rsc, const Allocation *alloc,
187                       uint32_t xoff, uint32_t lod, size_t count,
188                       const void *data, size_t sizeBytes);
189        void (*data2D)(const Context *rsc, const Allocation *alloc,
190                       uint32_t xoff, uint32_t yoff, uint32_t lod,
191                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
192                       const void *data, size_t sizeBytes, size_t stride);
193        void (*data3D)(const Context *rsc, const Allocation *alloc,
194                       uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
195                       uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes,
196                       size_t stride);
197
198        void (*read1D)(const Context *rsc, const Allocation *alloc,
199                       uint32_t xoff, uint32_t lod, size_t count,
200                       void *data, size_t sizeBytes);
201        void (*read2D)(const Context *rsc, const Allocation *alloc,
202                       uint32_t xoff, uint32_t yoff, uint32_t lod,
203                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
204                       void *data, size_t sizeBytes, size_t stride);
205        void (*read3D)(const Context *rsc, const Allocation *alloc,
206                       uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
207                       uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes,
208                       size_t stride);
209
210        // Lock and unlock make a 1D region of memory available to the CPU
211        // for direct access by pointer.  Once unlock is called control is
212        // returned to the SOC driver.
213        void * (*lock1D)(const Context *rsc, const Allocation *alloc);
214        void (*unlock1D)(const Context *rsc, const Allocation *alloc);
215
216        // Allocation to allocation copies
217        void (*allocData1D)(const Context *rsc,
218                            const Allocation *dstAlloc,
219                            uint32_t dstXoff, uint32_t dstLod, size_t count,
220                            const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
221        void (*allocData2D)(const Context *rsc,
222                            const Allocation *dstAlloc,
223                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
224                            RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
225                            const Allocation *srcAlloc,
226                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
227                            RsAllocationCubemapFace srcFace);
228        void (*allocData3D)(const Context *rsc,
229                            const Allocation *dstAlloc,
230                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
231                            uint32_t dstLod,
232                            uint32_t w, uint32_t h, uint32_t d,
233                            const Allocation *srcAlloc,
234                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
235                            uint32_t srcLod);
236
237        void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x,
238                              const void *data, uint32_t elementOff, size_t sizeBytes);
239        void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y,
240                              const void *data, uint32_t elementOff, size_t sizeBytes);
241
242        void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
243
244        void (*updateCachedObject)(const Context *rsc, const Allocation *alloc, rs_allocation *obj);
245    } allocation;
246
247    struct {
248        bool (*init)(const Context *rsc, const ProgramStore *ps);
249        void (*setActive)(const Context *rsc, const ProgramStore *ps);
250        void (*destroy)(const Context *rsc, const ProgramStore *ps);
251    } store;
252
253    struct {
254        bool (*init)(const Context *rsc, const ProgramRaster *ps);
255        void (*setActive)(const Context *rsc, const ProgramRaster *ps);
256        void (*destroy)(const Context *rsc, const ProgramRaster *ps);
257    } raster;
258
259    struct {
260        bool (*init)(const Context *rsc, const ProgramVertex *pv,
261                     const char* shader, size_t shaderLen,
262                     const char** textureNames, size_t textureNamesCount,
263                     const size_t *textureNamesLength);
264        void (*setActive)(const Context *rsc, const ProgramVertex *pv);
265        void (*destroy)(const Context *rsc, const ProgramVertex *pv);
266    } vertex;
267
268    struct {
269        bool (*init)(const Context *rsc, const ProgramFragment *pf,
270                     const char* shader, size_t shaderLen,
271                     const char** textureNames, size_t textureNamesCount,
272                     const size_t *textureNamesLength);
273        void (*setActive)(const Context *rsc, const ProgramFragment *pf);
274        void (*destroy)(const Context *rsc, const ProgramFragment *pf);
275    } fragment;
276
277    struct {
278        bool (*init)(const Context *rsc, const Mesh *m);
279        void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
280        void (*destroy)(const Context *rsc, const Mesh *m);
281    } mesh;
282
283    struct {
284        bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops);
285        bool (*initDynamic)(const Context *rsc, const Path *m);
286        void (*draw)(const Context *rsc, const Path *m);
287        void (*destroy)(const Context *rsc, const Path *m);
288    } path;
289
290    struct {
291        bool (*init)(const Context *rsc, const Sampler *m);
292        void (*destroy)(const Context *rsc, const Sampler *m);
293        void (*updateCachedObject)(const Context *rsc, const Sampler *s, rs_sampler *obj);
294    } sampler;
295
296    struct {
297        bool (*init)(const Context *rsc, const FBOCache *fb);
298        void (*setActive)(const Context *rsc, const FBOCache *fb);
299        void (*destroy)(const Context *rsc, const FBOCache *fb);
300    } framebuffer;
301
302    struct {
303        bool (*init)(const Context *rsc, ScriptGroup *sg);
304        void (*setInput)(const Context *rsc, const ScriptGroup *sg,
305                         const ScriptKernelID *kid, Allocation *);
306        void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
307                          const ScriptKernelID *kid, Allocation *);
308        void (*execute)(const Context *rsc, const ScriptGroup *sg);
309        void (*destroy)(const Context *rsc, const ScriptGroup *sg);
310        void (*updateCachedObject)(const Context *rsc, const ScriptGroup *sg, rs_script_group *obj);
311    } scriptgroup;
312
313    struct {
314        bool (*init)(const Context *rsc, const Type *m);
315        void (*destroy)(const Context *rsc, const Type *m);
316        void (*updateCachedObject)(const Context *rsc, const Type *s, rs_type *obj);
317    } type;
318
319    struct {
320        bool (*init)(const Context *rsc, const Element *m);
321        void (*destroy)(const Context *rsc, const Element *m);
322        void (*updateCachedObject)(const Context *rsc, const Element *s, rs_element *obj);
323    } element;
324
325    void (*finish)(const Context *rsc);
326} RsdHalFunctions;
327
328
329}
330}
331
332#ifdef __cplusplus
333extern "C" {
334#endif
335
336bool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
337
338#ifdef __cplusplus
339}
340#endif
341
342#endif
343