Skip to content

Commit 0c62095

Browse files
Add a fast preset switching test flag to check for shader compilation issues
1 parent ce836b2 commit 0c62095

File tree

7 files changed

+81
-32
lines changed

7 files changed

+81
-32
lines changed

src/libprojectM/Renderer/Renderer.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,15 @@ Renderer::Renderer(int width, int height, int gx, int gy, BeatDetect *_beatDetec
184184
glBindBuffer(GL_ARRAY_BUFFER, 0);
185185
}
186186

187-
void Renderer::SetPipeline(Pipeline &pipeline)
187+
std::string Renderer::SetPipeline(Pipeline &pipeline)
188188
{
189189
currentPipe = &pipeline;
190190
shaderEngine.reset();
191-
shaderEngine.loadPresetShaders(pipeline);
191+
if (!shaderEngine.loadPresetShaders(pipeline)) {
192+
return "Shader compilation error";
193+
}
194+
195+
return std::string();
192196
}
193197

194198
void Renderer::ResetTextures()

src/libprojectM/Renderer/Renderer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class Renderer
7676
GLuint initRenderToTexture();
7777

7878

79-
void SetPipeline(Pipeline &pipeline);
79+
std::string SetPipeline(Pipeline &pipeline);
8080

8181
void setPresetName(const std::string& theValue)
8282
{

src/libprojectM/Renderer/ShaderEngine.cpp

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,24 +1083,38 @@ bool ShaderEngine::linkProgram(GLuint programID) {
10831083
}
10841084

10851085

1086-
void ShaderEngine::loadPresetShaders(Pipeline &pipeline) {
1086+
bool ShaderEngine::loadPresetShaders(Pipeline &pipeline) {
10871087

1088-
// compile and link warp and composite shaders from pipeline
1089-
if (!pipeline.compositeShader.programSource.empty()) {
1090-
programID_presetComp = loadPresetShader(PresentCompositeShader, pipeline.compositeShader, pipeline.compositeShaderFilename);
1091-
if (programID_presetComp != GL_FALSE)
1092-
presetCompShaderLoaded = true;
1093-
}
1088+
bool ok = true;
1089+
1090+
// blur programs
1091+
blur1_enabled = false;
1092+
blur2_enabled = false;
1093+
blur3_enabled = false;
10941094

1095+
// compile and link warp and composite shaders from pipeline
10951096
if (!pipeline.warpShader.programSource.empty()) {
10961097
programID_presetWarp = loadPresetShader(PresentWarpShader, pipeline.warpShader, pipeline.warpShaderFilename);
10971098
if (programID_presetWarp != GL_FALSE) {
10981099
uniform_vertex_transf_warp_shader = glGetUniformLocation(programID_presetWarp, "vertex_transformation");
10991100
presetWarpShaderLoaded = true;
1101+
} else {
1102+
ok = false;
11001103
}
11011104
}
11021105

1103-
std::cout << "Preset composite shader active: " << presetCompShaderLoaded << ", preset warp shader active: " << presetWarpShaderLoaded << std::endl;
1106+
if (!pipeline.compositeShader.programSource.empty()) {
1107+
programID_presetComp = loadPresetShader(PresentCompositeShader, pipeline.compositeShader, pipeline.compositeShaderFilename);
1108+
if (programID_presetComp != GL_FALSE) {
1109+
presetCompShaderLoaded = true;
1110+
} else {
1111+
ok = false;
1112+
}
1113+
}
1114+
1115+
// std::cout << "Preset composite shader active: " << presetCompShaderLoaded << ", preset warp shader active: " << presetWarpShaderLoaded << std::endl;
1116+
1117+
return ok;
11041118
}
11051119

11061120
GLuint ShaderEngine::loadPresetShader(const ShaderEngine::PresentShaderType shaderType, Shader &presetShader, std::string &shaderFilename) {
@@ -1187,13 +1201,20 @@ GLuint ShaderEngine::CompileShaderProgram(const std::string & VertexShaderCode,
11871201
glAttachShader(programID, FragmentShaderID);
11881202
bool linkOK = linkProgram(programID);
11891203

1190-
GLuint m_temp_vao;
1191-
glGenVertexArrays(1, &m_temp_vao);
1192-
glBindVertexArray(m_temp_vao);
1204+
glDetachShader(programID, VertexShaderID);
1205+
glDetachShader(programID, FragmentShaderID);
11931206

1194-
glValidateProgram(programID);
1207+
glDeleteShader(VertexShaderID);
1208+
glDeleteShader(FragmentShaderID);
11951209

1196-
glDeleteVertexArrays(1, &m_temp_vao);
1210+
return linkOK ? programID : GL_FALSE;
1211+
}
1212+
1213+
void ShaderEngine::validateProgram(const GLuint programID) {
1214+
GLint Result = GL_FALSE;
1215+
int InfoLogLength;
1216+
1217+
glValidateProgram(programID);
11971218

11981219
// Check the program
11991220
glGetProgramiv(programID, GL_VALIDATE_STATUS, &Result);
@@ -1203,15 +1224,6 @@ GLuint ShaderEngine::CompileShaderProgram(const std::string & VertexShaderCode,
12031224
glGetProgramInfoLog(programID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
12041225
fprintf(stderr, "%s\n", &ProgramErrorMessage[0]);
12051226
}
1206-
1207-
1208-
glDetachShader(programID, VertexShaderID);
1209-
glDetachShader(programID, FragmentShaderID);
1210-
1211-
glDeleteShader(VertexShaderID);
1212-
glDeleteShader(FragmentShaderID);
1213-
1214-
return linkOK ? programID : GL_FALSE;
12151227
}
12161228

12171229
// use the appropriate shader program for rendering the interpolation.
@@ -1226,6 +1238,10 @@ bool ShaderEngine::enableWarpShader(Shader &shader, const Pipeline &pipeline, co
12261238

12271239
glUniformMatrix4fv(uniform_vertex_transf_warp_shader, 1, GL_FALSE, glm::value_ptr(mat_ortho));
12281240

1241+
#if OGL_DEBUG
1242+
validateProgram(programID_presetWarp);
1243+
#endif
1244+
12291245
return true;
12301246
}
12311247

@@ -1245,6 +1261,10 @@ bool ShaderEngine::enableCompositeShader(Shader &shader, const Pipeline &pipelin
12451261

12461262
SetupShaderVariables(programID_presetComp, pipeline, pipelineContext);
12471263

1264+
#if OGL_DEBUG
1265+
validateProgram(programID_presetComp);
1266+
#endif
1267+
12481268
return true;
12491269
}
12501270

src/libprojectM/Renderer/ShaderEngine.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class ShaderEngine
3838

3939
ShaderEngine();
4040
virtual ~ShaderEngine();
41-
void loadPresetShaders(Pipeline &pipeline);
41+
bool loadPresetShaders(Pipeline &pipeline);
4242
bool enableWarpShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext, const glm::mat4 & mat_ortho);
4343
bool enableCompositeShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext);
4444
void RenderBlurTextures(const Pipeline &pipeline, const PipelineContext &pipelineContext);
@@ -107,6 +107,7 @@ class ShaderEngine
107107
GLuint loadPresetShader(const PresentShaderType shaderType, Shader &shader, std::string &shaderFilename);
108108

109109
void deletePresetShader(Shader &shader);
110+
void validateProgram(const GLuint programID);
110111

111112

112113
// programs generated from preset shader code

src/libprojectM/projectM.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -740,10 +740,14 @@ static void *thread_callback(void *prjm) {
740740
timeKeeper->StartSmoothing();
741741
}
742742

743-
if (result.empty())
743+
if (result.empty()) {
744744
presetSwitchedEvent(hardCut, **m_presetPos);
745-
else
745+
errorLoadingCurrentPreset = false;
746+
} else {
746747
presetSwitchFailedEvent(hardCut, **m_presetPos, result);
748+
errorLoadingCurrentPreset = true;
749+
750+
}
747751
}
748752

749753

@@ -786,6 +790,8 @@ void projectM::selectNext(const bool hardCut) {
786790
*/
787791
std::string projectM::switchPreset(std::auto_ptr<Preset> & targetPreset) {
788792

793+
std::string result;
794+
789795
#ifdef SYNC_PRESET_SWITCHES
790796
pthread_mutex_lock(&preset_mutex);
791797
#endif
@@ -798,15 +804,16 @@ std::string projectM::switchPreset(std::auto_ptr<Preset> & targetPreset) {
798804
std::cerr << "problem allocating target preset: " << e.message() << std::endl;
799805
return e.message();
800806
}
801-
// Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches
802-
renderer->setPresetName(targetPreset->name());
803-
renderer->SetPipeline(targetPreset->pipeline());
807+
808+
// Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches
809+
renderer->setPresetName(targetPreset->name());
810+
result = renderer->SetPipeline(targetPreset->pipeline());
804811

805812
#ifdef SYNC_PRESET_SWITCHES
806813
pthread_mutex_unlock(&preset_mutex);
807814
#endif
808815

809-
return std::string();
816+
return result;
810817
}
811818

812819
void projectM::setPresetLock ( bool isLocked )

src/libprojectM/projectM.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ class DLLEXPORT projectM
265265

266266
int getWindowWidth() { return _settings.windowWidth; }
267267
int getWindowHeight() { return _settings.windowHeight; }
268+
bool getErrorLoadingCurrentPreset() const { return errorLoadingCurrentPreset; }
268269

269270
private:
270271
PCM * _pcm;
@@ -324,6 +325,7 @@ class DLLEXPORT projectM
324325
MasterRenderItemMerge * _merger;
325326

326327
bool running;
328+
bool errorLoadingCurrentPreset;
327329

328330
Pipeline* currentPipe;
329331

src/projectM-sdl/projectM_SDL_main.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define OGL_DEBUG 0
1212
#define UNLOCK_FPS 0
1313
#define FAKE_AUDIO 0
14+
#define TEST_ALL_PRESETS 0
1415

1516
#if OGL_DEBUG
1617
void DebugLog(GLenum source,
@@ -159,6 +160,20 @@ int main(int argc, char *argv[]) {
159160
app->beginAudioCapture();
160161
#endif
161162

163+
#if TEST_ALL_PRESETS
164+
uint buildErrors = 0;
165+
for(int i = 0; i < app->getPlaylistSize(); i++) {
166+
std::cout << i << "\t" << app->getPresetName(i) << std::endl;
167+
app->selectPreset(i);
168+
if (app->getErrorLoadingCurrentPreset()) {
169+
buildErrors++;
170+
}
171+
}
172+
173+
fprintf(stdout, "Preset loading errors: %d/%d [%d%%]\n", buildErrors, app->getPlaylistSize(), (buildErrors*100) / app->getPlaylistSize());
174+
175+
return PROJECTM_SUCCESS;
176+
#endif
162177

163178
#if UNLOCK_FPS
164179
int32_t frame_count = 0;

0 commit comments

Comments
 (0)