typedef std::map<unsigned long long, glws::Drawable *> DrawableMap;
-typedef std::map<unsigned long long, glws::Context *> ContextMap;
+typedef std::map<unsigned long long, Context *> ContextMap;
typedef std::map<unsigned long long, glws::Profile> ProfileMap;
static DrawableMap drawable_map;
static ContextMap context_map;
return (it != drawable_map.end()) ? it->second : NULL;
}
-static glws::Context *
+static Context *
getContext(unsigned long long context_ptr) {
if (context_ptr == 0) {
return NULL;
it = drawable_map.find(orig_surface);
if (it != drawable_map.end()) {
- if (it->second != currentDrawable) {
+ glretrace::Context *currentContext = glretrace::getCurrentContext();
+ if (!currentContext || it->second != currentContext->drawable) {
// TODO: reference count
delete it->second;
}
static void retrace_eglCreateContext(trace::Call &call) {
unsigned long long orig_context = call.ret->toUIntPtr();
unsigned long long orig_config = call.arg(1).toUIntPtr();
- glws::Context *share_context = getContext(call.arg(2).toUIntPtr());
+ Context *share_context = getContext(call.arg(2).toUIntPtr());
trace::Array *attrib_array = dynamic_cast<trace::Array *>(&call.arg(3));
glws::Profile profile;
}
- glws::Context *context = glretrace::createContext(share_context, profile);
+ Context *context = glretrace::createContext(share_context, profile);
if (!context) {
const char *name;
switch (profile) {
static void retrace_eglMakeCurrent(trace::Call &call) {
glws::Drawable *new_drawable = getDrawable(call.arg(1).toUIntPtr());
- glws::Context *new_context = getContext(call.arg(3).toUIntPtr());
+ Context *new_context = getContext(call.arg(3).toUIntPtr());
glretrace::makeCurrent(call, new_drawable, new_context);
}
static void retrace_eglSwapBuffers(trace::Call &call) {
+ glws::Drawable *drawable = getDrawable(call.arg(1).toUIntPtr());
+
frame_complete(call);
- if (retrace::doubleBuffer && currentDrawable) {
- currentDrawable->swapBuffers();
+ if (retrace::doubleBuffer) {
+ if (drawable) {
+ drawable->swapBuffers();
+ }
} else {
glFlush();
}
}
-static void retrace_glEGLImageTargetTexture2DOES(trace::Call &call)
-{
- EGLenum target = call.arg(0).toUInt();
- struct image_blob *iblob;
- struct image_info *info;
-
- if (target != GL_TEXTURE_2D) {
- os::log("%s: target %d not supported\n", __func__, target);
- return;
- }
- iblob = static_cast<struct image_blob *>((call.arg(1)).toPointer());
- info = &iblob->info;
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, info->width, info->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, iblob->data);
-}
-
const retrace::Entry glretrace::egl_callbacks[] = {
{"eglGetError", &retrace::ignore},
{"eglGetDisplay", &retrace::ignore},
//{"eglCopyBuffers", &retrace::ignore},
{"eglGetProcAddress", &retrace::ignore},
{"eglCreateImageKHR", &retrace::ignore},
- {"glEGLImageTargetTexture2DOES", &retrace_glEGLImageTargetTexture2DOES},
+ {"eglDestroyImageKHR", &retrace::ignore},
+ {"glEGLImageTargetTexture2DOES", &retrace::ignore},
{NULL, NULL},
};