mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-21 05:05:44 +00:00
Implement debug device/debug api message tracking for GL
This commit is contained in:
@@ -275,9 +275,9 @@ enum DebugMessageCategory
|
||||
|
||||
enum DebugMessageSeverity
|
||||
{
|
||||
eDbgSeverity_Corruption = 0,
|
||||
eDbgSeverity_Error,
|
||||
eDbgSeverity_Warning,
|
||||
eDbgSeverity_High = 0,
|
||||
eDbgSeverity_Medium,
|
||||
eDbgSeverity_Low,
|
||||
eDbgSeverity_Info,
|
||||
};
|
||||
|
||||
|
||||
@@ -644,7 +644,7 @@ vector<DebugMessage> WrappedID3D11Device::GetDebugMessages()
|
||||
|
||||
DebugMessage msg;
|
||||
msg.category = eDbgCategory_Miscellaneous;
|
||||
msg.severity = eDbgSeverity_Error;
|
||||
msg.severity = eDbgSeverity_Medium;
|
||||
|
||||
switch(message->Category)
|
||||
{
|
||||
@@ -691,13 +691,13 @@ vector<DebugMessage> WrappedID3D11Device::GetDebugMessages()
|
||||
switch(message->Severity)
|
||||
{
|
||||
case D3D11_MESSAGE_SEVERITY_CORRUPTION:
|
||||
msg.severity = eDbgSeverity_Corruption;
|
||||
msg.severity = eDbgSeverity_High;
|
||||
break;
|
||||
case D3D11_MESSAGE_SEVERITY_ERROR:
|
||||
msg.severity = eDbgSeverity_Error;
|
||||
msg.severity = eDbgSeverity_Medium;
|
||||
break;
|
||||
case D3D11_MESSAGE_SEVERITY_WARNING:
|
||||
msg.severity = eDbgSeverity_Warning;
|
||||
msg.severity = eDbgSeverity_Low;
|
||||
break;
|
||||
case D3D11_MESSAGE_SEVERITY_INFO:
|
||||
msg.severity = eDbgSeverity_Info;
|
||||
|
||||
@@ -240,6 +240,8 @@ enum GLChunkType
|
||||
SET_MARKER,
|
||||
END_EVENT,
|
||||
|
||||
DEBUG_MESSAGES,
|
||||
|
||||
CAPTURE_SCOPE,
|
||||
CONTEXT_CAPTURE_HEADER,
|
||||
CONTEXT_CAPTURE_FOOTER,
|
||||
|
||||
@@ -193,6 +193,8 @@ const char *GLChunkNames[] =
|
||||
"glPushDebugGroup",
|
||||
"glDebugMessageInsert",
|
||||
"glPopDebugGroup",
|
||||
|
||||
"DebugMessageList",
|
||||
|
||||
"Capture",
|
||||
"BeginCapture",
|
||||
@@ -536,14 +538,20 @@ void WrappedOpenGL::ActivateContext(void *windowHandle, void *contextHandle)
|
||||
|
||||
if(contextHandle)
|
||||
{
|
||||
const GLHookSet &gl = m_Real;
|
||||
|
||||
if(gl.glDebugMessageCallback && RenderDoc::Inst().GetCaptureOptions().DebugDeviceMode)
|
||||
{
|
||||
gl.glDebugMessageCallback(&DebugSnoopStatic, this);
|
||||
gl.glEnable(eGL_DEBUG_OUTPUT_SYNCHRONOUS);
|
||||
}
|
||||
|
||||
FontData &font = m_Fonts[contextHandle];
|
||||
|
||||
if(!font.built)
|
||||
{
|
||||
font.built = true;
|
||||
|
||||
const GLHookSet &gl = m_Real;
|
||||
|
||||
if(gl.glGenTextures && gl.glTextureStorage2DEXT && gl.glTextureSubImage2DEXT &&
|
||||
gl.glGenVertexArrays && gl.glBindVertexArray &&
|
||||
gl.glGenBuffers && gl.glNamedBufferStorageEXT &&
|
||||
@@ -1112,6 +1120,8 @@ void WrappedOpenGL::AttemptCapture()
|
||||
{
|
||||
m_State = WRITING_CAPFRAME;
|
||||
|
||||
m_DebugMessages.clear();
|
||||
|
||||
{
|
||||
RDCDEBUG("Immediate Context %llu Attempting capture", GetContextResourceID());
|
||||
|
||||
@@ -1163,9 +1173,84 @@ void WrappedOpenGL::FinishCapture()
|
||||
{
|
||||
m_State = WRITING_IDLE;
|
||||
|
||||
m_DebugMessages.clear();
|
||||
|
||||
//m_SuccessfulCapture = false;
|
||||
}
|
||||
|
||||
vector<DebugMessage> WrappedOpenGL::Serialise_DebugMessages()
|
||||
{
|
||||
SCOPED_SERIALISE_CONTEXT(DEBUG_MESSAGES);
|
||||
|
||||
vector<DebugMessage> debugMessages;
|
||||
|
||||
if(m_State == WRITING_CAPFRAME)
|
||||
{
|
||||
debugMessages = m_DebugMessages;
|
||||
m_DebugMessages.clear();
|
||||
}
|
||||
|
||||
SERIALISE_ELEMENT(bool, HasCallstack, RenderDoc::Inst().GetCaptureOptions().CaptureCallstacksOnlyDraws != 0);
|
||||
|
||||
if(HasCallstack)
|
||||
{
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
Callstack::Stackwalk *call = Callstack::Collect();
|
||||
|
||||
RDCASSERT(call->NumLevels() < 0xff);
|
||||
|
||||
size_t numLevels = call->NumLevels();
|
||||
uint64_t *stack = call->GetAddrs();
|
||||
|
||||
m_pSerialiser->Serialise("callstack", stack, numLevels);
|
||||
|
||||
delete call;
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t numLevels = 0;
|
||||
uint64_t *stack = NULL;
|
||||
|
||||
m_pSerialiser->Serialise("callstack", stack, numLevels);
|
||||
|
||||
m_pSerialiser->SetCallstack(stack, numLevels);
|
||||
|
||||
SAFE_DELETE_ARRAY(stack);
|
||||
}
|
||||
}
|
||||
|
||||
SERIALISE_ELEMENT(uint32_t, NumMessages, (uint32_t)debugMessages.size());
|
||||
|
||||
for(uint32_t i=0; i < NumMessages; i++)
|
||||
{
|
||||
ScopedContext scope(m_pSerialiser, NULL, "DebugMessage", "DebugMessage", 0, false);
|
||||
|
||||
string desc;
|
||||
if(m_State >= WRITING)
|
||||
desc = debugMessages[i].description.elems;
|
||||
|
||||
SERIALISE_ELEMENT(uint32_t, Category, debugMessages[i].category);
|
||||
SERIALISE_ELEMENT(uint32_t, Severity, debugMessages[i].severity);
|
||||
SERIALISE_ELEMENT(uint32_t, ID, debugMessages[i].messageID);
|
||||
SERIALISE_ELEMENT(string, Description, desc);
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
DebugMessage msg;
|
||||
msg.category = (DebugMessageCategory)Category;
|
||||
msg.severity = (DebugMessageSeverity)Severity;
|
||||
msg.messageID = ID;
|
||||
msg.description = Description;
|
||||
|
||||
debugMessages.push_back(msg);
|
||||
}
|
||||
}
|
||||
|
||||
return debugMessages;
|
||||
}
|
||||
|
||||
|
||||
void WrappedOpenGL::DebugSnoop(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message)
|
||||
{
|
||||
if(type != eGL_DEBUG_TYPE_OTHER || severity != eGL_DEBUG_SEVERITY_NOTIFICATION)
|
||||
@@ -1174,6 +1259,57 @@ void WrappedOpenGL::DebugSnoop(GLenum source, GLenum type, GLuint id, GLenum sev
|
||||
ToStr::Get(source).c_str(), ToStr::Get(type).c_str(), id, ToStr::Get(severity).c_str(), message);
|
||||
}
|
||||
|
||||
if(m_State == WRITING_CAPFRAME &&
|
||||
type != eGL_DEBUG_TYPE_PUSH_GROUP && type != eGL_DEBUG_TYPE_POP_GROUP)
|
||||
{
|
||||
DebugMessage msg;
|
||||
|
||||
msg.messageID = id;
|
||||
msg.description = string(message, message+length);
|
||||
|
||||
switch(severity)
|
||||
{
|
||||
case eGL_DEBUG_SEVERITY_HIGH:
|
||||
msg.severity = eDbgSeverity_High; break;
|
||||
case eGL_DEBUG_SEVERITY_MEDIUM:
|
||||
msg.severity = eDbgSeverity_Medium; break;
|
||||
case eGL_DEBUG_SEVERITY_LOW:
|
||||
msg.severity = eDbgSeverity_Low; break;
|
||||
case eGL_DEBUG_SEVERITY_NOTIFICATION:
|
||||
default:
|
||||
msg.severity = eDbgSeverity_Info; break;
|
||||
}
|
||||
|
||||
if(source == eGL_DEBUG_SOURCE_APPLICATION || type == eGL_DEBUG_TYPE_MARKER)
|
||||
{
|
||||
msg.category = eDbgCategory_Application_Defined;
|
||||
}
|
||||
else if(source == eGL_DEBUG_SOURCE_SHADER_COMPILER)
|
||||
{
|
||||
msg.category = eDbgCategory_Shaders;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case eGL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
|
||||
msg.category = eDbgCategory_Deprecated; break;
|
||||
case eGL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
|
||||
msg.category = eDbgCategory_Undefined; break;
|
||||
case eGL_DEBUG_TYPE_PORTABILITY:
|
||||
msg.category = eDbgCategory_Portability; break;
|
||||
case eGL_DEBUG_TYPE_PERFORMANCE:
|
||||
msg.category = eDbgCategory_Performance; break;
|
||||
case eGL_DEBUG_TYPE_ERROR:
|
||||
case eGL_DEBUG_TYPE_OTHER:
|
||||
default:
|
||||
msg.category = eDbgCategory_Miscellaneous; break;
|
||||
}
|
||||
}
|
||||
|
||||
m_DebugMessages.push_back(msg);
|
||||
}
|
||||
|
||||
if(m_RealDebugFunc)
|
||||
m_RealDebugFunc(source, type, id, severity, length, message, m_RealDebugFuncParam);
|
||||
}
|
||||
|
||||
@@ -93,6 +93,9 @@ class WrappedOpenGL
|
||||
|
||||
const GLHookSet &GetHookset() { return m_Real; }
|
||||
|
||||
vector<DebugMessage> m_DebugMessages;
|
||||
vector<DebugMessage> Serialise_DebugMessages();
|
||||
|
||||
GLDEBUGPROC m_RealDebugFunc;
|
||||
const void *m_RealDebugFuncParam;
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@ bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei cou
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -57,6 +59,8 @@ bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei cou
|
||||
|
||||
draw.flags |= eDraw_Drawcall;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
@@ -91,6 +95,8 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstanced(GLenum mode, GLint first, GL
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -110,6 +116,8 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstanced(GLenum mode, GLint first, GL
|
||||
draw.instanceOffset = 0;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_Instanced;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
|
||||
@@ -146,6 +154,8 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstancedBaseInstance(GLenum mode, GLi
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -166,6 +176,8 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstancedBaseInstance(GLenum mode, GLi
|
||||
draw.instanceOffset = BaseInstance;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_Instanced;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
|
||||
@@ -201,6 +213,8 @@ bool WrappedOpenGL::Serialise_glDrawElements(GLenum mode, GLsizei count, GLenum
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -220,6 +234,8 @@ bool WrappedOpenGL::Serialise_glDrawElements(GLenum mode, GLsizei count, GLenum
|
||||
draw.instanceOffset = 0;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -259,6 +275,8 @@ bool WrappedOpenGL::Serialise_glDrawRangeElements(GLenum mode, GLuint start, GLu
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -278,6 +296,8 @@ bool WrappedOpenGL::Serialise_glDrawRangeElements(GLenum mode, GLuint start, GLu
|
||||
draw.instanceOffset = 0;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -316,6 +336,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsBaseVertex(GLenum mode, GLsizei coun
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -336,6 +358,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsBaseVertex(GLenum mode, GLsizei coun
|
||||
draw.instanceOffset = 0;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -374,6 +398,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstanced(GLenum mode, GLsizei count
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -394,6 +420,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstanced(GLenum mode, GLsizei count
|
||||
draw.instanceOffset = 0;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -433,6 +461,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseInstance(GLenum mode, G
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -454,6 +484,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseInstance(GLenum mode, G
|
||||
draw.instanceOffset = BaseInstance;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -493,6 +525,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertex(GLenum mode, GLs
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -514,6 +548,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertex(GLenum mode, GLs
|
||||
draw.instanceOffset = 0;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -554,6 +590,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertexBaseInstance(GLen
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -576,6 +614,8 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertexBaseInstance(GLen
|
||||
draw.instanceOffset = BaseInstance;
|
||||
|
||||
draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
m_LastDrawMode = Mode;
|
||||
m_LastIndexSize = Type;
|
||||
@@ -624,6 +664,8 @@ bool WrappedOpenGL::Serialise_glClearBufferfv(GLenum buffer, GLint drawbuffer, c
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -635,6 +677,8 @@ bool WrappedOpenGL::Serialise_glClearBufferfv(GLenum buffer, GLint drawbuffer, c
|
||||
FetchDrawcall draw;
|
||||
draw.name = widen(name);
|
||||
draw.flags |= eDraw_Clear;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
}
|
||||
@@ -680,6 +724,8 @@ bool WrappedOpenGL::Serialise_glClearBufferiv(GLenum buffer, GLint drawbuffer, c
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -691,6 +737,8 @@ bool WrappedOpenGL::Serialise_glClearBufferiv(GLenum buffer, GLint drawbuffer, c
|
||||
FetchDrawcall draw;
|
||||
draw.name = widen(name);
|
||||
draw.flags |= eDraw_Clear;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
}
|
||||
@@ -728,6 +776,8 @@ bool WrappedOpenGL::Serialise_glClearBufferuiv(GLenum buffer, GLint drawbuffer,
|
||||
}
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -739,6 +789,8 @@ bool WrappedOpenGL::Serialise_glClearBufferuiv(GLenum buffer, GLint drawbuffer,
|
||||
FetchDrawcall draw;
|
||||
draw.name = widen(name);
|
||||
draw.flags |= eDraw_Clear;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
}
|
||||
@@ -770,6 +822,8 @@ bool WrappedOpenGL::Serialise_glClearBufferfi(GLenum buffer, GLint drawbuffer, G
|
||||
m_Real.glClearBufferfi(buf, draw, d, s);
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
@@ -781,6 +835,8 @@ bool WrappedOpenGL::Serialise_glClearBufferfi(GLenum buffer, GLint drawbuffer, G
|
||||
FetchDrawcall draw;
|
||||
draw.name = widen(name);
|
||||
draw.flags |= eDraw_Clear;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
}
|
||||
@@ -810,6 +866,8 @@ bool WrappedOpenGL::Serialise_glClear(GLbitfield mask)
|
||||
|
||||
const string desc = m_pSerialiser->GetDebugStr();
|
||||
|
||||
vector<DebugMessage> debugMessages = Serialise_DebugMessages();
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
AddEvent(CLEARBUFFERF, desc);
|
||||
@@ -833,6 +891,8 @@ bool WrappedOpenGL::Serialise_glClear(GLbitfield mask)
|
||||
FetchDrawcall draw;
|
||||
draw.name = widen(name);
|
||||
draw.flags |= eDraw_Clear;
|
||||
|
||||
draw.debugMessages = debugMessages;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
}
|
||||
|
||||
@@ -328,7 +328,47 @@ void glXDestroyContext(Display *dpy, GLXContext ctx)
|
||||
__attribute__ ((visibility ("default")))
|
||||
GLXContext glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, GLXContext shareList, Bool direct, const int *attribList)
|
||||
{
|
||||
GLXContext ret = OpenGLHook::glhooks.glXCreateContextAttribsARB_real(dpy, config, shareList, direct, attribList);
|
||||
const int *attribs = attribList;
|
||||
vector<int> attribVec;
|
||||
|
||||
if(RenderDoc::Inst().GetCaptureOptions().DebugDeviceMode)
|
||||
{
|
||||
bool flagsNext = false;
|
||||
bool flagsFound = false;
|
||||
const int *a = attribList;
|
||||
while(*a)
|
||||
{
|
||||
int val = *a;
|
||||
|
||||
if(flagsNext)
|
||||
{
|
||||
val |= GLX_CONTEXT_DEBUG_BIT_ARB;
|
||||
flagsNext = false;
|
||||
}
|
||||
|
||||
if(val == GLX_CONTEXT_FLAGS_ARB)
|
||||
{
|
||||
flagsNext = true;
|
||||
flagsFound = true;
|
||||
}
|
||||
|
||||
attribVec.push_back(val);
|
||||
|
||||
a++;
|
||||
}
|
||||
|
||||
if(!flagsFound)
|
||||
{
|
||||
attribVec.push_back(GLX_CONTEXT_FLAGS_ARB);
|
||||
attribVec.push_back(GLX_CONTEXT_DEBUG_BIT_ARB);
|
||||
}
|
||||
|
||||
attribVec.push_back(0);
|
||||
|
||||
attribs = &attribVec[0];
|
||||
}
|
||||
|
||||
GLXContext ret = OpenGLHook::glhooks.glXCreateContextAttribsARB_real(dpy, config, shareList, direct, attribs);
|
||||
|
||||
XVisualInfo *vis = OpenGLHook::glhooks.glXGetVisualFromFBConfig_real(dpy, config);
|
||||
|
||||
|
||||
@@ -333,8 +333,48 @@ class OpenGLHook : LibraryHook
|
||||
|
||||
static HGLRC WINAPI wglCreateContextAttribsARB_hooked(HDC dc, HGLRC hShareContext, const int *attribList)
|
||||
{
|
||||
HGLRC ret = glhooks.wglCreateContextAttribsARB_realfunc(dc, hShareContext, attribList);
|
||||
const int *attribs = attribList;
|
||||
vector<int> attribVec;
|
||||
|
||||
if(RenderDoc::Inst().GetCaptureOptions().DebugDeviceMode)
|
||||
{
|
||||
bool flagsNext = false;
|
||||
bool flagsFound = false;
|
||||
const int *a = attribList;
|
||||
while(*a)
|
||||
{
|
||||
int val = *a;
|
||||
|
||||
if(flagsNext)
|
||||
{
|
||||
val |= WGL_CONTEXT_DEBUG_BIT_ARB;
|
||||
flagsNext = false;
|
||||
}
|
||||
|
||||
if(val == WGL_CONTEXT_FLAGS_ARB)
|
||||
{
|
||||
flagsNext = true;
|
||||
flagsFound = true;
|
||||
}
|
||||
|
||||
attribVec.push_back(val);
|
||||
|
||||
a++;
|
||||
}
|
||||
|
||||
if(!flagsFound)
|
||||
{
|
||||
attribVec.push_back(WGL_CONTEXT_FLAGS_ARB);
|
||||
attribVec.push_back(WGL_CONTEXT_DEBUG_BIT_ARB);
|
||||
}
|
||||
|
||||
attribVec.push_back(0);
|
||||
|
||||
attribs = &attribVec[0];
|
||||
}
|
||||
|
||||
HGLRC ret = glhooks.wglCreateContextAttribsARB_realfunc(dc, hShareContext, attribs);
|
||||
|
||||
glhooks.GetDriver()->CreateContext(WindowFromDC(dc), ret, hShareContext, GetInitParamsForDC(dc));
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user