#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 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 uint32_t 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; // From WGL_EXT_colorspace bool sRGB; // \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) , sRGB(false) { } }; /*--------------------------------------------------------------------*//*! * \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 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); } // namespace wgl } // namespace tcu #endif // _TCUWGL_HPP