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(); }
68 const Texture *texture = 0;
69 const Sampler *sampler = 0;
72 SampledTexture() = default;
73 SampledTexture(const Texture *t, const Sampler *s, int l): texture(t), sampler(s), level(l) { }
75 bool operator==(const SampledTexture &o) const { return texture==o.texture && sampler==o.sampler && level==o.level; }
82 mutable int binding = -1;
87 struct BoundProgramData
89 const ProgramData *shdata;
90 mutable unsigned generation = 0;
92 BoundProgramData(const ProgramData *);
97 std::uintptr_t pipeline_key = 0;
98 const Camera *camera = 0;
100 const Framebuffer *framebuffer = 0;
101 const Rect *viewport = 0;
102 const Rect *scissor = 0;
103 unsigned texture_count = 0;
104 const Program *shprog = 0;
105 unsigned shdata_count = 0;
106 const VertexSetup *vertex_setup = 0;
107 FaceWinding front_face = NON_MANIFOLD;
108 CullMode face_cull = NO_CULL;
109 const DepthTest *depth_test = 0;
110 const StencilTest *stencil_test = 0;
111 const Blend *blend = 0;
112 unsigned object_lod_bias = 0;
123 unsigned frame_index = 0;
124 unsigned char changed = 0;
125 std::vector<State> state_stack;
126 State *current_state = 0;
127 ProgramData standard_shdata;
128 std::vector<BoundProgramData> shdata_stack;
129 std::vector<BoundResource<SampledTexture>> texture_stack;
130 const Texture &placeholder_texture;
131 const Sampler &default_sampler;
132 PipelineState *last_pipeline = 0;
135 static const Tag world_obj_matrix_tag;
136 static const Tag world_obj_normal_matrix_tag;
141 /** Begins rendering, allowing commands to be issued. */
144 /** Ends rendering. Any global state is reset to defaults. No further
145 commands are allowed before the next call to begin(). */
148 using RendererBackend::begin;
149 using RendererBackend::end;
151 /** Saves the current state so it can be restored later. */
154 /** Restores a previously saved state. Must be matched with an earlier
155 push_state() call. */
159 State &get_state() const;
162 void set_pipeline_key(std::uintptr_t);
163 void set_pipeline_key(const void *p) { set_pipeline_key(reinterpret_cast<uintptr_t>(p)); }
166 void set_pipeline_key(std::uintptr_t k, T d)
167 { set_pipeline_key(k^(static_cast<uintptr_t>(d)<<((sizeof(std::uintptr_t)-sizeof(T))*std::numeric_limits<char>::digits))); }
170 void set_pipeline_key(const void *p, T d) { set_pipeline_key(reinterpret_cast<uintptr_t>(p), d); }
172 /** Sets the camera to render from. The model matrix is reset to identity. */
173 void set_camera(const Camera &);
175 const Camera *get_camera() const { return get_state().camera; }
177 /** Replaces the Renderer's model matrix. */
178 void set_matrix(const Matrix &);
180 /** Returns the current model matrix. */
181 const Matrix &get_matrix() const { return get_state().model_matrix; }
183 void set_framebuffer(const Framebuffer *);
184 void set_viewport(const Rect *);
185 void set_scissor(const Rect *);
187 const Framebuffer *get_framebuffer() const { return get_state().framebuffer; }
189 /** Sets the shader program to use. As a convenience, uniform values may be
190 specified at the same time. */
191 void set_shader_program(const Program *prog, const ProgramData *data = 0);
193 /** Adds uniform values, which will be available for shader programs. If
194 multiple ProgramData objects with the same uniforms are added, the one added
195 last will be used. */
196 void add_shader_data(const ProgramData &data);
198 void set_texture(Tag, const Texture *, const Sampler * = 0);
199 void set_texture(Tag, const Texture *, int, const Sampler * = 0);
200 void set_storage_texture(Tag, const Texture *);
204 static void set_resource(std::vector<BoundResource<T>> &, unsigned &, Tag, const T &);
206 void flush_shader_data();
209 static void flush_resources(std::vector<BoundResource<T>> &, unsigned &);
212 void set_vertex_setup(const VertexSetup *);
213 void set_front_face(FaceWinding);
214 void set_face_cull(CullMode);
216 void set_depth_test(const DepthTest *);
217 void set_stencil_test(const StencilTest *);
218 void set_blend(const Blend *);
220 void set_object_lod_bias(unsigned);
221 unsigned get_object_lod_bias() const { return get_state().object_lod_bias; }
223 /** Clears framebuffer contents. If values is not null, it must contain one
224 element for each attachment. Otherwise the framebuffer contents are
225 discarded and become undefined. */
226 void clear(const ClearValue *values);
228 /** Draws a batch of primitives. A shader must be active. */
229 void draw(const Batch &);
231 /** Draws multiple instances of a batch of primitives. A shader must be
233 void draw_instanced(const Batch &, unsigned);
236 void apply_batch(const Batch &);
239 /** Dispatches a compute operation. */
240 void dispatch(unsigned, unsigned = 1, unsigned = 1);
242 /** Resolves multisample attachments from the active framebuffer into
243 their corresponding resolve attachments. */
244 void resolve_multisample();
246 void begin_query(const QueryPool &, unsigned);
247 void end_query(const QueryPool &, unsigned);
250 PipelineState &get_pipeline_state();
251 void apply_framebuffer();