attempt to fix bug 5313580
the working theory here is that a Surface object has become non-promotable because it lost its last reference; later Surface::readFromParcel is called the previous surface is found in the cache, but can't be promoted. this causes a new Surface object to be created which will promptly try to connect to the CPU_API -- this in turn will fail because the previous (now dead) surface is still connected. To fix this, we make sure to disconnect from the SurfaceTexture when Surface[TextureClient] is destroyed. Change-Id: I422234868a05d7b7d283e9d5a85f7ab79e65d8a9
This commit is contained in:
parent
d858f05940
commit
a36bcd53ac
|
@ -40,6 +40,7 @@ public:
|
|||
|
||||
protected:
|
||||
SurfaceTextureClient();
|
||||
virtual ~SurfaceTextureClient();
|
||||
void setISurfaceTexture(const sp<ISurfaceTexture>& surfaceTexture);
|
||||
|
||||
private:
|
||||
|
|
|
@ -36,6 +36,12 @@ SurfaceTextureClient::SurfaceTextureClient() {
|
|||
SurfaceTextureClient::init();
|
||||
}
|
||||
|
||||
SurfaceTextureClient::~SurfaceTextureClient() {
|
||||
if (mConnectedToCpu) {
|
||||
SurfaceTextureClient::disconnect(NATIVE_WINDOW_API_CPU);
|
||||
}
|
||||
}
|
||||
|
||||
void SurfaceTextureClient::init() {
|
||||
// Initialize the ANativeWindow function pointers.
|
||||
ANativeWindow::setSwapInterval = hook_setSwapInterval;
|
||||
|
|
Loading…
Reference in New Issue