// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Whole-tree processing that's likely to be helpful in multiple render models.

#ifndef GPU_TOOLS_COMPOSITOR_MODEL_BENCH_RENDER_MODEL_UTILS_H_
#define GPU_TOOLS_COMPOSITOR_MODEL_BENCH_RENDER_MODEL_UTILS_H_

#include <stdint.h>

#include <map>
#include <memory>
#include <set>
#include <vector>

#include "base/compiler_specific.h"
#include "gpu/tools/compositor_model_bench/render_tree.h"

// This is a visitor that runs over the tree structure that was built from the
// configuration file. It creates OpenGL textures (random checkerboards) that
// match the specifications of the original textures and overwrites the old
// texture ID's in the tree, replacing them with the matching new textures.
class TextureGenerator : public RenderNodeVisitor {
 public:
  typedef std::unique_ptr<uint8_t[]> ImagePtr;
  typedef std::vector<Tile>::iterator tile_iter;

  explicit TextureGenerator(RenderNode* root);
  ~TextureGenerator() override;

  // RenderNodeVisitor functions look for textures and pass them
  // off to HandleTexture (which behaves appropriately depending
  // on which pass we are in.)
  void BeginVisitRenderNode(RenderNode* node) override;
  void BeginVisitCCNode(CCNode* node) override;

 private:
  enum TextureGenStage {
    DiscoveryStage,
    RemappingStage,
    ImageGenerationStage
  };

  void DiscoverInputIDs(RenderNode* root);
  void GenerateGLTexIDs();
  void AssignIDMapping();
  void WriteOutNewIDs(RenderNode* root);
  void AllocateImageArray();
  void BuildTextureImages(RenderNode* root);
  void HandleTexture(int* texID, int width, int height, GLenum format);
  void GenerateImageForTexture(int texID, int width, int height, GLenum format);

  TextureGenStage stage_;
  std::set<int> discovered_ids_;
  std::unique_ptr<GLuint[]> tex_ids_;
  std::map<int, int> remapped_ids_;
  std::unique_ptr<ImagePtr[]> image_data_;
  int images_generated_;
  std::set<int> ids_for_completed_textures_;
};

#endif  // GPU_TOOLS_COMPOSITOR_MODEL_BENCH_RENDER_MODEL_UTILS_H_

