static void ogl_update_transformation(ALLEGRO_DISPLAY* disp, ALLEGRO_BITMAP *target) { if (disp->flags & ALLEGRO_PROGRAMMABLE_PIPELINE) { #ifdef ALLEGRO_CFG_SHADER_GLSL GLint loc = disp->ogl_extras->varlocs.projview_matrix_loc; ALLEGRO_TRANSFORM projview; al_copy_transform(&projview, &target->transform); al_compose_transform(&projview, &target->proj_transform); al_copy_transform(&disp->projview_transform, &projview); if (disp->ogl_extras->program_object > 0 && loc >= 0) { _al_glsl_set_projview_matrix(loc, &disp->projview_transform); } #endif } else { glMatrixMode(GL_PROJECTION); glLoadMatrixf((float *)target->proj_transform.m); glMatrixMode(GL_MODELVIEW); glLoadMatrixf((float *)target->transform.m); } if (target->parent) { ALLEGRO_BITMAP_EXTRA_OPENGL *ogl_extra = target->parent->extra; /* glViewport requires the bottom-left coordinate of the corner. */ glViewport(target->xofs, ogl_extra->true_h - (target->yofs + target->h), target->w, target->h); } else { glViewport(0, 0, target->w, target->h); } }
static bool glsl_use_shader(ALLEGRO_SHADER *shader, ALLEGRO_DISPLAY *display, bool set_projview_matrix_from_display) { ALLEGRO_SHADER_GLSL_S *gl_shader; GLuint program_object; GLenum err; if (!(display->flags & ALLEGRO_OPENGL)) { return false; } gl_shader = (ALLEGRO_SHADER_GLSL_S *)shader; program_object = gl_shader->program_object; glGetError(); /* clear error */ glUseProgram(program_object); err = glGetError(); if (err != GL_NO_ERROR) { ALLEGRO_WARN("glUseProgram(%u) failed: %s\n", program_object, _al_gl_error_string(err)); display->ogl_extras->program_object = 0; return false; } display->ogl_extras->program_object = program_object; /* Copy variable locations. */ display->ogl_extras->varlocs = gl_shader->varlocs; /* Optionally set projview matrix. We skip this when it is known that the * matrices in the display are out of date and are about to be clobbered * itself. */ if (set_projview_matrix_from_display) { _al_glsl_set_projview_matrix( display->ogl_extras->varlocs.projview_matrix_loc, &display->projview_transform); } return true; }