gKit2 light
Loading...
Searching...
No Matches
program.h
Go to the documentation of this file.
1
2#ifndef _PROGRAM_H
3#define _PROGRAM_H
4
5#include <vector>
6#include <string>
7
8#include "glcore.h"
9
10
13
16
22GLuint read_program( const char *filename, const char *definitions= "" );
23
26int release_program( const GLuint program );
27
30int reload_program( const GLuint program );
31
35int reload_program( const GLuint program, const char *definitions );
36
38int program_format_errors( const GLuint program, std::string& errors );
39
41int program_print_errors( const GLuint program, const char *filename= "" );
42
44bool program_ready( const GLuint program );
45
47bool program_errors( const GLuint program );
48
49
52{
53 std::string filename;
54 std::string definitions;
55 GLuint program;
56};
57
60{
61public:
63 {
64 printf("[pipeline cache] %d programs.\n", int(m_programs.size()));
65 // le contexte est deja detruit lorsque ce destructeur est appele...
66 // trop tard pour detruire les programs et les shaders...
67
68 //~ dump();
69 for(auto& cache : m_programs)
70 delete cache;
71 }
72
74 PipelineProgram *find( const char *filename, const char *definitions= "" )
75 {
76 // unordered_map sans doute plus rapide ? mais il y a peu de shaders utilises...
77 for(auto cache : m_programs)
78 {
79 if(cache->filename == filename && cache->definitions == definitions)
80 return cache;
81 }
82
83 return insert(filename, definitions);
84 }
85
87 PipelineProgram *find( const GLuint program, const char *filename, const char *definitions= "" )
88 {
89 for(auto cache : m_programs)
90 {
91 if(cache->program == program && cache->filename == filename && cache->definitions == definitions)
92 return cache;
93 }
94
95 return insert(program, filename, definitions);
96 }
97
99 PipelineProgram *reload( const GLuint program, const char *definitions= "" )
100 {
101 int update_program( const GLuint program, const char *filename, const char *definitions );
102
103 for(auto cache : m_programs)
104 {
105 if(cache->program == program)
106 {
107 if(definitions && definitions[0])
108 // modifier le cache avec les nouvelles definitions, uniquement si elles sont non nulles.
109 cache->definitions= definitions;
110
111 // recharge et recompile le shader.
112 update_program(program, cache->filename.c_str(), cache->definitions.c_str());
113 program_print_errors(program);
114 return cache;
115 }
116 }
117
118 // ne devrait pas arriver...
119 return nullptr;
120 }
121
123 void reload( )
124 {
125 int update_program( const GLuint program, const char *filename, const char *definitions );
126
127 for(auto cache : m_programs)
128 {
129 update_program(cache->program, cache->filename.c_str(), cache->definitions.c_str());
130 program_print_errors(cache->program);
131 }
132 }
133
134 // debug
135 void dump( )
136 {
137 for(unsigned i= 0; i < m_programs.size(); i++)
138 {
139 PipelineProgram *cache= m_programs[i];
140 printf("[%d] '%s'\n", i, cache->filename.c_str());
141 if(!cache->definitions.empty())
142 printf(" %s\n", cache->definitions.c_str());
143 }
144 }
145
148 {
149 static PipelineCache cache;
150 return cache;
151 }
152
153protected:
155 PipelineCache( ) : m_programs() {}
156
158 PipelineProgram *insert( const char *filename, const char *definitions= "" )
159 {
160 int update_program( const GLuint program, const char *filename, const char *definitions );
161
162 // cree le programme s'il n'existe pas deja...
163 GLuint program= glCreateProgram();
164 update_program(program, filename, definitions);
165 program_print_errors(program);
166
167 return insert(program, filename, definitions);
168 }
169
171 PipelineProgram *insert( const GLuint program, const char *filename, const char *definitions= "" )
172 {
173 PipelineProgram *cache= new PipelineProgram { filename, definitions, program };
174 m_programs.push_back(cache);
175
176 return cache;
177 }
178
179 std::vector<PipelineProgram *> m_programs;
180};
181
182
184#endif
void reload()
recompile tous les shaders. du cache.
Definition program.h:123
PipelineProgram * insert(const GLuint program, const char *filename, const char *definitions="")
ajoute un shader dans le cache.
Definition program.h:171
PipelineCache()
constructeur prive.
Definition program.h:155
PipelineProgram * reload(const GLuint program, const char *definitions="")
recharge et recompile un programme du cache.
Definition program.h:99
PipelineProgram * insert(const char *filename, const char *definitions="")
compile un shader et l'ajoute au cache.
Definition program.h:158
PipelineProgram * find(const char *filename, const char *definitions="")
renvoie un shader program compile. et l'ajoute dans le cache, si necessaire...
Definition program.h:74
static PipelineCache & manager()
acces au singleton.
Definition program.h:147
PipelineProgram * find(const GLuint program, const char *filename, const char *definitions="")
renvoie un shader program compile. et l'ajoute dans le cache, si necessaire...
Definition program.h:87
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition text.cpp:140
GLuint read_program(const char *filename, const char *definitions="")
Definition program.cpp:214
int program_print_errors(const GLuint program, const char *filename="")
affiche les erreurs de compilation.
Definition program.cpp:459
int release_program(const GLuint program)
Definition program.cpp:238
bool program_errors(const GLuint program)
renvoie vrai si le programme n'est pas pret.
Definition program.cpp:286
int reload_program(const GLuint program)
Definition program.cpp:225
bool program_ready(const GLuint program)
renvoie vrai si le programme est pret. (pas d'erreurs de compilation des shaders, pas d'erreur de lin...
Definition program.cpp:263
int program_format_errors(const GLuint program, std::string &errors)
renvoie les erreurs de compilation.
Definition program.cpp:393
description d'un shader program compile.
Definition program.h:52