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;