示例#1
0
static void PS3_VideoQuit(_THIS)
{
	if (fb_dev_fd > 0) {
		
		if (ioctl(fb_dev_fd, FBIOPUT_VSCREENINFO, &fb_orig_vinfo))
			SDL_SetError("[PS3] Can't restore original fb_var_screeninfo");

		
		ioctl(fb_dev_fd, PS3FB_IOCTL_OFF, 0);
		close(fb_dev_fd);
		fb_dev_fd = -1;
	}

	if (frame_buffer) {
		munmap(frame_buffer, fb_finfo.smem_len);
		frame_buffer = 0;
	}

	if (fb_parms)
		free((void *)fb_parms);
	if (fb_thread_data) {
		SPE_Shutdown(this, fb_thread_data);
		free((void *)fb_thread_data);
	}

	if (this->screen) {
		if (double_buffering && this->screen->pixels) {
			free(this->screen->pixels);
		}
		this->screen->pixels = NULL;
	}

	enable_cursor(1);
	deprintf(1, "[PS3] VideoQuit\n");
}
void
PS3_VideoQuit(_THIS)
{
    deprintf(1, "PS3_VideoQuit()\n");
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;

    PS3_QuitModes(_this);

    /* Unmap framebuffer */
    if (data->frame_buffer) {
        struct fb_fix_screeninfo fb_finfo;
        if (ioctl(data->fbdev, FBIOGET_FSCREENINFO, &fb_finfo) != -1) {
            munmap(data->frame_buffer, fb_finfo.smem_len);
            data->frame_buffer = 0;
        }
    }

    /* Shutdown SPE and related resources */
    if (data->fb_parms)
        free((void *)data->fb_parms);
    if (data->fb_thread_data) {
        SPE_Shutdown(data->fb_thread_data);
        free((void *)data->fb_thread_data);
    }

    /* Close device */
    if (data->fbdev) {
        /* Give control of frame buffer back to kernel */
        ioctl(data->fbdev, PS3FB_IOCTL_OFF, 0);
        close(data->fbdev);
        data->fbdev = -1;
    }
}