Home | History | Annotate | Download | only in win32
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program Tester Core
      3  * ----------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Win32 GLES3 wrapper platform.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "tcuWin32GLES3Platform.hpp"
     25 #include "gluRenderConfig.hpp"
     26 #include "gluRenderContext.hpp"
     27 #include "tcuRenderTarget.hpp"
     28 #include "gl3Context.h"
     29 #include "glwInitES30Direct.hpp"
     30 
     31 struct gl3PlatformContext_s
     32 {
     33 	tcu::wgl::Context*	context;
     34 
     35 	gl3PlatformContext_s (void)
     36 		: context(DE_NULL)
     37 	{
     38 	}
     39 };
     40 
     41 gl3FunctionPtr gl3PlatformContext_getProcAddress (gl3PlatformContext* platformCtx, const char* procName)
     42 {
     43 	DE_ASSERT(platformCtx && platformCtx->context);
     44 	return platformCtx->context->getGLFunction(procName);
     45 }
     46 
     47 namespace tcu
     48 {
     49 
     50 enum
     51 {
     52 	DEFAULT_WINDOW_WIDTH	= 400,
     53 	DEFAULT_WINDOW_HEIGHT	= 300
     54 };
     55 
     56 // Win32GLES3Context
     57 
     58 class Win32GLES3Context : public glu::RenderContext
     59 {
     60 public:
     61 									Win32GLES3Context			(const wgl::Core& wgl, HINSTANCE instance, const glu::RenderConfig& config);
     62 									~Win32GLES3Context			(void);
     63 
     64 	glu::ContextType				getType						(void) const	{ return glu::CONTEXTTYPE_ES3;	}
     65 	const RenderTarget&				getRenderTarget				(void) const	{ return m_renderTarget;		}
     66 	void							postIterate					(void);
     67 	const glw::Functions&			getFunctions				(void) const	{ return m_functions;			}
     68 
     69 private:
     70 									Win32GLES3Context			(const Win32GLES3Context& other);
     71 	Win32GLES3Context&				operator=					(const Win32GLES3Context& other);
     72 
     73 	RenderTarget					m_renderTarget;
     74 	Win32Window						m_window;
     75 
     76 	gl3PlatformContext				m_platformCtx;
     77 	gl3Context*						m_context;
     78 
     79 	glw::Functions					m_functions;
     80 };
     81 
     82 typedef const char* (GL_APIENTRY* glGetStringHackFunc) (GLenum str);
     83 
     84 Win32GLES3Context::Win32GLES3Context (const wgl::Core& wgl, HINSTANCE instance, const glu::RenderConfig& config)
     85 	: m_renderTarget(config.width	!= glu::RenderConfig::DONT_CARE ? config.width	: DEFAULT_WINDOW_WIDTH,
     86 					 config.height	!= glu::RenderConfig::DONT_CARE ? config.height	: DEFAULT_WINDOW_HEIGHT,
     87 					 PixelFormat(8, 8, 8, 8), 24, 8, 0)
     88 	, m_window		(instance, m_renderTarget.getWidth(), m_renderTarget.getHeight())
     89 	, m_context		(DE_NULL)
     90 {
     91 	const HDC		deviceCtx		= m_window.getDeviceContext();
     92 	const int		pixelFormat		= wgl::choosePixelFormat(wgl, deviceCtx, config);
     93 
     94 	if (pixelFormat < 0)
     95 		throw NotSupportedError("No compatible WGL pixel format found");
     96 
     97 	m_platformCtx.context = new wgl::Context(&wgl, m_window.getDeviceContext(), wgl::PROFILE_COMPATIBILITY, 3, 3, pixelFormat);
     98 
     99 	try
    100 	{
    101 		m_context = gl3Context_create(&m_platformCtx);
    102 		if (!m_context)
    103 			throw ResourceError("Failed to create GLES3 wrapper context");
    104 
    105 		gl3Context_setCurrentContext(m_context);
    106 		glw::initES30Direct(&m_functions);
    107 
    108 		m_window.setVisible(config.windowVisibility != glu::RenderConfig::VISIBILITY_HIDDEN);
    109 
    110 		{
    111 			const wgl::PixelFormatInfo	info	= wgl.getPixelFormatInfo(deviceCtx, pixelFormat);
    112 			const IVec2					size	= m_window.getSize();
    113 
    114 			m_renderTarget = tcu::RenderTarget(size.x(), size.y(),
    115 											   tcu::PixelFormat(info.redBits, info.greenBits, info.blueBits, info.alphaBits),
    116 											   info.depthBits, info.stencilBits,
    117 											   info.sampleBuffers ? info.samples : 0);
    118 		}
    119 	}
    120 	catch (...)
    121 	{
    122 		if (m_context)
    123 			gl3Context_destroy(m_context);
    124 		delete m_platformCtx.context;
    125 		throw;
    126 	}
    127 }
    128 
    129 Win32GLES3Context::~Win32GLES3Context (void)
    130 {
    131 	if (m_context)
    132 		gl3Context_destroy(m_context);
    133 
    134 	delete m_platformCtx.context;
    135 }
    136 
    137 void Win32GLES3Context::postIterate (void)
    138 {
    139 	m_platformCtx.context->swapBuffers();
    140 }
    141 
    142 // Win32GLES3ContextFactory
    143 
    144 class Win32GLES3ContextFactory : public glu::ContextFactory
    145 {
    146 public:
    147 								Win32GLES3ContextFactory	(HINSTANCE instance);
    148 								~Win32GLES3ContextFactory	(void);
    149 
    150 	virtual glu::RenderContext*	createContext				(const glu::RenderConfig& config, const tcu::CommandLine& cmdLine) const;
    151 
    152 private:
    153 	const HINSTANCE				m_instance;
    154 	wgl::Core					m_wglCore;
    155 };
    156 
    157 Win32GLES3ContextFactory::Win32GLES3ContextFactory (HINSTANCE instance)
    158 	: glu::ContextFactory	("gles3_wrapper",	"GLES3 Wrapper Context")
    159 	, m_instance			(instance)
    160 	, m_wglCore				(instance)
    161 {
    162 }
    163 
    164 Win32GLES3ContextFactory::~Win32GLES3ContextFactory (void)
    165 {
    166 }
    167 
    168 glu::RenderContext* Win32GLES3ContextFactory::createContext (const glu::RenderConfig& config, const tcu::CommandLine&) const
    169 {
    170 	if (config.type == glu::CONTEXTTYPE_ES3)
    171 		return new Win32GLES3Context(m_wglCore, m_instance, config);
    172 	else
    173 		throw NotSupportedError("Unsupported rendering context type");
    174 }
    175 
    176 // Win32GLES3Platform
    177 
    178 Win32GLES3Platform::Win32GLES3Platform (void)
    179 {
    180 	const HINSTANCE instance = GetModuleHandle(NULL);
    181 
    182 	// Set priority to lower.
    183 	SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);
    184 
    185 	m_glContextFactoryRegistry.registerFactory(new Win32GLES3ContextFactory(instance));
    186 }
    187 
    188 Win32GLES3Platform::~Win32GLES3Platform (void)
    189 {
    190 }
    191 
    192 bool Win32GLES3Platform::processEvents (void)
    193 {
    194 	MSG msg;
    195 	while (PeekMessage(&msg, NULL, 0, 0, TRUE))
    196 	{
    197 		DispatchMessage(&msg);
    198 		if (msg.message == WM_QUIT)
    199 			return false;
    200 	}
    201 	return true;
    202 }
    203 
    204 } // tcu
    205 
    206 // Platform factory
    207 tcu::Platform* createPlatform (void)
    208 {
    209 	return new tcu::Win32GLES3Platform();
    210 }
    211