diff options
author | Mathias Agopian <mathias@google.com> | 2009-07-30 18:14:56 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-07-30 18:14:56 -0700 |
commit | 5b5c9144872b4e31ba5a041dce585a8ddbbe495d (patch) | |
tree | a87a028c1485452127f0ec9c0e8214d419fe6753 /libs/ui | |
parent | 5e631892fb9ac4da83b70ba129ceb6a3f501bad9 (diff) | |
download | frameworks_base-5b5c9144872b4e31ba5a041dce585a8ddbbe495d.zip frameworks_base-5b5c9144872b4e31ba5a041dce585a8ddbbe495d.tar.gz frameworks_base-5b5c9144872b4e31ba5a041dce585a8ddbbe495d.tar.bz2 |
fixed some issues with the software renderer when surfaces are made current.
there was several issues:
- when a surface was made non-current, the last frame wasn't shown and the buffer could stay locked
- when a surface was made current the 2nd time, it would not dequeue a new buffer
now, queue/dequeue are done when the surface is made current.
for this to work, a new query() hook had to be added on android_native_window_t, it allows to retrieve some attributes of a window (currently only width and height).
Diffstat (limited to 'libs/ui')
-rw-r--r-- | libs/ui/FramebufferNativeWindow.cpp | 18 | ||||
-rw-r--r-- | libs/ui/Surface.cpp | 35 |
2 files changed, 52 insertions, 1 deletions
diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index 8c8fd6b..8b7ea21 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -124,6 +124,7 @@ FramebufferNativeWindow::FramebufferNativeWindow() android_native_window_t::dequeueBuffer = dequeueBuffer; android_native_window_t::lockBuffer = lockBuffer; android_native_window_t::queueBuffer = queueBuffer; + android_native_window_t::query = query; } FramebufferNativeWindow::~FramebufferNativeWindow() { @@ -198,6 +199,23 @@ int FramebufferNativeWindow::queueBuffer(android_native_window_t* window, return res; } +int FramebufferNativeWindow::query(android_native_window_t* window, + int what, int* value) +{ + FramebufferNativeWindow* self = getSelf(window); + Mutex::Autolock _l(self->mutex); + framebuffer_device_t* fb = self->fbDev; + switch (what) { + case NATIVE_WINDOW_WIDTH: + *value = fb->width; + return NO_ERROR; + case NATIVE_WINDOW_HEIGHT: + *value = fb->height; + return NO_ERROR; + } + return BAD_VALUE; +} + // ---------------------------------------------------------------------------- }; // namespace android // ---------------------------------------------------------------------------- diff --git a/libs/ui/Surface.cpp b/libs/ui/Surface.cpp index aef47fd..04ab64c 100644 --- a/libs/ui/Surface.cpp +++ b/libs/ui/Surface.cpp @@ -180,7 +180,7 @@ SurfaceControl::SurfaceControl( uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) : mClient(client), mSurface(surface), mToken(data.token), mIdentity(data.identity), - mFormat(format), mFlags(flags) + mWidth(w), mHeight(h), mFormat(format), mFlags(flags) { } @@ -338,6 +338,8 @@ status_t SurfaceControl::writeSurfaceToParcel( uint32_t format = 0; SurfaceID token = -1; uint32_t identity = 0; + uint32_t width = 0; + uint32_t height = 0; sp<SurfaceComposerClient> client; sp<ISurface> sur; if (SurfaceControl::isValid(control)) { @@ -345,6 +347,8 @@ status_t SurfaceControl::writeSurfaceToParcel( identity = control->mIdentity; client = control->mClient; sur = control->mSurface; + width = control->mWidth; + height = control->mHeight; format = control->mFormat; flags = control->mFlags; } @@ -352,6 +356,8 @@ status_t SurfaceControl::writeSurfaceToParcel( parcel->writeStrongBinder(sur!=0 ? sur->asBinder() : NULL); parcel->writeInt32(token); parcel->writeInt32(identity); + parcel->writeInt32(width); + parcel->writeInt32(height); parcel->writeInt32(format); parcel->writeInt32(flags); return NO_ERROR; @@ -373,6 +379,7 @@ sp<Surface> SurfaceControl::getSurface() const Surface::Surface(const sp<SurfaceControl>& surface) : mClient(surface->mClient), mSurface(surface->mSurface), mToken(surface->mToken), mIdentity(surface->mIdentity), + mWidth(surface->mWidth), mHeight(surface->mHeight), mFormat(surface->mFormat), mFlags(surface->mFlags), mBufferMapper(BufferMapper::get()) { @@ -386,6 +393,8 @@ Surface::Surface(const Parcel& parcel) mSurface = interface_cast<ISurface>(parcel.readStrongBinder()); mToken = parcel.readInt32(); mIdentity = parcel.readInt32(); + mWidth = parcel.readInt32(); + mHeight = parcel.readInt32(); mFormat = parcel.readInt32(); mFlags = parcel.readInt32(); @@ -401,6 +410,7 @@ void Surface::init() android_native_window_t::dequeueBuffer = dequeueBuffer; android_native_window_t::lockBuffer = lockBuffer; android_native_window_t::queueBuffer = queueBuffer; + android_native_window_t::query = query; mSwapRectangle.makeInvalid(); DisplayInfo dinfo; SurfaceComposerClient::getDisplayInfo(0, &dinfo); @@ -492,6 +502,13 @@ int Surface::queueBuffer(android_native_window_t* window, return self->queueBuffer(buffer); } +int Surface::query(android_native_window_t* window, + int what, int* value) +{ + Surface* self = getSelf(window); + return self->query(what, value); +} + // ---------------------------------------------------------------------------- status_t Surface::dequeueBuffer(sp<SurfaceBuffer>* buffer) @@ -499,6 +516,9 @@ status_t Surface::dequeueBuffer(sp<SurfaceBuffer>* buffer) android_native_buffer_t* out; status_t err = dequeueBuffer(&out); *buffer = SurfaceBuffer::getSelf(out); + // reset the width/height with the what we get from the buffer + mWidth = uint32_t(out->width); + mHeight = uint32_t(out->height); return err; } @@ -586,6 +606,19 @@ int Surface::queueBuffer(android_native_buffer_t* buffer) return NO_ERROR; } +int Surface::query(int what, int* value) +{ + switch (what) { + case NATIVE_WINDOW_WIDTH: + *value = int(mWidth); + return NO_ERROR; + case NATIVE_WINDOW_HEIGHT: + *value = int(mHeight); + return NO_ERROR; + } + return BAD_VALUE; +} + // ---------------------------------------------------------------------------- status_t Surface::lock(SurfaceInfo* info, bool blocking) { |