program_object.h
1 /*
2 ** UICore
3 ** Copyright (c) 1997-2015 The UICore Team
4 **
5 ** This software is provided 'as-is', without any express or implied
6 ** warranty. In no event will the authors be held liable for any damages
7 ** arising from the use of this software.
8 **
9 ** Permission is granted to anyone to use this software for any purpose,
10 ** including commercial applications, and to alter it and redistribute it
11 ** freely, subject to the following restrictions:
12 **
13 ** 1. The origin of this software must not be misrepresented; you must not
14 ** claim that you wrote the original software. If you use this software
15 ** in a product, an acknowledgment in the product documentation would be
16 ** appreciated but is not required.
17 ** 2. Altered source versions must be plainly marked as such, and must not be
18 ** misrepresented as being the original software.
19 ** 3. This notice may not be removed or altered from any source distribution.
20 **
21 ** Note: Some of the libraries UICore may link to may have additional
22 ** requirements or restrictions.
23 **
24 ** File Author(s):
25 **
26 ** Magnus Norddahl
27 ** Harry Storbacka
28 ** Kenneth Gangstoe
29 */
30 
31 #pragma once
32 
33 #include <memory>
34 #include "shader_object.h"
35 
36 namespace uicore
37 {
38  class IODevice;
39  typedef std::shared_ptr<IODevice> IODevicePtr;
40  class GraphicContext;
41  class ShaderObject;
42  typedef std::shared_ptr<ShaderObject> ShaderObjectPtr;
43 
46  {
47  public:
49  static std::shared_ptr<ProgramObject> create(const GraphicContextPtr &gc);
50 
52  static std::shared_ptr<ProgramObject> load(const GraphicContextPtr &gc, const std::string &vertex_fullname, const std::string &fragment_fullname);
53  static std::shared_ptr<ProgramObject> load(const GraphicContextPtr &gc, const std::string &vertex_fullname, const std::string &geometry_fullname, const std::string &fragment_fullname);
54  static std::shared_ptr<ProgramObject> load(const GraphicContextPtr &gc, const IODevicePtr &vertex_file, const IODevicePtr &fragment_file);
55  static std::shared_ptr<ProgramObject> load(const GraphicContextPtr &gc, const IODevicePtr &vertex_file, const IODevicePtr &geometry_file, const IODevicePtr &fragment_file);
56 
58  static std::shared_ptr<ProgramObject> load_and_link(const GraphicContextPtr &gc, const std::string &vertex_fullname, const std::string &fragment_fullname);
59  static std::shared_ptr<ProgramObject> load_and_link(const GraphicContextPtr &gc, const std::string &vertex_fullname, const std::string &geometry_fullname, const std::string &fragment_fullname);
60  static std::shared_ptr<ProgramObject> load_and_link(const GraphicContextPtr &gc, const IODevicePtr &vertex_file, const IODevicePtr &fragment_file);
61  static std::shared_ptr<ProgramObject> load_and_link(const GraphicContextPtr &gc, const IODevicePtr &vertex_file, const IODevicePtr &geometry_file, const IODevicePtr &fragment_file);
62 
64  virtual std::vector<ShaderObjectPtr> shaders() const = 0;
65 
67  virtual std::string info_log() const = 0;
68 
72  virtual int attribute_location(const std::string &name) const = 0;
73 
77  virtual int uniform_location(const std::string &name) const = 0;
78 
84  virtual int uniform_buffer_size(const std::string &block_name) const = 0;
85 
87  virtual int uniform_buffer_size(int block_index) const = 0;
88 
92  virtual int uniform_buffer_index(const std::string &block_name) const = 0;
93 
97  virtual int storage_buffer_index(const std::string &name) const = 0;
98 
100  virtual void attach(const ShaderObjectPtr &obj) = 0;
101 
103  virtual void detach(const ShaderObjectPtr &obj) = 0;
104 
108  virtual void bind_attribute_location(int index, const std::string &name) = 0;
109 
113  virtual void bind_frag_data_location(int color_number, const std::string &name) = 0;
114 
118  virtual bool try_link() = 0;
119 
123  virtual void link() = 0;
124 
128  virtual bool validate() = 0;
129 
130  virtual void set_uniform1i(int location, int value_a) = 0;
131  virtual void set_uniform2i(int location, int value_a, int value_b) = 0;
132  virtual void set_uniform3i(int location, int value_a, int value_b, int value_c) = 0;
133  virtual void set_uniform4i(int location, int value_a, int value_b, int value_c, int value_d) = 0;
134  virtual void set_uniformiv(int location, int size, int count, const int *data) = 0;
135  void set_uniform2i(int location, const Vec2i &vec) { set_uniform2i(location, vec.x, vec.y); }
136  void set_uniform3i(int location, const Vec3i &vec) { set_uniform3i(location, vec.x, vec.y, vec.z); }
137  void set_uniform4i(int location, const Vec4i &vec) { set_uniform4i(location, vec.x, vec.y, vec.z, vec.w); }
138  void set_uniform2s(int location, const Vec2s &vec) { set_uniform2i(location, vec.x, vec.y); }
139  void set_uniform3s(int location, const Vec3s &vec) { set_uniform3i(location, vec.x, vec.y, vec.z); }
140  void set_uniform4s(int location, const Vec4s &vec) { set_uniform4i(location, vec.x, vec.y, vec.z, vec.w); }
141  void set_uniform2b(int location, const Vec2b &vec) { set_uniform2i(location, vec.x, vec.y); }
142  void set_uniform3b(int location, const Vec3b &vec) { set_uniform3i(location, vec.x, vec.y, vec.z); }
143  void set_uniform4b(int location, const Vec4b &vec) { set_uniform4i(location, vec.x, vec.y, vec.z, vec.w); }
144  void set_uniformiv(int location, int count, const Vec2i *data) { set_uniformiv(location, 2, count, &data->x); }
145  void set_uniformiv(int location, int count, const Vec3i *data) { set_uniformiv(location, 3, count, &data->x); }
146  void set_uniformiv(int location, int count, const Vec4i *data) { set_uniformiv(location, 4, count, &data->x); }
147  virtual void set_uniform1f(int location, float value_a) = 0;
148  virtual void set_uniform2f(int location, float value_a, float value_b) = 0;
149  virtual void set_uniform3f(int location, float value_a, float value_b, float value_c) = 0;
150  virtual void set_uniform4f(int location, float value_a, float value_b, float value_c, float value_d) = 0;
151  virtual void set_uniformfv(int location, int size, int count, const float *data) = 0;
152  void set_uniform2f(int location, const Vec2f &vec) { set_uniform2f(location, vec.x, vec.y); }
153  void set_uniform3f(int location, const Vec3f &vec) { set_uniform3f(location, vec.x, vec.y, vec.z); }
154  void set_uniform4f(int location, const Vec4f &vec) { set_uniform4f(location, vec.x, vec.y, vec.z, vec.w); }
155  void set_uniformfv(int location, int count, const Vec2f *data) { set_uniformfv(location, 2, count, &data->x); }
156  void set_uniformfv(int location, int count, const Vec3f *data) { set_uniformfv(location, 3, count, &data->x); }
157  void set_uniformfv(int location, int count, const Vec4f *data) { set_uniformfv(location, 4, count, &data->x); }
158  virtual void set_uniform_matrix(int location, int size, int count, bool transpose, const float *data) = 0;
159  void set_uniform_matrix(int location, const Mat2f &matrix) { set_uniform_matrix(location, 2, 1, false, matrix.matrix); }
160  void set_uniform_matrix(int location, const Mat3f &matrix) { set_uniform_matrix(location, 3, 1, false, matrix.matrix); }
161  void set_uniform_matrix(int location, const Mat4f &matrix) { set_uniform_matrix(location, 4, 1, false, matrix.matrix); }
162  void set_uniform_matrix(int location, int count, const Mat2f *matrix) { set_uniform_matrix(location, 2, count, false, matrix->matrix); }
163  void set_uniform_matrix(int location, int count, const Mat3f *matrix) { set_uniform_matrix(location, 3, count, false, matrix->matrix); }
164  void set_uniform_matrix(int location, int count, const Mat4f *matrix) { set_uniform_matrix(location, 4, count, false, matrix->matrix); }
165 
166  void set_uniform1i(const std::string &name, int value_a) { int loc = uniform_location(name); if (loc >= 0) set_uniform1i(loc, value_a); }
167  void set_uniform2i(const std::string &name, int value_a, int value_b) { int loc = uniform_location(name); if (loc >= 0) set_uniform2i(loc, value_a, value_b); }
168  void set_uniform3i(const std::string &name, int value_a, int value_b, int value_c) { int loc = uniform_location(name); if (loc >= 0) set_uniform3i(loc, value_a, value_b, value_c); }
169  void set_uniform4i(const std::string &name, int value_a, int value_b, int value_c, int value_d) { int loc = uniform_location(name); if (loc >= 0) set_uniform4i(loc, value_a, value_b, value_c, value_d); }
170  void set_uniformiv(const std::string &name, int size, int count, const int *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformiv(loc, size, count, data); }
171  void set_uniform2i(const std::string &name, const Vec2i &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform2i(loc, vec); }
172  void set_uniform3i(const std::string &name, const Vec3i &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform3i(loc, vec); }
173  void set_uniform4i(const std::string &name, const Vec4i &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform4i(loc, vec); }
174  void set_uniform2s(const std::string &name, const Vec2s &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform2s(loc, vec); }
175  void set_uniform3s(const std::string &name, const Vec3s &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform3s(loc, vec); }
176  void set_uniform4s(const std::string &name, const Vec4s &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform4s(loc, vec); }
177  void set_uniform2b(const std::string &name, const Vec2b &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform2b(loc, vec); }
178  void set_uniform3b(const std::string &name, const Vec3b &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform3b(loc, vec); }
179  void set_uniform4b(const std::string &name, const Vec4b &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform4b(loc, vec); }
180  void set_uniformiv(const std::string &name, int count, const Vec2i *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformiv(loc, count, data); }
181  void set_uniformiv(const std::string &name, int count, const Vec3i *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformiv(loc, count, data); }
182  void set_uniformiv(const std::string &name, int count, const Vec4i *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformiv(loc, count, data); }
183  void set_uniform1f(const std::string &name, float value_a) { int loc = uniform_location(name); if (loc >= 0) set_uniform1f(loc, value_a); }
184  void set_uniform2f(const std::string &name, float value_a, float value_b) { int loc = uniform_location(name); if (loc >= 0) set_uniform2f(loc, value_a, value_b); }
185  void set_uniform3f(const std::string &name, float value_a, float value_b, float value_c) { int loc = uniform_location(name); if (loc >= 0) set_uniform3f(loc, value_a, value_b, value_c); }
186  void set_uniform4f(const std::string &name, float value_a, float value_b, float value_c, float value_d) { int loc = uniform_location(name); if (loc >= 0) set_uniform4f(loc, value_a, value_b, value_c, value_d); }
187  void set_uniformfv(const std::string &name, int size, int count, const float *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformfv(loc, size, count, data); }
188  void set_uniform2f(const std::string &name, const Vec2f &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform2f(loc, vec); }
189  void set_uniform3f(const std::string &name, const Vec3f &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform3f(loc, vec); }
190  void set_uniform4f(const std::string &name, const Vec4f &vec) { int loc = uniform_location(name); if (loc >= 0) set_uniform4f(loc, vec); }
191  void set_uniformfv(const std::string &name, int count, const Vec2f *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformfv(loc, count, data); }
192  void set_uniformfv(const std::string &name, int count, const Vec3f *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformfv(loc, count, data); }
193  void set_uniformfv(const std::string &name, int count, const Vec4f *data) { int loc = uniform_location(name); if (loc >= 0) set_uniformfv(loc, count, data); }
194  void set_uniform_matrix(const std::string &name, int size, int count, bool transpose, const float *data) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, size, count, transpose, data); }
195  void set_uniform_matrix(const std::string &name, const Mat2f &matrix) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, matrix); }
196  void set_uniform_matrix(const std::string &name, const Mat3f &matrix) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, matrix); }
197  void set_uniform_matrix(const std::string &name, const Mat4f &matrix) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, matrix); }
198  void set_uniform_matrix(const std::string &name, int count, const Mat2f *matrix) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, count, matrix); }
199  void set_uniform_matrix(const std::string &name, int count, const Mat3f *matrix) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, count, matrix); }
200  void set_uniform_matrix(const std::string &name, int count, const Mat4f *matrix) { int loc = uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, count, matrix); }
201 
202  virtual void set_uniform_buffer_index(const std::string &block_name, int bind_index) = 0;
203  virtual void set_uniform_buffer_index(int block_index, int bind_index) = 0;
204 
205  virtual void set_storage_buffer_index(const std::string &block_name, int bind_index) = 0;
206  virtual void set_storage_buffer_index(int block_index, int bind_index) = 0;
207  };
208 
209  typedef std::shared_ptr<ProgramObject> ProgramObjectPtr;
210 }
void set_uniformiv(int location, int count, const Vec4i *data)
Definition: program_object.h:146
void set_uniformfv(int location, int count, const Vec3f *data)
Definition: program_object.h:156
void set_uniform_matrix(int location, int count, const Mat4f *matrix)
Definition: program_object.h:164
void set_uniformfv(int location, int count, const Vec2f *data)
Definition: program_object.h:155
virtual void set_uniform4f(int location, float value_a, float value_b, float value_c, float value_d)=0
void set_uniform_matrix(int location, const Mat4f &matrix)
Definition: program_object.h:161
void set_uniform2b(const std::string &name, const Vec2b &vec)
Definition: program_object.h:177
virtual void set_uniform2i(int location, int value_a, int value_b)=0
virtual bool try_link()=0
Link program.
void set_uniform3b(const std::string &name, const Vec3b &vec)
Definition: program_object.h:178
void set_uniform4i(const std::string &name, const Vec4i &vec)
Definition: program_object.h:173
void set_uniform1i(const std::string &name, int value_a)
Definition: program_object.h:166
virtual void link()=0
Link program.
void set_uniformfv(const std::string &name, int count, const Vec3f *data)
Definition: program_object.h:192
2D matrix
Definition: mat2.h:41
void set_uniform2s(const std::string &name, const Vec2s &vec)
Definition: program_object.h:174
void set_uniform4i(int location, const Vec4i &vec)
Definition: program_object.h:137
Type x
Definition: vec3.h:74
Program Object.
Definition: program_object.h:45
void set_uniform3i(const std::string &name, int value_a, int value_b, int value_c)
Definition: program_object.h:168
virtual void bind_attribute_location(int index, const std::string &name)=0
Bind attribute to specific location.
virtual void set_uniformiv(int location, int size, int count, const int *data)=0
virtual int uniform_location(const std::string &name) const =0
Returns the location of a named uniform variable.
virtual int attribute_location(const std::string &name) const =0
Returns the location of a named active attribute.
virtual bool validate()=0
Validate program.
void set_uniform4s(int location, const Vec4s &vec)
Definition: program_object.h:140
void set_uniform3s(const std::string &name, const Vec3s &vec)
Definition: program_object.h:175
Type matrix[4]
The matrix (in column-major format)
Definition: mat2.h:172
Type x
Definition: vec4.h:74
void set_uniform4b(int location, const Vec4b &vec)
Definition: program_object.h:143
void set_uniform4f(const std::string &name, const Vec4f &vec)
Definition: program_object.h:190
void set_uniform3f(const std::string &name, const Vec3f &vec)
Definition: program_object.h:189
void set_uniform4s(const std::string &name, const Vec4s &vec)
Definition: program_object.h:176
Type x
Definition: vec2.h:75
virtual void detach(const ShaderObjectPtr &obj)=0
Remove shader from program object.
void set_uniform_matrix(const std::string &name, int count, const Mat3f *matrix)
Definition: program_object.h:199
virtual int storage_buffer_index(const std::string &name) const =0
Get the storage buffer index.
void set_uniform3f(const std::string &name, float value_a, float value_b, float value_c)
Definition: program_object.h:185
void set_uniformiv(const std::string &name, int count, const Vec4i *data)
Definition: program_object.h:182
virtual void set_uniform1f(int location, float value_a)=0
virtual std::vector< ShaderObjectPtr > shaders() const =0
Returns the shaders attached to the program object.
virtual int uniform_buffer_size(const std::string &block_name) const =0
Get the uniform block size.
std::shared_ptr< ShaderObject > ShaderObjectPtr
Definition: program_object.h:41
void set_uniform_matrix(int location, const Mat2f &matrix)
Definition: program_object.h:159
void set_uniformiv(int location, int count, const Vec3i *data)
Definition: program_object.h:145
Type z
Definition: vec3.h:76
Type matrix[16]
The matrix (in column-major format)
Definition: mat4.h:338
void set_uniform_matrix(const std::string &name, int count, const Mat2f *matrix)
Definition: program_object.h:198
void set_uniform2i(const std::string &name, const Vec2i &vec)
Definition: program_object.h:171
void set_uniform_matrix(const std::string &name, const Mat2f &matrix)
Definition: program_object.h:195
std::shared_ptr< IODevice > IODevicePtr
Definition: iodevice.h:85
void set_uniform2i(const std::string &name, int value_a, int value_b)
Definition: program_object.h:167
void set_uniformiv(const std::string &name, int count, const Vec2i *data)
Definition: program_object.h:180
void set_uniform_matrix(const std::string &name, const Mat4f &matrix)
Definition: program_object.h:197
Type y
Definition: vec2.h:76
virtual void set_uniform_buffer_index(const std::string &block_name, int bind_index)=0
void set_uniform_matrix(int location, int count, const Mat3f *matrix)
Definition: program_object.h:163
void set_uniformiv(const std::string &name, int size, int count, const int *data)
Definition: program_object.h:170
virtual void bind_frag_data_location(int color_number, const std::string &name)=0
Bind shader out variable a specific color buffer location.
virtual void set_uniform3i(int location, int value_a, int value_b, int value_c)=0
void set_uniform4f(int location, const Vec4f &vec)
Definition: program_object.h:154
void set_uniform3f(int location, const Vec3f &vec)
Definition: program_object.h:153
virtual void set_uniform_matrix(int location, int size, int count, bool transpose, const float *data)=0
void set_uniform2i(int location, const Vec2i &vec)
Definition: program_object.h:135
void set_uniform2b(int location, const Vec2b &vec)
Definition: program_object.h:141
virtual int uniform_buffer_index(const std::string &block_name) const =0
Get the uniform block index.
Type y
Definition: vec4.h:75
void set_uniformfv(const std::string &name, int count, const Vec4f *data)
Definition: program_object.h:193
Type w
Definition: vec4.h:77
virtual void set_uniform3f(int location, float value_a, float value_b, float value_c)=0
void set_uniform2f(const std::string &name, const Vec2f &vec)
Definition: program_object.h:188
void set_uniform4f(const std::string &name, float value_a, float value_b, float value_c, float value_d)
Definition: program_object.h:186
void set_uniform_matrix(int location, int count, const Mat2f *matrix)
Definition: program_object.h:162
void set_uniform4b(const std::string &name, const Vec4b &vec)
Definition: program_object.h:179
void set_uniformfv(const std::string &name, int size, int count, const float *data)
Definition: program_object.h:187
virtual void set_uniform2f(int location, float value_a, float value_b)=0
void set_uniformfv(int location, int count, const Vec4f *data)
Definition: program_object.h:157
void set_uniform1f(const std::string &name, float value_a)
Definition: program_object.h:183
std::shared_ptr< ProgramObject > ProgramObjectPtr
Definition: graphic_context.h:62
static std::shared_ptr< ProgramObject > load(const GraphicContextPtr &gc, const std::string &vertex_fullname, const std::string &fragment_fullname)
Load.
virtual void set_uniformfv(int location, int size, int count, const float *data)=0
void set_uniform3i(const std::string &name, const Vec3i &vec)
Definition: program_object.h:172
void set_uniform3s(int location, const Vec3s &vec)
Definition: program_object.h:139
void set_uniform_matrix(int location, const Mat3f &matrix)
Definition: program_object.h:160
Type y
Definition: vec3.h:75
void set_uniformiv(const std::string &name, int count, const Vec3i *data)
Definition: program_object.h:181
void set_uniform2s(int location, const Vec2s &vec)
Definition: program_object.h:138
void set_uniform3b(int location, const Vec3b &vec)
Definition: program_object.h:142
std::shared_ptr< GraphicContext > GraphicContextPtr
Definition: d3d_target.h:49
Type matrix[9]
The matrix (in column-major format)
Definition: mat3.h:266
Type z
Definition: vec4.h:76
Shader Object.
Definition: shader_object.h:55
virtual void set_uniform4i(int location, int value_a, int value_b, int value_c, int value_d)=0
void set_uniform2f(const std::string &name, float value_a, float value_b)
Definition: program_object.h:184
virtual std::string info_log() const =0
Returns the current info log for the program object.
void set_uniform_matrix(const std::string &name, int count, const Mat4f *matrix)
Definition: program_object.h:200
void set_uniformiv(int location, int count, const Vec2i *data)
Definition: program_object.h:144
void set_uniform_matrix(const std::string &name, const Mat3f &matrix)
Definition: program_object.h:196
virtual void set_uniform1i(int location, int value_a)=0
static std::shared_ptr< ProgramObject > create(const GraphicContextPtr &gc)
Constructs a ProgramObject.
void set_uniform3i(int location, const Vec3i &vec)
Definition: program_object.h:136
static std::shared_ptr< ProgramObject > load_and_link(const GraphicContextPtr &gc, const std::string &vertex_fullname, const std::string &fragment_fullname)
Load and link.
void set_uniformfv(const std::string &name, int count, const Vec2f *data)
Definition: program_object.h:191
void set_uniform_matrix(const std::string &name, int size, int count, bool transpose, const float *data)
Definition: program_object.h:194
Definition: Application/application.h:35
4D matrix
Definition: mat2.h:47
4D vector
Definition: size.h:44
void set_uniform2f(int location, const Vec2f &vec)
Definition: program_object.h:152
void set_uniform4i(const std::string &name, int value_a, int value_b, int value_c, int value_d)
Definition: program_object.h:169
virtual void set_storage_buffer_index(const std::string &block_name, int bind_index)=0
virtual void attach(const ShaderObjectPtr &obj)=0
Add shader to program object.