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)#include "cc/quads/render_pass.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/values.h" 84311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "cc/base/math_util.h" 94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "cc/debug/traced_value.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/draw_quad.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid* RenderPass::Id::AsTracingId() const { 174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch COMPILE_ASSERT(sizeof(size_t) <= sizeof(void*), size_t_bigger_than_pointer); 184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return reinterpret_cast<void*>(base::HashPair(layer_id, index)); 194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<RenderPass> RenderPass::Create() { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new RenderPass); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderPass::RenderPass() 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id(Id(-1, -1)), 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_transparent_background(true), 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) has_occlusion_from_outside_target_surface(false) {} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochRenderPass::~RenderPass() { 314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_EVENT_OBJECT_DELETED_WITH_ID( 324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), 334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch "cc::RenderPass", id.AsTracingId()); 344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<RenderPass> RenderPass::Copy(Id new_id) const { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> copy_pass(Create()); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_pass->SetAll(new_id, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_rect, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform_to_root_target, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_transparent_background, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_occlusion_from_outside_target_surface); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return copy_pass.Pass(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderPass::SetNew(Id id, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF damage_rect, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& transform_to_root_target) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GT(id.layer_id, 0); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(id.index, 0); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->id = id; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->output_rect = output_rect; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->damage_rect = damage_rect; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->transform_to_root_target = transform_to_root_target; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(quad_list.empty()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(shared_quad_state_list.empty()); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderPass::SetAll(Id id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect output_rect, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF damage_rect, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& transform_to_root_target, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_transparent_background, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_occlusion_from_outside_target_surface) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GT(id.layer_id, 0); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(id.index, 0); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->id = id; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->output_rect = output_rect; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->damage_rect = damage_rect; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->transform_to_root_target = transform_to_root_target; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->has_transparent_background = has_transparent_background; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->has_occlusion_from_outside_target_surface = 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_occlusion_from_outside_target_surface; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(quad_list.empty()); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(shared_quad_state_list.empty()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochscoped_ptr<base::Value> RenderPass::AsValue() const { 854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("output_rect", MathUtil::AsValue(output_rect).release()); 874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("damage_rect", MathUtil::AsValue(damage_rect).release()); 884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("has_transparent_background", has_transparent_background); 894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetBoolean("has_occlusion_from_outside_target_surface", 904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch has_occlusion_from_outside_target_surface); 914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->SetInteger("copy_requests", copy_requests.size()); 924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::ListValue> shared_states_value(new base::ListValue()); 934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch for (size_t i = 0; i < shared_quad_state_list.size(); ++i) { 944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shared_states_value->Append(shared_quad_state_list[i]->AsValue().release()); 954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("shared_quad_state_list", shared_states_value.release()); 974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::ListValue> quad_list_value(new base::ListValue()); 984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch for (size_t i = 0; i < quad_list.size(); ++i) { 994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch quad_list_value->Append(quad_list[i]->AsValue().release()); 1004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 1014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value->Set("quad_list", quad_list_value.release()); 1024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TracedValue::MakeDictIntoImplicitSnapshotWithCategory( 1044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), 1054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch value.get(), "cc::RenderPass", id.AsTracingId()); 1064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return value.PassAs<base::Value>(); 1074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 1084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 110