| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 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 CC_OUTPUT_DIRECT_RENDERER_H_ | 5 #ifndef CC_OUTPUT_DIRECT_RENDERER_H_ |
| 6 #define CC_OUTPUT_DIRECT_RENDERER_H_ | 6 #define CC_OUTPUT_DIRECT_RENDERER_H_ |
| 7 | 7 |
| 8 #include <memory> |
| 8 #include <unordered_map> | 9 #include <unordered_map> |
| 9 | 10 |
| 10 #include "base/callback.h" | 11 #include "base/callback.h" |
| 11 #include "base/macros.h" | 12 #include "base/macros.h" |
| 12 #include "cc/base/cc_export.h" | 13 #include "cc/base/cc_export.h" |
| 13 #include "cc/output/ca_layer_overlay.h" | 14 #include "cc/output/ca_layer_overlay.h" |
| 15 #include "cc/output/compositor_frame_metadata.h" |
| 14 #include "cc/output/overlay_processor.h" | 16 #include "cc/output/overlay_processor.h" |
| 15 #include "cc/output/renderer.h" | 17 #include "cc/output/renderer_capabilities_impl.h" |
| 16 #include "cc/quads/tile_draw_quad.h" | 18 #include "cc/quads/tile_draw_quad.h" |
| 17 #include "cc/resources/resource_provider.h" | 19 #include "cc/resources/resource_provider.h" |
| 18 #include "cc/resources/scoped_resource.h" | |
| 19 #include "gpu/command_buffer/common/texture_in_use_response.h" | 20 #include "gpu/command_buffer/common/texture_in_use_response.h" |
| 20 #include "ui/gfx/geometry/quad_f.h" | 21 #include "ui/gfx/geometry/quad_f.h" |
| 22 #include "ui/gfx/geometry/rect.h" |
| 23 |
| 24 namespace gfx { |
| 25 class ColorSpace; |
| 26 } |
| 21 | 27 |
| 22 namespace cc { | 28 namespace cc { |
| 23 class DrawPolygon; | 29 class DrawPolygon; |
| 30 class OutputSurface; |
| 31 class RenderPass; |
| 32 class RenderPassId; |
| 33 class RendererSettings; |
| 24 class ResourceProvider; | 34 class ResourceProvider; |
| 35 class ScopedResource; |
| 25 | 36 |
| 26 // This is the base class for code shared between the GL and software | 37 // This is the base class for code shared between the GL and software |
| 27 // renderer implementations. "Direct" refers to the fact that it does not | 38 // renderer implementations. "Direct" refers to the fact that it does not |
| 28 // delegate rendering to another compositor. | 39 // delegate rendering to another compositor (see historical DelegatingRenderer |
| 29 class CC_EXPORT DirectRenderer : public Renderer { | 40 // for reference). |
| 41 class CC_EXPORT DirectRenderer { |
| 30 public: | 42 public: |
| 31 ~DirectRenderer() override; | 43 DirectRenderer(const RendererSettings* settings, |
| 44 OutputSurface* output_surface, |
| 45 ResourceProvider* resource_provider); |
| 46 virtual ~DirectRenderer(); |
| 32 | 47 |
| 48 void SetVisible(bool visible); |
| 33 void DecideRenderPassAllocationsForFrame( | 49 void DecideRenderPassAllocationsForFrame( |
| 34 const RenderPassList& render_passes_in_draw_order) override; | 50 const RenderPassList& render_passes_in_draw_order); |
| 35 bool HasAllocatedResourcesForTesting(RenderPassId id) const override; | 51 bool HasAllocatedResourcesForTesting(RenderPassId id) const; |
| 36 void DrawFrame(RenderPassList* render_passes_in_draw_order, | 52 void DrawFrame(RenderPassList* render_passes_in_draw_order, |
| 37 float device_scale_factor, | 53 float device_scale_factor, |
| 38 const gfx::ColorSpace& device_color_space, | 54 const gfx::ColorSpace& device_color_space, |
| 39 const gfx::Rect& device_viewport_rect, | 55 const gfx::Rect& device_viewport_rect, |
| 40 const gfx::Rect& device_clip_rect) override; | 56 const gfx::Rect& device_clip_rect); |
| 57 |
| 58 // Public interface implemented by subclasses. |
| 59 virtual const RendererCapabilitiesImpl& Capabilities() const = 0; |
| 60 virtual void SwapBuffers(CompositorFrameMetadata metadata) = 0; |
| 41 virtual void SwapBuffersComplete() {} | 61 virtual void SwapBuffersComplete() {} |
| 42 virtual void DidReceiveTextureInUseResponses( | 62 virtual void DidReceiveTextureInUseResponses( |
| 43 const gpu::TextureInUseResponses& responses) {} | 63 const gpu::TextureInUseResponses& responses) {} |
| 44 | 64 |
| 45 // If a pass contains a single tile draw quad and can be drawn without | 65 // Allow tests to enlarge the texture size of non-root render passes to |
| 46 // a render pass (e.g. applying a filter directly to the tile quad) | 66 // verify cases where the texture doesn't match the render pass size. |
| 47 // return that quad, otherwise return null. | 67 void SetEnlargePassTextureAmountForTesting(const gfx::Size& amount) { |
| 48 virtual const TileDrawQuad* CanPassBeDrawnDirectly(const RenderPass* pass); | 68 enlarge_pass_texture_amount_ = amount; |
| 69 } |
| 49 | 70 |
| 71 // Public for tests that poke at internals. |
| 50 struct CC_EXPORT DrawingFrame { | 72 struct CC_EXPORT DrawingFrame { |
| 51 DrawingFrame(); | 73 DrawingFrame(); |
| 52 ~DrawingFrame(); | 74 ~DrawingFrame(); |
| 53 | 75 |
| 54 const RenderPassList* render_passes_in_draw_order; | 76 const RenderPassList* render_passes_in_draw_order = nullptr; |
| 55 const RenderPass* root_render_pass; | 77 const RenderPass* root_render_pass = nullptr; |
| 56 const RenderPass* current_render_pass; | 78 const RenderPass* current_render_pass = nullptr; |
| 57 const ScopedResource* current_texture; | 79 const ScopedResource* current_texture = nullptr; |
| 58 | 80 |
| 59 gfx::Rect root_damage_rect; | 81 gfx::Rect root_damage_rect; |
| 60 gfx::Rect device_viewport_rect; | 82 gfx::Rect device_viewport_rect; |
| 61 gfx::Rect device_clip_rect; | 83 gfx::Rect device_clip_rect; |
| 62 | 84 |
| 63 gfx::Transform projection_matrix; | 85 gfx::Transform projection_matrix; |
| 64 gfx::Transform window_matrix; | 86 gfx::Transform window_matrix; |
| 65 | 87 |
| 66 OverlayCandidateList overlay_list; | 88 OverlayCandidateList overlay_list; |
| 67 CALayerOverlayList ca_layer_overlay_list; | 89 CALayerOverlayList ca_layer_overlay_list; |
| 68 }; | 90 }; |
| 69 | 91 |
| 70 // Allow tests to enlarge the texture size of non-root render passes to | 92 protected: |
| 71 // verify cases where the texture doesn't match the render pass size. | 93 friend class BspWalkActionDrawPolygon; |
| 72 void SetEnlargePassTextureAmount(const gfx::Size& amount) { | |
| 73 enlarge_pass_texture_amount_ = amount; | |
| 74 } | |
| 75 | 94 |
| 76 void DoDrawPolygon(const DrawPolygon& poly, | |
| 77 DrawingFrame* frame, | |
| 78 const gfx::Rect& render_pass_scissor, | |
| 79 bool use_render_pass_scissor); | |
| 80 | |
| 81 protected: | |
| 82 enum SurfaceInitializationMode { | 95 enum SurfaceInitializationMode { |
| 83 SURFACE_INITIALIZATION_MODE_PRESERVE, | 96 SURFACE_INITIALIZATION_MODE_PRESERVE, |
| 84 SURFACE_INITIALIZATION_MODE_SCISSORED_CLEAR, | 97 SURFACE_INITIALIZATION_MODE_SCISSORED_CLEAR, |
| 85 SURFACE_INITIALIZATION_MODE_FULL_SURFACE_CLEAR, | 98 SURFACE_INITIALIZATION_MODE_FULL_SURFACE_CLEAR, |
| 86 }; | 99 }; |
| 87 | 100 |
| 88 DirectRenderer(const RendererSettings* settings, | |
| 89 OutputSurface* output_surface, | |
| 90 ResourceProvider* resource_provider); | |
| 91 | |
| 92 static gfx::RectF QuadVertexRect(); | 101 static gfx::RectF QuadVertexRect(); |
| 93 static void QuadRectTransform(gfx::Transform* quad_rect_transform, | 102 static void QuadRectTransform(gfx::Transform* quad_rect_transform, |
| 94 const gfx::Transform& quad_transform, | 103 const gfx::Transform& quad_transform, |
| 95 const gfx::RectF& quad_rect); | 104 const gfx::RectF& quad_rect); |
| 96 void InitializeViewport(DrawingFrame* frame, | 105 void InitializeViewport(DrawingFrame* frame, |
| 97 const gfx::Rect& draw_rect, | 106 const gfx::Rect& draw_rect, |
| 98 const gfx::Rect& viewport_rect, | 107 const gfx::Rect& viewport_rect, |
| 99 const gfx::Size& surface_size); | 108 const gfx::Size& surface_size); |
| 100 gfx::Rect MoveFromDrawToWindowSpace(const DrawingFrame* frame, | 109 gfx::Rect MoveFromDrawToWindowSpace(const DrawingFrame* frame, |
| 101 const gfx::Rect& draw_rect) const; | 110 const gfx::Rect& draw_rect) const; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 118 | 127 |
| 119 void FlushPolygons(std::deque<std::unique_ptr<DrawPolygon>>* poly_list, | 128 void FlushPolygons(std::deque<std::unique_ptr<DrawPolygon>>* poly_list, |
| 120 DrawingFrame* frame, | 129 DrawingFrame* frame, |
| 121 const gfx::Rect& render_pass_scissor, | 130 const gfx::Rect& render_pass_scissor, |
| 122 bool use_render_pass_scissor); | 131 bool use_render_pass_scissor); |
| 123 void DrawRenderPassAndExecuteCopyRequests(DrawingFrame* frame, | 132 void DrawRenderPassAndExecuteCopyRequests(DrawingFrame* frame, |
| 124 RenderPass* render_pass); | 133 RenderPass* render_pass); |
| 125 void DrawRenderPass(DrawingFrame* frame, const RenderPass* render_pass); | 134 void DrawRenderPass(DrawingFrame* frame, const RenderPass* render_pass); |
| 126 bool UseRenderPass(DrawingFrame* frame, const RenderPass* render_pass); | 135 bool UseRenderPass(DrawingFrame* frame, const RenderPass* render_pass); |
| 127 | 136 |
| 137 void DoDrawPolygon(const DrawPolygon& poly, |
| 138 DrawingFrame* frame, |
| 139 const gfx::Rect& render_pass_scissor, |
| 140 bool use_render_pass_scissor); |
| 141 |
| 142 // Private interface implemented by subclasses for use by DirectRenderer. |
| 128 virtual void BindFramebufferToOutputSurface(DrawingFrame* frame) = 0; | 143 virtual void BindFramebufferToOutputSurface(DrawingFrame* frame) = 0; |
| 129 virtual bool BindFramebufferToTexture(DrawingFrame* frame, | 144 virtual bool BindFramebufferToTexture(DrawingFrame* frame, |
| 130 const ScopedResource* resource) = 0; | 145 const ScopedResource* resource) = 0; |
| 131 virtual void SetScissorTestRect(const gfx::Rect& scissor_rect) = 0; | 146 virtual void SetScissorTestRect(const gfx::Rect& scissor_rect) = 0; |
| 132 virtual void PrepareSurfaceForPass( | 147 virtual void PrepareSurfaceForPass( |
| 133 DrawingFrame* frame, | 148 DrawingFrame* frame, |
| 134 SurfaceInitializationMode initialization_mode, | 149 SurfaceInitializationMode initialization_mode, |
| 135 const gfx::Rect& render_pass_scissor) = 0; | 150 const gfx::Rect& render_pass_scissor) = 0; |
| 136 // clip_region is a (possibly null) pointer to a quad in the same | 151 // |clip_region| is a (possibly null) pointer to a quad in the same |
| 137 // space as the quad. When non-null only the area of the quad that overlaps | 152 // space as the quad. When non-null only the area of the quad that overlaps |
| 138 // with clip_region will be drawn. | 153 // with clip_region will be drawn. |
| 139 virtual void DoDrawQuad(DrawingFrame* frame, | 154 virtual void DoDrawQuad(DrawingFrame* frame, |
| 140 const DrawQuad* quad, | 155 const DrawQuad* quad, |
| 141 const gfx::QuadF* clip_region) = 0; | 156 const gfx::QuadF* clip_region) = 0; |
| 142 virtual void BeginDrawingFrame(DrawingFrame* frame) = 0; | 157 virtual void BeginDrawingFrame(DrawingFrame* frame) = 0; |
| 143 virtual void FinishDrawingFrame(DrawingFrame* frame) = 0; | 158 virtual void FinishDrawingFrame(DrawingFrame* frame) = 0; |
| 144 virtual void FinishDrawingQuadList(); | 159 // If a pass contains a single tile draw quad and can be drawn without |
| 160 // a render pass (e.g. applying a filter directly to the tile quad) |
| 161 // return that quad, otherwise return null. |
| 162 virtual const TileDrawQuad* CanPassBeDrawnDirectly(const RenderPass* pass); |
| 163 virtual void FinishDrawingQuadList() {} |
| 145 virtual bool FlippedFramebuffer(const DrawingFrame* frame) const = 0; | 164 virtual bool FlippedFramebuffer(const DrawingFrame* frame) const = 0; |
| 146 virtual void EnsureScissorTestEnabled() = 0; | 165 virtual void EnsureScissorTestEnabled() = 0; |
| 147 virtual void EnsureScissorTestDisabled() = 0; | 166 virtual void EnsureScissorTestDisabled() = 0; |
| 148 | 167 virtual void DidChangeVisibility() = 0; |
| 149 virtual void CopyCurrentRenderPassToBitmap( | 168 virtual void CopyCurrentRenderPassToBitmap( |
| 150 DrawingFrame* frame, | 169 DrawingFrame* frame, |
| 151 std::unique_ptr<CopyOutputRequest> request) = 0; | 170 std::unique_ptr<CopyOutputRequest> request) = 0; |
| 152 | 171 |
| 172 const RendererSettings* const settings_; |
| 173 OutputSurface* const output_surface_; |
| 174 ResourceProvider* const resource_provider_; |
| 175 // This can be replaced by test implementations. |
| 176 std::unique_ptr<OverlayProcessor> overlay_processor_; |
| 177 |
| 153 // TODO(danakj): Just use a vector of pairs here? Hash map is way overkill. | 178 // TODO(danakj): Just use a vector of pairs here? Hash map is way overkill. |
| 154 std::unordered_map<RenderPassId, | 179 std::unordered_map<RenderPassId, |
| 155 std::unique_ptr<ScopedResource>, | 180 std::unique_ptr<ScopedResource>, |
| 156 RenderPassIdHash> | 181 RenderPassIdHash> |
| 157 render_pass_textures_; | 182 render_pass_textures_; |
| 158 std::unordered_map<RenderPassId, TileDrawQuad, RenderPassIdHash> | 183 std::unordered_map<RenderPassId, TileDrawQuad, RenderPassIdHash> |
| 159 render_pass_bypass_quads_; | 184 render_pass_bypass_quads_; |
| 160 OutputSurface* output_surface_; | 185 |
| 161 ResourceProvider* resource_provider_; | 186 bool visible_; |
| 162 std::unique_ptr<OverlayProcessor> overlay_processor_; | |
| 163 | 187 |
| 164 // For use in coordinate conversion, this stores the output rect, viewport | 188 // For use in coordinate conversion, this stores the output rect, viewport |
| 165 // rect (= unflipped version of glViewport rect), the size of target | 189 // rect (= unflipped version of glViewport rect), the size of target |
| 166 // framebuffer, and the current window space viewport. During a draw, this | 190 // framebuffer, and the current window space viewport. During a draw, this |
| 167 // stores the values for the current render pass; in between draws, they | 191 // stores the values for the current render pass; in between draws, they |
| 168 // retain the values for the root render pass of the last draw. | 192 // retain the values for the root render pass of the last draw. |
| 169 gfx::Rect current_draw_rect_; | 193 gfx::Rect current_draw_rect_; |
| 170 gfx::Rect current_viewport_rect_; | 194 gfx::Rect current_viewport_rect_; |
| 171 gfx::Size current_surface_size_; | 195 gfx::Size current_surface_size_; |
| 172 gfx::Rect current_window_space_viewport_; | 196 gfx::Rect current_window_space_viewport_; |
| 173 | 197 |
| 174 private: | 198 private: |
| 175 gfx::Size enlarge_pass_texture_amount_; | 199 gfx::Size enlarge_pass_texture_amount_; |
| 176 | 200 |
| 177 DISALLOW_COPY_AND_ASSIGN(DirectRenderer); | 201 DISALLOW_COPY_AND_ASSIGN(DirectRenderer); |
| 178 }; | 202 }; |
| 179 | 203 |
| 180 } // namespace cc | 204 } // namespace cc |
| 181 | 205 |
| 182 #endif // CC_OUTPUT_DIRECT_RENDERER_H_ | 206 #endif // CC_OUTPUT_DIRECT_RENDERER_H_ |
| OLD | NEW |