1bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/*
22980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
3bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
4bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * you may not use this file except in compliance with the License.
6bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * You may obtain a copy of the License at
7bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
8bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
10bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Unless required by applicable law or agreed to in writing, software
11bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * See the License for the specific language governing permissions and
14bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * limitations under the License.
15bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */
16bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
17bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#ifndef RS_HAL_H
18bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#define RS_HAL_H
19bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
203715b00e7b10a2624c1d5c696186c7a2f4a75a91Jason Sams#include <rsDefines.h>
21bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
227ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsstruct ANativeWindow;
237ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
24bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsnamespace android {
25bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsnamespace renderscript {
26bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
27bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Context;
28bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass ObjectBase;
29bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Element;
30bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Type;
31bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Allocation;
32bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Script;
33dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptKernelID;
34dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptFieldID;
35dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptMethodID;
36bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass ScriptC;
37dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptGroup;
389e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsclass Path;
397f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukclass Program;
408feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsclass ProgramStore;
41721acc495b859c6d884725a4f9b5523583dd11c7Jason Samsclass ProgramRaster;
42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass ProgramVertex;
43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass ProgramFragment;
44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Mesh;
457f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukclass Sampler;
46da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukclass FBOCache;
47bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
48a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams/**
49a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * Define the internal object types.  This ia a mirror of the
50a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * definition in rs_types.rsh except with the p value typed
51a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * correctly.
52a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams *
53a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * p = pointer to internal object implementation
54a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * r = reserved by libRS runtime
55a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * v1 = Mirror of p->mHal.drv
56a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * v2 = reserved for use by vendor drivers
57a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams */
58a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
59a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#ifndef __LP64__
60a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; } __attribute__((packed, aligned(4)))
61a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#else
62a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; const void* r; const void* v1; const void* v2; }
63a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#endif
64a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
65f29edf80510d483b8663e9d8b859959e37361aeeJason SamsRS_BASE_OBJ(ObjectBase) rs_object_base;
66a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Element) rs_element;
67a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Type) rs_type;
68a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Allocation) rs_allocation;
69a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Sampler) rs_sampler;
70a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Script) rs_script;
71a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(ScriptGroup) rs_script_group;
72a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
73a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#ifndef __LP64__
74a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_mesh;
75a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_path;
76a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_fragment;
77a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_vertex;
78a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_raster;
79a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_store;
80a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_font;
81a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#endif // __LP64__
82a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
83a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
84bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samstypedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
85bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
86bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/**
87bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Script management functions
88bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */
89bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samstypedef struct {
904b3de47071d875faaa7d419d050a464b09538797Jason Sams    bool (*initGraphics)(const Context *);
914b3de47071d875faaa7d419d050a464b09538797Jason Sams    void (*shutdownGraphics)(const Context *);
927257c7ee4b66f00c43d9235f3ac600061ae79968Alex Sakhartchouk    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
934b3de47071d875faaa7d419d050a464b09538797Jason Sams    void (*swap)(const Context *);
944b3de47071d875faaa7d419d050a464b09538797Jason Sams
95cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    void (*shutdownDriver)(Context *);
96bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    void (*getVersion)(unsigned int *major, unsigned int *minor);
97cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    void (*setPriority)(const Context *, int32_t priority);
98bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
9934689388556747b52c3c2f1c894929fb44580898Tim Murray    void* (*allocRuntimeMem)(size_t size, uint32_t flags);
10034689388556747b52c3c2f1c894929fb44580898Tim Murray    void (*freeRuntimeMem)(void* ptr);
101bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
102bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    struct {
1038feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        bool (*init)(const Context *rsc, ScriptC *s,
1048feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     char const *resName,
1058feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     char const *cacheDir,
1068feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     uint8_t const *bitcode,
1078feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     size_t bitcodeSize,
10887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                     uint32_t flags);
1098eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        bool (*initIntrinsic)(const Context *rsc, Script *s,
11041d6c769f5fa21da3cbc116af95d88949a4a5c76Stephen Hines                              RsScriptIntrinsicID iid,
1118eaba4fee0c7b5325742c87187622fdff51d5effJason Sams                              Element *e);
112bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
113cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        void (*invokeFunction)(const Context *rsc, Script *s,
114bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                               uint32_t slot,
115bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                               const void *params,
116bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                               size_t paramLength);
117cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        int (*invokeRoot)(const Context *rsc, Script *s);
118cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        void (*invokeForEach)(const Context *rsc,
119cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              Script *s,
12035e429ebf817130d8590d11d441a77aa697bd7d4Jason Sams                              uint32_t slot,
121cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              const Allocation * ain,
122cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              Allocation * aout,
123cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              const void * usr,
124099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                              size_t usrLen,
125cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              const RsScriptCall *sc);
126cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        void (*invokeInit)(const Context *rsc, Script *s);
1274ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines        void (*invokeFreeChildren)(const Context *rsc, Script *s);
128bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
129bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*setGlobalVar)(const Context *rsc, const Script *s,
130bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             uint32_t slot,
1319c64239ebbfa4170190ede812e69150035e008e0Tim Murray                             void *data,
1329c64239ebbfa4170190ede812e69150035e008e0Tim Murray                             size_t dataLength);
1339c64239ebbfa4170190ede812e69150035e008e0Tim Murray        void (*getGlobalVar)(const Context *rsc, const Script *s,
1349c64239ebbfa4170190ede812e69150035e008e0Tim Murray                             uint32_t slot,
135bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             void *data,
136bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             size_t dataLength);
1372980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
1382980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         uint32_t slot,
1392980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         void *data,
1402980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         size_t dataLength,
1412980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         const Element *e,
142ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines                                         const uint32_t *dims,
1432980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         size_t dimLength);
144bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*setGlobalBind)(const Context *rsc, const Script *s,
145bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                              uint32_t slot,
146807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                              Allocation *data);
147bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*setGlobalObj)(const Context *rsc, const Script *s,
148bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             uint32_t slot,
149bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             ObjectBase *data);
150bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
151bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*destroy)(const Context *rsc, Script *s);
1524b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes        void (*invokeForEachMulti)(const Context *rsc,
1534b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   Script *s,
1544b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   uint32_t slot,
1554b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   const Allocation ** ains,
1564b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   size_t inLen,
1574b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   Allocation * aout,
1584b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   const void * usr,
1594b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   size_t usrLen,
1604b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   const RsScriptCall *sc);
161a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Script *, rs_script *obj);
162bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    } script;
163bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
1648feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    struct {
165eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
166eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*destroy)(const Context *rsc, Allocation *alloc);
167ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        uint32_t (*grallocBits)(const Context *rsc, Allocation *alloc);
168eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
169eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
170eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                       bool zeroNew);
171eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
172eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*markDirty)(const Context *rsc, const Allocation *alloc);
1737ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
174733396b67724162844ea2785c7495115dc5ee8d8Jason Sams        void (*setSurface)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
1757ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams        void (*ioSend)(const Context *rsc, Allocation *alloc);
176ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
177ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        /**
178ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         * A new gralloc buffer is in use. The pointers and strides in
179ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         * mHal.drvState.lod[0-2] will be updated with the new values.
180ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         *
181ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         * The new gralloc handle is provided in mHal.state.nativeBuffer
182ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         *
183ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         */
1847ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams        void (*ioReceive)(const Context *rsc, Allocation *alloc);
185eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
186eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*data1D)(const Context *rsc, const Allocation *alloc,
187099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                       uint32_t xoff, uint32_t lod, size_t count,
188c794cd56e46408e08862c42a022090e323684197Alex Sakhartchouk                       const void *data, size_t sizeBytes);
189eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*data2D)(const Context *rsc, const Allocation *alloc,
190eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t lod,
191eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
192358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       const void *data, size_t sizeBytes, size_t stride);
193eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*data3D)(const Context *rsc, const Allocation *alloc,
1943bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
1953bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes,
1963bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       size_t stride);
197eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
198807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*read1D)(const Context *rsc, const Allocation *alloc,
199099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                       uint32_t xoff, uint32_t lod, size_t count,
200807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                       void *data, size_t sizeBytes);
201807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*read2D)(const Context *rsc, const Allocation *alloc,
202807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t lod,
203807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
204358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       void *data, size_t sizeBytes, size_t stride);
205807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*read3D)(const Context *rsc, const Allocation *alloc,
2063bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
2073bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes,
2083bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       size_t stride);
209807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
210807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        // Lock and unlock make a 1D region of memory available to the CPU
211807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        // for direct access by pointer.  Once unlock is called control is
212807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        // returned to the SOC driver.
213807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void * (*lock1D)(const Context *rsc, const Allocation *alloc);
214807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*unlock1D)(const Context *rsc, const Allocation *alloc);
215807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
21674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        // Allocation to allocation copies
21774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        void (*allocData1D)(const Context *rsc,
21874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *dstAlloc,
219099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                            uint32_t dstXoff, uint32_t dstLod, size_t count,
22074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
22174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        void (*allocData2D)(const Context *rsc,
22274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *dstAlloc,
22374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
22474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
22574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *srcAlloc,
22674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
22774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            RsAllocationCubemapFace srcFace);
22874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        void (*allocData3D)(const Context *rsc,
22974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *dstAlloc,
23074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
2313bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                            uint32_t dstLod,
23274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t w, uint32_t h, uint32_t d,
23374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *srcAlloc,
23474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
2353bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                            uint32_t srcLod);
23674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
237eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x,
238c794cd56e46408e08862c42a022090e323684197Alex Sakhartchouk                              const void *data, uint32_t elementOff, size_t sizeBytes);
239eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y,
240c794cd56e46408e08862c42a022090e323684197Alex Sakhartchouk                              const void *data, uint32_t elementOff, size_t sizeBytes);
241eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
24261a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
243a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
244a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Allocation *alloc, rs_allocation *obj);
245eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    } allocation;
246eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
247eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    struct {
2488feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        bool (*init)(const Context *rsc, const ProgramStore *ps);
2498feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        void (*setActive)(const Context *rsc, const ProgramStore *ps);
2508feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        void (*destroy)(const Context *rsc, const ProgramStore *ps);
2518feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    } store;
2528feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
253721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    struct {
254721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams        bool (*init)(const Context *rsc, const ProgramRaster *ps);
255721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams        void (*setActive)(const Context *rsc, const ProgramRaster *ps);
256721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams        void (*destroy)(const Context *rsc, const ProgramRaster *ps);
257721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    } raster;
2588feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
259a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct {
260a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        bool (*init)(const Context *rsc, const ProgramVertex *pv,
261748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char* shader, size_t shaderLen,
262748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char** textureNames, size_t textureNamesCount,
263748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const size_t *textureNamesLength);
264a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*setActive)(const Context *rsc, const ProgramVertex *pv);
265a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*destroy)(const Context *rsc, const ProgramVertex *pv);
266a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    } vertex;
267a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
268a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct {
269a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        bool (*init)(const Context *rsc, const ProgramFragment *pf,
270748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char* shader, size_t shaderLen,
271748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char** textureNames, size_t textureNamesCount,
272748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const size_t *textureNamesLength);
273a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*setActive)(const Context *rsc, const ProgramFragment *pf);
274a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*destroy)(const Context *rsc, const ProgramFragment *pf);
275a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    } fragment;
276a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
277a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct {
278a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        bool (*init)(const Context *rsc, const Mesh *m);
279a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
280a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*destroy)(const Context *rsc, const Mesh *m);
281a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    } mesh;
282bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
2837f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk    struct {
2849e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams        bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops);
2859e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams        bool (*initDynamic)(const Context *rsc, const Path *m);
2869e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams        void (*draw)(const Context *rsc, const Path *m);
2879e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams        void (*destroy)(const Context *rsc, const Path *m);
2889e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    } path;
2899e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams
2909e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    struct {
2917f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk        bool (*init)(const Context *rsc, const Sampler *m);
2927f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk        void (*destroy)(const Context *rsc, const Sampler *m);
293a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Sampler *s, rs_sampler *obj);
2947f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk    } sampler;
2957f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk
296da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    struct {
297da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk        bool (*init)(const Context *rsc, const FBOCache *fb);
298da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk        void (*setActive)(const Context *rsc, const FBOCache *fb);
299da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk        void (*destroy)(const Context *rsc, const FBOCache *fb);
300da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    } framebuffer;
301da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk
302dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    struct {
303709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        bool (*init)(const Context *rsc, ScriptGroup *sg);
304dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void (*setInput)(const Context *rsc, const ScriptGroup *sg,
305dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                         const ScriptKernelID *kid, Allocation *);
306dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
307dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                          const ScriptKernelID *kid, Allocation *);
308dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void (*execute)(const Context *rsc, const ScriptGroup *sg);
309dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void (*destroy)(const Context *rsc, const ScriptGroup *sg);
310a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const ScriptGroup *sg, rs_script_group *obj);
311dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    } scriptgroup;
312dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
313a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    struct {
314a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        bool (*init)(const Context *rsc, const Type *m);
315a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*destroy)(const Context *rsc, const Type *m);
316a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Type *s, rs_type *obj);
317a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } type;
318a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
319a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    struct {
320a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        bool (*init)(const Context *rsc, const Element *m);
321a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*destroy)(const Context *rsc, const Element *m);
322a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Element *s, rs_element *obj);
323a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } element;
324a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
3259761c3fcb8cf2ce89a29cb9202e4282d94f33d9dJason Sams    void (*finish)(const Context *rsc);
326bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams} RsdHalFunctions;
327bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
328bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
329bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
330bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
331bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
332414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#ifdef __cplusplus
333414a46166126da6864258bd25ff183f9a3c6261dStephen Hinesextern "C" {
334414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#endif
335414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
336414a46166126da6864258bd25ff183f9a3c6261dStephen Hinesbool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
337bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
338414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#ifdef __cplusplus
339414a46166126da6864258bd25ff183f9a3c6261dStephen Hines}
340414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#endif
341bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
342bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#endif
343