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

📄 i810xvmc.c

📁 显驱动 Intel英特尔G45G43G41G35G33G31G965Q963Q965GM965系列显卡最新X.Org驱动2.4.0版For Linux
💻 C
📖 第 1 页 / 共 5 页
字号:
  fmv.s[0] /= 2;  fmv.s[1] /= 2;  fmv.s[2] /= 2;  fmv.s[3] /= 2;    bmv.s[0] /= 2;  bmv.s[1] /= 2;  bmv.s[2] /= 2;  bmv.s[3] /= 2;  xy >>= 1;  /* U Blocks */  *du++ = GFXBLOCK + 4 + (usize>>2);  *du++ = (2<<30) | (1<<28) | dw1[0];  *du++ = xy;  *du++ = (4<<16) | 8;  *du++ = fmv.u[0];  *du++ = bmv.u[0];  if(usize) {    PACK_CORR_DATA_SHORT(du,block_ptr);  }  /* Second U Block */  *du++ = GFXBLOCK + 4 + (usize>>2);  *du++ = (2<<30) | (1<<28) | dw1[1];  *du++ = xy;  *du++ = (4<<16) | 8;  *du++ = fmv.u[1];  *du++ = bmv.u[1];  if(usize) {    block_ptr = (short *)((unsigned long)block_ptr + 16);    PACK_CORR_DATA_SHORT(du,block_ptr);    block_ptr = (short *)((unsigned long)block_ptr + 112);  }  /* End U Blocks */  /* V Blocks */  *dv++ = GFXBLOCK + 4 + (vsize>>2);  *dv++ = (3<<30) | (1<<28) | dw1[0];  *dv++ = xy;  *dv++ = (4<<16) | 8;  *dv++ = fmv.u[0];  *dv++ = bmv.u[0];  if(vsize) {    PACK_CORR_DATA_SHORT(dv,block_ptr);  }  /* Second V Block */  *dv++ = GFXBLOCK + 4 + (vsize>>2);  *dv++ = (3<<30) | (1<<28) | dw1[1];  *dv++ = xy;  *dv++ = (4<<16) | 8;  *dv++ = fmv.u[1];  *dv++ = bmv.u[1];  if(vsize) {    block_ptr = (short *)((unsigned long)block_ptr + 16);    PACK_CORR_DATA_SHORT(dv,block_ptr);    block_ptr = (short *)((unsigned long)block_ptr + 112);  }  /* End V Blocks */  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderFrameinFrame// Description: inline function that sets hardware parameters for a Frame//  encoded macroblock in a frame picture.***************************************************************************/static __inline__ void renderFrameinFrame(uint **datay,uint **datau,					  uint **datav,					  XvMCMacroBlock *mb,short *block_ptr,					  uint flags) {  register uint *dy = *datay;  register uint *du = *datau;  register uint *dv = *datav;  /* Motion Vectors */  su_t fmv;  su_t bmv;  /* gfxblock dword 1 */  uint dw1;  unsigned int ysize = y_frame_bytes[mb->coded_block_pattern];  unsigned int usize = u_frame_bytes[mb->coded_block_pattern];  unsigned int vsize = v_frame_bytes[mb->coded_block_pattern];  uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<4);  dw1 = type_table[mb->macroblock_type & 0xf] |    (((uint)mb->coded_block_pattern)<<22);  fmv.s[0] = mb->PMV[0][0][1];  fmv.s[1] = mb->PMV[0][0][0];    bmv.s[0] = mb->PMV[0][1][1];  bmv.s[1] = mb->PMV[0][1][0];  /* Y Block */  *dy++ = GFXBLOCK + 4 + (ysize>>2);  *dy++ = (1<<30) | (3<<28) | dw1;  *dy++ = xy;  *dy++ = (16<<16) | 16;  *dy++ = fmv.u[0];  *dy++ = bmv.u[0];  PACK_CORR_DATA(dy,block_ptr,ysize);  block_ptr = (short *)((unsigned long)block_ptr + ysize);  /* End Y Blocks */  fmv.s[0] /= 2;  fmv.s[1] /= 2;    bmv.s[0] /= 2;  bmv.s[1] /= 2;  xy >>= 1;  /* U Block */  *du++ = GFXBLOCK + 4 + (usize>>2);  *du++ = (2<<30) | (1<<28) | dw1;  *du++ = xy;  *du++ = (8<<16) | 8;  *du++ = fmv.u[0];  *du++ = bmv.u[0];  PACK_CORR_DATA(du,block_ptr,usize);  block_ptr = (short *)((unsigned long)block_ptr + usize);  /* End U Block */  /* V Block */  *dv++ = GFXBLOCK + 4 + (vsize>>2);  *dv++ = (3<<30) | (1<<28) | dw1;  *dv++ = xy;  *dv++ = (8<<16) | 8;  *dv++ = fmv.u[0];  *dv++ = bmv.u[0];  PACK_CORR_DATA(dv,block_ptr,vsize);  block_ptr = (short *)((unsigned long)block_ptr + vsize);  /* End V Block */  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderFrameinFrameDCT1// Description: inline function that sets hardware parameters for a Frame//  encoded macroblock in a frame picture with DCT type 1.***************************************************************************/static __inline__ void renderFrameinFrameDCT1(uint **datay,uint **datau,					      uint **datav,XvMCMacroBlock *mb,					      short *block_ptr,uint flags) {  register uint *dy = *datay;  register uint *du = *datau;  register uint *dv = *datav;  /* Motion Vectors */  su_t fmv;  su_t bmv;  short * top_left_b = NULL;  short * top_right_b = NULL;  short * bottom_left_b = NULL;  short * bottom_right_b = NULL;  uint temp_bp = 0;  uint ysize = y_dct1_frame_bytes[mb->coded_block_pattern];  uint usize = u_frame_bytes[mb->coded_block_pattern];  uint vsize = v_frame_bytes[mb->coded_block_pattern];  uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<4);  uint dw1 = type_table[mb->macroblock_type & 0xf] |    (((uint)mb->coded_block_pattern)<<22);  fmv.s[0] = mb->PMV[0][0][1];  fmv.s[1] = mb->PMV[0][0][0];    bmv.s[0] = mb->PMV[0][1][1];  bmv.s[1] = mb->PMV[0][1][0];  /*    It is easiest to find out what blocks are in need of reading first    rather than as we go.  */  top_left_b = &empty_block[0];  if(dw1 & (1<<27)) {    temp_bp |= (1<<25);    top_left_b = block_ptr;    block_ptr += 64;  }  top_right_b = &empty_block[0];  if(dw1 & (1<<26)) {    temp_bp |= (1<<24);    top_right_b = block_ptr;    block_ptr += 64;  }  bottom_left_b = &empty_block[0];  if(dw1 & (1<<25)) {    temp_bp |= (1<<27);    bottom_left_b = block_ptr;    block_ptr += 64;  }  bottom_right_b = &empty_block[0];  if(dw1 & (1<<24)) {    temp_bp |= (1<<26);    bottom_right_b = block_ptr;    block_ptr += 64;  }  dw1 |= temp_bp;  /* Y Block */  *dy++ = GFXBLOCK + 4 + (ysize>>2);  *dy++ = (1<<30) | (3<<28) | dw1;  *dy++ = xy;  *dy++ = (16<<16) | 16;  *dy++ = fmv.u[0];  *dy++ = bmv.u[0];  if(dw1 & (1<<27)) {    PACK_CORR_DATA_1to0(dy,top_left_b,bottom_left_b);    top_left_b = (short *)((unsigned long)top_left_b + 64);    bottom_left_b = (short *)((unsigned long)bottom_left_b + 64);  }  if(dw1 & (1<<26)) {    PACK_CORR_DATA_1to0(dy,top_right_b,bottom_right_b);    top_right_b = (short *)((unsigned long)top_right_b + 64);    bottom_right_b = (short *)((unsigned long)bottom_right_b + 64);  }  if(dw1 & (1<<27)) {    PACK_CORR_DATA_1to0(dy,top_left_b,bottom_left_b);  }  if(dw1 & (1<<26)) {    PACK_CORR_DATA_1to0(dy,top_right_b,bottom_right_b);  }  /* End Y Block */  fmv.s[0] /= 2;  fmv.s[1] /= 2;    bmv.s[0] /= 2;  bmv.s[1] /= 2;  xy >>= 1;  /* U Block */  *du++ = GFXBLOCK + 4 + (usize>>2);  *du++ = (2<<30) | (1<<28) | dw1;  *du++ = xy;  *du++ = (8<<16) | 8;  *du++ = fmv.u[0];  *du++ = bmv.u[0];  PACK_CORR_DATA(du,block_ptr,usize);  block_ptr = (short *)((unsigned long)block_ptr + usize);  /* V Block */  *dv++ = GFXBLOCK + 4 + (vsize>>2);  *dv++ = (3<<30) | (1<<28) | dw1;  *dv++ = xy;  *dv++ = (8<<16) | 8;  *dv++ = fmv.u[0];  *dv++ = bmv.u[0];  PACK_CORR_DATA(dv,block_ptr,vsize);  block_ptr = (short *)((unsigned long)block_ptr + vsize);  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderDualPrimeinFrame// Description: inline function that sets hardware parameters for a Dual//  Prime encoded macroblock in a frame picture with dct 1.***************************************************************************/static __inline__ void renderDualPrimeinFrame(uint **datay,uint **datau,					      uint **datav,XvMCMacroBlock *mb,					      short *block_ptr,uint flags) {  register uint *dy = *datay;  register uint *du = *datau;  register uint *dv = *datav;  /* Motion Vectors */  su_t fmv;  su_t bmv;  /* gfxblock dword 1 */  uint dw1[2];  uint y1size = y_first_field_bytes[mb->coded_block_pattern];  uint y2size = y_second_field_bytes[mb->coded_block_pattern];  uint usize = u_field_bytes[mb->coded_block_pattern];  uint vsize = v_field_bytes[mb->coded_block_pattern];  uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<3);  /*    Past Surface (map 0) is used for same parity prediction,    Future surface (map 1) is used for opposite.  */  dw1[0] = (((uint)mb->coded_block_pattern)<<22) |    3<<12 | 2<<6 | 2<<3 | 3;  dw1[1] = (((mb->coded_block_pattern & 0x3) |	     ((mb->coded_block_pattern & 0xc)<<2))<<22) |    3<<12 | 3<<6 | 3<<3 | 2;    fmv.s[0] = mb->PMV[0][0][1];  fmv.s[1] = mb->PMV[0][0][0];  bmv.s[0] = mb->PMV[1][0][1];  bmv.s[1] = mb->PMV[1][0][0];    fmv.s[2] = mb->PMV[0][0][1];  fmv.s[3] = mb->PMV[0][0][0];  bmv.s[2] = mb->PMV[1][1][1];  bmv.s[3] = mb->PMV[1][1][0];  /* First Y Block */  *dy++ = GFXBLOCK + 4 + (y1size>>2);  *dy++ = (1<<30) | (2<<28) | dw1[0];  *dy++ = xy;  *dy++ = (8<<16) | 16;  *dy++ = fmv.u[0];  *dy++ = bmv.u[0];;  PACK_CORR_DATA(dy,block_ptr,y1size);  block_ptr = (short *)((unsigned long)block_ptr + y1size);  /* Second Y Block */  *dy++ = GFXBLOCK + 4 + (y2size>>2);  *dy++ = (1<<30) | (2<<28) | dw1[1];  *dy++ = xy;  *dy++ = (8<<16) | 16;  *dy++ = fmv.u[1];  *dy++ = bmv.u[1];  PACK_CORR_DATA(dy,block_ptr,y2size);  block_ptr = (short *)((unsigned long)block_ptr + y2size);  fmv.s[0] /= 2;  fmv.s[1] /= 2;  bmv.s[0] /= 2;  bmv.s[1] /= 2;    fmv.s[2] /= 2;  fmv.s[3] /= 2;  bmv.s[2] /= 2;  bmv.s[3] /= 2;  xy >>= 1;  /* U Blocks */  *du++ = GFXBLOCK + 4 + (usize>>2);  *du++ = (2<<30) | (1<<28) | dw1[0];  *du++ = xy;  *du++ = (4<<16) | 8;  *du++ = fmv.u[0];  *du++ = bmv.u[0];  if(dw1[0] & (1<<23)) {    PACK_CORR_DATA_SHORT(du,block_ptr);  }  /* Second U Block */  *du++ = GFXBLOCK + 4 + (usize>>2);  *du++ = (2<<30) | (1<<28) | dw1[1];  *du++ = xy;  *du++ = (4<<16) | 8;  *du++ = fmv.u[1];  *du++ = bmv.u[1];  if(dw1[1] & (1<<23)) {    block_ptr = (short *)((unsigned long)block_ptr + 16);    PACK_CORR_DATA_SHORT(du,block_ptr);    block_ptr = (short *)((unsigned long)block_ptr + 112);  }  /* End U Blocks */  /* V Blocks */  *dv++ = GFXBLOCK + 4 + (vsize>>2);  *dv++ = (3<<30) | (1<<28) | dw1[0];  *dv++ = xy;  *dv++ = (4<<16) | 8;  *dv++ = fmv.u[0];  *dv++ = bmv.u[0];  if(dw1[0] & (1<<22)) {    PACK_CORR_DATA_SHORT(dv,block_ptr);  }  /* Second V Block */  *dv++ = GFXBLOCK + 4 + (vsize>>2);  *dv++ = (3<<30) | (1<<28) | dw1[1];  *dv++ = xy;  *dv++ = (4<<16) | 8;  *dv++ = fmv.u[1];  *dv++ = bmv.u[1];  if(dw1[1] & (1<<22)) {    block_ptr = (short *)((unsigned long)block_ptr + 16);    PACK_CORR_DATA_SHORT(dv,block_ptr);    block_ptr = (short *)((unsigned long)block_ptr + 112);  }  /* End V Blocks */  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderDualPrimeinFrameDCT0// Description: inline function that sets hardware parameters for a Dual//  Prime encoded macroblock in a frame picture with dct 0.***************************************************************************/static __inline__ void renderDualPrimeinFrameDCT0(uint **datay,uint **datau,						  uint **datav,						  XvMCMacroBlock *mb,						  short *block_ptr,						  uint flags) {  register uint *dy = *datay;  register uint *du = *datau;  register uint *dv = *datav;  /* Motion Vectors */  su_t fmv;  su_t bmv;  /* gfxblock dword 1 */  uint dw1[2];  short * top_left_b = NULL;  short * top_right_b = NULL;  short * bottom_left_b = NULL;  short * bottom_right_b = NULL;  uint cbp = (uint)mb->coded_block_pattern;  uint ysize = y_dct0_field_bytes[cbp];  uint usize = u_field_bytes[cbp];  uint vsize = v_field_bytes[cbp];  uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<3);  /*    Past Surface (map 0) is 

⌨️ 快捷键说明

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