1#ifndef _TCUWGL_HPP 2#define _TCUWGL_HPP 3/*------------------------------------------------------------------------- 4 * drawElements Quality Program Tester Core 5 * ---------------------------------------- 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief WGL Utilities. 24 *//*--------------------------------------------------------------------*/ 25 26#include "tcuDefs.hpp" 27#include "gluRenderContext.hpp" 28#include "deDynamicLibrary.h" 29#include "tcuWin32API.h" 30 31#include <vector> 32 33namespace glu 34{ 35struct RenderConfig; 36} 37 38namespace tcu 39{ 40namespace wgl 41{ 42 43class Library; 44class Context; 45 46/*--------------------------------------------------------------------*//*! 47 * \brief WGL pixel format info. 48 *//*--------------------------------------------------------------------*/ 49class PixelFormatInfo 50{ 51public: 52 enum PixelType 53 { 54 PIXELTYPE_RGBA = 0, 55 PIXELTYPE_RGBA_FLOAT, 56 PIXELTYPE_RGBA_UNSIGNED_FLOAT, 57 PIXELTYPE_COLOR_INDEX, 58 PIXELTYPE_UNKNOWN, 59 60 PIXELTYPE_LAST 61 }; 62 63 enum SurfaceFlags 64 { 65 SURFACE_WINDOW = (1<<0), 66 SURFACE_PIXMAP = (1<<1) 67 }; 68 69 enum Acceleration 70 { 71 ACCELERATION_NONE = 0, 72 ACCELERATION_GENERIC, 73 ACCELERATION_FULL, 74 ACCELERATION_UNKNOWN, 75 76 ACCELERATION_LAST 77 }; 78 79 int pixelFormat; 80 81 // From WGL_ARB_pixel_format 82 deUint32 surfaceTypes; 83 Acceleration acceleration; 84// bool needPalette; 85// bool needSystemPalette; 86// bool swapLayerBuffers; 87// SwapMethod swapMethod; { EXCHANGE, UNDEFINED } 88// int numOverlays; 89// int numUnderlays; 90// bool transparent; 91// int transparentRedValue; 92// int transparentGreenValue; 93// int transparentBlueValue; 94// int transparentAlphaValue; 95// int transparentIndexValue; 96// bool shareDepth; 97// bool shareStencil; 98// bool shareAccum; 99// bool supportGDI; 100 bool supportOpenGL; 101 bool doubleBuffer; 102// bool stereo; 103 PixelType pixelType; 104 105// int colorBits; 106 int redBits; 107// int redShift; 108 int greenBits; 109// int greenShift; 110 int blueBits; 111// int blueShift; 112 int alphaBits; 113// int alphaShift; 114 115// int accumBits; 116// int accumRedBits; 117// int accumGreenBits; 118// int accumBlueBits; 119// int accumAlphaBits; 120 121 int depthBits; 122 int stencilBits; 123 124// int numAuxBuffers; 125 126 // From WGL_ARB_multisample 127 int sampleBuffers; 128 int samples; 129 130 // \todo [2013-04-14 pyry] Version bits? 131 132 PixelFormatInfo (void) 133 : pixelFormat (0) 134 , surfaceTypes (0) 135 , acceleration (ACCELERATION_LAST) 136 , supportOpenGL (false) 137 , doubleBuffer (false) 138 , pixelType (PIXELTYPE_LAST) 139 , redBits (0) 140 , greenBits (0) 141 , blueBits (0) 142 , alphaBits (0) 143 , depthBits (0) 144 , stencilBits (0) 145 , sampleBuffers (0) 146 , samples (0) 147 { 148 } 149}; 150 151/*--------------------------------------------------------------------*//*! 152 * \brief Core WGL API 153 * 154 * \note Created API objects depend on Core object being live. User is 155 * resposible of keeping Core live as long as there are API objects 156 * (such as GL contexts) live! 157 *//*--------------------------------------------------------------------*/ 158class Core 159{ 160public: 161 Core (HINSTANCE instance); 162 ~Core (void); 163 164 std::vector<int> getPixelFormats (HDC deviceCtx) const; 165 PixelFormatInfo getPixelFormatInfo (HDC deviceCtx, int pixelFormat) const; 166 167 // Internal 168 const Library* getLibrary (void) const { return m_library; } 169 170private: 171 Core (const Core& other); 172 Core& operator= (const Core& other); 173 174 Library* m_library; 175}; 176 177//! Function pointer type. 178typedef void (__stdcall* FunctionPtr) (void); 179 180/*--------------------------------------------------------------------*//*! 181 * \brief WGL context 182 * 183 * Context is currently made current to current thread in constructor 184 * and detached in destructor. Thus context should be created in and 185 * accessed from a single thread. 186 *//*--------------------------------------------------------------------*/ 187class Context 188{ 189public: 190 Context (const Core* core, HDC deviceCtx, glu::ContextType ctxType, int pixelFormat); 191 ~Context (void); 192 193 FunctionPtr getGLFunction (const char* name) const; 194 195 void swapBuffers (void) const; 196 197 HDC getDeviceContext (void) const { return m_deviceCtx; } 198 HGLRC getGLContext (void) const { return m_context; } 199 200private: 201 Context (const Context& other); 202 Context& operator= (const Context& other); 203 204 const Core* m_core; 205 HDC m_deviceCtx; 206 HGLRC m_context; 207}; 208 209//! Utility for selecting config. Returns -1 if no matching pixel format was found. 210int choosePixelFormat (const Core& wgl, HDC deviceCtx, const glu::RenderConfig& config); 211 212} // wgl 213} // tcu 214 215#endif // _TCUWGL_HPP 216