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); } }
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); } }
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"); }