X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmain.c;h=f4704aead4e0aef22c003bd38cc1507fc7d9c85f;hb=bd6748fb5beb9d2f5cb0dd62fce445fe73b4d10e;hp=f7780a0e20a37955a69579bad3aae0666845a688;hpb=7a299a9a28544526803004cf899dcd729953fe74;p=geometrycompositor.git diff --git a/source/main.c b/source/main.c index f7780a0..f4704ae 100644 --- a/source/main.c +++ b/source/main.c @@ -63,29 +63,31 @@ static const char *vshader = "#version 150\n" "uniform vec4 geometry;\n" "in vec2 vertex;\n" + "in vec2 texture_coord;\n" "out vec2 texcoord;\n" "void main()\n" "{\n" " gl_Position = vec4((geometry.xy+vertex*geometry.zw)*2.0-1.0, 0.0, 1.0);\n" - " texcoord = vec2(vertex.x, 1.0-vertex.y);\n" + " texcoord = texture_coord;\n" "}\n"; static const char *fshader = "#version 150\n" - "uniform sampler2D window;\n" + "uniform sampler2D image;\n" "in vec2 texcoord;\n" "out vec4 frag_color;\n" "void main()\n" "{\n" - " frag_color = texture(window, texcoord);\n" + " frag_color = texture(image, texcoord);\n" "}\n"; static const float vertices[] = { - 0.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 1.0f, - 1.0f, 0.0f + /* vertex texcoord */ + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 1.0f }; int terminate_requested = 0; @@ -181,12 +183,40 @@ unsigned compile_shader(GLenum type, const char *source) return shader; } -int create_gl_resources(Compositor *compositor, CompositedScreen *screen) +unsigned link_program(unsigned *shaders, unsigned nshaders) { + unsigned program; + unsigned i; int status; char info_log[1024]; GLsizei length; + program = glCreateProgram(); + for(i=0; ishaders[0] = compile_shader(GL_VERTEX_SHADER, vshader); @@ -194,33 +224,24 @@ int create_gl_resources(Compositor *compositor, CompositedScreen *screen) if(!screen->shaders[0] || !screen->shaders[1]) return 0; - screen->program = glCreateProgram(); - glAttachShader(screen->program, screen->shaders[0]); - glAttachShader(screen->program, screen->shaders[1]); - glBindAttribLocation(screen->program, 0, "vertex"); - glLinkProgram(screen->program); + screen->program = link_program(screen->shaders, 2); + if(!screen->program) + return 0; screen->geometry_loc = glGetUniformLocation(screen->program, "geometry"); - glGetProgramiv(screen->program, GL_LINK_STATUS, &status); - glGetProgramInfoLog(screen->program, sizeof(info_log), &length, info_log); - if(!status) - { - fprintf(stderr, "Program link failed:\n%s\n", info_log); - glDeleteProgram(screen->program); - return 0; - } - else if(length) - printf("Program info log:\n%s\n", info_log); - glGenBuffers(1, &screen->vertex_buffer); glBindBuffer(GL_ARRAY_BUFFER, screen->vertex_buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + stride = 4*sizeof(float); glGenVertexArrays(1, &screen->vertex_array); glBindVertexArray(screen->vertex_array); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, stride, NULL); glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, stride, (void *)(2*sizeof(float))); + glEnableVertexAttribArray(1); + glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -555,22 +576,28 @@ void process_create_window_event(Compositor *compositor, XCreateWindowEvent *eve void process_destroy_window_event(Compositor *compositor, XDestroyWindowEvent *event) { - CompositedScreen *screen = find_screen_by_root(compositor, event->event); + CompositedScreen *screen; + CompositedWindow *window; + + screen = find_screen_by_root(compositor, event->event); if(!screen) return; - CompositedWindow *window = find_window(screen, event->window); + window = find_window(screen, event->window); if(window) remove_window(compositor, screen, window, 1); } void process_map_event(Compositor *compositor, XMapEvent *event) { - CompositedScreen *screen = find_screen_by_root(compositor, event->event); + CompositedScreen *screen; + CompositedWindow *window; + + screen = find_screen_by_root(compositor, event->event); if(!screen) return; - CompositedWindow *window = find_window(screen, event->window); + window = find_window(screen, event->window); if(!window) return; @@ -582,11 +609,14 @@ void process_map_event(Compositor *compositor, XMapEvent *event) void process_unmap_event(Compositor *compositor, XUnmapEvent *event) { - CompositedScreen *screen = find_screen_by_root(compositor, event->event); + CompositedScreen *screen; + CompositedWindow *window; + + screen = find_screen_by_root(compositor, event->event); if(!screen) return; - CompositedWindow *window = find_window(screen, event->window); + window = find_window(screen, event->window); if(window) window->map_state = IsUnviewable; @@ -595,11 +625,13 @@ void process_unmap_event(Compositor *compositor, XUnmapEvent *event) void process_reparent_event(Compositor *compositor, XReparentEvent *event) { - CompositedScreen *screen = find_screen_by_root(compositor, event->event); + CompositedScreen *screen; + CompositedWindow *window; + + screen = find_screen_by_root(compositor, event->event); if(!screen) return; - CompositedWindow *window; if(event->parent==screen->root) window = add_window(compositor, screen, event->window); else @@ -617,11 +649,14 @@ void process_reparent_event(Compositor *compositor, XReparentEvent *event) void process_configure_event(Compositor *compositor, XConfigureEvent *event) { - CompositedScreen *screen = find_screen_by_root(compositor, event->event); + CompositedScreen *screen; + CompositedWindow *window; + + screen = find_screen_by_root(compositor, event->event); if(!screen) return; - CompositedWindow *window = find_window(screen, event->window); + window = find_window(screen, event->window); if(!window) return; @@ -642,11 +677,14 @@ void process_configure_event(Compositor *compositor, XConfigureEvent *event) void process_damage_event(Compositor *compositor, XDamageNotifyEvent *event) { - CompositedScreen *screen = find_screen_by_window(compositor, event->drawable); + CompositedScreen *screen; + CompositedWindow *window; + + screen = find_screen_by_window(compositor, event->drawable); if(!screen) return; - CompositedWindow *window = find_window(screen, event->drawable); + window = find_window(screen, event->drawable); if(window->map_state==IsViewable) mark_dirty(compositor, screen); }