blob: 712e1b18bdb7c352eed92a2137e3dca3f524d6f0 [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
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<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);
} // namespace wgl
} // namespace tcu
#endif // _TCUWGL_HPP