mga_vid_test.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:4k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * mga_vid_test.c
  4.  *
  5.  * Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  6.  * Sept 1999
  7.  *
  8.  * This software has been released under the terms of the GNU Public
  9.  * license. See http://www.gnu.org/copyleft/gpl.html for details.
  10.  */
  11. #include <stddef.h>
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <sys/ioctl.h>
  15. #include <unistd.h>
  16. #include <fcntl.h>
  17. #include <sys/mman.h>
  18. #include "mga_vid.h"
  19. //#define MGA_G200
  20. #define MGA_G400
  21. mga_vid_config_t config;
  22. uint_8 *mga_vid_base;
  23. uint_32 is_g400;
  24. #define SRC_IMAGE_WIDTH 256
  25. #define SRC_IMAGE_HEIGHT 256
  26. uint_8 y_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT];
  27. uint_8 cr_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT];
  28. uint_8 cb_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT];
  29. void
  30. write_frame_g200(uint_8 *y,uint_8 *cr, uint_8 *cb)
  31. {
  32. uint_8 *dest;
  33. uint_32 bespitch,h,w;
  34. dest = mga_vid_base;
  35. bespitch = (config.src_width + 31) & ~31;
  36. for(h=0; h < config.src_height; h++) 
  37. {
  38. memcpy(dest, y, config.src_width);
  39. y += config.src_width;
  40. dest += bespitch;
  41. }
  42. for(h=0; h < config.src_height/2; h++) 
  43. {
  44. for(w=0; w < config.src_width/2; w++) 
  45. {
  46. *dest++ = *cb++;
  47. *dest++ = *cr++;
  48. }
  49. dest += bespitch - config.src_width;
  50. }
  51. }
  52. void
  53. write_frame_g400(uint_8 *y,uint_8 *cr, uint_8 *cb)
  54. {
  55. uint_8 *dest;
  56. uint_32 bespitch,h;
  57. dest = mga_vid_base;
  58. bespitch = (config.src_width + 31) & ~31;
  59. for(h=0; h < config.src_height; h++) 
  60. {
  61. memcpy(dest, y, config.src_width);
  62. y += config.src_width;
  63. dest += bespitch;
  64. }
  65. for(h=0; h < config.src_height/2; h++) 
  66. {
  67. memcpy(dest, cb, config.src_width/2);
  68. cb += config.src_width/2;
  69. dest += bespitch/2;
  70. }
  71. for(h=0; h < config.src_height/2; h++) 
  72. {
  73. memcpy(dest, cr, config.src_width/2);
  74. cr += config.src_width/2;
  75. dest += bespitch/2;
  76. }
  77. }
  78. void write_frame(uint_8 *y,uint_8 *cr, uint_8 *cb)
  79. {
  80. if(is_g400)
  81. write_frame_g400(y,cr,cb);
  82. else
  83. write_frame_g200(y,cr,cb);
  84. }
  85. void
  86. draw_cool_pattern(void)
  87. {
  88. int i,x,y;
  89. i = 0;
  90. for (y=0; y<config.src_height; y++) {
  91. for (x=0; x<config.src_width; x++) {
  92. y_image[i++] = x*x/2 + y*y/2 - 128;
  93. }
  94. }
  95. i = 0;
  96. for (y=0; y<config.src_height/2; y++) 
  97. for (x=0; x<config.src_width/2; x++) 
  98. {
  99. cr_image[i++] = x - 128;
  100. }
  101. i = 0;
  102. for (y=0; y<config.src_height/2; y++) 
  103. for (x=0; x<config.src_width/2; x++) 
  104. {
  105. cb_image[i++] = y - 128;
  106. }
  107. }
  108. void
  109. draw_color_blend(void)
  110. {
  111. int i,x,y;
  112. i = 0;
  113. for (y=0; y<config.src_height; y++) {
  114. for (x=0; x<config.src_width; x++) {
  115. y_image[i++] = 0;
  116. }
  117. }
  118. i = 0;
  119. for (y=0; y<config.src_height/2; y++) 
  120. for (x=0; x<config.src_width/2; x++) 
  121. {
  122. cr_image[i++] = x - 128;
  123. }
  124. i = 0;
  125. for (y=0; y<config.src_height/2; y++) 
  126. for (x=0; x<config.src_width/2; x++) 
  127. {
  128. cb_image[i++] = y - 128;
  129. }
  130. }
  131. int 
  132. main(int argc, char *argv[])
  133. {
  134. int f;
  135. if(argv[0][strlen(argv[0]) - 3] == '4')
  136. {
  137. is_g400 = 1;
  138. printf("Testing MGA G400 Backend Scalern");
  139. }
  140. else
  141. {
  142. is_g400 = 0;
  143. printf("Testing MGA G200 Backend Scalern");
  144. }
  145. f = open("/dev/mga_vid",O_RDWR);
  146. if(f == -1)
  147. {
  148. fprintf(stderr,"Couldn't open drivern");
  149. exit(1);
  150. }
  151. config.src_width = SRC_IMAGE_WIDTH;
  152. config.src_height= SRC_IMAGE_HEIGHT;
  153. config.dest_width = SRC_IMAGE_WIDTH;
  154. config.dest_height = SRC_IMAGE_HEIGHT;
  155. config.x_org= 10;
  156. config.y_org= 10;
  157. config.colkey_on = 0;
  158. if (ioctl(f,MGA_VID_CONFIG,&config))
  159. {
  160. perror("Error in config ioctl");
  161. }
  162. ioctl(f,MGA_VID_ON,0);
  163. mga_vid_base = (uint_8*)mmap(0,256 * 4096,PROT_WRITE,MAP_SHARED,f,0);
  164. printf("mga_vid_base = %8pn",mga_vid_base);
  165. write_frame(y_image,cr_image,cb_image);
  166. printf("(1) There should be a green square, offset by 10 pixels fromn"
  167.    "    the upper left corner displayedn");
  168. sleep(3);
  169. draw_cool_pattern();
  170. write_frame(y_image,cr_image,cb_image);
  171. printf("(2) There should be a cool mosaic like pattern now.n");
  172. sleep(3);
  173. draw_color_blend();
  174. write_frame(y_image,cr_image,cb_image);
  175. printf("(3) There should be a color blend with black, red, purple, bluen"
  176.    "    corners (starting top left going CW)n");
  177. sleep(3);
  178. ioctl(f,MGA_VID_OFF,0);
  179. close(f);
  180. return 0;
  181. }