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