10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef RS_HAL_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define RS_HAL_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <rsDefines.h>
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstruct ANativeWindow;
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Context;
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ObjectBase;
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Element;
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Type;
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Allocation;
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Script;
33ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ScriptKernelID;
34ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ScriptFieldID;
35ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ScriptMethodID;
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ScriptC;
37ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ScriptGroup;
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Path;
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Program;
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ProgramStore;
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ProgramRaster;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ProgramVertex;
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ProgramFragment;
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Mesh;
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Sampler;
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass FBOCache;
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestypedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestypedef struct {
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const void *in;
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void *out;
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const void *usr;
54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    size_t usrLen;
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t x;
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t y;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t z;
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t lod;
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    RsAllocationCubemapFace face;
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t ar[16];
61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t dimX;
63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t dimY;
64ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t dimZ;
65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t dimArray;
66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    const uint8_t *ptrIn;
68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint8_t *ptrOut;
69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t eStrideIn;
70ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t eStrideOut;
71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t yStrideIn;
72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t yStrideOut;
73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint32_t slot;
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} RsForEachStubParamStruct;
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/**
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Script management functions
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestypedef struct {
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool (*initGraphics)(const Context *);
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void (*shutdownGraphics)(const Context *);
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void (*swap)(const Context *);
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void (*shutdownDriver)(Context *);
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void (*getVersion)(unsigned int *major, unsigned int *minor);
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void (*setPriority)(const Context *, int32_t priority);
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, ScriptC *s,
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     char const *resName,
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     char const *cacheDir,
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     uint8_t const *bitcode,
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     size_t bitcodeSize,
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     uint32_t flags);
98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        bool (*initIntrinsic)(const Context *rsc, Script *s,
99ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                              RsScriptIntrinsicID iid,
100ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                              Element *e);
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*invokeFunction)(const Context *rsc, Script *s,
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                               uint32_t slot,
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                               const void *params,
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                               size_t paramLength);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int (*invokeRoot)(const Context *rsc, Script *s);
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*invokeForEach)(const Context *rsc,
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              Script *s,
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              uint32_t slot,
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              const Allocation * ain,
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              Allocation * aout,
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              const void * usr,
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              uint32_t usrLen,
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              const RsScriptCall *sc);
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*invokeInit)(const Context *rsc, Script *s);
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*invokeFreeChildren)(const Context *rsc, Script *s);
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setGlobalVar)(const Context *rsc, const Script *s,
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             uint32_t slot,
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             void *data,
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             size_t dataLength);
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         uint32_t slot,
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         void *data,
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         size_t dataLength,
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         const Element *e,
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         const size_t *dims,
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         size_t dimLength);
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setGlobalBind)(const Context *rsc, const Script *s,
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              uint32_t slot,
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              Allocation *data);
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setGlobalObj)(const Context *rsc, const Script *s,
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             uint32_t slot,
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                             ObjectBase *data);
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, Script *s);
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } script;
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, Allocation *alloc);
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       bool zeroNew);
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*markDirty)(const Context *rsc, const Allocation *alloc);
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int32_t (*initSurfaceTexture)(const Context *rsc, const Allocation *alloc);
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setSurfaceTexture)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*ioSend)(const Context *rsc, Allocation *alloc);
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*ioReceive)(const Context *rsc, Allocation *alloc);
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*data1D)(const Context *rsc, const Allocation *alloc,
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t xoff, uint32_t lod, uint32_t count,
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       const void *data, size_t sizeBytes);
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*data2D)(const Context *rsc, const Allocation *alloc,
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t xoff, uint32_t yoff, uint32_t lod,
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       const void *data, size_t sizeBytes);
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*data3D)(const Context *rsc, const Allocation *alloc,
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t xoff, uint32_t yoff, uint32_t zoff,
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t lod, RsAllocationCubemapFace face,
1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes);
1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*read1D)(const Context *rsc, const Allocation *alloc,
1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t xoff, uint32_t lod, uint32_t count,
1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       void *data, size_t sizeBytes);
1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*read2D)(const Context *rsc, const Allocation *alloc,
1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t xoff, uint32_t yoff, uint32_t lod,
1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       void *data, size_t sizeBytes);
1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*read3D)(const Context *rsc, const Allocation *alloc,
1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t xoff, uint32_t yoff, uint32_t zoff,
1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t lod, RsAllocationCubemapFace face,
1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                       uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes);
1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // Lock and unlock make a 1D region of memory available to the CPU
1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // for direct access by pointer.  Once unlock is called control is
1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // returned to the SOC driver.
1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void * (*lock1D)(const Context *rsc, const Allocation *alloc);
1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*unlock1D)(const Context *rsc, const Allocation *alloc);
1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // Allocation to allocation copies
1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*allocData1D)(const Context *rsc,
1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation *dstAlloc,
1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t dstXoff, uint32_t dstLod, uint32_t count,
1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*allocData2D)(const Context *rsc,
1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation *dstAlloc,
1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation *srcAlloc,
1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            RsAllocationCubemapFace srcFace);
1950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*allocData3D)(const Context *rsc,
1960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation *dstAlloc,
1970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
1980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t dstLod, RsAllocationCubemapFace dstFace,
1990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t w, uint32_t h, uint32_t d,
2000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation *srcAlloc,
2010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
2020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t srcLod, RsAllocationCubemapFace srcFace);
2030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x,
2050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              const void *data, uint32_t elementOff, size_t sizeBytes);
2060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y,
2070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                              const void *data, uint32_t elementOff, size_t sizeBytes);
2080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
2100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } allocation;
2110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const ProgramStore *ps);
2140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setActive)(const Context *rsc, const ProgramStore *ps);
2150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const ProgramStore *ps);
2160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } store;
2170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const ProgramRaster *ps);
2200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setActive)(const Context *rsc, const ProgramRaster *ps);
2210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const ProgramRaster *ps);
2220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } raster;
2230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const ProgramVertex *pv,
2260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const char* shader, size_t shaderLen,
2270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const char** textureNames, size_t textureNamesCount,
2280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const size_t *textureNamesLength);
2290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setActive)(const Context *rsc, const ProgramVertex *pv);
2300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const ProgramVertex *pv);
2310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } vertex;
2320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const ProgramFragment *pf,
2350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const char* shader, size_t shaderLen,
2360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const char** textureNames, size_t textureNamesCount,
2370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const size_t *textureNamesLength);
2380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setActive)(const Context *rsc, const ProgramFragment *pf);
2390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const ProgramFragment *pf);
2400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } fragment;
2410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const Mesh *m);
2440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
2450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const Mesh *m);
2460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } mesh;
2470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops);
2500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*initDynamic)(const Context *rsc, const Path *m);
2510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*draw)(const Context *rsc, const Path *m);
2520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const Path *m);
2530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } path;
2540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const Sampler *m);
2570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const Sampler *m);
2580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } sampler;
2590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct {
2610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool (*init)(const Context *rsc, const FBOCache *fb);
2620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*setActive)(const Context *rsc, const FBOCache *fb);
2630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void (*destroy)(const Context *rsc, const FBOCache *fb);
2640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } framebuffer;
2650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
266ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    struct {
267ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        bool (*init)(const Context *rsc, const ScriptGroup *sg);
268ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        void (*setInput)(const Context *rsc, const ScriptGroup *sg,
269ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                         const ScriptKernelID *kid, Allocation *);
270ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
271ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                          const ScriptKernelID *kid, Allocation *);
272ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        void (*execute)(const Context *rsc, const ScriptGroup *sg);
273ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        void (*destroy)(const Context *rsc, const ScriptGroup *sg);
274ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    } scriptgroup;
275ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
2760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} RsdHalFunctions;
2770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
2810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
282ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#ifdef __cplusplus
283ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsextern "C" {
284ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#endif
2850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
286ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsbool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
287ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
288ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#ifdef __cplusplus
289ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
290ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#endif
2910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
2930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
294