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