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:
parent
3e23593d2f
commit
f10d7fde03
include
libs/surfaceflinger_client
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user