15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/tools/compositor_model_bench/forward_render_model.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstdlib> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/tools/compositor_model_bench/render_model_utils.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::vector; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ForwardRenderNodeVisitor : public RenderNodeVisitor { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForwardRenderNodeVisitor() {} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BeginVisitRenderNode(RenderNode* v) OVERRIDE { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BeginVisitCCNode(CCNode* v) OVERRIDE { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!v->drawsContent()) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigAndActivateShaderForNode(v); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawQuad(v->width(), v->height()); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BeginVisitContentLayerNode(ContentLayerNode* l) OVERRIDE { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!l->drawsContent()) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigAndActivateShaderForTiling(l); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that we capture root layer tiles, a layer without tiles 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should not get drawn. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t n = 0; n < l->num_tiles(); ++n) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Tile* i = l->tile(n); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawTileQuad(i->texID, i->x, i->y); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ForwardRenderSimulator::ForwardRenderSimulator(RenderNode* root, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_width, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int window_height) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : RenderModelSimulator(root) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textures_.reset(new TextureGenerator(root)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor_.reset(new ForwardRenderNodeVisitor()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glViewport(0, 0, window_width, window_height); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDisable(GL_DEPTH_TEST); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDisable(GL_CULL_FACE); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnable(GL_BLEND); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ForwardRenderSimulator::~ForwardRenderSimulator() { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ForwardRenderSimulator::Update() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(0, 0, 1, 1); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glColorMask(true, true, true, true); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glColorMask(true, true, true, false); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BeginFrame(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_->Accept(visitor_.get()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ForwardRenderSimulator::Resize(int width, int height) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glViewport(0, 0, width, height); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71