fix a bug that caused the PixelFormat viewed by Surface to be wrong.

what happened is that the efective pixel format is calculated by SF but Surface nevew had access to it directly.
in particular this caused query(FORMAT) to return the requested format instead of the effective format.
This commit is contained in:
Mathias Agopian 2009-08-19 17:46:26 -07:00
parent 50517543d8
commit 1c97d2ebe1
7 changed files with 30 additions and 21 deletions

View File

@ -52,6 +52,9 @@ public:
struct surface_data_t {
int32_t token;
int32_t identity;
uint32_t width;
uint32_t height;
uint32_t format;
status_t readFromParcel(const Parcel& parcel);
status_t writeToParcel(Parcel* parcel) const;
};

View File

@ -730,14 +730,6 @@ sp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
return owner;
}
void LayerBaseClient::Surface::getSurfaceData(
ISurfaceFlingerClient::surface_data_t* params) const
{
params->token = mToken;
params->identity = mIdentity;
}
status_t LayerBaseClient::Surface::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{

View File

@ -321,10 +321,9 @@ public:
class Surface : public BnSurface
{
public:
int32_t getToken() const { return mToken; }
int32_t getIdentity() const { return mIdentity; }
virtual void getSurfaceData(
ISurfaceFlingerClient::surface_data_t* params) const;
protected:
Surface(const sp<SurfaceFlinger>& flinger,
SurfaceID id, int identity,

View File

@ -1239,9 +1239,11 @@ sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
switch (flags & eFXSurfaceMask) {
case eFXSurfaceNormal:
if (UNLIKELY(flags & ePushBuffers)) {
layer = createPushBuffersSurfaceLocked(client, d, id, w, h, flags);
layer = createPushBuffersSurfaceLocked(client, d, id,
w, h, flags);
} else {
layer = createNormalSurfaceLocked(client, d, id, w, h, format, flags);
layer = createNormalSurfaceLocked(client, d, id,
w, h, flags, format);
}
break;
case eFXSurfaceBlur:
@ -1255,8 +1257,13 @@ sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
if (layer != 0) {
setTransactionFlags(eTransactionNeeded);
surfaceHandle = layer->getSurface();
if (surfaceHandle != 0)
surfaceHandle->getSurfaceData(params);
if (surfaceHandle != 0) {
params->token = surfaceHandle->getToken();
params->identity = surfaceHandle->getIdentity();
params->width = w;
params->height = h;
params->format = format;
}
}
return surfaceHandle;
@ -1264,7 +1271,8 @@ sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
sp<LayerBaseClient> SurfaceFlinger::createNormalSurfaceLocked(
const sp<Client>& client, DisplayID display,
int32_t id, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags)
int32_t id, uint32_t w, uint32_t h, uint32_t flags,
PixelFormat& format)
{
// initialize the surfaces
switch (format) { // TODO: take h/w into account

View File

@ -195,8 +195,8 @@ private:
sp<LayerBaseClient> createNormalSurfaceLocked(
const sp<Client>& client, DisplayID display,
int32_t id, uint32_t w, uint32_t h,
PixelFormat format, uint32_t flags);
int32_t id, uint32_t w, uint32_t h, uint32_t flags,
PixelFormat& format);
sp<LayerBaseClient> createBlurSurfaceLocked(
const sp<Client>& client, DisplayID display,

View File

@ -189,8 +189,11 @@ status_t BnSurfaceFlingerClient::onTransact(
status_t ISurfaceFlingerClient::surface_data_t::readFromParcel(const Parcel& parcel)
{
token = parcel.readInt32();
identity = parcel.readInt32();
token = parcel.readInt32();
identity = parcel.readInt32();
width = parcel.readInt32();
height = parcel.readInt32();
format = parcel.readInt32();
return NO_ERROR;
}
@ -198,6 +201,9 @@ status_t ISurfaceFlingerClient::surface_data_t::writeToParcel(Parcel* parcel) co
{
parcel->writeInt32(token);
parcel->writeInt32(identity);
parcel->writeInt32(width);
parcel->writeInt32(height);
parcel->writeInt32(format);
return NO_ERROR;
}

View File

@ -197,7 +197,8 @@ SurfaceControl::SurfaceControl(
uint32_t w, uint32_t h, PixelFormat format, uint32_t flags)
: mClient(client), mSurface(surface),
mToken(data.token), mIdentity(data.identity),
mWidth(w), mHeight(h), mFormat(format), mFlags(flags)
mWidth(data.width), mHeight(data.height), mFormat(data.format),
mFlags(flags)
{
}