X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglretrace_glx.cpp;h=7efc3bf38e133ecb18dfce406e7439712a607bde;hb=refs%2Fheads%2Fglx-copy-sub-buffer;hp=20afe5107e4720d94ce5f55b8d051df4e447549a;hpb=06555614b7385c49964d27aaeec68dec6ff31744;p=apitrace diff --git a/retrace/glretrace_glx.cpp b/retrace/glretrace_glx.cpp index 20afe51..7efc3bf 100644 --- a/retrace/glretrace_glx.cpp +++ b/retrace/glretrace_glx.cpp @@ -29,11 +29,20 @@ #include "glretrace.hpp" +#ifndef GLX_PBUFFER_HEIGHT +#define GLX_PBUFFER_HEIGHT 0x8040 +#endif + +#ifndef GLX_PBUFFER_WIDTH +#define GLX_PBUFFER_WIDTH 0x8041 +#endif + + using namespace glretrace; typedef std::map DrawableMap; -typedef std::map ContextMap; +typedef std::map ContextMap; static DrawableMap drawable_map; static ContextMap context_map; @@ -47,13 +56,13 @@ getDrawable(unsigned long drawable_id) { DrawableMap::const_iterator it; it = drawable_map.find(drawable_id); if (it == drawable_map.end()) { - return (drawable_map[drawable_id] = glws::createDrawable(visual[glretrace::defaultProfile])); + return (drawable_map[drawable_id] = glretrace::createDrawable()); } return it->second; } -static glws::Context * +static Context * getContext(unsigned long long context_ptr) { if (context_ptr == 0) { return NULL; @@ -62,7 +71,7 @@ getContext(unsigned long long context_ptr) { ContextMap::const_iterator it; it = context_map.find(context_ptr); if (it == context_map.end()) { - return (context_map[context_ptr] = glws::createContext(visual[glretrace::defaultProfile], NULL, glretrace::defaultProfile, retrace::debug)); + return (context_map[context_ptr] = glretrace::createContext()); } return it->second; @@ -70,49 +79,30 @@ getContext(unsigned long long context_ptr) { static void retrace_glXCreateContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = getContext(call.arg(2).toUIntPtr()); + Context *share_context = getContext(call.arg(2).toUIntPtr()); - glws::Context *context = glws::createContext(glretrace::visual[glretrace::defaultProfile], share_context, glretrace::defaultProfile, retrace::debug); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } static void retrace_glXCreateContextAttribsARB(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = getContext(call.arg(2).toUIntPtr()); + Context *share_context = getContext(call.arg(2).toUIntPtr()); - glws::Context *context = glws::createContext(glretrace::visual[glretrace::defaultProfile], share_context, glretrace::defaultProfile, retrace::debug); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } static void retrace_glXMakeCurrent(trace::Call &call) { glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt()); - glws::Context *new_context = getContext(call.arg(2).toUIntPtr()); - - if (new_drawable == drawable && new_context == context) { - return; - } - - if (drawable && context) { - glFlush(); - if (!retrace::doubleBuffer) { - frame_complete(call); - } - } + Context *new_context = getContext(call.arg(2).toUIntPtr()); - bool result = glws::makeCurrent(new_drawable, new_context); - - if (new_drawable && new_context && result) { - drawable = new_drawable; - context = new_context; - } else { - drawable = NULL; - context = NULL; - } + glretrace::makeCurrent(call, new_drawable, new_context); } static void retrace_glXDestroyContext(trace::Call &call) { - glws::Context *context = getContext(call.arg(1).toUIntPtr()); + Context *context = getContext(call.arg(1).toUIntPtr()); if (!context) { return; @@ -121,10 +111,24 @@ static void retrace_glXDestroyContext(trace::Call &call) { delete context; } +static void retrace_glXCopySubBufferMESA(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(1).toUInt()); + int x = call.arg(2).toSInt(); + int y = call.arg(3).toSInt(); + int width = call.arg(4).toSInt(); + int height = call.arg(5).toSInt(); + + drawable->copySubBuffer(x, y, width, height); +} + static void retrace_glXSwapBuffers(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(1).toUInt()); + frame_complete(call); if (retrace::doubleBuffer) { - drawable->swapBuffers(); + if (drawable) { + drawable->swapBuffers(); + } } else { glFlush(); } @@ -132,43 +136,46 @@ static void retrace_glXSwapBuffers(trace::Call &call) { static void retrace_glXCreateNewContext(trace::Call &call) { unsigned long long orig_context = call.ret->toUIntPtr(); - glws::Context *share_context = getContext(call.arg(3).toUIntPtr()); + Context *share_context = getContext(call.arg(3).toUIntPtr()); - glws::Context *context = glws::createContext(glretrace::visual[glretrace::defaultProfile], share_context, glretrace::defaultProfile, retrace::debug); + Context *context = glretrace::createContext(share_context); context_map[orig_context] = context; } -static void retrace_glXMakeContextCurrent(trace::Call &call) { - glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt()); - glws::Context *new_context = getContext(call.arg(3).toUIntPtr()); +static void retrace_glXCreatePbuffer(trace::Call &call) { + const trace::Value *attrib_list = call.arg(2).toArray(); + int width = glretrace::parseAttrib(attrib_list, GLX_PBUFFER_WIDTH, 0); + int height = glretrace::parseAttrib(attrib_list, GLX_PBUFFER_HEIGHT, 0); + + unsigned long long orig_drawable = call.ret->toUInt(); + + glws::Drawable *drawable = glretrace::createPbuffer(width, height); + + drawable_map[orig_drawable] = drawable; +} + +static void retrace_glXDestroyPbuffer(trace::Call &call) { + glws::Drawable *drawable = getDrawable(call.arg(1).toUInt()); - if (new_drawable == drawable && new_context == context) { + if (!drawable) { return; } - if (drawable && context) { - glFlush(); - if (!retrace::doubleBuffer) { - frame_complete(call); - } - } + delete drawable; +} - bool result = glws::makeCurrent(new_drawable, new_context); +static void retrace_glXMakeContextCurrent(trace::Call &call) { + glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt()); + Context *new_context = getContext(call.arg(3).toUIntPtr()); - if (new_drawable && new_context && result) { - drawable = new_drawable; - context = new_context; - } else { - drawable = NULL; - context = NULL; - } + glretrace::makeCurrent(call, new_drawable, new_context); } const retrace::Entry glretrace::glx_callbacks[] = { //{"glXBindChannelToWindowSGIX", &retrace_glXBindChannelToWindowSGIX}, //{"glXBindSwapBarrierNV", &retrace_glXBindSwapBarrierNV}, //{"glXBindSwapBarrierSGIX", &retrace_glXBindSwapBarrierSGIX}, - //{"glXBindTexImageEXT", &retrace_glXBindTexImageEXT}, + {"glXBindTexImageEXT", &retrace::ignore}, //{"glXChannelRectSGIX", &retrace_glXChannelRectSGIX}, //{"glXChannelRectSyncSGIX", &retrace_glXChannelRectSyncSGIX}, {"glXChooseFBConfig", &retrace::ignore}, @@ -176,7 +183,7 @@ const retrace::Entry glretrace::glx_callbacks[] = { {"glXChooseVisual", &retrace::ignore}, //{"glXCopyContext", &retrace_glXCopyContext}, //{"glXCopyImageSubDataNV", &retrace_glXCopyImageSubDataNV}, - //{"glXCopySubBufferMESA", &retrace_glXCopySubBufferMESA}, + {"glXCopySubBufferMESA", &retrace_glXCopySubBufferMESA}, {"glXCreateContextAttribsARB", &retrace_glXCreateContextAttribsARB}, {"glXCreateContext", &retrace_glXCreateContext}, //{"glXCreateContextWithConfigSGIX", &retrace_glXCreateContextWithConfigSGIX}, @@ -184,15 +191,15 @@ const retrace::Entry glretrace::glx_callbacks[] = { //{"glXCreateGLXPixmap", &retrace_glXCreateGLXPixmap}, //{"glXCreateGLXPixmapWithConfigSGIX", &retrace_glXCreateGLXPixmapWithConfigSGIX}, {"glXCreateNewContext", &retrace_glXCreateNewContext}, - //{"glXCreatePbuffer", &retrace_glXCreatePbuffer}, - //{"glXCreatePixmap", &retrace_glXCreatePixmap}, + {"glXCreatePbuffer", &retrace_glXCreatePbuffer}, + {"glXCreatePixmap", &retrace::ignore}, //{"glXCreateWindow", &retrace_glXCreateWindow}, //{"glXCushionSGI", &retrace_glXCushionSGI}, {"glXDestroyContext", &retrace_glXDestroyContext}, //{"glXDestroyGLXPbufferSGIX", &retrace_glXDestroyGLXPbufferSGIX}, //{"glXDestroyGLXPixmap", &retrace_glXDestroyGLXPixmap}, - //{"glXDestroyPbuffer", &retrace_glXDestroyPbuffer}, - //{"glXDestroyPixmap", &retrace_glXDestroyPixmap}, + {"glXDestroyPbuffer", &retrace_glXDestroyPbuffer}, + {"glXDestroyPixmap", &retrace::ignore}, //{"glXDestroyWindow", &retrace_glXDestroyWindow}, //{"glXFreeContextEXT", &retrace_glXFreeContextEXT}, {"glXGetAGPOffsetMESA", &retrace::ignore}, @@ -214,6 +221,7 @@ const retrace::Entry glretrace::glx_callbacks[] = { {"glXGetProcAddress", &retrace::ignore}, {"glXGetSelectedEvent", &retrace::ignore}, {"glXGetSelectedEventSGIX", &retrace::ignore}, + {"glXGetSwapIntervalMESA", &retrace::ignore}, {"glXGetSyncValuesOML", &retrace::ignore}, {"glXGetVideoSyncSGI", &retrace::ignore}, {"glXGetVisualFromFBConfig", &retrace::ignore}, @@ -240,7 +248,7 @@ const retrace::Entry glretrace::glx_callbacks[] = { {"glXQuerySwapGroupNV", &retrace::ignore}, {"glXQueryVersion", &retrace::ignore}, //{"glXReleaseBuffersMESA", &retrace_glXReleaseBuffersMESA}, - //{"glXReleaseTexImageEXT", &retrace_glXReleaseTexImageEXT}, + {"glXReleaseTexImageEXT", &retrace::ignore}, //{"glXResetFrameCountNV", &retrace_glXResetFrameCountNV}, //{"glXSelectEvent", &retrace_glXSelectEvent}, //{"glXSelectEventSGIX", &retrace_glXSelectEventSGIX},