render_pass.h revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_QUADS_RENDER_PASS_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_QUADS_RENDER_PASS_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <utility> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/scoped_ptr_hash_map.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/scoped_ptr_vector.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_f.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace base { 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Value; 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DrawQuad; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CopyOutputRequest; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SharedQuadState; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A list of DrawQuad objects, sorted internally in front-to-back order. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuadList : public ScopedPtrVector<DrawQuad> { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef reverse_iterator BackToFrontIterator; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef const_reverse_iterator ConstBackToFrontIterator; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline BackToFrontIterator BackToFrontBegin() { return rbegin(); } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline BackToFrontIterator BackToFrontEnd() { return rend(); } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline ConstBackToFrontIterator BackToFrontBegin() const { return rbegin(); } 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline ConstBackToFrontIterator BackToFrontEnd() const { return rend(); } 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef ScopedPtrVector<SharedQuadState> SharedQuadStateList; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT RenderPass { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Id { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int layer_id; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Id(int layer_id, int index) : layer_id(layer_id), index(index) {} 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void* AsTracingId() const; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator==(const Id& other) const { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_id == other.layer_id && index == other.index; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator!=(const Id& other) const { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !(*this == other); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator<(const Id& other) const { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_id < other.layer_id || 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (layer_id == other.layer_id && index < other.index); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~RenderPass(); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<RenderPass> Create(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A shallow copy of the render pass, which does not include its quads. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> Copy(Id new_id) const; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetNew(Id id, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF damage_rect, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& transform_to_root_target); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetAll(Id id, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF damage_rect, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& transform_to_root_target, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_transparent_background, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_occlusion_from_outside_target_surface); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<base::Value> AsValue() const; 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Uniquely identifies the render pass in the compositor's current frame. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Id id; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These are in the space of the render pass' physical pixels. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF damage_rect; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Transforms from the origin of the |output_rect| to the origin of the root 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // render pass' |output_rect|. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform_to_root_target; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If false, the pixels in the render pass' texture are all opaque. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_transparent_background; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If true, then there may be pixels in the render pass' texture that are not 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // complete, since they are occluded. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_occlusion_from_outside_target_surface; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If non-empty, the renderer should produce a copy of the render pass' 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // contents as a bitmap, and give a copy of the bitmap to each callback in 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this list. This property should not be serialized between compositors, as 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // it only makes sense in the root compositor. 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedPtrVector<CopyOutputRequest> copy_requests; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuadList quad_list; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SharedQuadStateList shared_quad_state_list; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RenderPass); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace BASE_HASH_NAMESPACE { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(COMPILER_MSVC) 127bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochinline size_t hash_value(const cc::RenderPass::Id& key) { 128bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return base::HashPair(key.layer_id, key.index); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(COMPILER_GCC) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<> 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct hash<cc::RenderPass::Id> { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t operator()(cc::RenderPass::Id key) const { 134bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return base::HashPair(key.layer_id, key.index); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#error define a hash function for your compiler 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // COMPILER 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace BASE_HASH_NAMESPACE 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef ScopedPtrVector<RenderPass> RenderPassList; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef base::hash_map<RenderPass::Id, RenderPass*> RenderPassIdHashMap; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_QUADS_RENDER_PASS_H_ 148