diff --git a/src/libprojectM/Renderer/CMakeLists.txt b/src/libprojectM/Renderer/CMakeLists.txt index 672c02660..4abc081d7 100644 --- a/src/libprojectM/Renderer/CMakeLists.txt +++ b/src/libprojectM/Renderer/CMakeLists.txt @@ -31,6 +31,8 @@ add_custom_command(OUTPUT add_library(Renderer OBJECT ${CMAKE_CURRENT_BINARY_DIR}/BuiltInTransitionsResources.hpp BuiltInTransitionsResources.hpp.in + Debug.cpp + Debug.hpp CopyTexture.cpp CopyTexture.hpp FileScanner.cpp diff --git a/src/libprojectM/Renderer/Debug.cpp b/src/libprojectM/Renderer/Debug.cpp new file mode 100644 index 000000000..2af5be9af --- /dev/null +++ b/src/libprojectM/Renderer/Debug.cpp @@ -0,0 +1,38 @@ +#include "Debug.hpp" + + +namespace libprojectM::Renderer { + +void check_gl_error(const char* file, int line) +{ + GLenum err(glGetError()); + + while (err != GL_NO_ERROR) + { + std::string error; + + switch (err) + { + case GL_INVALID_OPERATION: + error = "INVALID_OPERATION"; + break; + case GL_INVALID_ENUM: + error = "INVALID_ENUM"; + break; + case GL_INVALID_VALUE: + error = "INVALID_VALUE"; + break; + case GL_OUT_OF_MEMORY: + error = "OUT_OF_MEMORY"; + break; + case GL_INVALID_FRAMEBUFFER_OPERATION: + error = "INVALID_FRAMEBUFFER_OPERATION"; + break; + } + + std::cerr << "GL_" << error.c_str() << " - " << file << ":" << line << std::endl; + err = glGetError(); + } +} + +} // namespace libprojectM::Renderer diff --git a/src/libprojectM/Renderer/Debug.hpp b/src/libprojectM/Renderer/Debug.hpp new file mode 100644 index 000000000..2d3dfa618 --- /dev/null +++ b/src/libprojectM/Renderer/Debug.hpp @@ -0,0 +1,14 @@ + +#pragma once + +#include +#include + +#define CHECK_GL_ERROR check_gl_error(__FILE__, __LINE__) + + +namespace libprojectM::Renderer { + +void check_gl_error(const char* file, int line); + +} // namespace libprojectM::Renderer diff --git a/src/libprojectM/Renderer/MilkdropNoise.cpp b/src/libprojectM/Renderer/MilkdropNoise.cpp index 67a13ec62..17b92dbd8 100644 --- a/src/libprojectM/Renderer/MilkdropNoise.cpp +++ b/src/libprojectM/Renderer/MilkdropNoise.cpp @@ -1,5 +1,6 @@ #include "MilkdropNoise.hpp" +#include "Debug.hpp" #include "projectM-opengl.h" #include @@ -22,6 +23,7 @@ auto MilkdropNoise::LowQuality() -> std::shared_ptr glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GetPreferredInternalFormat(), GL_UNSIGNED_BYTE, textureData.data()); + CHECK_GL_ERROR; } return std::make_shared("noise_lq", texture, GL_TEXTURE_2D, 256, 256, false); } @@ -36,6 +38,7 @@ auto MilkdropNoise::LowQualityLite() -> std::shared_ptr glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GetPreferredInternalFormat(), GL_UNSIGNED_BYTE, textureData.data()); + CHECK_GL_ERROR; } return std::make_shared("noise_lq_lite", texture, GL_TEXTURE_2D, 32, 32, false); @@ -51,6 +54,7 @@ auto MilkdropNoise::MediumQuality() -> std::shared_ptr glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GetPreferredInternalFormat(), GL_UNSIGNED_BYTE, textureData.data()); + CHECK_GL_ERROR; } return std::make_shared("noise_mq", texture, GL_TEXTURE_2D, 256, 256, false); } @@ -65,6 +69,7 @@ auto MilkdropNoise::HighQuality() -> std::shared_ptr glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GetPreferredInternalFormat(), GL_UNSIGNED_BYTE, textureData.data()); + CHECK_GL_ERROR; } return std::make_shared("noise_hq", texture, GL_TEXTURE_2D, 256, 256, false); @@ -80,6 +85,7 @@ auto MilkdropNoise::LowQualityVolume() -> std::shared_ptr glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_3D, texture); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 32, 32, 32, 0, GetPreferredInternalFormat(), GL_UNSIGNED_BYTE, textureData.data()); + CHECK_GL_ERROR; } return std::make_shared("noisevol_lq", texture, GL_TEXTURE_3D, 32, 32, false); @@ -95,6 +101,7 @@ auto MilkdropNoise::HighQualityVolume() -> std::shared_ptr glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_3D, texture); glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 32, 32, 32, 0, GetPreferredInternalFormat(), GL_UNSIGNED_BYTE, textureData.data()); + CHECK_GL_ERROR; } return std::make_shared("noisevol_hq", texture, GL_TEXTURE_3D, 32, 32, false); @@ -106,7 +113,9 @@ auto MilkdropNoise::GetPreferredInternalFormat() -> int // Query preferred internal texture format. GLES 3 only supports GL_RENDERBUFFER here, no texture targets. // That's why we use GL_BGRA as default, as this is the best general-use format according to Khronos. GLint preferredInternalFormat{GL_BGRA}; + CHECK_GL_ERROR; glGetInternalformativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, sizeof(preferredInternalFormat), &preferredInternalFormat); + CHECK_GL_ERROR; #else // GLES only supports GL_RGB and GL_RGBA, so we always use the latter. GLint preferredInternalFormat{GL_RGBA}; diff --git a/src/libprojectM/Renderer/MilkdropNoise.hpp b/src/libprojectM/Renderer/MilkdropNoise.hpp index b0af87a68..126bab964 100644 --- a/src/libprojectM/Renderer/MilkdropNoise.hpp +++ b/src/libprojectM/Renderer/MilkdropNoise.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -66,7 +67,6 @@ class MilkdropNoise static auto HighQualityVolume() -> std::shared_ptr; protected: - static auto GetPreferredInternalFormat() -> int; /** diff --git a/src/libprojectM/Renderer/PresetTransition.cpp b/src/libprojectM/Renderer/PresetTransition.cpp index 2a27f0021..22b4c51ce 100644 --- a/src/libprojectM/Renderer/PresetTransition.cpp +++ b/src/libprojectM/Renderer/PresetTransition.cpp @@ -1,5 +1,6 @@ #include "PresetTransition.hpp" +#include "Debug.hpp" #include "TextureManager.hpp" #include @@ -19,6 +20,7 @@ PresetTransition::PresetTransition(const std::shared_ptr& transitionShad m_staticRandomValues = {rand32(), rand32(), rand32(), rand32()}; RenderItem::Init(); + CHECK_GL_ERROR; } void PresetTransition::InitVertexAttrib() @@ -31,6 +33,7 @@ void PresetTransition::InitVertexAttrib() glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Point), reinterpret_cast(offsetof(Point, x))); // Position glBufferData(GL_ARRAY_BUFFER, sizeof(points), points.data(), GL_STATIC_DRAW); + CHECK_GL_ERROR; } auto PresetTransition::IsDone() const -> bool @@ -69,6 +72,7 @@ void PresetTransition::Draw(const Preset& oldPreset, } m_transitionShader->Bind(); + CHECK_GL_ERROR; // Numerical parameters m_transitionShader->SetUniformFloat3("iResolution", {static_cast(context.viewportSizeX), @@ -103,6 +107,7 @@ void PresetTransition::Draw(const Preset& oldPreset, oldPreset.OutputTexture()->Bind(0, m_presetSampler); m_transitionShader->SetUniformInt("iChannel1", 1); newPreset.OutputTexture()->Bind(1, m_presetSampler); + CHECK_GL_ERROR; int textureUnit = 2; std::vector noiseDescriptors(m_noiseTextureNames.size()); @@ -117,10 +122,12 @@ void PresetTransition::Draw(const Preset& oldPreset, glBindVertexArray(m_vaoID); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindVertexArray(0); + CHECK_GL_ERROR; // Clean up oldPreset.OutputTexture()->Unbind(0); newPreset.OutputTexture()->Unbind(1); + CHECK_GL_ERROR; for (int i = 2; i < textureUnit; i++) { @@ -128,6 +135,7 @@ void PresetTransition::Draw(const Preset& oldPreset, } Shader::Unbind(); + CHECK_GL_ERROR; // Update last frame time. m_lastFrameTime = std::chrono::system_clock::now(); diff --git a/src/libprojectM/Renderer/PresetTransition.hpp b/src/libprojectM/Renderer/PresetTransition.hpp index 2623324a7..2e520bcc6 100644 --- a/src/libprojectM/Renderer/PresetTransition.hpp +++ b/src/libprojectM/Renderer/PresetTransition.hpp @@ -3,6 +3,7 @@ #include "Renderer/RenderItem.hpp" #include "Renderer/Shader.hpp" #include "Renderer/TextureSamplerDescriptor.hpp" +#include #include diff --git a/src/libprojectM/Renderer/Texture.cpp b/src/libprojectM/Renderer/Texture.cpp index 47fb59b30..33daf376b 100644 --- a/src/libprojectM/Renderer/Texture.cpp +++ b/src/libprojectM/Renderer/Texture.cpp @@ -54,8 +54,11 @@ Texture::~Texture() void Texture::Bind(GLint slot, const Sampler::Ptr& sampler) const { + std::cout << "Texture::Bind" << std::endl; glActiveTexture(GL_TEXTURE0 + slot); + CHECK_GL_ERROR; glBindTexture(m_target, m_textureId); + CHECK_GL_ERROR; if (sampler) { diff --git a/src/libprojectM/Renderer/Texture.hpp b/src/libprojectM/Renderer/Texture.hpp index 4577b1712..6eba543a2 100644 --- a/src/libprojectM/Renderer/Texture.hpp +++ b/src/libprojectM/Renderer/Texture.hpp @@ -4,8 +4,10 @@ */ #pragma once +#include "Renderer/Debug.hpp" #include "Renderer/Sampler.hpp" +#include #include namespace libprojectM { diff --git a/src/libprojectM/Renderer/TextureManager.cpp b/src/libprojectM/Renderer/TextureManager.cpp index 60d7644b5..bcaa7590b 100644 --- a/src/libprojectM/Renderer/TextureManager.cpp +++ b/src/libprojectM/Renderer/TextureManager.cpp @@ -1,5 +1,6 @@ #include "TextureManager.hpp" +#include "Debug.hpp" #include "FileScanner.hpp" #include "IdleTextures.hpp" #include "MilkdropNoise.hpp" @@ -79,7 +80,8 @@ void TextureManager::Preload() SOIL_CREATE_NEW_ID, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MULTIPLY_ALPHA, &width, &height); - m_textures["idlem"] = std::make_shared("idlem", tex, GL_TEXTURE_2D, width, height, false);; + m_textures["idlem"] = std::make_shared("idlem", tex, GL_TEXTURE_2D, width, height, false); + ; tex = SOIL_load_OGL_texture_from_memory( headphones_data, @@ -87,8 +89,10 @@ void TextureManager::Preload() SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MULTIPLY_ALPHA, &width, &height); + CHECK_GL_ERROR; - m_textures["idleheadphones"] = std::make_shared("idleheadphones", tex, GL_TEXTURE_2D, width, height, false);; + m_textures["idleheadphones"] = std::make_shared("idleheadphones", tex, GL_TEXTURE_2D, width, height, false); + ; // Noise textures m_textures["noise_lq_lite"] = MilkdropNoise::LowQualityLite(); @@ -224,6 +228,7 @@ auto TextureManager::LoadTexture(const std::string& fileName, const std::string& SOIL_LOAD_RGBA, SOIL_CREATE_NEW_ID, SOIL_FLAG_MULTIPLY_ALPHA, &width, &height); + CHECK_GL_ERROR; if (tex == 0) { diff --git a/src/libprojectM/Renderer/TextureManager.hpp b/src/libprojectM/Renderer/TextureManager.hpp index 87883196e..0a2bd8c89 100644 --- a/src/libprojectM/Renderer/TextureManager.hpp +++ b/src/libprojectM/Renderer/TextureManager.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Renderer/Debug.hpp" #include "Renderer/TextureSamplerDescriptor.hpp" #include