Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2009 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 // ---------------------------------------------------------------------------
     23 namespace android {
     24 namespace renderscript {
     25 
     26 class Program;
     27 
     28 /*****************************************************************************
     29  * CAUTION
     30  *
     31  * Any layout changes for this class may require a corresponding change to be
     32  * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
     33  * a partial copy of the information below.
     34  *
     35  *****************************************************************************/
     36 class Allocation : public ObjectBase {
     37     // The graphics equivalent of malloc.  The allocation contains a structure of elements.
     38 
     39 public:
     40     struct Hal {
     41         void * drv;
     42 
     43         struct State {
     44             const Type * type;
     45 
     46             uint32_t usageFlags;
     47             RsAllocationMipmapControl mipmapControl;
     48 
     49             // Cached fields from the Type and Element
     50             // to prevent pointer chasing in critical loops.
     51             uint32_t dimensionX;
     52             uint32_t dimensionY;
     53             uint32_t dimensionZ;
     54             uint32_t elementSizeBytes;
     55             bool hasMipmaps;
     56             bool hasFaces;
     57             bool hasReferences;
     58         };
     59         State state;
     60 
     61         struct DrvState {
     62             void * mallocPtr;
     63         } drvState;
     64 
     65     };
     66     Hal mHal;
     67 
     68     static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages,
     69                                   RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE);
     70     virtual ~Allocation();
     71     void updateCache();
     72 
     73     void * getPtr() const {return mHal.drvState.mallocPtr;}
     74     const Type * getType() const {return mHal.state.type;}
     75 
     76     void syncAll(Context *rsc, RsAllocationUsageType src);
     77 
     78     void copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len);
     79 
     80     void resize1D(Context *rsc, uint32_t dimX);
     81     void resize2D(Context *rsc, uint32_t dimX, uint32_t dimY);
     82 
     83     void data(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, uint32_t sizeBytes);
     84     void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
     85                  uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes);
     86     void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, RsAllocationCubemapFace face,
     87                  uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes);
     88 
     89     void elementData(Context *rsc, uint32_t x,
     90                         const void *data, uint32_t elementOff, uint32_t sizeBytes);
     91     void elementData(Context *rsc, uint32_t x, uint32_t y,
     92                         const void *data, uint32_t elementOff, uint32_t sizeBytes);
     93 
     94     void read(void *data);
     95 
     96     void addProgramToDirty(const Program *);
     97     void removeProgramToDirty(const Program *);
     98 
     99     virtual void dumpLOGV(const char *prefix) const;
    100     virtual void serialize(OStream *stream) const;
    101     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; }
    102     static Allocation *createFromStream(Context *rsc, IStream *stream);
    103 
    104     bool getIsScript() const {
    105         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) != 0;
    106     }
    107     bool getIsTexture() const {
    108         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) != 0;
    109     }
    110     bool getIsRenderTarget() const {
    111         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) != 0;
    112     }
    113     bool getIsBufferObject() const {
    114         return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) != 0;
    115     }
    116 
    117     void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
    118     void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
    119     virtual bool freeChildren();
    120 
    121     void sendDirty(const Context *rsc) const;
    122     bool getHasGraphicsMipmaps() const {
    123         return mHal.state.mipmapControl != RS_ALLOCATION_MIPMAP_NONE;
    124     }
    125 
    126 
    127 protected:
    128     Vector<const Program *> mToDirtyList;
    129     ObjectBaseRef<const Type> mType;
    130     void setType(const Type *t) {
    131         mType.set(t);
    132         mHal.state.type = t;
    133     }
    134 
    135 private:
    136     void freeChildrenUnlocked();
    137     Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc);
    138 };
    139 
    140 }
    141 }
    142 #endif
    143 
    144