From 1fd8c7691a35ee55eb09451d40e33db790c454e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 23 May 2013 17:51:01 +0200 Subject: [PATCH] Added AbstractShaderProgram::validate(). --- src/AbstractShaderProgram.cpp | 19 +++++++++++++++++++ src/AbstractShaderProgram.h | 10 ++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/AbstractShaderProgram.cpp b/src/AbstractShaderProgram.cpp index 5ecce8aac..df463da19 100644 --- a/src/AbstractShaderProgram.cpp +++ b/src/AbstractShaderProgram.cpp @@ -96,6 +96,25 @@ AbstractShaderProgram::~AbstractShaderProgram() { if(_id) glDeleteProgram(_id); } +std::pair AbstractShaderProgram::validate() { + glValidateProgram(_id); + + /* Check validation status */ + GLint success, logLength; + glGetProgramiv(_id, GL_VALIDATE_STATUS, &success); + glGetProgramiv(_id, GL_INFO_LOG_LENGTH, &logLength); + + /* Error or warning message. The string is returned null-terminated, scrap + the \0 at the end afterwards */ + std::string message(logLength, '\n'); + if(!message.empty()) { + glGetProgramInfoLog(_id, message.size(), nullptr, &message[0]); + message.resize(logLength-1); + } + + return {success, std::move(message)}; +} + void AbstractShaderProgram::use() { /* Use only if the program isn't already in use */ GLuint& current = Context::current()->state()->shaderProgram->current; diff --git a/src/AbstractShaderProgram.h b/src/AbstractShaderProgram.h index a829d1068..a042fdb93 100644 --- a/src/AbstractShaderProgram.h +++ b/src/AbstractShaderProgram.h @@ -322,6 +322,16 @@ class MAGNUM_EXPORT AbstractShaderProgram { /** @brief OpenGL program ID */ inline GLuint id() const { return _id; } + /** + * @brief Validate program + * + * Returns validation status and optional validation message. + * @see @fn_gl{ValidateProgram}, @fn_gl{GetProgram} with + * @def_gl{VALIDATE_STATUS}, @def_gl{INFO_LOG_LENGTH}, + * @fn_gl{GetProgramInfoLog} + */ + std::pair validate(); + /** * @brief Use shader for rendering *