added native_window_set_buffer_count()

this method can be used to change the number of buffers
associated to a native window. the default is two.

Change-Id: I608b959e6b29d77f95edb23c31dc9b099a758f2f
This commit is contained in:
Mathias Agopian 2010-05-21 14:19:50 -07:00
parent 3e23593d2f
commit f10d7fde03
5 changed files with 35 additions and 9 deletions

View File

@ -80,6 +80,7 @@ public:
// file need to be updated.
static const unsigned int NUM_LAYERS_MAX = 31;
static const unsigned int NUM_BUFFER_MAX = 16;
static const unsigned int NUM_BUFFER_MIN = 2;
static const unsigned int NUM_DISPLAY_MAX = 4;
struct Statistics { // 4 longs

View File

@ -212,6 +212,7 @@ private:
int dispatch_connect(va_list args);
int dispatch_disconnect(va_list args);
int dispatch_crop(va_list args);
int dispatch_set_buffer_count(va_list args);
void setUsage(uint32_t reqUsage);
int connect(int api);

View File

@ -81,6 +81,7 @@ enum {
NATIVE_WINDOW_CONNECT,
NATIVE_WINDOW_DISCONNECT,
NATIVE_WINDOW_SET_CROP,
NATIVE_WINDOW_SET_BUFFER_COUNT,
};
/* parameter for NATIVE_WINDOW_[DIS]CONNECT */
@ -190,6 +191,7 @@ typedef struct android_native_window_t
* NATIVE_WINDOW_CONNECT
* NATIVE_WINDOW_DISCONNECT
* NATIVE_WINDOW_SET_CROP
* NATIVE_WINDOW_SET_BUFFER_COUNT
*
*/
@ -201,8 +203,9 @@ typedef struct android_native_window_t
/*
* native_window_set_usage() sets the intended usage flags for the next
* buffers acquired with (*lockBuffer)() and on.
* native_window_set_usage(..., usage)
* Sets the intended usage flags for the next buffers
* acquired with (*lockBuffer)() and on.
* By default (if this function is never called), a usage of
* GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE
* is assumed.
@ -217,8 +220,8 @@ static inline int native_window_set_usage(
}
/*
* native_window_connect(..., NATIVE_WINDOW_API_EGL) must be called
* by EGL when the window is made current.
* native_window_connect(..., NATIVE_WINDOW_API_EGL)
* Must be called by EGL when the window is made current.
* Returns -EINVAL if for some reason the window cannot be connected, which
* can happen if it's connected to some other API.
*/
@ -229,8 +232,8 @@ static inline int native_window_connect(
}
/*
* native_window_disconnect(..., NATIVE_WINDOW_API_EGL) must be called
* by EGL when the window is made not current.
* native_window_disconnect(..., NATIVE_WINDOW_API_EGL)
* Must be called by EGL when the window is made not current.
* An error is returned if for instance the window wasn't connected in the
* first place.
*/
@ -241,8 +244,8 @@ static inline int native_window_disconnect(
}
/*
* native_window_set_crop(..., crop) sets which region of the next queued
* buffers needs to be considered.
* native_window_set_crop(..., crop)
* Sets which region of the next queued buffers needs to be considered.
* A buffer's crop region is scaled to match the surface's size.
*
* The specified crop region applies to all buffers queued after it is called.
@ -259,6 +262,17 @@ static inline int native_window_set_crop(
return window->perform(window, NATIVE_WINDOW_SET_CROP, crop);
}
/*
* native_window_set_buffer_count(..., count)
* Sets the number of buffers associated with this native window.
*/
static inline int native_window_set_buffer_count(
android_native_window_t* window,
size_t bufferCount)
{
return window->perform(window, NATIVE_WINDOW_SET_BUFFER_COUNT, bufferCount);
}
// ---------------------------------------------------------------------------
/* FIXME: this is legacy for pixmaps */

View File

@ -463,6 +463,9 @@ status_t SharedBufferClient::setBufferCount(
if (uint32_t(bufferCount) >= SharedBufferStack::NUM_BUFFER_MAX)
return BAD_VALUE;
if (uint32_t(bufferCount) < SharedBufferStack::NUM_BUFFER_MIN)
return BAD_VALUE;
RWLock::AutoWLock _wr(mLock);
status_t err = ipc(bufferCount);

View File

@ -584,6 +584,9 @@ int Surface::perform(int operation, va_list args)
case NATIVE_WINDOW_SET_CROP:
res = dispatch_crop( args );
break;
case NATIVE_WINDOW_SET_BUFFER_COUNT:
res = dispatch_set_buffer_count( args );
break;
default:
res = NAME_NOT_FOUND;
break;
@ -607,6 +610,10 @@ int Surface::dispatch_crop(va_list args) {
android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
return crop( reinterpret_cast<Rect const*>(rect) );
}
int Surface::dispatch_set_buffer_count(va_list args) {
size_t bufferCount = va_arg(args, size_t);
return setBufferCount(bufferCount);
}
void Surface::setUsage(uint32_t reqUsage)
@ -856,7 +863,7 @@ status_t Surface::getBufferLocked(int index, int usage)
currentBuffer->setIndex(index);
}
} else {
err = err<0 ? err : NO_MEMORY;
err = err<0 ? err : status_t(NO_MEMORY);
}
}
return err;