14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
2eff3a1272e72ef04e66d1aaf22d934a59627c781shannonwoods@chromium.org// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file.
54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Display.h: Defines the egl::Display class, representing the abstract
84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// display on which graphics are drawn. Implements EGLDisplay.
94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// [EGL 1.4] section 2.1.2 page 3.
104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
113cfd7225a0d278a629237fd5644df513de3a67deapatrick@chromium.org#ifndef LIBEGL_DISPLAY_H_
123cfd7225a0d278a629237fd5644df513de3a67deapatrick@chromium.org#define LIBEGL_DISPLAY_H_
134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
14e6842296d00cda4d731782f1e7f22006ea277c4fdaniel@transgaming.com#include <set>
15f289ee8d52d090a5f9ff94034b6e3f510187991aapatrick@chromium.org#include <vector>
16e6842296d00cda4d731782f1e7f22006ea277c4fdaniel@transgaming.com
17e6842296d00cda4d731782f1e7f22006ea277c4fdaniel@transgaming.com#include "libEGL/Config.h"
18486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com
19486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comnamespace gl
20486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com{
21486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Context;
22486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com}
234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace egl
254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
26486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.comclass Surface;
27486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com
284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass Display
294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com  public:
314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    ~Display();
324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool initialize();
344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void terminate();
354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
36591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    static egl::Display *getDisplay(EGLNativeDisplayType displayId, EGLint displayType);
3784d7cbc3b1cf664ef9340ad28755f2851f5040dcjbauman@chromium.org
382b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang    static const char *getExtensionString(egl::Display *display);
392b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang
40591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    static bool supportsPlatformD3D();
41591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    static bool supportsPlatformOpenGL();
42591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang
434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
4606d7a7559b3c284bf568ac1aa0881209a61e7582jbauman@chromium.org    EGLSurface createWindowSurface(HWND window, EGLConfig config, const EGLint *attribList);
474e29770792184805ad0b9e50ec6355e940fd22c4jbauman@chromium.org    EGLSurface createOffscreenSurface(EGLConfig config, HANDLE shareHandle, const EGLint *attribList);
48daea4b4584cdbd8c82dd9946eb07a32ab2f278b7shannon.woods%transgaming.com@gtempaccount.com    EGLContext createContext(EGLConfig configHandle, EGLint clientVersion, const gl::Context *shareContext, bool notifyResets, bool robustAccess);
494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void destroySurface(egl::Surface *surface);
514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void destroyContext(gl::Context *context);
524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
533b1703f42cc94a1b28a5a6b5f9653084c0bc455bdaniel@transgaming.com    bool isInitialized() const;
544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool isValidConfig(EGLConfig config);
554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool isValidContext(gl::Context *context);
564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool isValidSurface(egl::Surface *surface);
574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool hasExistingWindowSurface(HWND window);
584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5976d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com    rx::Renderer *getRenderer() { return mRenderer; };
604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
618bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com    // exported methods must be virtual
6209fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com    virtual void notifyDeviceLost();
638bce3f59f55ebbef64e2a7b0f024644afbebd5b0shannon.woods%transgaming.com@gtempaccount.com    virtual void recreateSwapChains();
6409fcc9fe6a6247af02ca203a9df4ffb00f2ee003daniel@transgaming.com
65721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com    const char *getExtensionString() const;
666e4f2a6b70e12750a1e79c3dcee6c6dd5cfb67feshannonwoods@chromium.org    const char *getVendorString() const;
67721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com  private:
694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    DISALLOW_COPY_AND_ASSIGN(Display);
70d36c6a0a2674ded25b28b92f4b9fc22191d8ab61daniel@transgaming.com
71591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    Display(EGLNativeDisplayType displayId, EGLint displayType);
7284d7cbc3b1cf664ef9340ad28755f2851f5040dcjbauman@chromium.org
738c9c4521e253c36ace0bc95d52deda7c0d55887fvangelis@google.com    bool restoreLostDevice();
748c9c4521e253c36ace0bc95d52deda7c0d55887fvangelis@google.com
7584d7cbc3b1cf664ef9340ad28755f2851f5040dcjbauman@chromium.org    EGLNativeDisplayType mDisplayId;
76591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    EGLint mRequestedDisplayType;
774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    typedef std::set<Surface*> SurfaceSet;
794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    SurfaceSet mSurfaceSet;
804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    ConfigSet mConfigSet;
824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    typedef std::set<gl::Context*> ContextSet;
844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    ContextSet mContextSet;
85da6e263cede2f850a62f6b4e250fc5b13518da24daniel@transgaming.com
8676d3e6e07b87d95baf43a0c40ec6f3df883fbf71daniel@transgaming.com    rx::Renderer *mRenderer;
87721b7f267502e01728d1676cd69765ba28c68dc3vladimirv@gmail.com
882b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang    static std::string generateClientExtensionString();
892b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang
902b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang    void initDisplayExtensionString();
912b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang    std::string mDisplayExtensionString;
922b5f3b3653d8cb82d6f1ab60ee79b6e5284fc53aGeoff Lang
936e4f2a6b70e12750a1e79c3dcee6c6dd5cfb67feshannonwoods@chromium.org    void initVendorString();
946e4f2a6b70e12750a1e79c3dcee6c6dd5cfb67feshannonwoods@chromium.org    std::string mVendorString;
954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com};
964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
983cfd7225a0d278a629237fd5644df513de3a67deapatrick@chromium.org#endif   // LIBEGL_DISPLAY_H_
99