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