| Index: content/common/gpu/gpu_command_buffer_stub.h
|
| diff --git a/content/common/gpu/gpu_command_buffer_stub.h b/content/common/gpu/gpu_command_buffer_stub.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..58d32c358885a302d35db74b9e3c2343314e66fe
|
| --- /dev/null
|
| +++ b/content/common/gpu/gpu_command_buffer_stub.h
|
| @@ -0,0 +1,286 @@
|
| +// Copyright (c) 2012 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 CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
|
| +#define CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
|
| +
|
| +#include <stddef.h>
|
| +#include <stdint.h>
|
| +
|
| +#include <deque>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/macros.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/observer_list.h"
|
| +#include "base/time/time.h"
|
| +#include "content/common/content_export.h"
|
| +#include "content/common/gpu/gpu_memory_manager.h"
|
| +#include "gpu/command_buffer/common/command_buffer_id.h"
|
| +#include "gpu/command_buffer/common/constants.h"
|
| +#include "gpu/command_buffer/common/gpu_memory_allocation.h"
|
| +#include "gpu/command_buffer/service/command_buffer_service.h"
|
| +#include "gpu/command_buffer/service/command_executor.h"
|
| +#include "gpu/command_buffer/service/context_group.h"
|
| +#include "gpu/ipc/common/surface_handle.h"
|
| +#include "ipc/ipc_listener.h"
|
| +#include "ipc/ipc_sender.h"
|
| +#include "ui/events/latency_info.h"
|
| +#include "ui/gfx/geometry/size.h"
|
| +#include "ui/gfx/gpu_memory_buffer.h"
|
| +#include "ui/gfx/swap_result.h"
|
| +#include "ui/gl/gl_surface.h"
|
| +#include "ui/gl/gpu_preference.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace gpu {
|
| +struct Mailbox;
|
| +struct SyncToken;
|
| +class SyncPointClient;
|
| +class SyncPointManager;
|
| +class ValueStateMap;
|
| +namespace gles2 {
|
| +class MailboxManager;
|
| +class SubscriptionRefSet;
|
| +}
|
| +}
|
| +
|
| +struct GpuCommandBufferMsg_CreateImage_Params;
|
| +
|
| +namespace content {
|
| +
|
| +class GpuChannel;
|
| +class GpuWatchdog;
|
| +struct WaitForCommandState;
|
| +
|
| +class GpuCommandBufferStub
|
| + : public IPC::Listener,
|
| + public IPC::Sender,
|
| + public base::SupportsWeakPtr<GpuCommandBufferStub> {
|
| + public:
|
| + class DestructionObserver {
|
| + public:
|
| + // Called in Destroy(), before the context/surface are released.
|
| + virtual void OnWillDestroyStub() = 0;
|
| +
|
| + protected:
|
| + virtual ~DestructionObserver() {}
|
| + };
|
| +
|
| + typedef base::Callback<void(const std::vector<ui::LatencyInfo>&)>
|
| + LatencyInfoCallback;
|
| +
|
| + GpuCommandBufferStub(
|
| + GpuChannel* channel,
|
| + gpu::SyncPointManager* sync_point_manager,
|
| + base::SingleThreadTaskRunner* task_runner,
|
| + GpuCommandBufferStub* share_group,
|
| + gpu::SurfaceHandle surface_handle,
|
| + gpu::gles2::MailboxManager* mailbox_manager,
|
| + gpu::PreemptionFlag* preempt_by_flag,
|
| + gpu::gles2::SubscriptionRefSet* subscription_ref_set,
|
| + gpu::ValueStateMap* pending_valuebuffer_state,
|
| + const gfx::Size& size,
|
| + const gpu::gles2::DisallowedFeatures& disallowed_features,
|
| + const std::vector<int32_t>& attribs,
|
| + gfx::GpuPreference gpu_preference,
|
| + int32_t stream_id,
|
| + int32_t route_id,
|
| + GpuWatchdog* watchdog,
|
| + const GURL& active_url);
|
| +
|
| + ~GpuCommandBufferStub() override;
|
| +
|
| + // IPC::Listener implementation:
|
| + bool OnMessageReceived(const IPC::Message& message) override;
|
| +
|
| + // IPC::Sender implementation:
|
| + bool Send(IPC::Message* msg) override;
|
| +
|
| + gpu::gles2::MemoryTracker* GetMemoryTracker() const;
|
| +
|
| + // Whether this command buffer can currently handle IPC messages.
|
| + bool IsScheduled();
|
| +
|
| + // Whether there are commands in the buffer that haven't been processed.
|
| + bool HasUnprocessedCommands();
|
| +
|
| + gpu::gles2::GLES2Decoder* decoder() const { return decoder_.get(); }
|
| + gpu::CommandExecutor* scheduler() const { return executor_.get(); }
|
| + GpuChannel* channel() const { return channel_; }
|
| +
|
| + // Unique command buffer ID for this command buffer stub.
|
| + gpu::CommandBufferId command_buffer_id() const { return command_buffer_id_; }
|
| +
|
| + // Identifies the various GpuCommandBufferStubs in the GPU process belonging
|
| + // to the same renderer process.
|
| + int32_t route_id() const { return route_id_; }
|
| +
|
| + // Identifies the stream for this command buffer.
|
| + int32_t stream_id() const { return stream_id_; }
|
| +
|
| + gfx::GpuPreference gpu_preference() { return gpu_preference_; }
|
| +
|
| + int32_t GetRequestedAttribute(int attr) const;
|
| +
|
| + // Sends a message to the console.
|
| + void SendConsoleMessage(int32_t id, const std::string& message);
|
| +
|
| + void SendCachedShader(const std::string& key, const std::string& shader);
|
| +
|
| + gfx::GLSurface* surface() const { return surface_.get(); }
|
| +
|
| + void AddDestructionObserver(DestructionObserver* observer);
|
| + void RemoveDestructionObserver(DestructionObserver* observer);
|
| +
|
| + void SetLatencyInfoCallback(const LatencyInfoCallback& callback);
|
| +
|
| + void MarkContextLost();
|
| +
|
| + const gpu::gles2::FeatureInfo* GetFeatureInfo() const;
|
| +
|
| + void SendSwapBuffersCompleted(
|
| + const std::vector<ui::LatencyInfo>& latency_info,
|
| + gfx::SwapResult result);
|
| + void SendUpdateVSyncParameters(base::TimeTicks timebase,
|
| + base::TimeDelta interval);
|
| +
|
| + private:
|
| + GpuMemoryManager* GetMemoryManager() const;
|
| +
|
| + void Destroy();
|
| +
|
| + bool MakeCurrent();
|
| +
|
| + // Cleans up and sends reply if OnInitialize failed.
|
| + void OnInitializeFailed(IPC::Message* reply_message);
|
| +
|
| + scoped_refptr<gfx::GLSurface> CreateSurface();
|
| +
|
| + // Message handlers:
|
| + void OnInitialize(base::SharedMemoryHandle shared_state_shm,
|
| + IPC::Message* reply_message);
|
| + void OnSetGetBuffer(int32_t shm_id, IPC::Message* reply_message);
|
| + void OnProduceFrontBuffer(const gpu::Mailbox& mailbox);
|
| + void OnGetState(IPC::Message* reply_message);
|
| + void OnWaitForTokenInRange(int32_t start,
|
| + int32_t end,
|
| + IPC::Message* reply_message);
|
| + void OnWaitForGetOffsetInRange(int32_t start,
|
| + int32_t end,
|
| + IPC::Message* reply_message);
|
| + void OnAsyncFlush(int32_t put_offset,
|
| + uint32_t flush_count,
|
| + const std::vector<ui::LatencyInfo>& latency_info);
|
| + void OnRegisterTransferBuffer(int32_t id,
|
| + base::SharedMemoryHandle transfer_buffer,
|
| + uint32_t size);
|
| + void OnDestroyTransferBuffer(int32_t id);
|
| + void OnGetTransferBuffer(int32_t id, IPC::Message* reply_message);
|
| +
|
| + void OnEnsureBackbuffer();
|
| +
|
| + void OnSignalSyncToken(const gpu::SyncToken& sync_token, uint32_t id);
|
| + void OnSignalAck(uint32_t id);
|
| + void OnSignalQuery(uint32_t query, uint32_t id);
|
| +
|
| + void OnFenceSyncRelease(uint64_t release);
|
| + bool OnWaitFenceSync(gpu::CommandBufferNamespace namespace_id,
|
| + gpu::CommandBufferId command_buffer_id,
|
| + uint64_t release);
|
| + void OnWaitFenceSyncCompleted(gpu::CommandBufferNamespace namespace_id,
|
| + gpu::CommandBufferId command_buffer_id,
|
| + uint64_t release);
|
| +
|
| + void OnCreateImage(const GpuCommandBufferMsg_CreateImage_Params& params);
|
| + void OnDestroyImage(int32_t id);
|
| + void OnCreateStreamTexture(uint32_t texture_id,
|
| + int32_t stream_id,
|
| + bool* succeeded);
|
| +
|
| + void OnCommandProcessed();
|
| + void OnParseError();
|
| + void OnSchedulingChanged(bool scheduled);
|
| +
|
| + void ReportState();
|
| +
|
| + // Wrapper for CommandExecutor::PutChanged that sets the crash report URL.
|
| + void PutChanged();
|
| +
|
| + // Poll the command buffer to execute work.
|
| + void PollWork();
|
| + void PerformWork();
|
| +
|
| + // Schedule processing of delayed work. This updates the time at which
|
| + // delayed work should be processed. |process_delayed_work_time_| is
|
| + // updated to current time + delay. Call this after processing some amount
|
| + // of delayed work.
|
| + void ScheduleDelayedWork(base::TimeDelta delay);
|
| +
|
| + bool CheckContextLost();
|
| + void CheckCompleteWaits();
|
| + void PullTextureUpdates(gpu::CommandBufferNamespace namespace_id,
|
| + gpu::CommandBufferId command_buffer_id,
|
| + uint32_t release);
|
| +
|
| + // The lifetime of objects of this class is managed by a GpuChannel. The
|
| + // GpuChannels destroy all the GpuCommandBufferStubs that they own when they
|
| + // are destroyed. So a raw pointer is safe.
|
| + GpuChannel* const channel_;
|
| +
|
| + // Outlives the stub.
|
| + gpu::SyncPointManager* const sync_point_manager_;
|
| +
|
| + // Task runner for main thread.
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| +
|
| + // The group of contexts that share namespaces with this context.
|
| + scoped_refptr<gpu::gles2::ContextGroup> context_group_;
|
| +
|
| + bool initialized_;
|
| + const gpu::SurfaceHandle surface_handle_;
|
| + gfx::Size initial_size_;
|
| + gpu::gles2::DisallowedFeatures disallowed_features_;
|
| + std::vector<int32_t> requested_attribs_;
|
| + gfx::GpuPreference gpu_preference_;
|
| + bool use_virtualized_gl_context_;
|
| + const gpu::CommandBufferId command_buffer_id_;
|
| + const int32_t stream_id_;
|
| + const int32_t route_id_;
|
| + uint32_t last_flush_count_;
|
| +
|
| + scoped_ptr<gpu::CommandBufferService> command_buffer_;
|
| + scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
|
| + scoped_ptr<gpu::CommandExecutor> executor_;
|
| + scoped_ptr<gpu::SyncPointClient> sync_point_client_;
|
| + scoped_refptr<gfx::GLSurface> surface_;
|
| + gfx::GLSurface::Format surface_format_;
|
| +
|
| + GpuWatchdog* watchdog_;
|
| +
|
| + base::ObserverList<DestructionObserver> destruction_observers_;
|
| +
|
| + bool waiting_for_sync_point_;
|
| +
|
| + base::TimeTicks process_delayed_work_time_;
|
| + uint32_t previous_processed_num_;
|
| + base::TimeTicks last_idle_time_;
|
| +
|
| + scoped_refptr<gpu::PreemptionFlag> preemption_flag_;
|
| +
|
| + LatencyInfoCallback latency_info_callback_;
|
| +
|
| + GURL active_url_;
|
| + size_t active_url_hash_;
|
| +
|
| + scoped_ptr<WaitForCommandState> wait_for_token_;
|
| + scoped_ptr<WaitForCommandState> wait_for_get_offset_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GpuCommandBufferStub);
|
| +};
|
| +
|
| +} // namespace content
|
| +
|
| +#endif // CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
|
|
|