forked from CyanogenMod/android_frameworks_base
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix remote GraphicBuffer allocation in SurfaceFlinger.
This change fixes a horrible hack that I did to allow application processes to create GraphicBuffer objects by making a binder call to SurfaceFlinger. This change introduces a new binder interface specifically for doing this, and does it in such a way that SurfaceFlinger will maintain a reference to the buffers until the app is done with them. Change-Id: Icb240397c6c206d7f69124c1497a829f051cb49b
- Loading branch information
Jamie Gennis
committed
Jan 13, 2011
1 parent
e8d0e8a
commit f7acf16
Showing
9 changed files
with
297 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* Copyright (C) 2011 The Android Open Source Project | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#ifndef ANDROID_SF_IGRAPHIC_BUFFER_ALLOC_H | ||
#define ANDROID_SF_IGRAPHIC_BUFFER_ALLOC_H | ||
|
||
#include <stdint.h> | ||
#include <sys/types.h> | ||
|
||
#include <utils/RefBase.h> | ||
|
||
#include <binder/IInterface.h> | ||
|
||
namespace android { | ||
// ---------------------------------------------------------------------------- | ||
|
||
class IGraphicBufferAlloc : public IInterface | ||
{ | ||
public: | ||
DECLARE_META_INTERFACE(GraphicBufferAlloc); | ||
|
||
/* Create a new GraphicBuffer for the client to use. The server will | ||
* maintain a reference to the newly created GraphicBuffer until | ||
* freeAllGraphicBuffers is called. | ||
*/ | ||
virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, | ||
PixelFormat format, uint32_t usage) = 0; | ||
|
||
/* Free all but one of the GraphicBuffer objects that the server is | ||
* currently referencing. If bufIndex is not a valid index of the buffers | ||
* the server is referencing, then all buffers are freed. | ||
*/ | ||
virtual void freeAllGraphicBuffersExcept(int bufIndex) = 0; | ||
}; | ||
|
||
// ---------------------------------------------------------------------------- | ||
|
||
class BnGraphicBufferAlloc : public BnInterface<IGraphicBufferAlloc> | ||
{ | ||
public: | ||
virtual status_t onTransact( uint32_t code, | ||
const Parcel& data, | ||
Parcel* reply, | ||
uint32_t flags = 0); | ||
}; | ||
|
||
// ---------------------------------------------------------------------------- | ||
|
||
}; // namespace android | ||
|
||
#endif // ANDROID_SF_IGRAPHIC_BUFFER_ALLOC_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* | ||
* Copyright (C) 2011 The Android Open Source Project | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
// tag as surfaceflinger | ||
#define LOG_TAG "SurfaceFlinger" | ||
|
||
#include <stdint.h> | ||
#include <sys/types.h> | ||
|
||
#include <binder/Parcel.h> | ||
|
||
#include <ui/GraphicBuffer.h> | ||
|
||
#include <surfaceflinger/IGraphicBufferAlloc.h> | ||
|
||
// --------------------------------------------------------------------------- | ||
|
||
namespace android { | ||
|
||
enum { | ||
CREATE_GRAPHIC_BUFFER = IBinder::FIRST_CALL_TRANSACTION, | ||
FREE_ALL_GRAPHIC_BUFFERS_EXCEPT, | ||
}; | ||
|
||
class BpGraphicBufferAlloc : public BpInterface<IGraphicBufferAlloc> | ||
{ | ||
public: | ||
BpGraphicBufferAlloc(const sp<IBinder>& impl) | ||
: BpInterface<IGraphicBufferAlloc>(impl) | ||
{ | ||
} | ||
|
||
virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, | ||
PixelFormat format, uint32_t usage) { | ||
Parcel data, reply; | ||
data.writeInterfaceToken( | ||
IGraphicBufferAlloc::getInterfaceDescriptor()); | ||
data.writeInt32(w); | ||
data.writeInt32(h); | ||
data.writeInt32(format); | ||
data.writeInt32(usage); | ||
remote()->transact(CREATE_GRAPHIC_BUFFER, data, &reply); | ||
sp<GraphicBuffer> graphicBuffer; | ||
bool nonNull = (bool)reply.readInt32(); | ||
if (nonNull) { | ||
graphicBuffer = new GraphicBuffer(); | ||
reply.read(*graphicBuffer); | ||
} | ||
return graphicBuffer; | ||
} | ||
|
||
virtual void freeAllGraphicBuffersExcept(int bufIdx) { | ||
Parcel data, reply; | ||
data.writeInterfaceToken( | ||
IGraphicBufferAlloc::getInterfaceDescriptor()); | ||
data.writeInt32(bufIdx); | ||
remote()->transact(FREE_ALL_GRAPHIC_BUFFERS_EXCEPT, data, &reply); | ||
} | ||
}; | ||
|
||
IMPLEMENT_META_INTERFACE(GraphicBufferAlloc, "android.ui.IGraphicBufferAlloc"); | ||
|
||
// ---------------------------------------------------------------------- | ||
|
||
status_t BnGraphicBufferAlloc::onTransact( | ||
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) | ||
{ | ||
// codes that don't require permission check | ||
|
||
switch(code) { | ||
case CREATE_GRAPHIC_BUFFER: { | ||
CHECK_INTERFACE(IGraphicBufferAlloc, data, reply); | ||
uint32_t w = data.readInt32(); | ||
uint32_t h = data.readInt32(); | ||
PixelFormat format = data.readInt32(); | ||
uint32_t usage = data.readInt32(); | ||
sp<GraphicBuffer> result(createGraphicBuffer(w, h, format, usage)); | ||
reply->writeInt32(result != 0); | ||
if (result != 0) { | ||
reply->write(*result); | ||
} | ||
return NO_ERROR; | ||
} break; | ||
case FREE_ALL_GRAPHIC_BUFFERS_EXCEPT: { | ||
CHECK_INTERFACE(IGraphicBufferAlloc, data, reply); | ||
int bufIdx = data.readInt32(); | ||
freeAllGraphicBuffersExcept(bufIdx); | ||
return NO_ERROR; | ||
} break; | ||
default: | ||
return BBinder::onTransact(code, data, reply, flags); | ||
} | ||
} | ||
|
||
}; // namespace android |
Oops, something went wrong.