summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authoralokp@chromium.org <alokp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-03 17:02:27 +0000
committeralokp@chromium.org <alokp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-03 17:02:27 +0000
commit84352455e708fc771809f34476d4db9ca79e4bc9 (patch)
treeb47b875ea7ade05db1d924ddc48f1c8f3c6f97ea /gpu
parent882f0ccbf250af3ff242da94706f26bb2f09c5b0 (diff)
downloadchromium_src-84352455e708fc771809f34476d4db9ca79e4bc9.zip
chromium_src-84352455e708fc771809f34476d4db9ca79e4bc9.tar.gz
chromium_src-84352455e708fc771809f34476d4db9ca79e4bc9.tar.bz2
Changes necessary to compile gpu demos on linux. It is not functional yet just compiling.
BUG=26099 Review URL: http://codereview.chromium.org/552240 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37977 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/demos/demos.gyp244
-rw-r--r--gpu/demos/framework/platform.h25
-rw-r--r--gpu/demos/framework/window.cc143
-rw-r--r--gpu/demos/framework/window.h16
-rw-r--r--gpu/demos/framework/window_linux.cc24
-rw-r--r--gpu/demos/framework/window_mac.mm24
-rw-r--r--gpu/demos/framework/window_win.cc100
7 files changed, 329 insertions, 247 deletions
diff --git a/gpu/demos/demos.gyp b/gpu/demos/demos.gyp
index 10d3cba..d69ae75c 100644
--- a/gpu/demos/demos.gyp
+++ b/gpu/demos/demos.gyp
@@ -5,6 +5,18 @@
{
'variables': {
'chromium_code': 1,
+ 'conditions': [
+ # Pepper demos that are compiled as shared libraries need to be compiled
+ # with -fPIC flag. All static libraries that these demos depend on must
+ # also be compiled with -fPIC flag. Setting GYP_DEFINES="linux_fpic=1"
+ # compiles everything with -fPIC. Disable pepper demos on linux/x64
+ # unless linux_fpic is 1.
+ ['OS=="linux" and (target_arch=="x64" or target_arch=="arm") and linux_fpic!=1', {
+ 'enable_pepper_demos%': 0,
+ }, {
+ 'enable_pepper_demos%': 1,
+ }],
+ ],
},
'includes': [
'../../build/common.gypi',
@@ -30,16 +42,18 @@
'../gpu.gyp:command_buffer_client',
'../gpu.gyp:command_buffer_service',
],
- 'all_dependent_settings': {
- 'sources': [
- 'framework/main_exe.cc',
- ],
- },
'sources': [
- 'framework/platform.h',
'framework/window.cc',
'framework/window.h',
],
+ 'conditions': [
+ ['OS=="linux"', {'sources': ['framework/window_linux.cc']}],
+ ['OS=="mac"', {'sources': ['framework/window_mac.mm']}],
+ ['OS=="win"', {'sources': ['framework/window_win.cc']}],
+ ],
+ 'direct_dependent_settings': {
+ 'sources': ['framework/main_exe.cc'],
+ },
},
{
'target_name': 'gpu_demo_framework_pepper',
@@ -48,27 +62,37 @@
'gpu_demo_framework',
'../gpu.gyp:pgl',
],
- 'all_dependent_settings': {
- 'sources': [
- 'framework/main_pepper.cc',
- 'framework/plugin.def',
- 'framework/plugin.rc',
- ],
- 'run_as': {
- 'action': [
- '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)chrome<(EXECUTABLE_SUFFIX)',
- '--no-sandbox',
- '--internal-pepper',
- '--enable-gpu-plugin',
- '--load-plugin=$(TargetPath)',
- 'file://$(ProjectDir)pepper_gpu_demo.html',
- ],
- },
- },
'sources': [
'framework/plugin.cc',
'framework/plugin.h',
],
+ 'direct_dependent_settings': {
+ 'sources': [
+ 'framework/main_pepper.cc',
+ ],
+ 'conditions': [
+ ['OS=="win"', {
+ 'sources': [
+ 'framework/plugin.def',
+ 'framework/plugin.rc',
+ ],
+ 'run_as': {
+ 'action': [
+ '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)chrome<(EXECUTABLE_SUFFIX)',
+ '--no-sandbox',
+ '--internal-pepper',
+ '--enable-gpu-plugin',
+ '--load-plugin=$(TargetPath)',
+ 'file://$(ProjectDir)pepper_gpu_demo.html',
+ ],
+ },
+ }],
+ ['OS=="linux"', {
+ # -gstabs, used in the official builds, causes an ICE. Remove it.
+ 'cflags!': ['-gstabs'],
+ }],
+ ],
+ },
},
{
'target_name': 'hello_triangle_exe',
@@ -83,18 +107,6 @@
],
},
{
- 'target_name': 'hello_triangle_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:hello_triangle',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/hello_triangle.cc',
- ],
- },
- {
'target_name': 'mip_map_2d_exe',
'type': 'executable',
'dependencies': [
@@ -107,18 +119,6 @@
],
},
{
- 'target_name': 'mip_map_2d_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:mip_map_2d',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/mip_map_2d.cc',
- ],
- },
- {
'target_name': 'simple_texture_2d_exe',
'type': 'executable',
'dependencies': [
@@ -131,18 +131,6 @@
],
},
{
- 'target_name': 'simple_texture_2d_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:simple_texture_2d',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/simple_texture_2d.cc',
- ],
- },
- {
'target_name': 'simple_texture_cubemap_exe',
'type': 'executable',
'dependencies': [
@@ -155,18 +143,6 @@
],
},
{
- 'target_name': 'simple_texture_cubemap_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:simple_texture_cubemap',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/simple_texture_cubemap.cc',
- ],
- },
- {
'target_name': 'simple_vertex_shader_exe',
'type': 'executable',
'dependencies': [
@@ -179,18 +155,6 @@
],
},
{
- 'target_name': 'simple_vertex_shader_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:simple_vertex_shader',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/simple_vertex_shader.cc',
- ],
- },
- {
'target_name': 'stencil_test_exe',
'type': 'executable',
'dependencies': [
@@ -203,18 +167,6 @@
],
},
{
- 'target_name': 'stencil_test_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:stencil_test',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/stencil_test.cc',
- ],
- },
- {
'target_name': 'texture_wrap_exe',
'type': 'executable',
'dependencies': [
@@ -226,19 +178,97 @@
'gles2_book/texture_wrap.cc',
],
},
- {
- 'target_name': 'texture_wrap_pepper',
- 'type': 'shared_library',
- 'dependencies': [
- 'gpu_demo_framework_pepper',
- '../../third_party/gles2_book/gles2_book.gyp:texture_wrap',
- ],
- 'sources': [
- 'gles2_book/example.h',
- 'gles2_book/texture_wrap.cc',
+ ],
+ 'conditions': [
+ ['enable_pepper_demos==1', {
+ 'targets': [
+ {
+ 'target_name': 'hello_triangle_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:hello_triangle',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/hello_triangle.cc',
+ ],
+ },
+ {
+ 'target_name': 'mip_map_2d_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:mip_map_2d',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/mip_map_2d.cc',
+ ],
+ },
+ {
+ 'target_name': 'simple_texture_2d_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:simple_texture_2d',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/simple_texture_2d.cc',
+ ],
+ },
+ {
+ 'target_name': 'simple_texture_cubemap_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:simple_texture_cubemap',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/simple_texture_cubemap.cc',
+ ],
+ },
+ {
+ 'target_name': 'simple_vertex_shader_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:simple_vertex_shader',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/simple_vertex_shader.cc',
+ ],
+ },
+ {
+ 'target_name': 'stencil_test_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:stencil_test',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/stencil_test.cc',
+ ],
+ },
+ {
+ 'target_name': 'texture_wrap_pepper',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'gpu_demo_framework_pepper',
+ '../../third_party/gles2_book/gles2_book.gyp:texture_wrap',
+ ],
+ 'sources': [
+ 'gles2_book/example.h',
+ 'gles2_book/texture_wrap.cc',
+ ],
+ },
],
- },
- ]
+ }],
+ ],
}
# Local Variables:
diff --git a/gpu/demos/framework/platform.h b/gpu/demos/framework/platform.h
deleted file mode 100644
index cd6c003..0000000
--- a/gpu/demos/framework/platform.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Platform-specific types and definitions for native widget handles.
-
-#ifndef GPU_DEMOS_FRAMEWORK_PLATFORM_H_
-#define GPU_DEMOS_FRAMEWORK_PLATFORM_H_
-
-#ifdef _WINDOWS
-#include <windows.h>
-#endif // _WINDOWS
-
-#include "build/build_config.h"
-
-namespace gpu {
-namespace demos {
-
-#if defined(OS_WIN)
-typedef HWND NativeWindowHandle;
-#endif // defined(OS_WIN)
-
-} // namespace demos
-} // namespace gpu
-#endif // GPU_DEMOS_FRAMEWORK_PLATFORM_H_
diff --git a/gpu/demos/framework/window.cc b/gpu/demos/framework/window.cc
index 41538d5..d258792 100644
--- a/gpu/demos/framework/window.cc
+++ b/gpu/demos/framework/window.cc
@@ -8,6 +8,7 @@
#include "gpu/command_buffer/client/gles2_lib.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/gpu_processor.h"
+#include "gpu/demos/framework/demo.h"
#include "gpu/demos/framework/demo_factory.h"
using gpu::Buffer;
@@ -16,81 +17,39 @@ using gpu::GPUProcessor;
using gpu::gles2::GLES2CmdHelper;
using gpu::gles2::GLES2Implementation;
-// TODO(alokp): Make this class cross-platform. Investigate using SDL.
namespace {
const int32 kCommandBufferSize = 1024 * 1024;
const int32 kTransferBufferSize = 512 * 1024;
+} // namespace.
-LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg,
- WPARAM w_param, LPARAM l_param) {
- LRESULT result = 0;
- switch (msg) {
- case WM_CLOSE:
- ::DestroyWindow(hwnd);
- break;
- case WM_DESTROY:
- ::PostQuitMessage(0);
- break;
- case WM_ERASEBKGND:
- break;
- case WM_PAINT: {
- gpu::demos::Window* window = reinterpret_cast<gpu::demos::Window*>(
- GetWindowLongPtr(hwnd, GWL_USERDATA));
- if (window != NULL) window->OnPaint();
- ::ValidateRect(hwnd, NULL);
- break;
- }
- default:
- result = ::DefWindowProc(hwnd, msg, w_param, l_param);
- break;
- }
- return result;
+namespace gpu {
+namespace demos {
+
+Window::Window()
+ : window_handle_(NULL),
+ demo_(CreateDemo()) {
+}
+
+Window::~Window() {
}
-HWND CreateNativeWindow(const wchar_t* title, int width, int height,
- LONG_PTR user_data) {
- WNDCLASS wnd_class = {0};
- HINSTANCE instance = GetModuleHandle(NULL);
- wnd_class.style = CS_OWNDC;
- wnd_class.lpfnWndProc = WindowProc;
- wnd_class.hInstance = instance;
- wnd_class.hbrBackground =
- reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
- wnd_class.lpszClassName = L"gpu_demo";
- if (!RegisterClass(&wnd_class)) return NULL;
-
- DWORD wnd_style = WS_VISIBLE | WS_POPUP | WS_BORDER | WS_SYSMENU | WS_CAPTION;
- RECT wnd_rect;
- wnd_rect.left = 0;
- wnd_rect.top = 0;
- wnd_rect.right = width;
- wnd_rect.bottom = height;
- AdjustWindowRect(&wnd_rect, wnd_style, FALSE);
-
- HWND hwnd = CreateWindow(
- wnd_class.lpszClassName,
- title,
- wnd_style,
- 0,
- 0,
- wnd_rect.right - wnd_rect.left,
- wnd_rect.bottom - wnd_rect.top,
- NULL,
- NULL,
- instance,
- NULL);
- if (hwnd == NULL) return NULL;
-
- ShowWindow(hwnd, SW_SHOWNORMAL);
- // Set this to the GWL_USERDATA so that it is available to WindowProc.
- SetWindowLongPtr(hwnd, GWL_USERDATA, user_data);
-
- return hwnd;
+bool Window::Init(int width, int height) {
+ window_handle_ = CreateNativeWindow(demo_->Title(), width, height);
+ if (window_handle_ == NULL)
+ return false;
+ if (!CreateRenderContext(PluginWindow(window_handle_)))
+ return false;
+
+ demo_->InitWindowSize(width, height);
+ return demo_->InitGL();
}
-bool InitRenderContext(HWND hwnd) {
- CHECK(hwnd);
+void Window::OnPaint() {
+ demo_->Draw();
+ ::gles2::GetGLContext()->SwapBuffers();
+}
+bool Window::CreateRenderContext(gfx::PluginWindowHandle hwnd) {
scoped_ptr<CommandBufferService> command_buffer(new CommandBufferService);
if (!command_buffer->Initialize(kCommandBufferSize)) {
return false;
@@ -117,54 +76,14 @@ bool InitRenderContext(HWND hwnd) {
command_buffer->GetTransferBuffer(transfer_buffer_id);
if (transfer_buffer.ptr == NULL) return false;
- gles2::Initialize();
- gles2::SetGLContext(new GLES2Implementation(helper,
- transfer_buffer.size,
- transfer_buffer.ptr,
- transfer_buffer_id));
+ ::gles2::Initialize();
+ ::gles2::SetGLContext(new GLES2Implementation(helper,
+ transfer_buffer.size,
+ transfer_buffer.ptr,
+ transfer_buffer_id));
return command_buffer.release() != NULL;
}
-} // namespace.
-
-namespace gpu {
-namespace demos {
-
-Window::Window()
- : window_handle_(NULL),
- demo_(CreateDemo()) {
-}
-
-Window::~Window() {
-}
-
-bool Window::Init(int width, int height) {
- window_handle_ = CreateNativeWindow(demo_->Title(), width, height,
- reinterpret_cast<LONG_PTR>(this));
- if (window_handle_ == NULL) return false;
- if (!InitRenderContext(window_handle_)) return false;
-
- demo_->InitWindowSize(width, height);
- return demo_->InitGL();
-}
-
-void Window::MainLoop() {
- MSG msg;
- bool done = false;
- while (!done) {
- while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- if (msg.message == WM_QUIT) done = true;
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- }
- // Message queue is empty and application has not quit yet - keep painting.
- if (!done) ::UpdateWindow(window_handle_);
- }
-}
-
-void Window::OnPaint() {
- demo_->Draw();
- ::gles2::GetGLContext()->SwapBuffers();
-}
} // namespace demos
} // namespace gpu
+
diff --git a/gpu/demos/framework/window.h b/gpu/demos/framework/window.h
index dade945..a84ecf8 100644
--- a/gpu/demos/framework/window.h
+++ b/gpu/demos/framework/window.h
@@ -5,13 +5,14 @@
#ifndef GPU_DEMOS_FRAMEWORK_WINDOW_H_
#define GPU_DEMOS_FRAMEWORK_WINDOW_H_
+#include "app/gfx/native_widget_types.h"
#include "base/scoped_ptr.h"
-#include "gpu/demos/framework/demo.h"
-#include "gpu/demos/framework/platform.h"
namespace gpu {
namespace demos {
+class Demo;
+
// Acts as a framework for standalone demos. It creates a window and delegates
// all events to demo to perform rendering and other tasks.
class Window {
@@ -28,7 +29,15 @@ class Window {
void OnPaint();
private:
- NativeWindowHandle window_handle_;
+ // Creates and shows a native window with the given title and dimensions.
+ gfx::NativeWindow CreateNativeWindow(const wchar_t* title,
+ int width, int height);
+ // Converts native window handle to NPAPI plugin window handle.
+ gfx::PluginWindowHandle PluginWindow(gfx::NativeWindow hwnd);
+ // Creates an OpenGL ES 2.0 rendering context for the given window.
+ bool CreateRenderContext(gfx::PluginWindowHandle hwnd);
+
+ gfx::NativeWindow window_handle_;
scoped_ptr<Demo> demo_;
DISALLOW_COPY_AND_ASSIGN(Window);
@@ -37,3 +46,4 @@ class Window {
} // namespace demos
} // namespace gpu
#endif // GPU_DEMOS_FRAMEWORK_WINDOW_H_
+
diff --git a/gpu/demos/framework/window_linux.cc b/gpu/demos/framework/window_linux.cc
new file mode 100644
index 0000000..4f07a24
--- /dev/null
+++ b/gpu/demos/framework/window_linux.cc
@@ -0,0 +1,24 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/demos/framework/window.h"
+
+namespace gpu {
+namespace demos {
+
+void Window::MainLoop() {
+}
+
+gfx::NativeWindow Window::CreateNativeWindow(const wchar_t* title,
+ int width, int height) {
+ return NULL;
+}
+
+gfx::PluginWindowHandle Window::PluginWindow(gfx::NativeWindow hwnd) {
+ return gfx::kNullPluginWindow;
+}
+
+} // namespace demos
+} // namespace gpu
+
diff --git a/gpu/demos/framework/window_mac.mm b/gpu/demos/framework/window_mac.mm
new file mode 100644
index 0000000..4f07a24
--- /dev/null
+++ b/gpu/demos/framework/window_mac.mm
@@ -0,0 +1,24 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/demos/framework/window.h"
+
+namespace gpu {
+namespace demos {
+
+void Window::MainLoop() {
+}
+
+gfx::NativeWindow Window::CreateNativeWindow(const wchar_t* title,
+ int width, int height) {
+ return NULL;
+}
+
+gfx::PluginWindowHandle Window::PluginWindow(gfx::NativeWindow hwnd) {
+ return gfx::kNullPluginWindow;
+}
+
+} // namespace demos
+} // namespace gpu
+
diff --git a/gpu/demos/framework/window_win.cc b/gpu/demos/framework/window_win.cc
new file mode 100644
index 0000000..62b2771
--- /dev/null
+++ b/gpu/demos/framework/window_win.cc
@@ -0,0 +1,100 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/demos/framework/window.h"
+
+namespace {
+LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg,
+ WPARAM w_param, LPARAM l_param) {
+ LRESULT result = 0;
+ switch (msg) {
+ case WM_CLOSE:
+ ::DestroyWindow(hwnd);
+ break;
+ case WM_DESTROY:
+ ::PostQuitMessage(0);
+ break;
+ case WM_ERASEBKGND:
+ break;
+ case WM_PAINT: {
+ gpu::demos::Window* window = reinterpret_cast<gpu::demos::Window*>(
+ GetWindowLongPtr(hwnd, GWL_USERDATA));
+ if (window != NULL) window->OnPaint();
+ ::ValidateRect(hwnd, NULL);
+ break;
+ }
+ default:
+ result = ::DefWindowProc(hwnd, msg, w_param, l_param);
+ break;
+ }
+ return result;
+}
+} // namespace.
+
+namespace gpu {
+namespace demos {
+
+void Window::MainLoop() {
+ // Set this to the GWL_USERDATA so that it is available to WindowProc.
+ SetWindowLongPtr(window_handle_, GWL_USERDATA,
+ reinterpret_cast<LONG_PTR>(this));
+
+ MSG msg;
+ bool done = false;
+ while (!done) {
+ while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
+ if (msg.message == WM_QUIT) done = true;
+ ::TranslateMessage(&msg);
+ ::DispatchMessage(&msg);
+ }
+ // Message queue is empty and application has not quit yet - keep painting.
+ if (!done) ::UpdateWindow(window_handle_);
+ }
+}
+
+gfx::NativeWindow Window::CreateNativeWindow(const wchar_t* title,
+ int width, int height) {
+ WNDCLASS wnd_class = {0};
+ HINSTANCE instance = GetModuleHandle(NULL);
+ wnd_class.style = CS_OWNDC;
+ wnd_class.lpfnWndProc = WindowProc;
+ wnd_class.hInstance = instance;
+ wnd_class.hbrBackground =
+ reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
+ wnd_class.lpszClassName = L"gpu_demo";
+ if (!RegisterClass(&wnd_class)) return NULL;
+
+ DWORD wnd_style = WS_VISIBLE | WS_POPUP | WS_BORDER | WS_SYSMENU | WS_CAPTION;
+ RECT wnd_rect;
+ wnd_rect.left = 0;
+ wnd_rect.top = 0;
+ wnd_rect.right = width;
+ wnd_rect.bottom = height;
+ AdjustWindowRect(&wnd_rect, wnd_style, FALSE);
+
+ HWND hwnd = CreateWindow(
+ wnd_class.lpszClassName,
+ title,
+ wnd_style,
+ 0,
+ 0,
+ wnd_rect.right - wnd_rect.left,
+ wnd_rect.bottom - wnd_rect.top,
+ NULL,
+ NULL,
+ instance,
+ NULL);
+ if (hwnd == NULL) return NULL;
+
+ ShowWindow(hwnd, SW_SHOWNORMAL);
+ return hwnd;
+}
+
+gfx::PluginWindowHandle Window::PluginWindow(gfx::NativeWindow hwnd) {
+ return hwnd;
+}
+
+} // namespace demos
+} // namespace gpu
+