Index

zydeco / 5f524c5

Experiment in graphics programming, C++, OpenGL, simulation techniques.

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
703 Sep 2023 16:015f524c5OpenGL render abstractionsJosh Stockin1660G

Blob @ zydeco / src / render / gl / GLProgram.cpp

text/plain1576 bytesdownload raw
1#include <GL/gl3w.h>
2
3#include "ZydecoCommon.hpp"
4#include "GLProgram.hpp"
5#include "GLShader.hpp"
6
7
8static Logger LOGGER("GLProgram");
9
10
11// static initialize members
12std::map<std::string, GLProgram*> GLProgram::s_glPrograms {};
13
14
15GLProgram *GLProgram::GetGLProgram(std::string name)
16{
17 if (!s_glPrograms.count(name)) { ZydecoFault("GetGLProgram(): Program '{}' does not exist", name); }
18 return s_glPrograms.at(name);
19}
20
21GLProgram::GLProgram(std::string name, std::vector<GLShader*> shaders)
22{
23 LOGGER.Log(Logger::TRACE, "GLProgram(name: {}, ...)", name);
24 m_glProgramId = glCreateProgram();
25 m_glProgramName = name;
26
27 for (GLShader *p_shader : shaders)
28 {
29 glAttachShader(m_glProgramId, p_shader->GetGLShaderID());
30 }
31
32 glLinkProgram(m_glProgramId);
33
34 int success;
35 char infoLog[512];
36 glGetProgramiv(m_glProgramId, GL_LINK_STATUS, &success);
37 if(!success)
38 {
39 glGetShaderInfoLog(m_glProgramId, 512, NULL, infoLog);
40 ZydecoFault("Shader program linking failed:\n{}", infoLog);
41 }
42
43 for (GLShader *p_shader : shaders)
44 {
45 glDetachShader(m_glProgramId, p_shader->GetGLShaderID());
46 }
47
48 s_glPrograms.emplace(std::pair<std::string, GLProgram*>(m_glProgramName, this));
49}
50
51GLProgram::~GLProgram()
52{
53 LOGGER.Log(Logger::TRACE, "~GLProgram() for '{}'", m_glProgramName);
54 glDeleteProgram(m_glProgramId);
55 s_glPrograms.erase(m_glProgramName);
56}
57
58uint64_t GLProgram::GetGLProgramID()
59{
60 return m_glProgramId;
61}
62
63std::string GLProgram::GetGLProgramName()
64{
65 return m_glProgramName;
66}
67