X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmain.c;h=afcd7646b9ecdd38df1d7a557d85f8a366a64d82;hb=15cc4fad4138cd30e1fe239cad5a2e6215c38b7b;hp=1cabcf637dc992dd14dcf71656795e371e218c5a;hpb=574302ed0fced0d57233c4517d414b4c3e875d7d;p=geometrycompositor.git diff --git a/source/main.c b/source/main.c index 1cabcf6..afcd764 100644 --- a/source/main.c +++ b/source/main.c @@ -241,6 +241,17 @@ unsigned link_program(unsigned *shaders, unsigned nshaders) return program; } +unsigned create_2d_texture() +{ + unsigned texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + return texture; +} + int create_gl_resources(Compositor *compositor, CompositedScreen *screen) { unsigned stride; @@ -273,12 +284,8 @@ int create_gl_resources(Compositor *compositor, CompositedScreen *screen) glBindBuffer(GL_ARRAY_BUFFER, 0); - glGenTextures(1, &screen->fb_texture); - glBindTexture(GL_TEXTURE_2D, screen->fb_texture); + screen->fb_texture = create_2d_texture(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, screen->width, screen->height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); glGenFramebuffers(1, &screen->framebuffer); @@ -301,6 +308,24 @@ CompositedWindow *find_window(CompositedScreen *screen, Window w) return NULL; } +CompositedWindow *find_window_global(Compositor *compositor, Window w, CompositedScreen **screen) +{ + unsigned i, j; + + for(i=0; inscreens; ++i) + for(j=0; jscreens[i].nwindows; ++j) + if(compositor->screens[i].windows[j].window==w) + { + if(screen) + *screen = &compositor->screens[i]; + return &compositor->screens[i].windows[j]; + } + + if(screen) + *screen = NULL; + return NULL; +} + void create_window_pixmap(Compositor *compositor, CompositedScreen *screen, CompositedWindow *window) { int attribs[5]; @@ -366,11 +391,7 @@ CompositedWindow *add_window(Compositor *compositor, CompositedScreen *screen, W if(window->map_state==IsViewable) create_window_pixmap(compositor, screen, window); - glGenTextures(1, &window->texture); - glBindTexture(GL_TEXTURE_2D, window->texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + window->texture = create_2d_texture(); return window; } @@ -444,18 +465,6 @@ CompositedScreen *find_screen_by_root(Compositor *compositor, Window root) return NULL; } -CompositedScreen *find_screen_by_window(Compositor *compositor, Window w) -{ - unsigned i, j; - - for(i=0; inscreens; ++i) - for(j=0; jscreens[i].nwindows; ++j) - if(compositor->screens[i].windows[j].window==w) - return &compositor->screens[i]; - - return NULL; -} - void update_monitor_vertices(CompositedScreen *screen, CompositedMonitor *monitor) { unsigned t; @@ -997,12 +1006,8 @@ void process_damage_event(Compositor *compositor, XDamageNotifyEvent *event) CompositedScreen *screen; CompositedWindow *window; - screen = find_screen_by_window(compositor, event->drawable); - if(!screen) - return; - - window = find_window(screen, event->drawable); - if(window->map_state==IsViewable) + window = find_window_global(compositor, event->drawable, &screen); + if(window && window->map_state==IsViewable) mark_dirty(compositor, screen); } @@ -1069,6 +1074,8 @@ void refresh_screen(Compositor *compositor, CompositedScreen *screen) if(window->map_state!=IsViewable) continue; + XDamageSubtract(compositor->display, window->damage, None, None); + glBindTexture(GL_TEXTURE_2D, window->texture); compositor->glXBindTexImageEXT(compositor->display, window->glx_pixmap, GLX_FRONT_LEFT_EXT, NULL); glUniform4f(screen->geometry_loc, @@ -1076,7 +1083,6 @@ void refresh_screen(Compositor *compositor, CompositedScreen *screen) (float)(window->width+2*window->border)/screen->width, (float)(window->height+2*window->border)/screen->height); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); compositor->glXReleaseTexImageEXT(compositor->display, window->glx_pixmap, GLX_FRONT_LEFT_EXT); - XDamageSubtract(compositor->display, window->damage, None, None); } glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);