OSDN Git Service

Implement EGL_SWAP_BEHAVIOR for eglSurfaceAttrib().
authorNicolas Capens <capn@google.com>
Wed, 25 Mar 2015 18:03:21 +0000 (14:03 -0400)
committerNicolas Capens <capn@google.com>
Wed, 25 Mar 2015 21:30:05 +0000 (21:30 +0000)
SwiftShader currently always preserves the color buffer on eglSwapBuffers,
so both EGL_BUFFER_PRESERVED and EGL_BUFFER_DESTROYED can be used without
real changes.

Change-Id: I55fcd7d4b4211483d8876c15d3d6ea77ea2685e6
Reviewed-on: https://swiftshader-review.googlesource.com/2721
Reviewed-by: Ping-Hao Wu <pinghao@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libEGL/Surface.cpp
src/OpenGL/libEGL/Surface.h
src/OpenGL/libEGL/libEGL.cpp

index 7d99988..466f10f 100644 (file)
@@ -208,6 +208,11 @@ egl::Image *Surface::getDepthStencil()
     return mDepthStencil;\r
 }\r
 \r
+void Surface::setSwapBehavior(EGLenum swapBehavior)\r
+{\r
+       mSwapBehavior = swapBehavior;\r
+}\r
+\r
 void Surface::setSwapInterval(EGLint interval)\r
 {\r
     if(mSwapInterval == interval)\r
@@ -225,6 +230,16 @@ EGLint Surface::getConfigID() const
     return mConfig->mConfigID;\r
 }\r
 \r
+EGLenum Surface::getSurfaceType() const\r
+{\r
+    return mConfig->mSurfaceType;\r
+}\r
+\r
+sw::Format Surface::getInternalFormat() const\r
+{\r
+    return mConfig->mRenderTargetFormat;\r
+}\r
+\r
 EGLint Surface::getWidth() const\r
 {\r
     return mWidth;\r
@@ -270,11 +285,6 @@ egl::Texture *Surface::getBoundTexture() const
     return mTexture;\r
 }\r
 \r
-sw::Format Surface::getInternalFormat() const\r
-{\r
-    return mConfig->mRenderTargetFormat;\r
-}\r
-\r
 bool Surface::checkForResize()\r
 {\r
     #if defined(_WIN32)\r
index 55cbed3..1db6fc1 100644 (file)
@@ -44,9 +44,13 @@ public:
     virtual egl::Image *getRenderTarget();\r
     virtual egl::Image *getDepthStencil();\r
 \r
+       void setSwapBehavior(EGLenum swapBehavior);\r
     void setSwapInterval(EGLint interval);\r
 \r
     virtual EGLint getConfigID() const;\r
+       virtual EGLenum getSurfaceType() const;\r
+       virtual sw::Format getInternalFormat() const;\r
+\r
     virtual EGLint getWidth() const;\r
     virtual EGLint getHeight() const;\r
     virtual EGLint getPixelAspectRatio() const;\r
@@ -54,7 +58,6 @@ public:
     virtual EGLenum getSwapBehavior() const;\r
     virtual EGLenum getTextureFormat() const;\r
     virtual EGLenum getTextureTarget() const;\r
-    virtual sw::Format getInternalFormat() const;\r
 \r
     virtual void setBoundTexture(egl::Texture *texture);\r
     virtual egl::Texture *getBoundTexture() const;\r
index 3a3dce9..e016390 100644 (file)
@@ -479,7 +479,25 @@ EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLi
                return EGL_FALSE;\r
        }\r
 \r
-       UNIMPLEMENTED();   // FIXME\r
+       switch(attribute)\r
+       {\r
+       case EGL_SWAP_BEHAVIOR:\r
+               if(value == EGL_BUFFER_PRESERVED)\r
+               {\r
+                       if(!(eglSurface->getSurfaceType() && EGL_SWAP_BEHAVIOR_PRESERVED_BIT))\r
+                       {\r
+                               return error(EGL_BAD_MATCH, EGL_FALSE);\r
+                       }\r
+               }\r
+               else if(value != EGL_BUFFER_DESTROYED)\r
+               {\r
+                       return error(EGL_BAD_PARAMETER, EGL_FALSE);\r
+               }\r
+               eglSurface->setSwapBehavior(value);\r
+               break;\r
+       default:\r
+               UNIMPLEMENTED();   // FIXME\r
+       }\r
 \r
        return success(EGL_TRUE);\r
 }\r