Edit

kc3-lang/angle/src/libEGL/Surface.h

Branch :

  • Show log

    Commit

  • Author : apatrick@chromium.org
    Date : 2010-08-31 20:00:18
    Hash : 0db0d6c8
    Message : Replaces swap chain lazily when the swap interval is changed. It does not appear to be possible to pass a presentation interval to Present() or change it after creating the swap chain, short of calling Reset(). I decided to try fixing it by replacing the swap chain under the same conditions as a window resize. I tested it with a modified version of the simple vertex shader sample, passing various values to eglSwapInterval. My reading of the EGL spec might be wrong but I believe the interval state should be associated with the surface bound to the current context, rather than the display. Review URL: http://codereview.appspot.com/2036044 git-svn-id: https://angleproject.googlecode.com/svn/trunk@408 736b8ea6-26fd-11df-bfd4-992fa37f6226

  • src/libEGL/Surface.h
  • //
    // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // Surface.h: Defines the egl::Surface class, representing a drawing surface
    // such as the client area of a window, including any back buffers.
    // Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
    
    #ifndef INCLUDE_SURFACE_H_
    #define INCLUDE_SURFACE_H_
    
    #define EGLAPI
    #include <EGL/egl.h>
    #include <d3d9.h>
    
    #include "common/angleutils.h"
    
    namespace egl
    {
    class Display;
    class Config;
    
    class Surface
    {
      public:
        Surface(Display *display, const egl::Config *config, HWND window);
    
        ~Surface();
    
        void release();
        void resetSwapChain();
    
        HWND getWindowHandle();
        bool swap();
    
        virtual EGLint getWidth() const;
        virtual EGLint getHeight() const;
    
        virtual IDirect3DSurface9 *getRenderTarget();
        virtual IDirect3DSurface9 *getDepthStencil();
    
        void setSwapInterval(EGLint interval);
    
      private:
        DISALLOW_COPY_AND_ASSIGN(Surface);
    
        Display *const mDisplay;
        IDirect3DSwapChain9 *mSwapChain;
        IDirect3DSurface9 *mBackBuffer;
        IDirect3DSurface9 *mRenderTarget;
        IDirect3DSurface9 *mDepthStencil;
        IDirect3DTexture9 *mFlipTexture;
    
        bool checkForOutOfDateSwapChain();
    
        static DWORD convertInterval(EGLint interval);
    
        void applyFlipState(IDirect3DDevice9 *device);
        void restoreState(IDirect3DDevice9 *device);
        void writeRecordableFlipState(IDirect3DDevice9 *device);
        void releaseRecordedState(IDirect3DDevice9 *device);
        IDirect3DStateBlock9 *mFlipState;
        IDirect3DStateBlock9 *mPreFlipState;
        IDirect3DSurface9 *mPreFlipBackBuffer;
        IDirect3DSurface9 *mPreFlipDepthStencil;
    
        const HWND mWindow;            // Window that the surface is created for.
        const egl::Config *mConfig;    // EGL config surface was created with
        EGLint mHeight;                // Height of surface
        EGLint mWidth;                 // Width of surface
    //  EGLint horizontalResolution;   // Horizontal dot pitch
    //  EGLint verticalResolution;     // Vertical dot pitch
    //  EGLBoolean largestPBuffer;     // If true, create largest pbuffer possible
    //  EGLBoolean mipmapTexture;      // True if texture has mipmaps
    //  EGLint mipmapLevel;            // Mipmap level to render to
    //  EGLenum multisampleResolve;    // Multisample resolve behavior
        EGLint mPixelAspectRatio;      // Display aspect ratio
        EGLenum mRenderBuffer;         // Render buffer
        EGLenum mSwapBehavior;         // Buffer swap behavior
    //  EGLenum textureFormat;         // Format of texture: RGB, RGBA, or no texture
    //  EGLenum textureTarget;         // Type of texture: 2D or no texture
    //  EGLenum vgAlphaFormat;         // Alpha format for OpenVG
    //  EGLenum vgColorSpace;          // Color space for OpenVG
        EGLint mSwapInterval;
        DWORD mPresentInterval;
        bool mPresentIntervalDirty;
    };
    }
    
    #endif   // INCLUDE_SURFACE_H_