libQcomUI: Add support for updating the buffer geometry
Add support for updating the buffer geometry without any reallocation of memory. The buffer geometry is updated in the GraphicBuffer as well as in the buffer handle. Change-Id: I3fdb4f6a737277ab63fcbdb42e9c955ea7471760
This commit is contained in:
parent
18e73bc5c7
commit
be32078a40
@ -7,9 +7,10 @@ LOCAL_SRC_FILES := \
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libcutils \
|
||||
libmemalloc
|
||||
libmemalloc \
|
||||
libui
|
||||
|
||||
LOCAL_C_INCLUDES := $(TOP)/hardware/qcom/display/libgralloc
|
||||
LOCAL_C_INCLUDES := $(TOP)/hardware/qcom/display/libgralloc \
|
||||
LOCAL_CFLAGS := -DLOG_TAG=\"libQcomUI\"
|
||||
LOCAL_MODULE := libQcomUI
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
@ -108,6 +108,9 @@ int getNumberOfArgsForOperation(int operation) {
|
||||
case NATIVE_WINDOW_SET_BUFFERS_SIZE:
|
||||
num_args = 1;
|
||||
break;
|
||||
case NATIVE_WINDOW_UPDATE_BUFFERS_GEOMETRY:
|
||||
num_args = 3;
|
||||
break;
|
||||
default: LOGE("%s: invalid operation(0x%x)", __FUNCTION__, operation);
|
||||
break;
|
||||
};
|
||||
@ -169,6 +172,81 @@ int checkBuffer(native_handle_t *buffer_handle, int size, int usage)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks if memory needs to be reallocated for this buffer.
|
||||
*
|
||||
* @param: Geometry of the current buffer.
|
||||
* @param: Required Geometry.
|
||||
* @param: Geometry of the updated buffer.
|
||||
*
|
||||
* @return True if a memory reallocation is required.
|
||||
*/
|
||||
bool needNewBuffer(const qBufGeometry currentGeometry,
|
||||
const qBufGeometry requiredGeometry,
|
||||
const qBufGeometry updatedGeometry)
|
||||
{
|
||||
// If the current buffer info matches the updated info,
|
||||
// we do not require any memory allocation.
|
||||
if (updatedGeometry.width && updatedGeometry.height &&
|
||||
updatedGeometry.format) {
|
||||
return false;
|
||||
}
|
||||
if (currentGeometry.width != requiredGeometry.width ||
|
||||
currentGeometry.height != requiredGeometry.height ||
|
||||
currentGeometry.format != requiredGeometry.format) {
|
||||
// Current and required geometry do not match. Allocation
|
||||
// required.
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the geometry of this buffer without reallocation.
|
||||
*
|
||||
* @param: buffer whose geometry needs to be updated.
|
||||
* @param: Updated width
|
||||
* @param: Updated height
|
||||
* @param: Updated format
|
||||
*/
|
||||
int updateBufferGeometry(sp<GraphicBuffer> buffer, const qBufGeometry updatedGeometry)
|
||||
{
|
||||
if (buffer == 0) {
|
||||
LOGE("%s: graphic buffer is NULL", __FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!updatedGeometry.width || !updatedGeometry.height ||
|
||||
!updatedGeometry.format) {
|
||||
// No update required. Return.
|
||||
return 0;
|
||||
}
|
||||
if (buffer->width == updatedGeometry.width &&
|
||||
buffer->height == updatedGeometry.height &&
|
||||
buffer->format == updatedGeometry.format) {
|
||||
// The buffer has already been updated. Return.
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Validate the handle
|
||||
if (private_handle_t::validate(buffer->handle)) {
|
||||
LOGE("%s: handle is invalid", __FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
buffer->width = updatedGeometry.width;
|
||||
buffer->height = updatedGeometry.height;
|
||||
buffer->format = updatedGeometry.format;
|
||||
private_handle_t *hnd = (private_handle_t*)(buffer->handle);
|
||||
if (hnd) {
|
||||
hnd->width = updatedGeometry.width;
|
||||
hnd->height = updatedGeometry.height;
|
||||
hnd->format = updatedGeometry.format;
|
||||
} else {
|
||||
LOGE("%s: hnd is NULL", __FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -31,12 +31,31 @@
|
||||
#define INCLUDE_LIBQCOM_UI
|
||||
|
||||
#include <cutils/native_handle.h>
|
||||
#include <ui/GraphicBuffer.h>
|
||||
|
||||
using android::sp;
|
||||
using android::GraphicBuffer;
|
||||
|
||||
/*
|
||||
* Qcom specific Native Window perform operations
|
||||
*/
|
||||
enum {
|
||||
NATIVE_WINDOW_SET_BUFFERS_SIZE = 0x10000000,
|
||||
NATIVE_WINDOW_SET_BUFFERS_SIZE = 0x10000000,
|
||||
NATIVE_WINDOW_UPDATE_BUFFERS_GEOMETRY = 0x20000000,
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure to hold the buffer geometry
|
||||
*/
|
||||
struct qBufGeometry {
|
||||
int width;
|
||||
int height;
|
||||
int format;
|
||||
void set(int w, int h, int f) {
|
||||
width = w;
|
||||
height = h;
|
||||
format = f;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@ -69,4 +88,25 @@ bool isGPUSupportedFormat(int format);
|
||||
* @return -EINVAL if the operation is invalid.
|
||||
*/
|
||||
int getNumberOfArgsForOperation(int operation);
|
||||
|
||||
/*
|
||||
* Checks if memory needs to be reallocated for this buffer.
|
||||
*
|
||||
* @param: Geometry of the current buffer.
|
||||
* @param: Required Geometry.
|
||||
* @param: Geometry of the updated buffer.
|
||||
*
|
||||
* @return True if a memory reallocation is required.
|
||||
*/
|
||||
bool needNewBuffer(const qBufGeometry currentGeometry,
|
||||
const qBufGeometry requiredGeometry,
|
||||
const qBufGeometry updatedGeometry);
|
||||
|
||||
/*
|
||||
* Update the geometry of this buffer without reallocation.
|
||||
*
|
||||
* @param: buffer whose geometry needs to be updated.
|
||||
* @param: Updated buffer geometry
|
||||
*/
|
||||
int updateBufferGeometry(sp<GraphicBuffer> buffer, const qBufGeometry bufGeometry);
|
||||
#endif // INCLUDE_LIBQCOM_UI
|
||||
|
Loading…
x
Reference in New Issue
Block a user