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"
333c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp"
343c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwEnums.hpp"
353c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos// Assume no call translation is needed
373c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(sizeof(eglw::EGLNativeDisplayType) == sizeof(HDC));
383c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(sizeof(eglw::EGLNativePixmapType) == sizeof(HBITMAP));
393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(sizeof(eglw::EGLNativeWindowType) == sizeof(HWND));
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
430e94e01a42e51498efc714634e2ad050ede9f3ecPyry Haulosnamespace win32
440e94e01a42e51498efc714634e2ad050ede9f3ecPyry Haulos{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace eglw;
493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DEFAULT_SURFACE_WIDTH		= 400,
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DEFAULT_SURFACE_HEIGHT		= 300,
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	WAIT_WINDOW_VISIBLE_MS		= 500	//!< Time to wait before issuing screenshot after changing window visibility (hack for DWM)
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeDisplay::Capability	DISPLAY_CAPABILITIES	= eglu::NativeDisplay::CAPABILITY_GET_DISPLAY_LEGACY;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativePixmap::Capability		BITMAP_CAPABILITIES		= eglu::NativePixmap::CAPABILITY_CREATE_SURFACE_LEGACY;
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeWindow::Capability		WINDOW_CAPABILITIES		= (eglu::NativeWindow::Capability)
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		   (eglu::NativeWindow::CAPABILITY_CREATE_SURFACE_LEGACY	|
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		    eglu::NativeWindow::CAPABILITY_GET_SURFACE_SIZE			|
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		    eglu::NativeWindow::CAPABILITY_GET_SCREEN_SIZE			|
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																			eglu::NativeWindow::CAPABILITY_READ_SCREEN_PIXELS		|
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		    eglu::NativeWindow::CAPABILITY_SET_SURFACE_SIZE			|
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																			eglu::NativeWindow::CAPABILITY_CHANGE_VISIBILITY);
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeDisplay : public eglu::NativeDisplay
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									NativeDisplay			(void);
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~NativeDisplay			(void) {}
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
733c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	virtual EGLNativeDisplayType	getLegacyNative			(void)			{ return m_deviceContext;	}
743c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const eglw::Library&			getLibrary				(void) const	{ return m_library;			}
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	HDC								getDeviceContext		(void)			{ return m_deviceContext;	}
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC								m_deviceContext;
803c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	eglw::DefaultLibrary			m_library;
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativePixmapFactory : public eglu::NativePixmapFactory
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NativePixmapFactory		(void);
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								~NativePixmapFactory	(void) {}
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativePixmap*	createPixmap			(eglu::NativeDisplay* nativeDisplay, int width, int height) const;
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativePixmap*	createPixmap			(eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height) const;
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativePixmap : public eglu::NativePixmap
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NativePixmap			(NativeDisplay* nativeDisplay, int width, int height, int bitDepth);
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~NativePixmap			(void);
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLNativePixmapType			getLegacyNative			(void) { return m_bitmap; }
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HBITMAP						m_bitmap;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindowFactory : public eglu::NativeWindowFactory
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NativeWindowFactory		(HINSTANCE instance);
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~NativeWindowFactory	(void) {}
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativeWindow*	createWindow			(eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const;
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const HINSTANCE				m_instance;
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindow : public eglu::NativeWindow
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									NativeWindow			(NativeDisplay* nativeDisplay, HINSTANCE instance, const eglu::WindowParams& params);
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~NativeWindow			(void);
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	EGLNativeWindowType				getLegacyNative			(void) { return m_window.getHandle(); }
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IVec2					getSurfaceSize			(void) const;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IVec2					getScreenSize			(void) const { return getSurfaceSize(); }
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					processEvents			(void);
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					setSurfaceSize			(IVec2 size);
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					setVisibility			(eglu::WindowParams::Visibility visibility);
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					readScreenPixels		(tcu::TextureLevel* dst) const;
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1320e94e01a42e51498efc714634e2ad050ede9f3ecPyry Haulos	win32::Window					m_window;
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	eglu::WindowParams::Visibility	m_curVisibility;
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint64						m_setVisibleTime;		//!< Time window was set visible.
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeDisplay
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1393c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeDisplay::NativeDisplay (void)
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeDisplay	(DISPLAY_CAPABILITIES)
1413c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, m_deviceContext		((HDC)EGL_DEFAULT_DISPLAY)
1423c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, m_library				("libEGL.dll")
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativePixmap
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativePixmap::NativePixmap (NativeDisplay* nativeDisplay, int width, int height, int bitDepth)
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativePixmap	(BITMAP_CAPABILITIES)
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_bitmap				(DE_NULL)
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const HDC		deviceCtx	= nativeDisplay->getDeviceContext();
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BITMAPINFO		bitmapInfo;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	memset(&bitmapInfo, 0, sizeof(bitmapInfo));
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (bitDepth != 24 && bitDepth != 32)
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw NotSupportedError("Unsupported pixmap bit depth", DE_NULL, __FILE__, __LINE__);
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biSize				= sizeof(bitmapInfo);
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biWidth			= width;
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biHeight			= height;
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biPlanes			= 1;
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biBitCount			= bitDepth;
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biCompression		= BI_RGB;
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biSizeImage		= 0;
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biXPelsPerMeter	= 1;
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biYPelsPerMeter	= 1;
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biClrUsed			= 0;
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitmapInfo.bmiHeader.biClrImportant		= 0;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void* bitmapPtr = DE_NULL;
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_bitmap = CreateDIBSection(deviceCtx, &bitmapInfo, DIB_RGB_COLORS, &bitmapPtr, NULL, 0);
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_bitmap)
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw ResourceError("Failed to create bitmap", DE_NULL, __FILE__, __LINE__);
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativePixmap::~NativePixmap (void)
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DeleteObject(m_bitmap);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativePixmapFactory
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativePixmapFactory::NativePixmapFactory (void)
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativePixmapFactory	("bitmap", "Win32 Bitmap", BITMAP_CAPABILITIES)
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativePixmap* NativePixmapFactory::createPixmap (eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, int width, int height) const
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1933c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const Library&	egl			= nativeDisplay->getLibrary();
1943c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	int				redBits		= 0;
1953c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	int				greenBits	= 0;
1963c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	int				blueBits	= 0;
1973c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	int				alphaBits	= 0;
1983c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	int				bitSum		= 0;
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(display != EGL_NO_DISPLAY);
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2023c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	egl.getConfigAttrib(display, config, EGL_RED_SIZE,		&redBits);
2033c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	egl.getConfigAttrib(display, config, EGL_GREEN_SIZE,	&greenBits);
2043c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	egl.getConfigAttrib(display, config, EGL_BLUE_SIZE,		&blueBits);
2053c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	egl.getConfigAttrib(display, config, EGL_ALPHA_SIZE,	&alphaBits);
2063c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	EGLU_CHECK_MSG(egl, "eglGetConfigAttrib()");
2073c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bitSum = redBits+greenBits+blueBits+alphaBits;
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativePixmap(dynamic_cast<NativeDisplay*>(nativeDisplay), width, height, bitSum);
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativePixmap* NativePixmapFactory::createPixmap (eglu::NativeDisplay* nativeDisplay, int width, int height) const
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int defaultDepth = 32;
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativePixmap(dynamic_cast<NativeDisplay*>(nativeDisplay), width, height, defaultDepth);
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindowFactory
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindowFactory::NativeWindowFactory (HINSTANCE instance)
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeWindowFactory	("window", "Win32 Window", WINDOW_CAPABILITIES)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_instance				(instance)
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeWindow* NativeWindowFactory::createWindow (eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativeWindow(dynamic_cast<NativeDisplay*>(nativeDisplay), m_instance, params);
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindow
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindow::NativeWindow (NativeDisplay* nativeDisplay, HINSTANCE instance, const eglu::WindowParams& params)
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeWindow	(WINDOW_CAPABILITIES)
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_window				(instance,
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 params.width	== eglu::WindowParams::SIZE_DONT_CARE ? DEFAULT_SURFACE_WIDTH	: params.width,
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 params.height	== eglu::WindowParams::SIZE_DONT_CARE ? DEFAULT_SURFACE_HEIGHT	: params.height)
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_curVisibility		(eglu::WindowParams::VISIBILITY_HIDDEN)
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_setVisibleTime		(0)
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (params.visibility != eglu::WindowParams::VISIBILITY_DONT_CARE)
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		setVisibility(params.visibility);
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::setVisibility (eglu::WindowParams::Visibility visibility)
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (visibility)
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case eglu::WindowParams::VISIBILITY_HIDDEN:
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_window.setVisible(false);
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_curVisibility		= visibility;
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case eglu::WindowParams::VISIBILITY_VISIBLE:
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case eglu::WindowParams::VISIBILITY_FULLSCREEN:
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \todo [2014-03-12 pyry] Implement FULLSCREEN, or at least SW_MAXIMIZE.
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_window.setVisible(true);
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_curVisibility		= eglu::WindowParams::VISIBILITY_VISIBLE;
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_setVisibleTime	= deGetMicroseconds();
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindow::~NativeWindow (void)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2723c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIVec2 NativeWindow::getSurfaceSize (void) const
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_window.getSize();
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::processEvents (void)
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_window.processEvents();
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::setSurfaceSize (IVec2 size)
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_window.setSize(size.x(), size.y());
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::readScreenPixels (tcu::TextureLevel* dst) const
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC			windowDC	= DE_NULL;
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC			screenDC	= DE_NULL;
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC			tmpDC		= DE_NULL;
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HBITMAP		tmpBitmap	= DE_NULL;
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RECT		rect;
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK_INTERNAL(m_curVisibility != eglu::WindowParams::VISIBILITY_HIDDEN);
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Hack for DWM: There is no way to wait for DWM animations to finish, so we just have to wait
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// for a while before issuing screenshot if window was just made visible.
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deInt64 timeSinceVisibleUs = (deInt64)(deGetMicroseconds()-m_setVisibleTime);
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (timeSinceVisibleUs < (deInt64)WAIT_WINDOW_VISIBLE_MS*1000)
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSleep(WAIT_WINDOW_VISIBLE_MS - (deUint32)(timeSinceVisibleUs/1000));
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(GetClientRect(m_window.getHandle(), &rect));
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int			width		= rect.right - rect.left;
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int			height		= rect.bottom - rect.top;
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BITMAPINFOHEADER	bitmapInfo;
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deMemset(&bitmapInfo, 0, sizeof(bitmapInfo));
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		screenDC = GetDC(DE_NULL);
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(screenDC);
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		windowDC = GetDC(m_window.getHandle());
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(windowDC);
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpDC = CreateCompatibleDC(screenDC);
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(tmpDC != DE_NULL);
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		MapWindowPoints(m_window.getHandle(), DE_NULL, (LPPOINT)&rect, 2);
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpBitmap = CreateCompatibleBitmap(screenDC, width, height);
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(tmpBitmap != DE_NULL);
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(SelectObject(tmpDC, tmpBitmap) != DE_NULL);
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(BitBlt(tmpDC, 0, 0, width, height, screenDC, rect.left, rect.top, SRCCOPY));
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biSize			= sizeof(BITMAPINFOHEADER);
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biWidth			= width;
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biHeight			= -height;
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biPlanes			= 1;
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biBitCount		= 32;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biCompression	= BI_RGB;
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biSizeImage		= 0;
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biXPelsPerMeter	= 0;
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biYPelsPerMeter	= 0;
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biClrUsed		= 0;
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bitmapInfo.biClrImportant	= 0;
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst->setStorage(TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_INT8), width, height);
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK(GetDIBits(screenDC, tmpBitmap, 0, height, dst->getAccess().getDataPtr(), (BITMAPINFO*)&bitmapInfo, DIB_RGB_COLORS));
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DeleteObject(tmpBitmap);
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpBitmap = DE_NULL;
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ReleaseDC(DE_NULL, screenDC);
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		screenDC = DE_NULL;
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ReleaseDC(m_window.getHandle(), windowDC);
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		windowDC = DE_NULL;
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DeleteDC(tmpDC);
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tmpDC = DE_NULL;
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (...)
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (screenDC)
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ReleaseDC(DE_NULL, screenDC);
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (windowDC)
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ReleaseDC(m_window.getHandle(), windowDC);
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (tmpBitmap)
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteObject(tmpBitmap);
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (tmpDC)
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DeleteDC(tmpDC);
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw;
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3830e94e01a42e51498efc714634e2ad050ede9f3ecPyry HaulosEGLNativeDisplayFactory::EGLNativeDisplayFactory (HINSTANCE instance)
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeDisplayFactory	("win32", "Native Win32 Display", DISPLAY_CAPABILITIES)
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_instance					(instance)
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_nativeWindowRegistry.registerFactory(new NativeWindowFactory(m_instance));
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_nativePixmapRegistry.registerFactory(new NativePixmapFactory());
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3910e94e01a42e51498efc714634e2ad050ede9f3ecPyry HaulosEGLNativeDisplayFactory::~EGLNativeDisplayFactory (void)
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3950e94e01a42e51498efc714634e2ad050ede9f3ecPyry Hauloseglu::NativeDisplay* EGLNativeDisplayFactory::createDisplay (const EGLAttrib* attribList) const
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(attribList);
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativeDisplay();
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4010e94e01a42e51498efc714634e2ad050ede9f3ecPyry Haulos} // win32
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
403