您是否嘗試過使用GL_ARB_robustness爲OpenGL實現添加健壯性支持?
2.6「圖形重置恢復」可能導致GL上下文的重置
某些事件。這種重置 會導致所有上下文狀態丟失。從這種事件中恢復 需要重新創建受影響的上下文中的所有對象。圖形的 當前狀態復位狀態由
enum GetGraphicsResetStatusARB();
符號常量返回返回指示是否因爲對 GetGraphicsResetStatusARB最後一次通話的GL方面一直處於 復位狀態在任何點。 NO_ERROR指示自上次調用以來,GL上下文的 未處於重置狀態。 GUILTY_CONTEXT_RESET_ARB指示已檢測到 歸因於當前GL上下文的重置。INNOCENT_CONTEXT_RESET_ARB 指示檢測到不歸於當前GL上下文的重置。 UNKNOWN_CONTEXT_RESET_ARB指示檢測到的 圖形重置,其原因未知。
此外,確保在初始化上下文時使用調試環境,並使用ARB_debug_output擴展接收日誌輸出。
void DebugMessageControlARB(enum source,
enum type,
enum severity,
sizei count,
const uint* ids,
boolean enabled);
void DebugMessageInsertARB(enum source,
enum type,
uint id,
enum severity,
sizei length,
const char* buf);
void DebugMessageCallbackARB(DEBUGPROCARB callback,
const void* userParam);
uint GetDebugMessageLogARB(uint count,
sizei bufSize,
enum* sources,
enum* types,
uint* ids,
enum* severities,
sizei* lengths,
char* messageLog);
void GetPointerv(enum pname,
void** params);
例如:
// Initialize GL_ARB_debug_output ASAP
if (glfwExtensionSupported("GL_ARB_debug_output"))
{
typedef void APIENTRY (*glDebugMessageCallbackARBFunc)
(GLDEBUGPROCARB callback, const void* userParam);
typedef void APIENTRY (*glDebugMessageControlARBFunc)
(GLenum source, GLenum type, GLenum severity,
GLsizei count, const GLuint* ids, GLboolean enabled);
auto glDebugMessageCallbackARB = (glDebugMessageCallbackARBFunc)
glfwGetProcAddress("glDebugMessageCallbackARB");
auto glDebugMessageControlARB = (glDebugMessageControlARBFunc)
glfwGetProcAddress("glDebugMessageControlARB");
glDebugMessageCallbackARB(debugCallback, this);
glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE,
GL_DEBUG_SEVERITY_LOW_ARB, 0, nullptr, GL_TRUE);
}
...
std::string GlfwThread::severityString(GLenum severity)
{
switch (severity)
{
case GL_DEBUG_SEVERITY_LOW_ARB: return "LOW";
case GL_DEBUG_SEVERITY_MEDIUM_ARB: return "MEDIUM";
case GL_DEBUG_SEVERITY_HIGH_ARB: return "HIGH";
default: return "??";
}
}
std::string GlfwThread::sourceString(GLenum source)
{
switch (source)
{
case GL_DEBUG_SOURCE_API_ARB: return "API";
case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: return "SYSTEM";
case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: return "SHADER_COMPILER";
case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: return "THIRD_PARTY";
case GL_DEBUG_SOURCE_APPLICATION_ARB: return "APPLICATION";
case GL_DEBUG_SOURCE_OTHER_ARB: return "OTHER";
default: return "???";
}
}
std::string GlfwThread::typeString(GLenum type)
{
switch (type)
{
case GL_DEBUG_TYPE_ERROR_ARB: return "ERROR";
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: return "DEPRECATED_BEHAVIOR";
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: return "UNDEFINED_BEHAVIOR";
case GL_DEBUG_TYPE_PORTABILITY_ARB: return "PORTABILITY";
case GL_DEBUG_TYPE_PERFORMANCE_ARB: return "PERFORMANCE";
case GL_DEBUG_TYPE_OTHER_ARB: return "OTHER";
default: return "???";
}
}
// Note: this is static, it is called from OpenGL
void GlfwThread::debugCallback(GLenum source, GLenum type,
GLuint id, GLenum severity,
GLsizei, const GLchar *message,
const GLvoid *)
{
std::cout << "source=" << sourceString(source) <<
" type=" << typeString(type) <<
" id=" << id <<
" severity=" << severityString(severity) <<
" message=" << message <<
std::endl;
AssertBreak(type != GL_DEBUG_TYPE_ERROR_ARB);
}
你幾乎可以肯定有一個體面的OpenGL實現這兩個擴展使用。他們幫助,很多。調試上下文對所有內容進行驗證並向日志投訴。他們甚至在一些OpenGL實現中的日誌輸出中給出性能建議。使用ARB_debug_output使檢查glGetError
已過時 - 它會檢查你的每一個電話。
你能添加一些日誌嗎? xorg.log和system log –
Archlinux是一種滾動版本的發行版,CentOS是一個面向服務器的發行版,如果你想要很好的多媒體支持和OpenGL功能而不需要太多的努力,你可能是錯誤的一方。 Archlinux有點像Debian Sid(Debian測試有時甚至是最糟糕的),每次我觸摸這個2發行版時,我都遇到與GPU驅動程序幾乎相同的問題,主要是因爲內核和X總是更新到最後一個版本和GPU司機落後。 – user2485710
@ user2485710:目標操作系統是Centos的問題。我們使用Archlinux(Ubuntu)進行開發。 – poljak181