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