10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009-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 ANDROID_STRUCTURED_ALLOCATION_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_STRUCTURED_ALLOCATION_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsType.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstruct ANativeWindow;
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*****************************************************************************
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * CAUTION
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Any layout changes for this class may require a corresponding change to be
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * a partial copy of the information below.
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *****************************************************************************/
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Allocation : public ObjectBase {
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // The graphics equivalent of malloc.  The allocation contains a structure of elements.
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const static int MAX_LOD = 16;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct Hal {
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void * drv;
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        struct State {
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const Type * type;
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t usageFlags;
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            RsAllocationMipmapControl mipmapControl;
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // Cached fields from the Type and Element
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // to prevent pointer chasing in critical loops.
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t dimensionX;
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t dimensionY;
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t dimensionZ;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            uint32_t elementSizeBytes;
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            bool hasMipmaps;
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            bool hasFaces;
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            bool hasReferences;
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            void * unused_01;
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            int32_t surfaceTextureID;
6333b0a9fe4f0fc7bd26378420af259d24036caa22Stephen Hines            void *wndSurface;
6433b0a9fe4f0fc7bd26378420af259d24036caa22Stephen Hines            void *surfaceTexture;
65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            RsDataType eType;
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        };
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        State state;
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        struct DrvState {
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mutable void * mallocPtrLOD0;
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            mutable uint32_t strideLOD0;
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } drvState;
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    };
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Hal mHal;
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages,
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE,
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                         void *ptr = 0);
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual ~Allocation();
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void updateCache();
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const Type * getType() const {return mHal.state.type;}
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void syncAll(Context *rsc, RsAllocationUsageType src);
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len);
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void resize1D(Context *rsc, uint32_t dimX);
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void resize2D(Context *rsc, uint32_t dimX, uint32_t dimY);
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void data(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, size_t sizeBytes);
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                 uint32_t w, uint32_t h, const void *data, size_t sizeBytes);
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, RsAllocationCubemapFace face,
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                 uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes);
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void read(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, void *data, size_t sizeBytes);
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                 uint32_t w, uint32_t h, void *data, size_t sizeBytes);
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, RsAllocationCubemapFace face,
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                 uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes);
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void elementData(Context *rsc, uint32_t x,
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const void *data, uint32_t elementOff, size_t sizeBytes);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void elementData(Context *rsc, uint32_t x, uint32_t y,
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const void *data, uint32_t elementOff, size_t sizeBytes);
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
109ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    void addProgramToDirty(const Program *);
110ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    void removeProgramToDirty(const Program *);
111ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void dumpLOGV(const char *prefix) const;
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void serialize(Context *rsc, OStream *stream) const;
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; }
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static Allocation *createFromStream(Context *rsc, IStream *stream);
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getIsScript() const {
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) != 0;
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getIsTexture() const {
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) != 0;
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getIsRenderTarget() const {
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) != 0;
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getIsBufferObject() const {
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) != 0;
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual bool freeChildren();
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void sendDirty(const Context *rsc) const;
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool getHasGraphicsMipmaps() const {
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mHal.state.mipmapControl != RS_ALLOCATION_MIPMAP_NONE;
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
140ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<const Program *> mToDirtyList;
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ObjectBaseRef<const Type> mType;
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void setType(const Type *t) {
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mType.set(t);
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mHal.state.type = t;
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprivate:
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void freeChildrenUnlocked();
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc, void *ptr);
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t getPackedSize() const;
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static void writePackedData(Context *rsc, const Type *type, uint8_t *dst,
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                                const uint8_t *src, bool dstPadded);
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void unpackVec3Allocation(Context *rsc, const void *data, size_t dataSize);
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void packVec3Allocation(Context *rsc, OStream *stream) const;
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
162