Mir
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
gl_renderer.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2012 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
17  */
18 
19 #ifndef MIR_COMPOSITOR_GL_RENDERER_H_
20 #define MIR_COMPOSITOR_GL_RENDERER_H_
21 
23 #include <mir/geometry/rectangle.h>
24 #include <mir/graphics/buffer_id.h>
25 #include <GLES2/gl2.h>
26 #include <unordered_map>
27 #include <vector>
28 
29 namespace mir
30 {
31 namespace compositor
32 {
33 
34 class GLRenderer : public Renderer
35 {
36 public:
37  GLRenderer(geometry::Rectangle const& display_area);
38  virtual ~GLRenderer() noexcept;
39 
40  // These are called with a valid GL context:
41  void set_viewport(geometry::Rectangle const& rect) override;
42  void set_rotation(float degrees) override;
43  void begin() const override;
44  void render(graphics::Renderable const& renderable,
45  graphics::Buffer& buffer) const override;
46  void end() const override;
47 
48  // This is called _without_ a GL context:
49  void suspend() override;
50 
51  struct Vertex
52  {
53  GLfloat position[3];
54  GLfloat texcoord[2];
55  };
56 
57  struct Primitive
58  {
59  GLenum type; // GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES etc
60  GLuint tex_id; // GL texture ID (or 0 to represent the surface itself)
61  std::vector<Vertex> vertices;
62  };
63 
85  virtual void tessellate(std::vector<Primitive>& primitives,
86  graphics::Renderable const& renderable,
87  geometry::Size const& buf_size) const;
88 
95  virtual GLuint load_texture(graphics::Renderable const& renderable,
96  graphics::Buffer& buffer) const;
97 
98 private:
99  GLuint vertex_shader;
100  GLuint fragment_shader;
101  GLuint program;
102  GLuint position_attr_loc;
103  GLuint texcoord_attr_loc;
104  GLuint centre_uniform_loc;
105  GLuint display_transform_uniform_loc;
106  GLuint transform_uniform_loc;
107  GLuint alpha_uniform_loc;
108  float rotation;
109 
110  geometry::Rectangle viewport;
111 
112  typedef graphics::Renderable const* SurfaceID;
113  struct Texture
114  {
115  GLuint id = 0;
116  graphics::BufferID origin;
117  bool used;
118  };
119  mutable std::unordered_map<SurfaceID, Texture> textures;
120  mutable bool skipped = false;
121 
122 };
123 
124 }
125 }
126 
127 #endif // MIR_COMPOSITOR_GL_RENDERER_H_
Definition: size.h:30
GLenum type
Definition: gl_renderer.h:59
Definition: gl_renderer.h:57
void render(graphics::Renderable const &renderable, graphics::Buffer &buffer) const override
Definition: gl_renderer.cpp:214
GLRenderer(geometry::Rectangle const &display_area)
Definition: gl_renderer.cpp:94
Definition: buffer_id.h:27
Definition: renderer.h:34
GLfloat position[3]
Definition: gl_renderer.h:53
virtual void tessellate(std::vector< Primitive > &primitives, graphics::Renderable const &renderable, geometry::Size const &buf_size) const
tessellate defines the list of triangles that will be used to render the surface. ...
Definition: gl_renderer.cpp:186
Definition: gl_renderer.h:34
std::vector< Vertex > vertices
Definition: gl_renderer.h:61
Definition: renderable.h:33
GLfloat texcoord[2]
Definition: gl_renderer.h:54
void set_rotation(float degrees) override
Definition: gl_renderer.cpp:344
void set_viewport(geometry::Rectangle const &rect) override
Definition: gl_renderer.cpp:300
void suspend() override
Definition: gl_renderer.cpp:388
Definition: gl_renderer.h:51
virtual ~GLRenderer() noexcept
Definition: gl_renderer.cpp:174
Definition: rectangle.h:33
void end() const override
Definition: gl_renderer.cpp:368
Definition: buffer.h:34
virtual GLuint load_texture(graphics::Renderable const &renderable, graphics::Buffer &buffer) const
Load the texture for a surface any which way you like.
Definition: gl_renderer.cpp:271
GLuint tex_id
Definition: gl_renderer.h:60
void begin() const override
Definition: gl_renderer.cpp:363

Copyright © 2012,2013 Canonical Ltd.
Generated on Fri Apr 11 21:14:53 UTC 2014