EGL: fix the ANativeWindow size/fmt override
This change fixes how the Android EGL layer overrides the size and format of an ANativeWindow in eglCreateWindowSurface. The new behavior is to leave the size untouched when overriding the format. The previous behavior was to reset the ANativeWindow to use the default size set by the ANativeWindow implementation. It also adds two new 'perform' methods to the ANativeWindow interface: set_buffers_dimensions and set_buffers_format, and redefines the behavior of set_buffers_geometry to be the combination of these two new methods. Additionally, this change adds an error check for the return value of the new native_window_set_buffers_format call, which required adding a (stub) handler for to FramebufferNativeWindow. Change-Id: I805c7ccd8d4730dfb132d10d8bc3fb058a0b9df1
This commit is contained in:
parent
6a90b3a3d7
commit
bee205fd58
@ -65,6 +65,8 @@ private:
|
||||
int dispatchDisconnect(va_list args);
|
||||
int dispatchSetBufferCount(va_list args);
|
||||
int dispatchSetBuffersGeometry(va_list args);
|
||||
int dispatchSetBuffersDimensions(va_list args);
|
||||
int dispatchSetBuffersFormat(va_list args);
|
||||
int dispatchSetBuffersTransform(va_list args);
|
||||
int dispatchSetBuffersTimestamp(va_list args);
|
||||
int dispatchSetCrop(va_list args);
|
||||
@ -73,7 +75,8 @@ private:
|
||||
int connect(int api);
|
||||
int disconnect(int api);
|
||||
int setBufferCount(int bufferCount);
|
||||
int setBuffersGeometry(int w, int h, int format);
|
||||
int setBuffersDimensions(int w, int h);
|
||||
int setBuffersFormat(int format);
|
||||
int setBuffersTransform(int transform);
|
||||
int setBuffersTimestamp(int64_t timestamp);
|
||||
int setCrop(Rect const* rect);
|
||||
|
@ -254,6 +254,12 @@ int SurfaceTextureClient::perform(int operation, va_list args)
|
||||
case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP:
|
||||
res = dispatchSetBuffersTimestamp(args);
|
||||
break;
|
||||
case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS:
|
||||
res = dispatchSetBuffersDimensions(args);
|
||||
break;
|
||||
case NATIVE_WINDOW_SET_BUFFERS_FORMAT:
|
||||
res = dispatchSetBuffersFormat(args);
|
||||
break;
|
||||
default:
|
||||
res = NAME_NOT_FOUND;
|
||||
break;
|
||||
@ -290,7 +296,22 @@ int SurfaceTextureClient::dispatchSetBuffersGeometry(va_list args) {
|
||||
int w = va_arg(args, int);
|
||||
int h = va_arg(args, int);
|
||||
int f = va_arg(args, int);
|
||||
return setBuffersGeometry(w, h, f);
|
||||
int err = setBuffersDimensions(w, h);
|
||||
if (err != 0) {
|
||||
return err;
|
||||
}
|
||||
return setBuffersFormat(f);
|
||||
}
|
||||
|
||||
int SurfaceTextureClient::dispatchSetBuffersDimensions(va_list args) {
|
||||
int w = va_arg(args, int);
|
||||
int h = va_arg(args, int);
|
||||
return setBuffersDimensions(w, h);
|
||||
}
|
||||
|
||||
int SurfaceTextureClient::dispatchSetBuffersFormat(va_list args) {
|
||||
int f = va_arg(args, int);
|
||||
return setBuffersFormat(f);
|
||||
}
|
||||
|
||||
int SurfaceTextureClient::dispatchSetBuffersTransform(va_list args) {
|
||||
@ -390,12 +411,12 @@ int SurfaceTextureClient::setBufferCount(int bufferCount)
|
||||
return err;
|
||||
}
|
||||
|
||||
int SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
|
||||
int SurfaceTextureClient::setBuffersDimensions(int w, int h)
|
||||
{
|
||||
LOGV("SurfaceTextureClient::setBuffersGeometry");
|
||||
LOGV("SurfaceTextureClient::setBuffersDimensions");
|
||||
Mutex::Autolock lock(mMutex);
|
||||
|
||||
if (w<0 || h<0 || format<0)
|
||||
if (w<0 || h<0)
|
||||
return BAD_VALUE;
|
||||
|
||||
if ((w && !h) || (!w && h))
|
||||
@ -403,7 +424,6 @@ int SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
|
||||
|
||||
mReqWidth = w;
|
||||
mReqHeight = h;
|
||||
mReqFormat = format;
|
||||
|
||||
status_t err = mSurfaceTexture->setCrop(Rect(0, 0));
|
||||
LOGE_IF(err, "ISurfaceTexture::setCrop(...) returned %s", strerror(-err));
|
||||
@ -411,6 +431,19 @@ int SurfaceTextureClient::setBuffersGeometry(int w, int h, int format)
|
||||
return err;
|
||||
}
|
||||
|
||||
int SurfaceTextureClient::setBuffersFormat(int format)
|
||||
{
|
||||
LOGV("SurfaceTextureClient::setBuffersFormat");
|
||||
Mutex::Autolock lock(mMutex);
|
||||
|
||||
if (format<0)
|
||||
return BAD_VALUE;
|
||||
|
||||
mReqFormat = format;
|
||||
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
int SurfaceTextureClient::setBuffersTransform(int transform)
|
||||
{
|
||||
LOGV("SurfaceTextureClient::setBuffersTransform");
|
||||
|
@ -299,6 +299,7 @@ int FramebufferNativeWindow::perform(ANativeWindow* window,
|
||||
{
|
||||
switch (operation) {
|
||||
case NATIVE_WINDOW_SET_USAGE:
|
||||
case NATIVE_WINDOW_SET_BUFFERS_FORMAT:
|
||||
case NATIVE_WINDOW_CONNECT:
|
||||
case NATIVE_WINDOW_DISCONNECT:
|
||||
break;
|
||||
|
@ -367,7 +367,12 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config,
|
||||
if (cnx->egl.eglGetConfigAttrib(iDpy,
|
||||
iConfig, EGL_NATIVE_VISUAL_ID, &format)) {
|
||||
if (format != 0) {
|
||||
native_window_set_buffers_geometry(window, 0, 0, format);
|
||||
int err = native_window_set_buffers_format(window, format);
|
||||
if (err != 0) {
|
||||
LOGE("error setting native window pixel format: %s (%d)",
|
||||
strerror(-err), err);
|
||||
return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user