Surface: query swapBehavior from the Impl
All the previously implemented surfaces used to preserve the content of
the surface on a swap but this is no longer the case with CGL.
BUG=angleproject:891
Change-Id: I264c579bcbbd22b4eeb09e78aa95751d223694fc
Reviewed-on: https://chromium-review.googlesource.com/289871
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/Surface.cpp b/src/libANGLE/Surface.cpp
index 68ad4ca..c4cbf97 100644
--- a/src/libANGLE/Surface.cpp
+++ b/src/libANGLE/Surface.cpp
@@ -32,7 +32,7 @@
// FIXME: Determine actual pixel aspect ratio
mPixelAspectRatio(static_cast<EGLint>(1.0 * EGL_DISPLAY_SCALING)),
mRenderBuffer(EGL_BACK_BUFFER),
- mSwapBehavior(EGL_BUFFER_PRESERVED)
+ mSwapBehavior(impl->getSwapBehavior())
{
addRef();
diff --git a/src/libANGLE/Surface_unittest.cpp b/src/libANGLE/Surface_unittest.cpp
index e453658..236bb5d 100644
--- a/src/libANGLE/Surface_unittest.cpp
+++ b/src/libANGLE/Surface_unittest.cpp
@@ -29,6 +29,7 @@
MOCK_CONST_METHOD0(getWidth, EGLint());
MOCK_CONST_METHOD0(getHeight, EGLint());
MOCK_CONST_METHOD0(isPostSubBufferSupported, EGLint(void));
+ MOCK_CONST_METHOD0(getSwapBehavior, EGLint(void));
MOCK_METHOD2(getAttachmentRenderTarget, gl::Error(const gl::FramebufferAttachment::Target &, rx::FramebufferAttachmentRenderTarget **));
MOCK_METHOD0(destroy, void());
diff --git a/src/libANGLE/renderer/SurfaceImpl.h b/src/libANGLE/renderer/SurfaceImpl.h
index acc81e4..cc23478 100644
--- a/src/libANGLE/renderer/SurfaceImpl.h
+++ b/src/libANGLE/renderer/SurfaceImpl.h
@@ -41,6 +41,7 @@
virtual EGLint getHeight() const = 0;
virtual EGLint isPostSubBufferSupported() const = 0;
+ virtual EGLint getSwapBehavior() const = 0;
};
}
diff --git a/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
index 2e06380..146f6b2 100644
--- a/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
+++ b/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
@@ -295,6 +295,11 @@
return EGL_TRUE;
}
+EGLint SurfaceD3D::getSwapBehavior() const
+{
+ return EGL_BUFFER_PRESERVED;
+}
+
egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value)
{
if (attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
diff --git a/src/libANGLE/renderer/d3d/SurfaceD3D.h b/src/libANGLE/renderer/d3d/SurfaceD3D.h
index 7beb5fd..3fb248a 100644
--- a/src/libANGLE/renderer/d3d/SurfaceD3D.h
+++ b/src/libANGLE/renderer/d3d/SurfaceD3D.h
@@ -45,6 +45,7 @@
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
+ EGLint getSwapBehavior() const override;
// D3D implementations
SwapChainD3D *getSwapChain() const;
diff --git a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
index 7eb20c0..4982270 100644
--- a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
+++ b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
@@ -34,6 +34,7 @@
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
+ EGLint getSwapBehavior() const override;
};
}
diff --git a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
index 1034540..f6fe4f6 100644
--- a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
@@ -87,4 +87,9 @@
return EGL_FALSE;
}
+EGLint WindowSurfaceCGL::getSwapBehavior() const
+{
+ return EGL_BUFFER_DESTROYED;
+}
+
}
diff --git a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
index 6df5c0b..80e9e7c 100644
--- a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
@@ -117,4 +117,9 @@
return EGL_FALSE;
}
+EGLint PbufferSurfaceGLX::getSwapBehavior() const
+{
+ return EGL_BUFFER_PRESERVED;
+}
+
}
diff --git a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
index a00775f..d1548ed 100644
--- a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
+++ b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
@@ -38,6 +38,7 @@
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
+ EGLint getSwapBehavior() const override;
private:
unsigned mWidth;
diff --git a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
index a43111a..80c9e4a 100644
--- a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
@@ -192,6 +192,11 @@
return EGL_FALSE;
}
+EGLint WindowSurfaceGLX::getSwapBehavior() const
+{
+ return EGL_BUFFER_PRESERVED;
+}
+
bool WindowSurfaceGLX::getWindowDimensions(Window window, unsigned int *width, unsigned int *height) const
{
Window root;
diff --git a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
index f99c06e..de18f2b 100644
--- a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
+++ b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
@@ -39,6 +39,8 @@
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
+ EGLint getSwapBehavior() const override;
+
private:
bool getWindowDimensions(Window window, unsigned int *width, unsigned int *height) const;
diff --git a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
index c4f55d9..7d0cacb 100644
--- a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
@@ -179,4 +179,9 @@
return EGL_FALSE;
}
+EGLint PbufferSurfaceWGL::getSwapBehavior() const
+{
+ return EGL_BUFFER_PRESERVED;
+}
+
}
diff --git a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
index f9e1075..9608a2c 100644
--- a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
@@ -40,6 +40,7 @@
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
+ EGLint getSwapBehavior() const override;
private:
EGLint mWidth;
diff --git a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
index d7f27af..a2bce84 100644
--- a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
@@ -145,4 +145,9 @@
return EGL_FALSE;
}
+EGLint WindowSurfaceWGL::getSwapBehavior() const
+{
+ return EGL_BUFFER_PRESERVED;
+}
+
}
diff --git a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
index bd5ca61..fbd8e90 100644
--- a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
@@ -38,6 +38,7 @@
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
+ EGLint getSwapBehavior() const override;
private:
int mPixelFormat;