blob: 6f50632c4c7eb53ed4036cf194ddc2ab5af376fe [file] [log] [blame]
#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