blob: 20be1aa4942eb7d7f88fe40070eae99caa78baa8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#pragma once
#include "shader.h" // IWYU pragma: export
#include <glRef.h>
#include <glad/gl.h>
#include <glm/mat4x4.hpp>
#include <special_members.h>
class Location;
using ProgramRef = glRef<GLuint, &glCreateProgram, &glDeleteProgram>;
class Program {
public:
Program() = delete;
template<typename... S> explicit Program(const S &... srcs)
{
(glAttachShader(m_program, srcs.compile()), ...);
linkAndValidate();
}
virtual ~Program() = default;
DEFAULT_MOVE_NO_COPY(Program);
class UniformLocation {
public:
UniformLocation(GLuint prog, const char * name);
// NOLINTNEXTLINE(hicpp-explicit-conversions)
operator auto() const
{
return location;
}
explicit
operator bool() const
{
return location >= 0;
}
protected:
GLint location;
};
class RequiredUniformLocation : public UniformLocation {
public:
RequiredUniformLocation(GLuint prog, const char * name);
};
// NOLINTNEXTLINE(hicpp-explicit-conversions)
operator GLuint() const
{
return m_program;
}
protected:
void checkProgramError(GLuint program, GLuint flag, std::string_view errorMessage) const;
void use() const;
void linkAndValidate() const;
ProgramRef m_program;
};
|