blob: 396c2fca8c8cff367199029a3f519817bf91ac33 [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_GPU_PROCESS_HOST_UI_SHIM_H_
#define CHROME_BROWSER_GPU_PROCESS_HOST_UI_SHIM_H_
#pragma once
// This class lives on the UI thread and supports classes like the
// BackingStoreProxy, which must live on the UI thread. The IO thread
// portion of this class, the GpuProcessHost, is responsible for
// shuttling messages between the browser and GPU processes.
#include <queue>
#include "base/callback.h"
#include "base/linked_ptr.h"
#include "base/scoped_ptr.h"
#include "base/singleton.h"
#include "base/values.h"
#include "base/threading/non_thread_safe.h"
#include "chrome/common/gpu_feature_flags.h"
#include "chrome/common/gpu_info.h"
#include "chrome/common/message_router.h"
#include "ipc/ipc_channel.h"
#include "ui/gfx/native_widget_types.h"
namespace gfx {
class Size;
}
class GpuBlacklist;
struct GPUCreateCommandBufferConfig;
class GPUInfo;
struct GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params;
struct GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params;
namespace IPC {
struct ChannelHandle;
class Message;
}
class GpuProcessHostUIShim : public IPC::Channel::Sender,
public IPC::Channel::Listener,
public base::NonThreadSafe {
public:
// Getter for the singleton. This will return NULL on failure.
static GpuProcessHostUIShim* GetInstance();
int32 GetNextRoutingId();
// IPC::Channel::Sender implementation.
virtual bool Send(IPC::Message* msg);
// Sends outstanding replies. This is only called
// in error situations like the GPU process crashing -- but is necessary
// to prevent the blocked clients from hanging.
void SendOutstandingReplies();
// IPC::Channel::Listener implementation.
// The GpuProcessHost causes this to be called on the UI thread to
// dispatch the incoming messages from the GPU process, which are
// actually received on the IO thread.
virtual bool OnMessageReceived(const IPC::Message& message);
typedef Callback2<const IPC::ChannelHandle&, const GPUInfo&>::Type
EstablishChannelCallback;
// Tells the GPU process to create a new channel for communication with a
// renderer. Once the GPU process responds asynchronously with the IPC handle
// and GPUInfo, we call the callback.
void EstablishGpuChannel(
int renderer_id, EstablishChannelCallback* callback);
typedef Callback0::Type SynchronizeCallback;
// Sends a reply message later when the next GpuHostMsg_SynchronizeReply comes
// in.
void Synchronize(SynchronizeCallback* callback);
typedef Callback1<int32>::Type CreateCommandBufferCallback;
// Tells the GPU process to create a new command buffer that draws into the
// window associated with the given renderer.
void CreateViewCommandBuffer(
int32 render_view_id,
int32 renderer_id,
const GPUCreateCommandBufferConfig& init_params,
CreateCommandBufferCallback* callback);
// See documentation on MessageRouter for AddRoute and RemoveRoute
void AddRoute(int32 routing_id, IPC::Channel::Listener* listener);
void RemoveRoute(int32 routing_id);
// Sends a message to the browser process to collect the information from the
// graphics card.
void CollectGraphicsInfoAsynchronously(GPUInfo::Level level);
// Tells the GPU process to crash. Useful for testing.
void SendAboutGpuCrash();
// Tells the GPU process to let its main thread enter an infinite loop.
// Useful for testing.
void SendAboutGpuHang();
// Return all known information about the GPU.
const GPUInfo& gpu_info() const;
// Used only in testing. Sets a callback to invoke when GPU info is collected,
// regardless of whether it has been collected already or if it is partial
// or complete info. Set to NULL when the callback should no longer be called.
void set_gpu_info_collected_callback(Callback0::Type* callback) {
gpu_info_collected_callback_.reset(callback);
}
ListValue* logMessages() const { return log_messages_.DeepCopy(); }
// Can be called directly from the UI thread to log a message.
void AddCustomLogMessage(int level, const std::string& header,
const std::string& message);
bool LoadGpuBlacklist();
private:
friend struct DefaultSingletonTraits<GpuProcessHostUIShim>;
GpuProcessHostUIShim();
virtual ~GpuProcessHostUIShim();
// TODO(apatrick): Following the pattern from GpuProcessHost. Talk to zmo
// and see if we can find a better mechanism.
bool EnsureInitialized();
bool Init();
// Message handlers.
bool OnControlMessageReceived(const IPC::Message& message);
void OnChannelEstablished(const IPC::ChannelHandle& channel_handle,
const GPUInfo& gpu_info);
void OnCommandBufferCreated(const int32 route_id);
void OnDestroyCommandBuffer(gfx::PluginWindowHandle window,
int32 renderer_id, int32 render_view_id);
void OnGraphicsInfoCollected(const GPUInfo& gpu_info);
void OnLogMessage(int level, const std::string& header,
const std::string& message);
void OnSynchronizeReply();
#if defined(OS_LINUX)
void OnResizeXID(unsigned long xid, gfx::Size size, IPC::Message* reply_msg);
#elif defined(OS_MACOSX)
void OnAcceleratedSurfaceSetIOSurface(
const GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params& params);
void OnAcceleratedSurfaceBuffersSwapped(
const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params);
#elif defined(OS_WIN)
void OnScheduleComposite(int32 renderer_id, int32 render_view_id);
#endif
int last_routing_id_;
GPUInfo gpu_info_;
ListValue log_messages_;
MessageRouter router_;
// Used only in testing. If set, the callback is invoked when the GPU info
// has been collected.
scoped_ptr<Callback0::Type> gpu_info_collected_callback_;
// These are the channel requests that we have already sent to
// the GPU process, but haven't heard back about yet.
std::queue<linked_ptr<EstablishChannelCallback> > channel_requests_;
// The pending synchronization requests we need to reply to.
std::queue<linked_ptr<SynchronizeCallback> > synchronize_requests_;
// The pending create command buffer requests we need to reply to.
std::queue<linked_ptr<CreateCommandBufferCallback> >
create_command_buffer_requests_;
bool initialized_;
bool initialized_successfully_;
bool gpu_feature_flags_set_;
scoped_ptr<GpuBlacklist> gpu_blacklist_;
GpuFeatureFlags gpu_feature_flags_;
};
#endif // CHROME_BROWSER_GPU_PROCESS_HOST_UI_SHIM_H_