1//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Config.h: Defines the egl::Config class, describing the format, type
8// and size for an egl::Surface. Implements EGLConfig and related functionality.
9// [EGL 1.4] section 3.4 page 15.
10
11#ifndef INCLUDE_CONFIG_H_
12#define INCLUDE_CONFIG_H_
13
14#define EGLAPI
15#include <EGL/egl.h>
16#include <d3d9.h>
17
18#include <set>
19
20#include "common/angleutils.h"
21
22namespace egl
23{
24class Display;
25
26class Config
27{
28  public:
29    Config(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample);
30
31    void setDefaults();
32    void set(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample);
33    EGLConfig getHandle() const;
34
35    const D3DDISPLAYMODE mDisplayMode;
36    const D3DFORMAT mRenderTargetFormat;
37    const D3DFORMAT mDepthStencilFormat;
38    const EGLint mMultiSample;
39
40    EGLint mBufferSize;              // Depth of the color buffer
41    EGLint mRedSize;                 // Bits of Red in the color buffer
42    EGLint mGreenSize;               // Bits of Green in the color buffer
43    EGLint mBlueSize;                // Bits of Blue in the color buffer
44    EGLint mLuminanceSize;           // Bits of Luminance in the color buffer
45    EGLint mAlphaSize;               // Bits of Alpha in the color buffer
46    EGLint mAlphaMaskSize;           // Bits of Alpha Mask in the mask buffer
47    EGLBoolean mBindToTextureRGB;    // True if bindable to RGB textures.
48    EGLBoolean mBindToTextureRGBA;   // True if bindable to RGBA textures.
49    EGLenum mColorBufferType;        // Color buffer type
50    EGLenum mConfigCaveat;           // Any caveats for the configuration
51    EGLint mConfigID;                // Unique EGLConfig identifier
52    EGLint mConformant;              // Whether contexts created with this config are conformant
53    EGLint mDepthSize;               // Bits of Z in the depth buffer
54    EGLint mLevel;                   // Frame buffer level
55    EGLBoolean mMatchNativePixmap;   // Match the native pixmap format
56    EGLint mMaxPBufferWidth;         // Maximum width of pbuffer
57    EGLint mMaxPBufferHeight;        // Maximum height of pbuffer
58    EGLint mMaxPBufferPixels;        // Maximum size of pbuffer
59    EGLint mMaxSwapInterval;         // Maximum swap interval
60    EGLint mMinSwapInterval;         // Minimum swap interval
61    EGLBoolean mNativeRenderable;    // EGL_TRUE if native rendering APIs can render to surface
62    EGLint mNativeVisualID;          // Handle of corresponding native visual
63    EGLint mNativeVisualType;        // Native visual type of the associated visual
64    EGLint mRenderableType;          // Which client rendering APIs are supported.
65    EGLint mSampleBuffers;           // Number of multisample buffers
66    EGLint mSamples;                 // Number of samples per pixel
67    EGLint mStencilSize;             // Bits of Stencil in the stencil buffer
68    EGLint mSurfaceType;             // Which types of EGL surfaces are supported.
69    EGLenum mTransparentType;        // Type of transparency supported
70    EGLint mTransparentRedValue;     // Transparent red value
71    EGLint mTransparentGreenValue;   // Transparent green value
72    EGLint mTransparentBlueValue;    // Transparent blue value
73};
74
75// Function object used by STL sorting routines for ordering Configs according to [EGL] section 3.4.1 page 24.
76class SortConfig
77{
78  public:
79    explicit SortConfig(const EGLint *attribList);
80
81    bool operator()(const Config *x, const Config *y) const;
82    bool operator()(const Config &x, const Config &y) const;
83
84  private:
85    void scanForWantedComponents(const EGLint *attribList);
86    EGLint wantedComponentsSize(const Config &config) const;
87
88    bool mWantRed;
89    bool mWantGreen;
90    bool mWantBlue;
91    bool mWantAlpha;
92    bool mWantLuminance;
93};
94
95class ConfigSet
96{
97    friend Display;
98
99  public:
100    ConfigSet();
101
102    void add(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample);
103    size_t size() const;
104    bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
105    const egl::Config *get(EGLConfig configHandle);
106
107  private:
108    DISALLOW_COPY_AND_ASSIGN(ConfigSet);
109
110    typedef std::set<Config, SortConfig> Set;
111    typedef Set::iterator Iterator;
112    Set mSet;
113
114    static const EGLint mSortAttribs[];
115};
116}
117
118#endif   // INCLUDE_CONFIG_H_
119