OLD | NEW |
(Empty) | |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef CC_OUTPUT_DIRECT_RENDERER_H_ |
| 6 #define CC_OUTPUT_DIRECT_RENDERER_H_ |
| 7 |
| 8 #include "base/basictypes.h" |
| 9 #include "base/callback.h" |
| 10 #include "base/containers/scoped_ptr_hash_map.h" |
| 11 #include "cc/base/scoped_ptr_deque.h" |
| 12 #include "cc/output/overlay_processor.h" |
| 13 #include "cc/output/renderer.h" |
| 14 #include "cc/resources/resource_provider.h" |
| 15 #include "cc/resources/scoped_resource.h" |
| 16 #include "ui/gfx/geometry/quad_f.h" |
| 17 |
| 18 namespace cc { |
| 19 |
| 20 class DrawPolygon; |
| 21 class ResourceProvider; |
| 22 |
| 23 // This is the base class for code shared between the GL and software |
| 24 // renderer implementations. "Direct" refers to the fact that it does not |
| 25 // delegate rendering to another compositor. |
| 26 class DirectRenderer : public Renderer { |
| 27 public: |
| 28 ~DirectRenderer() override; |
| 29 |
| 30 void DecideRenderPassAllocationsForFrame( |
| 31 const RenderPassList& render_passes_in_draw_order) override; |
| 32 bool HasAllocatedResourcesForTesting(RenderPassId id) const override; |
| 33 void DrawFrame(RenderPassList* render_passes_in_draw_order, |
| 34 float device_scale_factor, |
| 35 const gfx::Rect& device_viewport_rect, |
| 36 const gfx::Rect& device_clip_rect, |
| 37 bool disable_picture_quad_image_filtering) override; |
| 38 |
| 39 struct DrawingFrame { |
| 40 DrawingFrame(); |
| 41 ~DrawingFrame(); |
| 42 |
| 43 const RenderPassList* render_passes_in_draw_order; |
| 44 const RenderPass* root_render_pass; |
| 45 const RenderPass* current_render_pass; |
| 46 const ScopedResource* current_texture; |
| 47 |
| 48 gfx::Rect root_damage_rect; |
| 49 gfx::Rect device_viewport_rect; |
| 50 gfx::Rect device_clip_rect; |
| 51 |
| 52 gfx::Transform projection_matrix; |
| 53 gfx::Transform window_matrix; |
| 54 |
| 55 bool disable_picture_quad_image_filtering; |
| 56 |
| 57 OverlayCandidateList overlay_list; |
| 58 }; |
| 59 |
| 60 void SetEnlargePassTextureAmountForTesting(const gfx::Vector2d& amount); |
| 61 void DoDrawPolygon(const DrawPolygon& poly, |
| 62 DrawingFrame* frame, |
| 63 const gfx::Rect& render_pass_scissor, |
| 64 bool use_render_pass_scissor); |
| 65 |
| 66 protected: |
| 67 enum SurfaceInitializationMode { |
| 68 SURFACE_INITIALIZATION_MODE_PRESERVE, |
| 69 SURFACE_INITIALIZATION_MODE_SCISSORED_CLEAR, |
| 70 SURFACE_INITIALIZATION_MODE_FULL_SURFACE_CLEAR, |
| 71 }; |
| 72 |
| 73 DirectRenderer(RendererClient* client, |
| 74 const RendererSettings* settings, |
| 75 OutputSurface* output_surface, |
| 76 ResourceProvider* resource_provider); |
| 77 |
| 78 static gfx::RectF QuadVertexRect(); |
| 79 static void QuadRectTransform(gfx::Transform* quad_rect_transform, |
| 80 const gfx::Transform& quad_transform, |
| 81 const gfx::RectF& quad_rect); |
| 82 void InitializeViewport(DrawingFrame* frame, |
| 83 const gfx::Rect& draw_rect, |
| 84 const gfx::Rect& viewport_rect, |
| 85 const gfx::Size& surface_size); |
| 86 gfx::Rect MoveFromDrawToWindowSpace(const DrawingFrame* frame, |
| 87 const gfx::Rect& draw_rect) const; |
| 88 |
| 89 bool NeedDeviceClip(const DrawingFrame* frame) const; |
| 90 gfx::Rect DeviceClipRectInDrawSpace(const DrawingFrame* frame) const; |
| 91 gfx::Rect DeviceViewportRectInDrawSpace(const DrawingFrame* frame) const; |
| 92 gfx::Rect OutputSurfaceRectInDrawSpace(const DrawingFrame* frame) const; |
| 93 static gfx::Rect ComputeScissorRectForRenderPass(const DrawingFrame* frame); |
| 94 void SetScissorStateForQuad(const DrawingFrame* frame, |
| 95 const DrawQuad& quad, |
| 96 const gfx::Rect& render_pass_scissor, |
| 97 bool use_render_pass_scissor); |
| 98 bool ShouldSkipQuad(const DrawQuad& quad, |
| 99 const gfx::Rect& render_pass_scissor); |
| 100 void SetScissorTestRectInDrawSpace(const DrawingFrame* frame, |
| 101 const gfx::Rect& draw_space_rect); |
| 102 |
| 103 static gfx::Size RenderPassTextureSize(const RenderPass* render_pass); |
| 104 |
| 105 void FlushPolygons(ScopedPtrDeque<DrawPolygon>* poly_list, |
| 106 DrawingFrame* frame, |
| 107 const gfx::Rect& render_pass_scissor, |
| 108 bool use_render_pass_scissor); |
| 109 void DrawRenderPass(DrawingFrame* frame, const RenderPass* render_pass); |
| 110 bool UseRenderPass(DrawingFrame* frame, const RenderPass* render_pass); |
| 111 |
| 112 virtual void BindFramebufferToOutputSurface(DrawingFrame* frame) = 0; |
| 113 virtual bool BindFramebufferToTexture(DrawingFrame* frame, |
| 114 const ScopedResource* resource, |
| 115 const gfx::Rect& target_rect) = 0; |
| 116 virtual void SetDrawViewport(const gfx::Rect& window_space_viewport) = 0; |
| 117 virtual void SetScissorTestRect(const gfx::Rect& scissor_rect) = 0; |
| 118 virtual void PrepareSurfaceForPass( |
| 119 DrawingFrame* frame, |
| 120 SurfaceInitializationMode initialization_mode, |
| 121 const gfx::Rect& render_pass_scissor) = 0; |
| 122 // clip_region is a (possibly null) pointer to a quad in the same |
| 123 // space as the quad. When non-null only the area of the quad that overlaps |
| 124 // with clip_region will be drawn. |
| 125 virtual void DoDrawQuad(DrawingFrame* frame, |
| 126 const DrawQuad* quad, |
| 127 const gfx::QuadF* clip_region) = 0; |
| 128 virtual void BeginDrawingFrame(DrawingFrame* frame) = 0; |
| 129 virtual void FinishDrawingFrame(DrawingFrame* frame) = 0; |
| 130 virtual void FinishDrawingQuadList(); |
| 131 virtual bool FlippedFramebuffer(const DrawingFrame* frame) const = 0; |
| 132 virtual void EnsureScissorTestEnabled() = 0; |
| 133 virtual void EnsureScissorTestDisabled() = 0; |
| 134 virtual void DiscardBackbuffer() {} |
| 135 virtual void EnsureBackbuffer() {} |
| 136 |
| 137 virtual void CopyCurrentRenderPassToBitmap( |
| 138 DrawingFrame* frame, |
| 139 scoped_ptr<CopyOutputRequest> request) = 0; |
| 140 |
| 141 base::ScopedPtrHashMap<RenderPassId, scoped_ptr<ScopedResource>> render_pass_t
extures_; |
| 142 OutputSurface* output_surface_; |
| 143 ResourceProvider* resource_provider_; |
| 144 scoped_ptr<OverlayProcessor> overlay_processor_; |
| 145 |
| 146 // For use in coordinate conversion, this stores the output rect, viewport |
| 147 // rect (= unflipped version of glViewport rect), and the size of target |
| 148 // framebuffer. During a draw, this stores the values for the current render |
| 149 // pass; in between draws, they retain the values for the root render pass of |
| 150 // the last draw. |
| 151 gfx::Rect current_draw_rect_; |
| 152 gfx::Rect current_viewport_rect_; |
| 153 gfx::Size current_surface_size_; |
| 154 |
| 155 private: |
| 156 gfx::Vector2d enlarge_pass_texture_amount_; |
| 157 |
| 158 DISALLOW_COPY_AND_ASSIGN(DirectRenderer); |
| 159 }; |
| 160 |
| 161 } // namespace cc |
| 162 |
| 163 #endif // CC_OUTPUT_DIRECT_RENDERER_H_ |
OLD | NEW |