1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Data structures for representing parts of Chromium's composited layer tree 6 // and a function to load it from the JSON configuration file 7 8 #ifndef GPU_TOOLS_COMPOSITOR_MODEL_BENCH_RENDER_TREE_H_ 9 #define GPU_TOOLS_COMPOSITOR_MODEL_BENCH_RENDER_TREE_H_ 10 11 #include <string> 12 #include <vector> 13 14 #include "base/compiler_specific.h" 15 #include "base/memory/scoped_vector.h" 16 #include "gpu/tools/compositor_model_bench/shaders.h" 17 #include "ui/gl/gl_bindings.h" 18 #include "ui/gl/gl_implementation.h" 19 20 // These are fairly arbitrary values based on how big my actual browser 21 // window was. 22 const int WINDOW_WIDTH = 1609; 23 const int WINDOW_HEIGHT = 993; 24 25 struct Tile { 26 int x; 27 int y; 28 int texID; 29 }; 30 31 struct Texture { 32 int texID; 33 int height; 34 int width; 35 GLenum format; 36 }; 37 38 GLenum TextureFormatFromString(std::string format); 39 const char* TextureFormatName(GLenum format); 40 int FormatBytesPerPixel(GLenum format); 41 42 class RenderNodeVisitor; 43 44 class RenderNode { 45 public: 46 RenderNode(); 47 virtual ~RenderNode(); 48 virtual void Accept(RenderNodeVisitor* v); 49 layerID()50 int layerID() { 51 return layerID_; 52 } 53 set_layerID(int id)54 void set_layerID(int id) { 55 layerID_ = id; 56 } 57 width()58 int width() { 59 return width_; 60 } 61 set_width(int width)62 void set_width(int width) { 63 width_ = width; 64 } 65 height()66 int height() { 67 return height_; 68 } 69 set_height(int height)70 void set_height(int height) { 71 height_ = height; 72 } 73 drawsContent()74 bool drawsContent() { 75 return drawsContent_; 76 } 77 set_drawsContent(bool draws)78 void set_drawsContent(bool draws) { 79 drawsContent_ = draws; 80 } 81 set_targetSurface(int surface)82 void set_targetSurface(int surface) { 83 targetSurface_ = surface; 84 } 85 transform()86 float* transform() { 87 return transform_; 88 } 89 set_transform(float * mat)90 void set_transform(float* mat) { 91 memcpy(reinterpret_cast<void*>(transform_), 92 reinterpret_cast<void*>(mat), 93 16 * sizeof(transform_[0])); 94 } 95 add_tile(Tile t)96 void add_tile(Tile t) { 97 tiles_.push_back(t); 98 } 99 num_tiles()100 size_t num_tiles() { 101 return tiles_.size(); 102 } 103 tile(size_t index)104 Tile* tile(size_t index) { 105 return &tiles_[index]; 106 } 107 tile_width()108 int tile_width() { 109 return tile_width_; 110 } 111 set_tile_width(int width)112 void set_tile_width(int width) { 113 tile_width_ = width; 114 } 115 tile_height()116 int tile_height() { 117 return tile_height_; 118 } 119 set_tile_height(int height)120 void set_tile_height(int height) { 121 tile_height_ = height; 122 } 123 124 private: 125 int layerID_; 126 int width_; 127 int height_; 128 bool drawsContent_; 129 int targetSurface_; 130 float transform_[16]; 131 std::vector<Tile> tiles_; 132 int tile_width_; 133 int tile_height_; 134 }; 135 136 class ContentLayerNode : public RenderNode { 137 public: 138 ContentLayerNode(); 139 virtual ~ContentLayerNode(); 140 virtual void Accept(RenderNodeVisitor* v) OVERRIDE; 141 set_skipsDraw(bool skips)142 void set_skipsDraw(bool skips) { 143 skipsDraw_ = skips; 144 } 145 add_child(RenderNode * child)146 void add_child(RenderNode* child) { 147 children_.push_back(child); 148 } 149 150 private: 151 ScopedVector<RenderNode> children_; 152 bool skipsDraw_; 153 }; 154 155 class CCNode : public RenderNode { 156 public: 157 CCNode(); 158 virtual ~CCNode(); 159 160 virtual void Accept(RenderNodeVisitor* v) OVERRIDE; 161 vertex_shader()162 ShaderID vertex_shader() { 163 return vertex_shader_; 164 } 165 set_vertex_shader(ShaderID shader)166 void set_vertex_shader(ShaderID shader) { 167 vertex_shader_ = shader; 168 } 169 fragment_shader()170 ShaderID fragment_shader() { 171 return fragment_shader_; 172 } 173 set_fragment_shader(ShaderID shader)174 void set_fragment_shader(ShaderID shader) { 175 fragment_shader_ = shader; 176 } 177 add_texture(Texture t)178 void add_texture(Texture t) { 179 textures_.push_back(t); 180 } 181 num_textures()182 size_t num_textures() { 183 return textures_.size(); 184 } 185 texture(size_t index)186 Texture* texture(size_t index) { 187 return &textures_[index]; 188 } 189 190 private: 191 ShaderID vertex_shader_; 192 ShaderID fragment_shader_; 193 std::vector<Texture> textures_; 194 }; 195 196 class RenderNodeVisitor { 197 public: 198 virtual ~RenderNodeVisitor(); 199 200 virtual void BeginVisitRenderNode(RenderNode* v) = 0; 201 virtual void BeginVisitContentLayerNode(ContentLayerNode* v); 202 virtual void BeginVisitCCNode(CCNode* v); 203 virtual void EndVisitRenderNode(RenderNode* v); 204 virtual void EndVisitContentLayerNode(ContentLayerNode* v); 205 virtual void EndVisitCCNode(CCNode* v); 206 }; 207 208 RenderNode* BuildRenderTreeFromFile(const base::FilePath& path); 209 210 #endif // GPU_TOOLS_COMPOSITOR_MODEL_BENCH_RENDER_TREE_H_ 211 212