| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef SERVICES_GFX_COMPOSITOR_BACKEND_GPU_OUTPUT_H_ | 5 #ifndef SERVICES_GFX_COMPOSITOR_BACKEND_GPU_OUTPUT_H_ |
| 6 #define SERVICES_GFX_COMPOSITOR_BACKEND_GPU_OUTPUT_H_ | 6 #define SERVICES_GFX_COMPOSITOR_BACKEND_GPU_OUTPUT_H_ |
| 7 | 7 |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <mutex> | 9 #include <mutex> |
| 10 #include <queue> | 10 #include <queue> |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 public: | 27 public: |
| 28 GpuOutput(mojo::InterfaceHandle<mojo::ContextProvider> context_provider, | 28 GpuOutput(mojo::InterfaceHandle<mojo::ContextProvider> context_provider, |
| 29 const SchedulerCallbacks& scheduler_callbacks, | 29 const SchedulerCallbacks& scheduler_callbacks, |
| 30 const base::Closure& error_callback); | 30 const base::Closure& error_callback); |
| 31 ~GpuOutput() override; | 31 ~GpuOutput() override; |
| 32 | 32 |
| 33 Scheduler* GetScheduler() override; | 33 Scheduler* GetScheduler() override; |
| 34 void SubmitFrame(const scoped_refptr<RenderFrame>& frame) override; | 34 void SubmitFrame(const scoped_refptr<RenderFrame>& frame) override; |
| 35 | 35 |
| 36 private: | 36 private: |
| 37 struct FrameData : public base::RefCountedThreadSafe<FrameData> { | 37 struct FrameData { |
| 38 enum class State { |
| 39 Pending, // initial state waiting for draw to start |
| 40 Drawing, // draw has started |
| 41 Finished // draw has finished |
| 42 }; |
| 43 |
| 38 FrameData(const scoped_refptr<RenderFrame>& frame, int64_t submit_time); | 44 FrameData(const scoped_refptr<RenderFrame>& frame, int64_t submit_time); |
| 45 ~FrameData(); |
| 39 | 46 |
| 40 void Recycle(); | 47 void ResetDrawState(); |
| 41 | 48 |
| 42 const scoped_refptr<RenderFrame> frame; | 49 const scoped_refptr<RenderFrame> frame; |
| 43 const int64_t submit_time; | 50 const int64_t submit_time; |
| 44 bool drawn = false; // set when DrawFrame is called | 51 State state = State::Pending; |
| 45 int64_t draw_time = 0; // 0 if not drawn | 52 int64_t draw_started_time = 0; // time when drawing began |
| 46 int64_t wait_time = 0; // 0 if not drawn | 53 int64_t draw_issued_time = 0; // time when awaiting for finish began |
| 47 | 54 |
| 48 private: | 55 private: |
| 49 friend class base::RefCountedThreadSafe<FrameData>; | |
| 50 | |
| 51 ~FrameData(); | |
| 52 | |
| 53 DISALLOW_COPY_AND_ASSIGN(FrameData); | 56 DISALLOW_COPY_AND_ASSIGN(FrameData); |
| 54 }; | 57 }; |
| 55 | 58 |
| 56 // |GpuRasterizer::Callbacks|: | 59 // |GpuRasterizer::Callbacks|: |
| 57 void OnRasterizerReady(int64_t vsync_timebase, | 60 void OnRasterizerReady(int64_t vsync_timebase, |
| 58 int64_t vsync_interval) override; | 61 int64_t vsync_interval) override; |
| 59 void OnRasterizerSuspended() override; | 62 void OnRasterizerSuspended() override; |
| 60 void OnRasterizerFinishedDraw(bool presented) override; | 63 void OnRasterizerFinishedDraw(bool presented) override; |
| 61 void OnRasterizerError() override; | 64 void OnRasterizerError() override; |
| 62 | 65 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 79 // The rasterizer itself runs on its own thread. | 82 // The rasterizer itself runs on its own thread. |
| 80 std::unique_ptr<base::Thread> rasterizer_thread_; | 83 std::unique_ptr<base::Thread> rasterizer_thread_; |
| 81 scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner_; | 84 scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner_; |
| 82 base::WaitableEvent rasterizer_initialized_; | 85 base::WaitableEvent rasterizer_initialized_; |
| 83 std::unique_ptr<GpuRasterizer> rasterizer_; | 86 std::unique_ptr<GpuRasterizer> rasterizer_; |
| 84 | 87 |
| 85 // Holds state shared between the compositor and rasterizer threads. | 88 // Holds state shared between the compositor and rasterizer threads. |
| 86 struct { | 89 struct { |
| 87 std::mutex mutex; // guards all shared state | 90 std::mutex mutex; // guards all shared state |
| 88 | 91 |
| 89 // The most recently submitted frame. | 92 // Queue of frames. |
| 90 // Only null until the first frame has been submitted. | 93 // |
| 91 scoped_refptr<FrameData> current_frame_data; | 94 // The head of this queue consists of up to |pipeline_depth| frames |
| 92 | 95 // which are drawn and awaiting finish. These frames are popped off |
| 93 // Frames drawn and awaiting completion by the rasterizer. | 96 // the queue when finished unless the queue would become empty (such |
| 94 std::queue<scoped_refptr<FrameData>> drawn_frames_awaiting_finish; | 97 // that we always retain the current frame as the tail). |
| 98 // |
| 99 // The tail of this queue is a single frame which is either drawn or |
| 100 // finished and represents the current (most recently submitted) |
| 101 // content. |
| 102 // |
| 103 // The queue is only ever empty until the first frame is submitted. |
| 104 // Subsequently, it always contains at least one frame. |
| 105 std::queue<std::unique_ptr<FrameData>> frames; |
| 95 | 106 |
| 96 // Set to true when the rasterizer is ready to draw. | 107 // Set to true when the rasterizer is ready to draw. |
| 97 bool rasterizer_ready = false; | 108 bool rasterizer_ready = false; |
| 98 | 109 |
| 99 // Set to true when a request to draw has been scheduled. | 110 // Set to true when a request to draw has been scheduled. |
| 100 bool draw_scheduled = false; | 111 bool draw_scheduled = false; |
| 101 } shared_state_; | 112 } shared_state_; |
| 102 | 113 |
| 103 DISALLOW_COPY_AND_ASSIGN(GpuOutput); | 114 DISALLOW_COPY_AND_ASSIGN(GpuOutput); |
| 104 }; | 115 }; |
| 105 | 116 |
| 106 } // namespace compositor | 117 } // namespace compositor |
| 107 | 118 |
| 108 #endif // SERVICES_GFX_COMPOSITOR_BACKEND_GPU_OUTPUT_H_ | 119 #endif // SERVICES_GFX_COMPOSITOR_BACKEND_GPU_OUTPUT_H_ |
| OLD | NEW |