diff options
author | alokp@chromium.org <alokp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-03 17:02:27 +0000 |
---|---|---|
committer | alokp@chromium.org <alokp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-03 17:02:27 +0000 |
commit | 84352455e708fc771809f34476d4db9ca79e4bc9 (patch) | |
tree | b47b875ea7ade05db1d924ddc48f1c8f3c6f97ea /gpu | |
parent | 882f0ccbf250af3ff242da94706f26bb2f09c5b0 (diff) | |
download | chromium_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.gyp | 244 | ||||
-rw-r--r-- | gpu/demos/framework/platform.h | 25 | ||||
-rw-r--r-- | gpu/demos/framework/window.cc | 143 | ||||
-rw-r--r-- | gpu/demos/framework/window.h | 16 | ||||
-rw-r--r-- | gpu/demos/framework/window_linux.cc | 24 | ||||
-rw-r--r-- | gpu/demos/framework/window_mac.mm | 24 | ||||
-rw-r--r-- | gpu/demos/framework/window_win.cc | 100 |
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 + |