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