extern void resources_cleanup(void) { for (int i = 0; i < MAX_TEXTURES; i++) if (all_resources.textures[i].id != 0) free_texture(&all_resources.textures[i]); for (int i = 0; i < MAX_SAMPLERS; i++) if (all_resources.samplers[i].id != 0) free_sampler(&all_resources.samplers[i]); for (int i = 0; i < MAX_RENDERBUFFERS; i++) if (all_resources.renderbuffers[i].id) free_renderbuffer(&all_resources.renderbuffers[i]); for (int i = 0; i < MAX_FRAMEBUFFERS; i++) if (all_resources.framebuffers[i].id) free_framebuffer(&all_resources.framebuffers[i]); for (int i = 0; i < MAX_BUFFERS; i++) if (all_resources.buffers[i].id) free_video_buffer(&all_resources.buffers[i]); for (int i = 0; i < MAX_VERTEX_ARRAYS; i++) if (all_resources.arrays[i].id) free_vertex_array(&all_resources.arrays[i]); for (int i = 0; i < MAX_SHADERS; i++) free_shader(&all_resources.shaders[i]); }
void cleanup_module(void) { int status = 0; if (bModInit) { status = unregister_framebuffer(&fb_info.gen.info); if (status < 0) { printk ("Failed to unregister the framebuffer device (status=%d).\n", status); } else { ruby_deinit_display(); free_framebuffer(); if (periodic_flush_enable) del_timer(&fb_info.ruby_timer); bModInit = 0; } } }
//----------------------------------------------------------------------------- // // Initialise the chip and the frame buffer driver. // //----------------------------------------------------------------------------- int __init rubyfb_init(void) { int i; ///// TESTING int j; ///// TESTING fb_info.FrameBufferAddress = alloc_framebuffer(); if (!fb_info.FrameBufferAddress) { printk ("rubyfb_init: Failed to allocate memory for the framebuffer.\n"); return -EINVAL; } // Clear the allocated memory memset(fb_info.FrameBufferAddress, 0, RUBY_PHYSICAL_MEM_SIZE); // Tell the lower levels what our addresses are ruby_set_addresses(fb_info.FrameBufferAddress, fb_info.FrameBufferDmaAddress); ruby_init_display(); strcpy(fb_info.gen.info.modename, "ruby"); fb_info.gen.info.changevar = NULL; fb_info.gen.info.node = -1; fb_info.gen.info.fbops = &ruby_ops; fb_info.gen.info.disp = &disp; fb_info.gen.info.switch_con = &fbgen_switch; fb_info.gen.info.updatevar = &fbgen_update_var; fb_info.gen.info.blank = &fbgen_blank; strcpy(fb_info.gen.info.fontname, default_fontname); fb_info.gen.parsize = 0; fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT; fb_info.gen.fbhw = &ruby_hwswitch; fb_info.gen.fbhw->detect(); fbgen_get_var(&disp.var, -1, &fb_info.gen.info); disp.var.activate = FB_ACTIVATE_NOW; fbgen_do_set_var(&disp.var, 1, &fb_info.gen); fbgen_set_disp(-1, &fb_info.gen); fbgen_install_cmap(0, &fb_info.gen); if (register_framebuffer(&fb_info.gen.info) < 0) { printk("Failed to register the %s framebuffer device.\n", fb_info.gen.info.modename); free_framebuffer(); return -EINVAL; } if (periodic_flush_enable) { init_timer(&fb_info.ruby_timer); fb_info.ruby_timer.function = ruby_flush; fb_info.ruby_timer.data = 0; fb_info.ruby_timer.expires = (unsigned long) jiffies + HZ + 100; add_timer(&fb_info.ruby_timer); } ///////////////////////////// ////// Display Logo ////// /////////////////////////// ///// ruby_display_logo(); printk("fb%d: %s framebuffer device installed.\n", GET_FB_IDX(fb_info.gen.info.node), fb_info.gen.info.modename); printk("Display %s features %d x %d at %d bpp.\n", fb_info.gen.info.modename, RUBY_DISPLAY_WIDTH, RUBY_DISPLAY_HEIGHT, RUBY_DISPLAY_BPP); return 0; }