⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 harness.c

📁 ati driver
💻 C
📖 第 1 页 / 共 2 页
字号:
						for (; x < dm.virtual_width; x++) {							fb[x] = 0;						}						fb = (uint16 *)((uint8 *)fb + fbc.bytes_per_row);					}				} break;				case B_RGB32_BIG:				case B_RGBA32_BIG:				case B_RGB32_LITTLE:				case B_RGBA32_LITTLE: {					int x, y;					uint32 *fb = (uint32 *)fbc.frame_buffer;					printf(" frame buffer is 32bpp\n");					/* make a checkerboard pattern */					for (y = 0; y < (dm.virtual_height >> 1); y++) {						for (x = 0; x < (dm.virtual_width >> 1); x++) {							fb[x] = 0;						}						for (; x < dm.virtual_width; x++) {							fb[x] = 0xffffffff;						}						fb = (uint32 *)((uint8 *)fb + fbc.bytes_per_row);					}					for (; y < dm.virtual_height; y++) {						for (x = 0; x < (dm.virtual_width >> 1); x++) {							fb[x] = 0xffffffff;						}						for (; x < dm.virtual_width; x++) {							fb[x] = 0;						}						fb = (uint32 *)((uint8 *)fb + fbc.bytes_per_row);					}				} break;				default:					printf("YIKES! frame buffer shape unknown!\n");				}			} break;			case B_GET_PIXEL_CLOCK_LIMITS: {				get_pixel_clock_limits gpcl = gah(B_GET_PIXEL_CLOCK_LIMITS, NULL);				uint32 low, high;				if (!gpcl) {					missing_feature(cmds[i]);					break;				}				result = gpcl(&dm, &low, &high);				if (result != B_OK) {					printf("get_pixel_clock_limits() failed: %ld (0x%08lx)\n", result, result);					break;				}				printf("Minimum pixel clock: %lu\nMaximum pixel clock: %lu\n", low, high);			} break;			case B_MOVE_DISPLAY: {				move_display_area mda = gah(B_MOVE_DISPLAY, NULL);	/* should we be passing the display mode? */				int top, left;				if (mda) {					printf("Enter new coordinates: "); fflush(stdout);					scanf("%d,%d", &left, &top);					/* no range checking for now */					result = mda(left, top);					printf("move_display_area() returned %ld (0x%08lx)\n", result, result);				} else {					missing_option(cmds[i]);				}			} break;			case B_SET_INDEXED_COLORS: {				set_indexed_colors sic = gah(B_SET_INDEXED_COLORS, NULL); /* should we be passing display mode */				if (sic) {					char *list[] = {"Red CLUT", "Green CLUT", "Blue CLUT", "Grey CLUT", "Be CLUT", NULL};					int choice;					choice = pick_from_list("Set cursor visibility:", list);					if (choice >= 0) {						uint8 color_data[256 * 3], *cd = color_data;						int j, k;						for (j = 0; j < 256; j++) {							for (k = 0; k < 3; k++) {								*cd = 0;								if ((k == choice) || (choice == 3)) *cd = (uint8)j;								cd++;							}						}						sic(256, 0, color_data, 0);					}				} else {					missing_option(cmds[i]);				}			} break;			case B_ACCELERANT_RETRACE_SEMAPHORE: {				accelerant_retrace_semaphore ars = gah(B_ACCELERANT_RETRACE_SEMAPHORE, NULL);				sem_id sid;				status_t result;				if (!ars) {					missing_feature(cmds[i]);					break;				}				sid = ars();				if (sid < B_OK) {					printf("Bad semaphore ID returned: %ld\n", sid);					break;				}				if (!valid_mode) {					printf("No video mode selected, skipping retrace check.\n");				}				result = acquire_sem_etc(sid, 1, B_TIMEOUT, 1000000L);				if (result != B_OK) {					printf("Semaphore acquisition failed: %ld (0x%08lx)\n", result, result);					break;				}				printf("Retrace semaphore acquired!\n");			} break;			case B_SET_CURSOR_SHAPE: {				if (dm.flags & B_HARDWARE_CURSOR) {					set_cursor_shape scs = gah(B_SET_CURSOR_SHAPE, NULL);					if (!scs) {						missing_option(cmds[i]);						break;					}					{					int i;					uint8 hand_and[32];					for (i = 0; i < 32; i++) hand_and[i] = ~my_hand_cursor_and[i];					result = scs(16, 16, 2, 2, hand_and, my_hand_cursor_xor);					}					if (result != B_OK)						failed_with_reason("B_SET_CURSOR_SHAPE", result);				} else printf("Mode does not support hardware cursor!\n");			} break;			case B_MOVE_CURSOR: {				if (dm.flags & B_HARDWARE_CURSOR) {					move_cursor mc = gah(B_MOVE_CURSOR, NULL);					if (!mc) {						missing_option(cmds[i]);						break;					}					mc((uint16)(dm.virtual_width >> 1) - 8, (uint16)(dm.virtual_height >> 1));				} else printf("Mode does not support hardware cursor!\n");			} break;			case B_SHOW_CURSOR: {				if (dm.flags & B_HARDWARE_CURSOR) {					show_cursor sc = gah(B_SHOW_CURSOR, NULL);					char *list[] = {"Hide Cursor", "Show Cursor", NULL};					int choice;					if (!sc) {						missing_option(cmds[i]);						break;					}					choice = pick_from_list("Set cursor visibility:", list);					if (choice >= 0) sc(choice == 1);				} else printf("Mode does not support hardware cursor!\n");			} break;			case B_ACQUIRE_ENGINE: {				acquire_engine ae = gah(B_ACQUIRE_ENGINE, NULL);				if (!ae) {					missing_feature(cmds[i]);					break;				}				result = ae(0,0, NULL, &et);				if (result != B_OK) {					failed_with_reason("acquire_engine()", result);					et = NULL;					break;				}				engine_acquired = TRUE;				printf("acceleration engine acquired: 0x%08lx\n", (uint32)et);			} break;			case B_RELEASE_ENGINE: {				release_engine re = gah(B_RELEASE_ENGINE, NULL);				if (!re) {					missing_feature(cmds[i]);					break;				}				if (!engine_acquired) {					printf("Do B_ACQUIRE_ENGINE first!\n");					break;				}				result = re(et, NULL);				if (result != B_OK) {					failed_with_reason("release_engine()", result);					break;				}				engine_acquired = FALSE;				printf("acceleration engine released.\n");			} break;			case B_WAIT_ENGINE_IDLE: {				wait_engine_idle wei = gah(B_WAIT_ENGINE_IDLE, NULL);				if (!wei) {					missing_feature(cmds[i]);					break;				}				if (!engine_acquired) {					printf("Do B_ACQUIRE_ENGINE first!\n");					break;				}				wei();				printf("Acceleration engine idle.\n");			} break;			case B_FILL_RECTANGLE: {				fill_rectangle rf = gah(B_FILL_RECTANGLE, &dm);				fill_rect_params rfp[16];				int j;				if (!rf) {					missing_option(cmds[i]);					break;				}				if (!engine_acquired) {					printf("Do B_ACQUIRE_ENGINE first!\n");					break;				}				rfp[0].left = rfp[0].top = 0;				rfp[0].right = dm.virtual_width - 1;				rfp[0].bottom = dm.virtual_height - 1;				rf(et, 0, rfp, 1);				for (j = 0; ((dm.virtual_width-1) >> (j+1)) && ((dm.virtual_height-1) >> (j+1)); j++) {					rfp[j].right = (dm.virtual_width - 1) >> j;					rfp[j].left = (dm.virtual_width - 1) >> (j+1);					rfp[j].bottom = (dm.virtual_height - 1) >> j;					rfp[j].top = (dm.virtual_height - 1) >> (j+1);					printf("   rfp[%d] = %d,%d to %d,%d\n", j, rfp[j].left, rfp[j].top, rfp[j].right, rfp[j].bottom);				}				rf(et, 0xffffffff, rfp, (uint32)j);			} break;			case B_INVERT_RECTANGLE: {				uint16 left, top, right, bottom, h_delta, v_delta;				fill_rect_params rfp[16];				int j;				invert_rectangle ri = gah(B_INVERT_RECTANGLE, &dm);				if (!ri) {					missing_option(cmds[i]);					break;				}				if (!engine_acquired) {					printf("Do B_ACQUIRE_ENGINE first!\n");					break;				}				left = 0; right = dm.virtual_width - 1;				top = 0; bottom = dm.virtual_height - 1;				h_delta = dm.virtual_width >> 4;				v_delta = dm.virtual_height >> 4;				for (j = 0; j < 8; j++) {					rfp[j].left = left;					rfp[j].top = top;					rfp[j].right = right;					rfp[j].bottom = bottom;					left += h_delta;					right -= h_delta;					top += v_delta;					bottom -= v_delta;				}				ri(et, rfp, 8);			} break;			case B_FILL_SPAN: {				fill_span sf = gah(B_FILL_SPAN, &dm);				uint16 *spans, *sp;				int j, k, w;				if (!sf) {					missing_option(cmds[i]);					break;				}				if (!engine_acquired) {					printf("Do B_ACQUIRE_ENGINE first!\n");					break;				}				sp = spans = (uint16*)calloc(dm.timing.v_display * 3, sizeof(uint16));				if (!spans) {					printf("Couldn't allocate RAM for span list :-(\n");					break;				}				for (j = dm.timing.v_display, k = 0, w = dm.timing.h_total >> 1; j > 0; j--) {					*sp++ = j-1;					*sp++ = k;					*sp++ = k + w;					if (j > dm.timing.v_display / 2) k++;					else k--;					if (j & 1) w--;				}				sf(et, 0x55555555, spans, dm.timing.v_display);				free(spans);			} break;						case B_OVERLAY_COUNT: {				overlay_count ovc = gah(B_OVERLAY_COUNT, &dm);				if( !ovc ) {					missing_option( cmds[i] );					break;				}				printf( "Number of overlay units: %ld\n", ovc( &dm ));			} break;			case B_OVERLAY_SUPPORTED_SPACES: {				overlay_supported_spaces oss = gah(B_OVERLAY_SUPPORTED_SPACES, &dm);				const uint32 *cur;				int num, idx;								if( !oss ) {					missing_option( cmds[i] );					break;				}				overlay_cs = oss( &dm );				printf( "Supported overlay colour spaces:" );								for( cur = overlay_cs, num = 0; *cur; ++cur, ++num )					printf( " %s", spaceToString( *cur ));									printf( "\n" );								overlay_cs_names = calloc( num + 1, sizeof( char *));								for( idx = 0; idx < num; ++idx  )					overlay_cs_names[idx] = spaceToString( overlay_cs[idx] );									overlay_cs_names[num] = 0;			} break;			case B_OVERLAY_SUPPORTED_FEATURES: {				overlay_supported_features osf = gah(B_OVERLAY_SUPPORTED_FEATURES, &dm);				int choice;				uint32 features;				if( !osf ) {					missing_option( cmds[i] );					break;				}				if( overlay_cs == NULL ) {					printf( "Call B_OVERLAY_SUPPORTED_SPACES first\n" );					break;				}								choice = pick_from_list("Choose overlay colour space:", (char **)overlay_cs_names );				if( choice < 0 )					break;								features = osf( overlay_cs[choice] );				printf( "features:" );				if( features & B_OVERLAY_COLOR_KEY ) printf( " B_OVERLAY_COLOR_KEY" );				if( features & B_OVERLAY_CHROMA_KEY ) printf( " B_OVERLAY_CHROMA_KEY" );				if( features & B_OVERLAY_HORIZONTAL_FILTERING ) printf( " B_OVERLAY_HORIZONTAL_FILTERING" );				if( features & B_OVERLAY_VERTICAL_FILTERING ) printf( " B_OVERLAY_VERTICAL_FILTERING" );				if( features & B_OVERLAY_HORIZONTAL_MIRRORING ) printf( " B_OVERLAY_HORIZONTAL_MIRRORING" );				if( features & B_OVERLAY_KEYING_USES_ALPHA ) printf( " B_OVERLAY_KEYING_USES_ALPHA" );				printf( "\n" );			} break;			case B_ALLOCATE_OVERLAY_BUFFER: {				allocate_overlay_buffer aob = gah(B_ALLOCATE_OVERLAY_BUFFER, &dm);				int choice;				int row;												if( !aob ) {					missing_option( cmds[i] );					break;				}				if( overlay_cs == NULL ) {					printf( "Call B_OVERLAY_SUPPORTED_SPACES first\n" );					break;				}				if( ob != NULL ) {					printf( "This program only allows one overlay buffer to be allocated\n" );					break;				}								choice = pick_from_list("Choose overlay colour space:", (char **)overlay_cs_names );				if( choice < 0 )					break;									ob = aob( overlay_cs[choice], 320, 200 );				if( ob == NULL ) {					printf( "Failed\n" );					break;				}				for( row = 0; row < ob->height; ++row ) {										/*memset( &((char *)ob->buffer)[row * ob->bytes_per_row], 						row & 1 ? 0xaa : 0x55, ob->bytes_per_row );*/					uint col;					char *buf = &((char *)ob->buffer)[row * ob->bytes_per_row];										for( col = 0; col < ob->bytes_per_row / 4; ++col ) {						buf[col*4] = 255-row;						buf[col*4+1] = 255-row;						buf[col*4+2] = 255-row;						buf[col*4+3] = 0;					}				}			} break;			case B_RELEASE_OVERLAY_BUFFER: {				release_overlay_buffer rob = gah(B_RELEASE_OVERLAY_BUFFER, &dm);				if( !rob ) {					missing_option( cmds[i] );					break;				}				if( ob == NULL ) {					printf( "Call B_ALLOCATE_OVERLAY_BUFFER first\n" );					break;				}				rob( ob );				ob = NULL;			} break;			case B_GET_OVERLAY_CONSTRAINTS: {				get_overlay_constraints ocn = gah(B_GET_OVERLAY_CONSTRAINTS, &dm);				overlay_constraints oc;								if( !ocn ) {					missing_option( cmds[i] );					break;				}				if( ob == NULL ) {					printf( "Call B_ALLOCATE_OVERLAY_BUFFER first\n" );					break;				}				result = ocn( &dm, ob, &oc );				if (result != B_OK)					failed_with_reason("B_GET_OVERLAY_CONSTRAINTS", result);									dump_overlay_limits( "view", &oc.view );				dump_overlay_limits( "window", &oc.window );				dump_overlay_scale_limits( "h_scale", &oc.h_scale );				dump_overlay_scale_limits( "v_scale", &oc.v_scale );			} break;			case B_ALLOCATE_OVERLAY: {				allocate_overlay aov = gah( B_ALLOCATE_OVERLAY, &dm );				if( !aov ) {					missing_option( cmds[i] );					break;				}				if( ot ) {					printf( "This program only allows one overlay to be allocated\n" );					break;				}				ot = aov();				if( ot == NULL ) {					printf( "Cannot allocate overlay\n" );					break;				}			} break;			case B_RELEASE_OVERLAY: {				release_overlay rov = gah( B_RELEASE_OVERLAY, &dm );				if( !rov ) {					missing_option( cmds[i] );					break;				}				if( !ot ) {					printf( "Call B_ALLOCATE_OVERLAY first\n" );					break;				}				result = rov( ot );				if( result != B_OK )					failed_with_reason( "B_RELEASE_OVERLAY", result );									ot = NULL;			} break;			case B_CONFIGURE_OVERLAY: {				configure_overlay cov = gah( B_CONFIGURE_OVERLAY, &dm );				overlay_window ow;				overlay_view ov;				if( !cov ) {					missing_option( cmds[i] );					break;				}				if( !ot ) {					printf( "Call B_ALLOCATE_OVERLAY first\n" );					break;				}				if( ob == NULL ) {					printf( "Call B_ALLOCATE_OVERLAY_BUFFER first\n" );					break;				}				ow.h_start = 16;				ow.v_start = 16;				ow.width = dm.virtual_width - 32;				ow.height = dm.virtual_height - 32;				ow.offset_left = 0;				ow.offset_top = 0;				ow.offset_right = 0;				ow.offset_bottom = 0;								ow.red.mask = 0xff;				ow.red.value = 0;				ow.green.mask = 0xff;				ow.green.value = 0;				ow.blue.mask = 0xff;				ow.blue.value = 0;				ow.alpha.mask = 0xff;				ow.alpha.value = 0;				ow.flags = B_OVERLAY_COLOR_KEY;								ov.h_start = 0;				ov.v_start = 0;				ov.width = ob->width;				ov.height = ob->height;								result = cov( ot, ob, &ow, &ov);					if( result != B_OK )					failed_with_reason( "B_RELEASE_OVERLAY", result );			} break;							default: {				printf("Ooops: %s not implemented yet.\n", cmds[i]);			} break;		}	}	/* clean up */	if (cmds) free(cmds);	if (mode_list) free(mode_list);	if( overlay_cs_names ) free( overlay_cs_names );}#define T_GRAPHICS_DEVICE_DIR "/dev/graphics"int main(int argc, char **argv) {	int fd;	GetAccelerantHook gah;	image_id image;	/* pick a device */	fd = pick_device(T_GRAPHICS_DEVICE_DIR);	if (fd < 0) {		fprintf(stderr, "Can't open device: %s (%s)\n", strerror(fd), strerror(errno));		return fd;	}	/* load the accelerant */	image = load_accelerant(fd, &gah);	if (image < 0) goto close_driver;	exercise_driver(gah);	/* uninit accelerant */	{	uninit_accelerant ua = gah(B_UNINIT_ACCELERANT, NULL);	if (ua) ua();	}	/* unload add-on */	unload_add_on(image);	close_driver:	/* close the driver */	close(fd);	return B_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -