Esempio n. 1
0
void evdi_fbdev_unplug(struct drm_device *dev)
{
  struct evdi_device *evdi = dev->dev_private;
  struct evdi_fbdev *ufbdev;
  if (!evdi->fbdev) {
    return;
  }

  ufbdev = evdi->fbdev;
  if (ufbdev->helper.fbdev) {
    struct fb_info *info;
    info = ufbdev->helper.fbdev;
    unlink_framebuffer(info);
  }
}
Esempio n. 2
0
void recycle_framebuffer(int width, int height, GLuint tex, GLuint fbo) {
    framebuffer_t *framebuffer = xmalloc(sizeof(framebuffer_t));
    framebuffer->width = width;
    framebuffer->height = height;
    framebuffer->tex = tex;
    framebuffer->fbo = fbo;

    // fprintf(stderr, "added recyleable framebuffer %dx%d %d %d\n", framebuffer->width, framebuffer->height, 
    //     framebuffer->tex, framebuffer->fbo);

    DL_APPEND(framebuffers, framebuffer);
    num_framebuffers++;

    if (num_framebuffers > MAX_CACHED) {
        fprintf(stderr, ERROR("too many framebuffers in use\n"));
        glDeleteFramebuffers(1, &framebuffers->fbo);
        glDeleteTextures(1, &framebuffers->tex);
        unlink_framebuffer(framebuffers);
    }
}
Esempio n. 3
0
void make_framebuffer(int width, int height, GLuint *tex, GLuint *fbo) {
    framebuffer_t *framebuffer, *tmp;

    // fprintf(stderr, "requesting framebuffer: %dx%d\n", width, height);
    // fprintf(stderr, "got %d %p framebuffers\n", num_framebuffers, framebuffers);

    DL_FOREACH_SAFE(framebuffers, framebuffer, tmp) {
        // fprintf(stderr, "checking %dx%d %d %d\n", framebuffer->width, framebuffer->height, 
        //         framebuffer->tex, framebuffer->fbo);

        // Same size?
        if (framebuffer->height == height && framebuffer->width == width) {
            // fprintf(stderr, "found reusable framebuffer\n");
            *tex = framebuffer->tex;
            *fbo = framebuffer->fbo;
            glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->fbo);
            glBindTexture(GL_TEXTURE_2D, framebuffer->tex);
            unlink_framebuffer(framebuffer);
            return;
        }
    }
    // fprintf(stderr, "nope\n");

    glGenFramebuffers(1, fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
    fprintf(stderr, INFO("new framebuffer (%dx%d): %u\n"), width, height, *fbo);

    glGenTextures(1, tex);
    glBindTexture(GL_TEXTURE_2D, *tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, NULL);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *tex, 0);
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        die("cannot initialize new framebuffer");
}