1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/* 2d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Copyright (C) 2009 The Android Open Source Project 3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License. 6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at 7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software 11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and 14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License. 15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */ 16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#ifndef ANDROID_STRUCTURED_ALLOCATION_H 18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#define ANDROID_STRUCTURED_ALLOCATION_H 19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsType.h" 21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams// --------------------------------------------------------------------------- 23d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 24d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 2683f1c63c56ed73e0dfcc4de67bc58a4df5b3fe69Jason Samsclass Program; 27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 28e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines/***************************************************************************** 29e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines * CAUTION 30e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines * 31e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines * Any layout changes for this class may require a corresponding change to be 32e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains 33e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines * a partial copy of the information below. 34e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines * 35e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines *****************************************************************************/ 36ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukclass Allocation : public ObjectBase { 37e004058419dc1d3315274dbdf538e57769a2db9cStephen Hines // The graphics equivalent of malloc. The allocation contains a structure of elements. 38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Samspublic: 40e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams struct Hal { 41e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams void * drv; 42e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams 43e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams struct State { 445ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk const Type * type; 45e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams 46e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams uint32_t usageFlags; 47e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams RsAllocationMipmapControl mipmapControl; 48e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams 49e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams // Cached fields from the Type and Element 50e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams // to prevent pointer chasing in critical loops. 51e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams uint32_t dimensionX; 52e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams uint32_t dimensionY; 53e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams uint32_t dimensionZ; 54e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams uint32_t elementSizeBytes; 55e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams bool hasMipmaps; 56e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams bool hasFaces; 57e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams bool hasReferences; 58e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams }; 59e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams State state; 607e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams 617e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams struct DrvState { 627e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams void * mallocPtr; 637e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams } drvState; 647e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams 65e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams }; 66e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams Hal mHal; 67e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams 687e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages, 697e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE); 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams virtual ~Allocation(); 71e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams void updateCache(); 72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 737e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams void * getPtr() const {return mHal.drvState.mallocPtr;} 745ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk const Type * getType() const {return mHal.state.type;} 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 765476b450e50939940dcf3f15c92335cee2fc572dJason Sams void syncAll(Context *rsc, RsAllocationUsageType src); 775476b450e50939940dcf3f15c92335cee2fc572dJason Sams 785edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams void copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len); 795edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 805edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams void resize1D(Context *rsc, uint32_t dimX); 815edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams void resize2D(Context *rsc, uint32_t dimX, uint32_t dimY); 82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 8349a05d7b82956009f03acbb92a064eed054eb031Jason Sams void data(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, uint32_t sizeBytes); 8449a05d7b82956009f03acbb92a064eed054eb031Jason Sams void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 8507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes); 8649a05d7b82956009f03acbb92a064eed054eb031Jason Sams void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, RsAllocationCubemapFace face, 8707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes); 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 8949a05d7b82956009f03acbb92a064eed054eb031Jason Sams void elementData(Context *rsc, uint32_t x, 9049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams const void *data, uint32_t elementOff, uint32_t sizeBytes); 9149a05d7b82956009f03acbb92a064eed054eb031Jason Sams void elementData(Context *rsc, uint32_t x, uint32_t y, 9249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams const void *data, uint32_t elementOff, uint32_t sizeBytes); 9349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 9440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams void read(void *data); 9540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 9683f1c63c56ed73e0dfcc4de67bc58a4df5b3fe69Jason Sams void addProgramToDirty(const Program *); 9783f1c63c56ed73e0dfcc4de67bc58a4df5b3fe69Jason Sams void removeProgramToDirty(const Program *); 981bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 99644a0e320d4bda1871f38858e63aad2c9864570fJason Sams virtual void dumpLOGV(const char *prefix) const; 100aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk virtual void serialize(OStream *stream) const; 101aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; } 102aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk static Allocation *createFromStream(Context *rsc, IStream *stream); 1031bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 1045e0035af3671628945d9a88cd22cf16bc07eecd1Jason Sams bool getIsScript() const { 105e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) != 0; 1065e0035af3671628945d9a88cd22cf16bc07eecd1Jason Sams } 107d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams bool getIsTexture() const { 108e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) != 0; 109d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams } 1108e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk bool getIsRenderTarget() const { 1118e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) != 0; 1128e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk } 113d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams bool getIsBufferObject() const { 114e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) != 0; 115d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams } 116eeeaccc89971268a0cc63ac0ae0868b5c003c9a9Jason Sams 1175edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const; 1185edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const; 119777ec2662ef5ee8b0a501e0b8a9b2d7a2b84ffe7Jason Sams virtual bool freeChildren(); 120b28ca96fd69be0d3d12106f81c415439d185b017Jason Sams 1217e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams void sendDirty(const Context *rsc) const; 1225e0035af3671628945d9a88cd22cf16bc07eecd1Jason Sams bool getHasGraphicsMipmaps() const { 123e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams return mHal.state.mipmapControl != RS_ALLOCATION_MIPMAP_NONE; 1245e0035af3671628945d9a88cd22cf16bc07eecd1Jason Sams } 1255e0035af3671628945d9a88cd22cf16bc07eecd1Jason Sams 12683f1c63c56ed73e0dfcc4de67bc58a4df5b3fe69Jason Sams 1278e95466b5aa16b13c9e39b7ff8167f47a643c4baAlex Sakhartchoukprotected: 12883f1c63c56ed73e0dfcc4de67bc58a4df5b3fe69Jason Sams Vector<const Program *> mToDirtyList; 1295ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk ObjectBaseRef<const Type> mType; 1305ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk void setType(const Type *t) { 1315ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk mType.set(t); 1325ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk mHal.state.type = t; 1335ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk } 13483f1c63c56ed73e0dfcc4de67bc58a4df5b3fe69Jason Sams 1358a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Samsprivate: 136777ec2662ef5ee8b0a501e0b8a9b2d7a2b84ffe7Jason Sams void freeChildrenUnlocked(); 1377e8aae7f76f221905fba7ccbcb3442c6f96dfad2Jason Sams Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc); 138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}; 139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#endif 143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 144