1 #ifndef MSP_GL_RENDERER_H_
2 #define MSP_GL_RENDERER_H_
9 #include "programdata.h"
10 #include "renderer_backend.h"
35 Rendering supervisor. This is the primary interface for setting state and
36 issuing draw commands.
38 The Renderer class allows setting textures and uniform values by names (using
39 ProgramData for the latter). The names are resolved into binding points when
40 the resources are needed for a draw command.
42 A state stack is provided to help with state management in render graphs.
43 Renderables can save the state by pushing it on the stack before beginning
44 their work, and pop it afterwards to restore it without disturbing state set
47 class Renderer: public RendererBackend
49 friend RendererBackend;
53 RAII helper class for pushing state on the stack.
61 Push(Renderer &r): renderer(r) { renderer.push_state(); }
62 ~Push() { renderer.pop_state(); }
69 mutable int binding = -1;
70 const Texture *texture = 0;
71 const Sampler *sampler = 0;
76 struct BoundProgramData
78 const ProgramData *shdata;
79 mutable unsigned generation = 0;
81 BoundProgramData(const ProgramData *);
86 std::uintptr_t pipeline_key = 0;
87 const Camera *camera = 0;
89 const Framebuffer *framebuffer = 0;
90 const Rect *viewport = 0;
91 const Rect *scissor = 0;
92 unsigned texture_count = 0;
93 const Program *shprog = 0;
94 unsigned shdata_count = 0;
95 const VertexSetup *vertex_setup = 0;
96 FaceWinding front_face = NON_MANIFOLD;
97 CullMode face_cull = NO_CULL;
98 const DepthTest *depth_test = 0;
99 const StencilTest *stencil_test = 0;
100 const Blend *blend = 0;
101 unsigned object_lod_bias = 0;
112 unsigned frame_index = 0;
113 unsigned char changed = 0;
114 std::vector<State> state_stack;
115 State *current_state = 0;
116 ProgramData standard_shdata;
117 std::vector<BoundProgramData> shdata_stack;
118 std::vector<BoundTexture> texture_stack;
119 const Texture &placeholder_texture;
120 const Sampler &default_sampler;
121 PipelineState *last_pipeline = 0;
124 static const Tag world_obj_matrix_tag;
125 static const Tag world_obj_normal_matrix_tag;
130 /** Begins rendering, allowing commands to be issued. */
133 /** Ends rendering. Any global state is reset to defaults. No further
134 commands are allowed before the next call to begin(). */
137 using RendererBackend::begin;
138 using RendererBackend::end;
140 /** Saves the current state so it can be restored later. */
143 /** Restores a previously saved state. Must be matched with an earlier
148 State &get_state() const;
151 void set_pipeline_key(std::uintptr_t);
152 void set_pipeline_key(const void *p) { set_pipeline_key(reinterpret_cast<uintptr_t>(p)); }
155 void set_pipeline_key(std::uintptr_t k, T d)
156 { set_pipeline_key(k^(static_cast<uintptr_t>(d)<<((sizeof(std::uintptr_t)-sizeof(T))*std::numeric_limits<char>::digits))); }
159 void set_pipeline_key(const void *p, T d) { set_pipeline_key(reinterpret_cast<uintptr_t>(p), d); }
161 /** Sets the camera to render from. The model matrix is reset to identity. */
162 void set_camera(const Camera &);
164 const Camera *get_camera() const { return get_state().camera; }
166 /** Replaces the Renderer's model matrix. */
167 void set_matrix(const Matrix &);
169 /** Returns the current model matrix. */
170 const Matrix &get_matrix() const { return get_state().model_matrix; }
172 void set_framebuffer(const Framebuffer *);
173 void set_viewport(const Rect *);
174 void set_scissor(const Rect *);
176 const Framebuffer *get_framebuffer() const { return get_state().framebuffer; }
178 /** Sets the shader program to use. As a convenience, uniform values may be
179 specified at the same time. */
180 void set_shader_program(const Program *prog, const ProgramData *data = 0);
182 /** Adds uniform values, which will be available for shader programs. If
183 multiple ProgramData objects with the same uniforms are added, the one added
184 last will be used. */
185 void add_shader_data(const ProgramData &data);
187 void set_texture(Tag, const Texture *, const Sampler * = 0);
188 void set_texture(Tag, const Texture *, int, const Sampler * = 0);
191 void flush_shader_data();
192 void flush_textures();
195 void set_vertex_setup(const VertexSetup *);
196 void set_front_face(FaceWinding);
197 void set_face_cull(CullMode);
199 void set_depth_test(const DepthTest *);
200 void set_stencil_test(const StencilTest *);
201 void set_blend(const Blend *);
203 void set_object_lod_bias(unsigned);
204 unsigned get_object_lod_bias() const { return get_state().object_lod_bias; }
206 /** Clears framebuffer contents. If values is not null, it must contain one
207 element for each attachment. Otherwise the framebuffer contents are
208 discarded and become undefined. */
209 void clear(const ClearValue *values);
211 /** Draws a batch of primitives. A shader must be active. */
212 void draw(const Batch &);
214 /** Draws multiple instances of a batch of primitives. A shader must be active. */
215 void draw_instanced(const Batch &, unsigned);
217 /** Resolves multisample attachments from the active framebuffer into
219 void resolve_multisample(Framebuffer &target);
221 void begin_query(const QueryPool &, unsigned);
222 void end_query(const QueryPool &, unsigned);
225 PipelineState &get_pipeline_state();
226 void apply_framebuffer();