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