blob: 1669cebfa2efe013bdb4a2c19988f99a7ece032e [file] [log] [blame]
// Copyright 2013 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 SERVICES_GLES2_COMMAND_BUFFER_DRIVER_H_
#define SERVICES_GLES2_COMMAND_BUFFER_DRIVER_H_
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/single_thread_task_runner.h"
#include "base/timer/timer.h"
#include "mojo/services/gpu/interfaces/command_buffer.mojom.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/size.h"
#include "ui/gl/gl_surface.h"
namespace gpu {
class CommandBufferService;
class GpuScheduler;
class GpuControlService;
class SyncPointManager;
namespace gles2 {
class GLES2Decoder;
class MailboxManager;
}
}
namespace gfx {
class GLContext;
class GLShareGroup;
class GLSurface;
}
namespace gles2 {
class CommandBufferDriver {
public:
class Client {
public:
virtual ~Client();
virtual void UpdateVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) = 0;
virtual void DidLoseContext() = 0;
};
// Offscreen.
CommandBufferDriver(gfx::GLShareGroup* share_group,
gpu::gles2::MailboxManager* mailbox_manager,
gpu::SyncPointManager* sync_point_manager,
const gfx::SurfaceConfiguration& requested_configuration);
// Onscreen.
CommandBufferDriver(gfx::AcceleratedWidget widget,
gfx::GLShareGroup* share_group,
gpu::gles2::MailboxManager* mailbox_manager,
gpu::SyncPointManager* sync_point_manager,
const gfx::SurfaceConfiguration& requested_configuration);
~CommandBufferDriver();
void set_client(scoped_ptr<Client> client) { client_ = client.Pass(); }
void Initialize(
mojo::InterfaceHandle<mojo::CommandBufferSyncClient> sync_client,
mojo::InterfaceHandle<mojo::CommandBufferLostContextObserver>
loss_observer,
mojo::ScopedSharedBufferHandle shared_state);
void SetGetBuffer(int32_t buffer);
void Flush(int32_t put_offset);
void MakeProgress(int32_t last_get_offset);
void RegisterTransferBuffer(int32_t id,
mojo::ScopedSharedBufferHandle transfer_buffer,
uint32_t size);
void DestroyTransferBuffer(int32_t id);
void Echo(const mojo::Callback<void()>& callback);
void RetireSyncPointOnGpuThread(uint32_t sync_point);
private:
bool DoInitialize(mojo::ScopedSharedBufferHandle shared_state);
void OnResize(gfx::Size size, float scale_factor);
bool OnWaitSyncPoint(uint32_t sync_point);
void OnSyncPointRetired();
void OnParseError();
void OnContextLost(uint32_t reason);
void OnUpdateVSyncParameters(const base::TimeTicks timebase,
const base::TimeDelta interval);
scoped_ptr<Client> client_;
mojo::CommandBufferSyncClientPtr sync_client_;
mojo::CommandBufferLostContextObserverPtr loss_observer_;
gfx::AcceleratedWidget widget_;
scoped_ptr<gpu::CommandBufferService> command_buffer_;
scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
scoped_ptr<gpu::GpuScheduler> scheduler_;
scoped_refptr<gfx::GLContext> context_;
scoped_refptr<gfx::GLSurface> surface_;
scoped_refptr<gfx::GLShareGroup> share_group_;
scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_;
scoped_refptr<gpu::SyncPointManager> sync_point_manager_;
gfx::SurfaceConfiguration requested_configuration_;
scoped_refptr<base::SingleThreadTaskRunner> context_lost_task_runner_;
base::Callback<void(int32_t)> context_lost_callback_;
base::WeakPtrFactory<CommandBufferDriver> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(CommandBufferDriver);
};
} // namespace gles2
#endif // SERVICES_GLES2_COMMAND_BUFFER_DRIVER_H_