Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2013 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 ANDROID_STRUCTURED_ALLOCATION_H
     18 #define ANDROID_STRUCTURED_ALLOCATION_H
     19 
     20 #include "rsType.h"
     21 
     22 #if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
     23 #include <ui/GraphicBuffer.h>
     24 #include "rsGrallocConsumer.h"
     25 #include "gui/CpuConsumer.h"
     26 #include "gui/GLConsumer.h"
     27 #else
     28 struct ANativeWindowBuffer;
     29 #endif
     30 
     31 // ---------------------------------------------------------------------------
     32 namespace android {
     33 
     34 namespace renderscript {
     35 
     36 class Program;
     37 
     38 /*****************************************************************************
     39  * CAUTION
     40  *
     41  * Any layout changes for this class may require a corresponding change to be
     42  * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
     43  * a partial copy of the information below.
     44  *
     45  *****************************************************************************/
     46 class Allocation : public ObjectBase {
     47     // The graphics equivalent of malloc.  The allocation contains a structure of elements.
     48 
     49 public:
     50     const static int MAX_LOD = 16;
     51 
     52     struct Hal {
     53         void * drv;
     54 
     55         struct State {
     56             const Type * type;
     57 
     58             uint32_t usageFlags;
     59             RsAllocationMipmapControl mipmapControl;
     60 
     61             // Cached fields from the Type and Element
     62             // to prevent pointer chasing in critical loops.
     63             uint32_t yuv;
     64             uint32_t elementSizeBytes;
     65             bool hasMipmaps;
     66             bool hasFaces;
     67             bool hasReferences;
     68             void * userProvidedPtr;
     69             int32_t surfaceTextureID;
     70             ANativeWindowBuffer *nativeBuffer;
     71             int64_t timestamp;
     72         };
     73         State state;
     74 
     75         struct DrvState {
     76             struct LodState {
     77                 void * mallocPtr;
     78                 size_t stride;
     79                 uint32_t dimX;
     80                 uint32_t dimY;
     81                 uint32_t dimZ;
     82             } lod[android::renderscript::Allocation::MAX_LOD];
     83             size_t faceOffset;
     84             uint32_t lodCount;
     85             uint32_t faceCount;
     86 
     87             struct YuvState {
     88                 uint32_t shift;
     89                 uint32_t step;
     90             } yuv;
     91 
     92             int grallocFlags;
     93         };
     94         mutable DrvState drvState;
     95 
     96     };
     97     Hal mHal;
     98 
     99     void operator delete(void* ptr);
    100 
    101     static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages,
    102                                          RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE,
    103                                          void *ptr = 0);
    104     virtual ~Allocation();
    105     void updateCache();
    106 
    107     const Type * getType() const {return mHal.state.type;}
    108 
    109     void syncAll(Context *rsc, RsAllocationUsageType src);
    110 
    111     void copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len);
    112 
    113     void resize1D(Context *rsc, uint32_t dimX);
    114     void resize2D(Context *rsc, uint32_t dimX, uint32_t dimY);
    115 
    116     void data(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, size_t sizeBytes);
    117     void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
    118               uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride);
    119     void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
    120               uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes, size_t stride);
    121 
    122     void read(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, void *data, size_t sizeBytes);
    123     void read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
    124               uint32_t w, uint32_t h, void *data, size_t sizeBytes, size_t stride);
    125     void read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
    126               uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes, size_t stride);
    127 
    128     void elementData(Context *rsc, uint32_t x,
    129                      const void *data, uint32_t elementOff, size_t sizeBytes);
    130     void elementData(Context *rsc, uint32_t x, uint32_t y,
    131                      const void *data, uint32_t elementOff, size_t sizeBytes);
    132 
    133     void addProgramToDirty(const Program *);
    134     void removeProgramToDirty(const Program *);
    135 
    136     virtual void dumpLOGV(const char *prefix) const;
    137     virtual void serialize(Context *rsc, OStream *stream) const;
    138     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; }
    139     static Allocation *createFromStream(Context *rsc, IStream *stream);
    140 
    141     bool getIsScript() const {
    142         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) != 0;
    143     }
    144     bool getIsTexture() const {
    145         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) != 0;
    146     }
    147     bool getIsRenderTarget() const {
    148         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) != 0;
    149     }
    150     bool getIsBufferObject() const {
    151         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) != 0;
    152     }
    153 
    154     void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
    155     void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
    156     virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const;
    157     virtual bool freeChildren();
    158 
    159     void sendDirty(const Context *rsc) const;
    160     bool getHasGraphicsMipmaps() const {
    161         return mHal.state.mipmapControl != RS_ALLOCATION_MIPMAP_NONE;
    162     }
    163 
    164     void * getSurface(const Context *rsc);
    165     void setSurface(const Context *rsc, RsNativeWindow sur);
    166     void ioSend(const Context *rsc);
    167     void ioReceive(const Context *rsc);
    168 
    169     void * getPointer(const Context *rsc, uint32_t lod, RsAllocationCubemapFace face,
    170                       uint32_t z, uint32_t array, size_t *stride);
    171 
    172     bool hasSameDims(const Allocation *Other) const;
    173 
    174 protected:
    175     Vector<const Program *> mToDirtyList;
    176     ObjectBaseRef<const Type> mType;
    177     void setType(const Type *t) {
    178         mType.set(t);
    179         mHal.state.type = t;
    180     }
    181 
    182 #if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
    183     class NewBufferListener : public android::ConsumerBase::FrameAvailableListener {
    184     public:
    185         const android::renderscript::Context *rsc;
    186         const android::renderscript::Allocation *alloc;
    187 
    188         virtual void onFrameAvailable(const BufferItem& item);
    189     };
    190 
    191     sp<NewBufferListener> mBufferListener;
    192     sp< GrallocConsumer > mGrallocConsumer;
    193 #endif
    194 
    195 
    196 private:
    197     void freeChildrenUnlocked();
    198     Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc, void *ptr);
    199 
    200     uint32_t getPackedSize() const;
    201     static void writePackedData(Context *rsc, const Type *type, uint8_t *dst,
    202                                 const uint8_t *src, bool dstPadded);
    203     void unpackVec3Allocation(Context *rsc, const void *data, size_t dataSize);
    204     void packVec3Allocation(Context *rsc, OStream *stream) const;
    205 };
    206 
    207 }
    208 }
    209 #endif
    210