15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GLES2_CONFORM_SUPPORT_ONLY)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gles2_conform_support/gtf/gtf_stubs.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/gles2_conform/GTF_ES/glsl/GTF/Source/eglNative.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LPCTSTR kWindowClassName = TEXT("ES2CONFORM");
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WPARAM w_param, LPARAM l_param) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LRESULT result = 0;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (msg) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_CLOSE:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::DestroyWindow(hwnd);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_DESTROY:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::PostQuitMessage(0);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WM_ERASEBKGND:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Return a non-zero value to indicate that the background has been
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // erased.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = 1;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = ::DefWindowProc(hwnd, msg, w_param, l_param);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GTFbool GTFNativeCreateDisplay(EGLNativeDisplayType *pNativeDisplay) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *pNativeDisplay = EGL_DEFAULT_DISPLAY;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GTFtrue;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GTFNativeDestroyDisplay(EGLNativeDisplayType nativeDisplay) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing to destroy since we are using EGL_DEFAULT_DISPLAY
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GTFbool GTFNativeCreateWindow(EGLNativeDisplayType nativeDisplay,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              EGLDisplay eglDisplay, EGLConfig eglConfig,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char* title, int width, int height,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              EGLNativeWindowType *pNativeWindow) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WNDCLASS wnd_class = {0};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HINSTANCE instance = GetModuleHandle(NULL);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_class.style = CS_OWNDC;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_class.lpfnWndProc = WindowProc;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_class.hInstance = instance;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_class.hbrBackground =
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_class.lpszClassName = kWindowClassName;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!RegisterClass(&wnd_class))
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GTFfalse;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD wnd_style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT wnd_rect;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_rect.left = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_rect.top = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_rect.right = width;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wnd_rect.bottom = height;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!AdjustWindowRect(&wnd_rect, wnd_style, FALSE))
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GTFfalse;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef UNICODE
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convert ascii string to wide string.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::wstring wnd_title(title, title + strlen(title));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string wnd_title = title;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UNICODE
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND hwnd = CreateWindow(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wnd_class.lpszClassName,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wnd_title.c_str(),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wnd_style,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wnd_rect.right - wnd_rect.left,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wnd_rect.bottom - wnd_rect.top,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (hwnd == NULL)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GTFfalse;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowWindow(hwnd, SW_SHOWNORMAL);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *pNativeWindow = hwnd;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GTFtrue;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GTFNativeDestroyWindow(EGLNativeDisplayType nativeDisplay,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            EGLNativeWindowType nativeWindow) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DestroyWindow(nativeWindow);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnregisterClass(kWindowClassName, GetModuleHandle(NULL));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EGLImageKHR GTFCreateEGLImage(int width, int height,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              GLenum format, GLenum type) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (EGLImageKHR)NULL;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GTFDestroyEGLImage(EGLImageKHR image) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // extern "C"
118