summaryrefslogtreecommitdiffstats
path: root/libs/rs
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-03-01 15:31:04 -0800
committerJason Sams <rjsams@android.com>2010-03-01 15:31:04 -0800
commit8a64743f37ed35af7c2204acd18bb3d62d8f66d5 (patch)
tree13222fdd1021b6af52f78d1d3576b0139b724ee1 /libs/rs
parentc2908e60c9b021fb4bb69acff8d49981dd4dade8 (diff)
downloadframeworks_base-8a64743f37ed35af7c2204acd18bb3d62d8f66d5.zip
frameworks_base-8a64743f37ed35af7c2204acd18bb3d62d8f66d5.tar.gz
frameworks_base-8a64743f37ed35af7c2204acd18bb3d62d8f66d5.tar.bz2
Add support for linking to a skia bitmap rather than always copying the data from the bitmap.
Diffstat (limited to 'libs/rs')
-rw-r--r--libs/rs/RenderScript.h2
-rw-r--r--libs/rs/rs.spec8
-rw-r--r--libs/rs/rsAllocation.cpp44
-rw-r--r--libs/rs/rsAllocation.h12
4 files changed, 60 insertions, 6 deletions
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 0c95e7d..cd8361c 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -46,6 +46,8 @@ typedef void * RsProgramFragment;
typedef void * RsProgramFragmentStore;
typedef void * RsProgramRaster;
+typedef void (* RsBitmapCallback_t)(void *);
+
enum RsDeviceParam {
RS_DEVICE_PARAM_FORCE_SOFTWARE_GL,
RS_DEVICE_PARAM_COUNT
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 89d9d5e..4d97c0f 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -90,6 +90,14 @@ AllocationCreateSized {
ret RsAllocation
}
+AllocationCreateBitmapRef {
+ param RsType type
+ param void * bmpPtr
+ param void * callbackData
+ param RsBitmapCallback_t callback
+ ret RsAllocation
+ }
+
AllocationCreateFromBitmap {
param uint32_t width
param uint32_t height
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index f1798de..4e8278d 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -25,6 +25,27 @@ using namespace android::renderscript;
Allocation::Allocation(Context *rsc, const Type *type) : ObjectBase(rsc)
{
+ init(rsc, type);
+
+ mPtr = malloc(mType->getSizeBytes());
+ if (!mPtr) {
+ LOGE("Allocation::Allocation, alloc failure");
+ }
+}
+
+Allocation::Allocation(Context *rsc, const Type *type, void *bmp,
+ void *callbackData, RsBitmapCallback_t callback)
+: ObjectBase(rsc)
+{
+ init(rsc, type);
+
+ mPtr = bmp;
+ mUserBitmapCallback = callback;
+ mUserBitmapCallbackData = callbackData;
+}
+
+void Allocation::init(Context *rsc, const Type *type)
+{
mAllocFile = __FILE__;
mAllocLine = __LINE__;
mPtr = NULL;
@@ -43,17 +64,22 @@ Allocation::Allocation(Context *rsc, const Type *type) : ObjectBase(rsc)
mBufferID = 0;
mUploadDefered = false;
+ mUserBitmapCallback = NULL;
+ mUserBitmapCallbackData = NULL;
+
mType.set(type);
rsAssert(type);
- mPtr = malloc(mType->getSizeBytes());
- if (!mPtr) {
- LOGE("Allocation::Allocation, alloc failure");
- }
+
+ mPtr = NULL;
}
Allocation::~Allocation()
{
- free(mPtr);
+ if (mUserBitmapCallback != NULL) {
+ mUserBitmapCallback(mUserBitmapCallbackData);
+ } else {
+ free(mPtr);
+ }
mPtr = NULL;
if (mBufferID) {
@@ -486,6 +512,14 @@ static ElementConverter_t pickConverter(const Element *dst, const Element *src)
return 0;
}
+RsAllocation rsi_AllocationCreateBitmapRef(Context *rsc, RsType vtype,
+ void *bmp, void *callbackData, RsBitmapCallback_t callback)
+{
+ const Type * type = static_cast<const Type *>(vtype);
+ Allocation * alloc = new Allocation(rsc, type, bmp, callbackData, callback);
+ alloc->incUserRef();
+ return alloc;
+}
RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, uint32_t w, uint32_t h, RsElement _dst, RsElement _src, bool genMips, const void *data)
{
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
index 778c904..516f8b7 100644
--- a/libs/rs/rsAllocation.h
+++ b/libs/rs/rsAllocation.h
@@ -29,11 +29,12 @@ class Allocation : public ObjectBase
{
// The graphics equilivent of malloc. The allocation contains a structure of elements.
-
public:
// By policy this allocation will hold a pointer to the type
// but will not destroy it on destruction.
Allocation(Context *rsc, const Type *);
+ Allocation(Context *rsc, const Type *, void *bmp, void *callbackData, RsBitmapCallback_t callback);
+
virtual ~Allocation();
void setCpuWritable(bool);
@@ -82,6 +83,11 @@ protected:
Vector<const Program *> mToDirtyList;
+ // Is we have a non-null user bitmap callback we do not own the bits and
+ // instead call this function to free the memort when its time.
+ RsBitmapCallback_t mUserBitmapCallback;
+ void *mUserBitmapCallbackData;
+
// Usage restrictions
bool mCpuWrite;
bool mCpuRead;
@@ -109,6 +115,10 @@ protected:
uint32_t mBufferID;
bool mUploadDefered;
+
+private:
+ void init(Context *rsc, const Type *);
+
};
}