13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Win32 EGL native display factory
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuWin32EGLNativeDisplayFactory.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluDefs.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuWin32Window.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuWin32API.h"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTexture.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deThread.h"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deClock.h"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DEFAULT_SURFACE_WIDTH		= 400,
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DEFAULT_SURFACE_HEIGHT		= 300,
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	WAIT_WINDOW_VISIBLE_MS		= 500	//!< Time to wait before issuing screenshot after changing window visibility (hack for DWM)
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeDisplay::Capability	DISPLAY_CAPABILITIES	= eglu::NativeDisplay::CAPABILITY_GET_DISPLAY_LEGACY;
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativePixmap::Capability		BITMAP_CAPABILITIES		= eglu::NativePixmap::CAPABILITY_CREATE_SURFACE_LEGACY;
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeWindow::Capability		WINDOW_CAPABILITIES		= (eglu::NativeWindow::Capability)
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		   (eglu::NativeWindow::CAPABILITY_CREATE_SURFACE_LEGACY	|
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		    eglu::NativeWindow::CAPABILITY_GET_SURFACE_SIZE			|
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		    eglu::NativeWindow::CAPABILITY_GET_SCREEN_SIZE			|
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																			eglu::NativeWindow::CAPABILITY_READ_SCREEN_PIXELS		|
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		    eglu::NativeWindow::CAPABILITY_SET_SURFACE_SIZE			|
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																			eglu::NativeWindow::CAPABILITY_CHANGE_VISIBILITY);
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeDisplay : public eglu::NativeDisplay
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									NativeDisplay			(void);
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~NativeDisplay			(void) {}
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual EGLNativeDisplayType	getLegacyNative			(void) { return m_deviceContext; }
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC								getDeviceContext		(void) { return m_deviceContext; }
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC								m_deviceContext;
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativePixmapFactory : public eglu::NativePixmapFactory
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NativePixmapFactory		(void);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								~NativePixmapFactory	(void) {}
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativePixmap*	createPixmap			(eglu::NativeDisplay* nativeDisplay, int width, int height) const;
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativePixmap*	createPixmap			(eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height) const;
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativePixmap : public eglu::NativePixmap
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NativePixmap			(NativeDisplay* nativeDisplay, int width, int height, int bitDepth);
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~NativePixmap			(void);
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLNativePixmapType			getLegacyNative			(void) { return m_bitmap; }
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HBITMAP						m_bitmap;
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindowFactory : public eglu::NativeWindowFactory
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NativeWindowFactory		(HINSTANCE instance);
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~NativeWindowFactory	(void) {}
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativeWindow*	createWindow			(eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const;
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const HINSTANCE				m_instance;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindow : public eglu::NativeWindow
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									NativeWindow			(NativeDisplay* nativeDisplay, HINSTANCE instance, const eglu::WindowParams& params);
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~NativeWindow			(void);
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLNativeWindowType				getLegacyNative			(void) { return m_window.getHandle(); }
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IVec2					getSurfaceSize			(void) const;
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IVec2					getScreenSize			(void) const { return getSurfaceSize(); }
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					processEvents			(void);
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					setSurfaceSize			(IVec2 size);
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					setVisibility			(eglu::WindowParams::Visibility visibility);
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					readScreenPixels		(tcu::TextureLevel* dst) const;
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Win32Window						m_window;
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	eglu::WindowParams::Visibility	m_curVisibility;
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64						m_setVisibleTime;		//!< Time window was set visible.
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeDisplay
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeDisplay::NativeDisplay (void)
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeDisplay	(DISPLAY_CAPABILITIES)
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_deviceContext		(EGL_DEFAULT_DISPLAY)
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativePixmap
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativePixmap::NativePixmap (NativeDisplay* nativeDisplay, int width, int height, int bitDepth)
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativePixmap	(BITMAP_CAPABILITIES)
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_bitmap				(DE_NULL)
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const HDC		deviceCtx	= nativeDisplay->getDeviceContext();
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BITMAPINFO		bitmapInfo;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	memset(&bitmapInfo, 0, sizeof(bitmapInfo));
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (bitDepth != 24 && bitDepth != 32)
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw NotSupportedError("Unsupported pixmap bit depth", DE_NULL, __FILE__, __LINE__);
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biSize				= sizeof(bitmapInfo);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biWidth			= width;
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biHeight			= height;
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biPlanes			= 1;
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biBitCount			= bitDepth;
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biCompression		= BI_RGB;
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biSizeImage		= 0;
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biXPelsPerMeter	= 1;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biYPelsPerMeter	= 1;
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biClrUsed			= 0;
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biClrImportant		= 0;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void* bitmapPtr = DE_NULL;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_bitmap = CreateDIBSection(deviceCtx, &bitmapInfo, DIB_RGB_COLORS, &bitmapPtr, NULL, 0);
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_bitmap)
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw ResourceError("Failed to create bitmap", DE_NULL, __FILE__, __LINE__);
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativePixmap::~NativePixmap (void)
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DeleteObject(m_bitmap);
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativePixmapFactory
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1723c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativePixmapFactory::NativePixmapFactory (void)
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativePixmapFactory	("bitmap", "Win32 Bitmap", BITMAP_CAPABILITIES)
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativePixmap* NativePixmapFactory::createPixmap (eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height) const
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int	redBits		= 0;
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int	greenBits	= 0;
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int	blueBits	= 0;
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int	alphaBits	= 0;
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int	bitSum		= 0;
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(display != EGL_NO_DISPLAY);
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLU_CHECK_CALL(eglGetConfigAttrib(display, config, EGL_RED_SIZE,	&redBits));
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLU_CHECK_CALL(eglGetConfigAttrib(display, config, EGL_GREEN_SIZE,	&greenBits));
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLU_CHECK_CALL(eglGetConfigAttrib(display, config, EGL_BLUE_SIZE,	&blueBits));
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLU_CHECK_CALL(eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE,	&alphaBits));
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitSum = redBits+greenBits+blueBits+alphaBits;
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativePixmap(dynamic_cast<NativeDisplay*>(nativeDisplay), width, height, bitSum);
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativePixmap* NativePixmapFactory::createPixmap (eglu::NativeDisplay* nativeDisplay, int width, int height) const
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int defaultDepth = 32;
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativePixmap(dynamic_cast<NativeDisplay*>(nativeDisplay), width, height, defaultDepth);
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindowFactory
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindowFactory::NativeWindowFactory (HINSTANCE instance)
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeWindowFactory	("window", "Win32 Window", WINDOW_CAPABILITIES)
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_instance				(instance)
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeWindow* NativeWindowFactory::createWindow (eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativeWindow(dynamic_cast<NativeDisplay*>(nativeDisplay), m_instance, params);
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindow
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindow::NativeWindow (NativeDisplay* nativeDisplay, HINSTANCE instance, const eglu::WindowParams& params)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeWindow	(WINDOW_CAPABILITIES)
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_window				(instance,
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 params.width	== eglu::WindowParams::SIZE_DONT_CARE ? DEFAULT_SURFACE_WIDTH	: params.width,
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 params.height	== eglu::WindowParams::SIZE_DONT_CARE ? DEFAULT_SURFACE_HEIGHT	: params.height)
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_curVisibility		(eglu::WindowParams::VISIBILITY_HIDDEN)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_setVisibleTime		(0)
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (params.visibility != eglu::WindowParams::VISIBILITY_DONT_CARE)
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		setVisibility(params.visibility);
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::setVisibility (eglu::WindowParams::Visibility visibility)
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (visibility)
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case eglu::WindowParams::VISIBILITY_HIDDEN:
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_window.setVisible(false);
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_curVisibility		= visibility;
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case eglu::WindowParams::VISIBILITY_VISIBLE:
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case eglu::WindowParams::VISIBILITY_FULLSCREEN:
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \todo [2014-03-12 pyry] Implement FULLSCREEN, or at least SW_MAXIMIZE.
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_window.setVisible(true);
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_curVisibility		= eglu::WindowParams::VISIBILITY_VISIBLE;
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_setVisibleTime	= deGetMicroseconds();
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindow::~NativeWindow (void)
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2553c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIVec2 NativeWindow::getSurfaceSize (void) const
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_window.getSize();
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::processEvents (void)
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_window.processEvents();
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::setSurfaceSize (IVec2 size)
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_window.setSize(size.x(), size.y());
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::readScreenPixels (tcu::TextureLevel* dst) const
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC			windowDC	= DE_NULL;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC			screenDC	= DE_NULL;
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC			tmpDC		= DE_NULL;
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HBITMAP		tmpBitmap	= DE_NULL;
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RECT		rect;
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK_INTERNAL(m_curVisibility != eglu::WindowParams::VISIBILITY_HIDDEN);
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Hack for DWM: There is no way to wait for DWM animations to finish, so we just have to wait
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// for a while before issuing screenshot if window was just made visible.
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deInt64 timeSinceVisibleUs = (deInt64)(deGetMicroseconds()-m_setVisibleTime);
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (timeSinceVisibleUs < (deInt64)WAIT_WINDOW_VISIBLE_MS*1000)
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(WAIT_WINDOW_VISIBLE_MS - (deUint32)(timeSinceVisibleUs/1000));
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(GetClientRect(m_window.getHandle(), &rect));
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int			width		= rect.right - rect.left;
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int			height		= rect.bottom - rect.top;
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BITMAPINFOHEADER	bitmapInfo;
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deMemset(&bitmapInfo, 0, sizeof(bitmapInfo));
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		screenDC = GetDC(DE_NULL);
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(screenDC);
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		windowDC = GetDC(m_window.getHandle());
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(windowDC);
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpDC = CreateCompatibleDC(screenDC);
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(tmpDC != DE_NULL);
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		MapWindowPoints(m_window.getHandle(), DE_NULL, (LPPOINT)&rect, 2);
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpBitmap = CreateCompatibleBitmap(screenDC, width, height);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(tmpBitmap != DE_NULL);
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(SelectObject(tmpDC, tmpBitmap) != DE_NULL);
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(BitBlt(tmpDC, 0, 0, width, height, screenDC, rect.left, rect.top, SRCCOPY));
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biSize			= sizeof(BITMAPINFOHEADER);
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biWidth			= width;
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biHeight			= -height;
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biPlanes			= 1;
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biBitCount		= 32;
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biCompression	= BI_RGB;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biSizeImage		= 0;
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biXPelsPerMeter	= 0;
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biYPelsPerMeter	= 0;
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biClrUsed		= 0;
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biClrImportant	= 0;
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst->setStorage(TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_INT8), width, height);
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(GetDIBits(screenDC, tmpBitmap, 0, height, dst->getAccess().getDataPtr(), (BITMAPINFO*)&bitmapInfo, DIB_RGB_COLORS));
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DeleteObject(tmpBitmap);
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpBitmap = DE_NULL;
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ReleaseDC(DE_NULL, screenDC);
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		screenDC = DE_NULL;
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ReleaseDC(m_window.getHandle(), windowDC);
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		windowDC = DE_NULL;
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DeleteDC(tmpDC);
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpDC = DE_NULL;
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (...)
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (screenDC)
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ReleaseDC(DE_NULL, screenDC);
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (windowDC)
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ReleaseDC(m_window.getHandle(), windowDC);
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (tmpBitmap)
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteObject(tmpBitmap);
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (tmpDC)
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteDC(tmpDC);
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw;
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryWin32EGLNativeDisplayFactory::Win32EGLNativeDisplayFactory (HINSTANCE instance)
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeDisplayFactory	("win32", "Native Win32 Display", DISPLAY_CAPABILITIES)
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_instance					(instance)
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_nativeWindowRegistry.registerFactory(new NativeWindowFactory(m_instance));
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_nativePixmapRegistry.registerFactory(new NativePixmapFactory());
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3743c827367444ee418f129b2c238299f49d3264554Jarkko PoyryWin32EGLNativeDisplayFactory::~Win32EGLNativeDisplayFactory (void)
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeDisplay* Win32EGLNativeDisplayFactory::createDisplay (const EGLAttrib* attribList) const
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(attribList);
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativeDisplay();
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
385