| #ifndef _TCUWGL_HPP |
| #define _TCUWGL_HPP |
| /*------------------------------------------------------------------------- |
| * drawElements Quality Program Tester Core |
| * ---------------------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief WGL Utilities. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "tcuDefs.hpp" |
| #include "gluRenderConfig.hpp" |
| #include "gluRenderContext.hpp" |
| #include "deDynamicLibrary.h" |
| #include "tcuWin32API.h" |
| |
| #include <vector> |
| |
| namespace glu |
| { |
| struct RenderConfig; |
| } |
| |
| namespace tcu |
| { |
| namespace wgl |
| { |
| |
| class Library; |
| class Context; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief WGL pixel format info. |
| *//*--------------------------------------------------------------------*/ |
| class PixelFormatInfo |
| { |
| public: |
| enum PixelType |
| { |
| PIXELTYPE_RGBA = 0, |
| PIXELTYPE_RGBA_FLOAT, |
| PIXELTYPE_RGBA_UNSIGNED_FLOAT, |
| PIXELTYPE_COLOR_INDEX, |
| PIXELTYPE_UNKNOWN, |
| |
| PIXELTYPE_LAST |
| }; |
| |
| enum SurfaceFlags |
| { |
| SURFACE_WINDOW = (1<<0), |
| SURFACE_PIXMAP = (1<<1) |
| }; |
| |
| enum Acceleration |
| { |
| ACCELERATION_NONE = 0, |
| ACCELERATION_GENERIC, |
| ACCELERATION_FULL, |
| ACCELERATION_UNKNOWN, |
| |
| ACCELERATION_LAST |
| }; |
| |
| int pixelFormat; |
| |
| // From WGL_ARB_pixel_format |
| deUint32 surfaceTypes; |
| Acceleration acceleration; |
| bool needPalette; |
| bool needSystemPalette; |
| // bool swapLayerBuffers; |
| // SwapMethod swapMethod; { EXCHANGE, UNDEFINED } |
| int numOverlays; |
| int numUnderlays; |
| // bool transparent; |
| // int transparentRedValue; |
| // int transparentGreenValue; |
| // int transparentBlueValue; |
| // int transparentAlphaValue; |
| // int transparentIndexValue; |
| // bool shareDepth; |
| // bool shareStencil; |
| // bool shareAccum; |
| // bool supportGDI; |
| bool supportOpenGL; |
| bool doubleBuffer; |
| bool stereo; |
| PixelType pixelType; |
| |
| // int colorBits; |
| int redBits; |
| // int redShift; |
| int greenBits; |
| // int greenShift; |
| int blueBits; |
| // int blueShift; |
| int alphaBits; |
| // int alphaShift; |
| |
| int accumBits; |
| // int accumRedBits; |
| // int accumGreenBits; |
| // int accumBlueBits; |
| // int accumAlphaBits; |
| |
| int depthBits; |
| int stencilBits; |
| |
| int numAuxBuffers; |
| |
| // From WGL_ARB_multisample |
| int sampleBuffers; |
| int samples; |
| |
| // \todo [2013-04-14 pyry] Version bits? |
| |
| PixelFormatInfo (void) |
| : pixelFormat (0) |
| , surfaceTypes (0) |
| , acceleration (ACCELERATION_LAST) |
| , needPalette (false) |
| , needSystemPalette (false) |
| , numOverlays (0) |
| , numUnderlays (0) |
| , supportOpenGL (false) |
| , doubleBuffer (false) |
| , stereo (false) |
| , pixelType (PIXELTYPE_LAST) |
| , redBits (0) |
| , greenBits (0) |
| , blueBits (0) |
| , alphaBits (0) |
| , accumBits (0) |
| , depthBits (0) |
| , stencilBits (0) |
| , numAuxBuffers (0) |
| , sampleBuffers (0) |
| , samples (0) |
| { |
| } |
| }; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Core WGL API |
| * |
| * \note Created API objects depend on Core object being live. User is |
| * resposible of keeping Core live as long as there are API objects |
| * (such as GL contexts) live! |
| *//*--------------------------------------------------------------------*/ |
| class Core |
| { |
| public: |
| Core (HINSTANCE instance); |
| ~Core (void); |
| |
| std::vector<int> getPixelFormats (HDC deviceCtx) const; |
| PixelFormatInfo getPixelFormatInfo (HDC deviceCtx, int pixelFormat) const; |
| |
| // Internal |
| const Library* getLibrary (void) const { return m_library; } |
| |
| private: |
| Core (const Core& other); |
| Core& operator= (const Core& other); |
| |
| Library* m_library; |
| }; |
| |
| //! Function pointer type. |
| typedef void (__stdcall* FunctionPtr) (void); |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief WGL context |
| * |
| * Context is currently made current to current thread in constructor |
| * and detached in destructor. Thus context should be created in and |
| * accessed from a single thread. |
| *//*--------------------------------------------------------------------*/ |
| class Context |
| { |
| public: |
| Context (const Core* core, |
| HDC deviceCtx, |
| const Context* sharedContext, |
| glu::ContextType ctxType, |
| int pixelFormat, |
| glu::ResetNotificationStrategy resetNotificationStrategy); |
| ~Context (void); |
| |
| FunctionPtr getGLFunction (const char* name) const; |
| |
| void makeCurrent (void); |
| void swapBuffers (void) const; |
| |
| HDC getDeviceContext (void) const { return m_deviceCtx; } |
| HGLRC getGLContext (void) const { return m_context; } |
| |
| private: |
| Context (const Context& other); |
| Context& operator= (const Context& other); |
| |
| const Core* m_core; |
| HDC m_deviceCtx; |
| HGLRC m_context; |
| }; |
| |
| //! Utility for selecting config. Returns -1 if no matching pixel format was found. |
| int choosePixelFormat (const Core& wgl, HDC deviceCtx, const glu::RenderConfig& config); |
| |
| //! Is pixel format in general supported by dEQP tests? |
| bool isSupportedByTests (const PixelFormatInfo& pixelFormatInfo); |
| |
| } // wgl |
| } // tcu |
| |
| #endif // _TCUWGL_HPP |