SDL_fbriva.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. SDL - Simple DirectMedia Layer
  3. Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4. This library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public
  6. License as published by the Free Software Foundation; either
  7. version 2 of the License, or (at your option) any later version.
  8. This library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11. Library General Public License for more details.
  12. You should have received a copy of the GNU Library General Public
  13. License along with this library; if not, write to the Free
  14. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15. Sam Lantinga
  16. slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_fbriva.c,v 1.2 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. #include "SDL_types.h"
  23. #include "SDL_video.h"
  24. #include "SDL_blit.h"
  25. #include "SDL_fbriva.h"
  26. #include "riva_mmio.h"
  27. #include "riva_regs.h"
  28. static int FifoEmptyCount = 0;
  29. static int FifoFreeCount = 0;
  30. /* Wait for vertical retrace */
  31. static void WaitVBL(_THIS)
  32. {
  33. volatile Uint8 *port = (Uint8 *)(mapped_io + PCIO_OFFSET + 0x3DA);
  34. while (  (*port & 0x08) )
  35. ;
  36. while ( !(*port & 0x08) )
  37. ;
  38. }
  39. static void NV3WaitIdle(_THIS)
  40. {
  41. RivaRop *Rop = (RivaRop *)(mapped_io + ROP_OFFSET);
  42. while ( (Rop->FifoFree < FifoEmptyCount) ||
  43.         (*(mapped_io + PGRAPH_OFFSET + 0x000006B0) & 0x01) )
  44. ;
  45. }
  46. static void NV4WaitIdle(_THIS)
  47. {
  48. RivaRop *Rop = (RivaRop *)(mapped_io + ROP_OFFSET);
  49. while ( (Rop->FifoFree < FifoEmptyCount) ||
  50.         (*(mapped_io + PGRAPH_OFFSET + 0x00000700) & 0x01) )
  51. ;
  52. }
  53. /* Sets video mem colorkey and accelerated blit function */
  54. static int SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key)
  55. {
  56. return(0);
  57. }
  58. /* Sets per surface hardware alpha value */
  59. static int SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value)
  60. {
  61. return(0);
  62. }
  63. static int FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color)
  64. {
  65. int dstX, dstY;
  66. int dstW, dstH;
  67. RivaBitmap *Bitmap = (RivaBitmap *)(mapped_io + BITMAP_OFFSET);
  68. /* Don't blit to the display surface when switched away */
  69. if ( dst == this->screen ) {
  70. SDL_mutexP(hw_lock);
  71. }
  72. /* Set up the X/Y base coordinates */
  73. dstW = rect->w;
  74. dstH = rect->h;
  75. FB_dst_to_xy(this, dst, &dstX, &dstY);
  76. /* Adjust for the current rectangle */
  77. dstX += rect->x;
  78. dstY += rect->y;
  79. RIVA_FIFO_FREE(Bitmap, 1);
  80. Bitmap->Color1A = color;
  81. RIVA_FIFO_FREE(Bitmap, 2);
  82. Bitmap->UnclippedRectangle[0].TopLeft     = (dstX << 16) | dstY; 
  83. Bitmap->UnclippedRectangle[0].WidthHeight = (dstW << 16) | dstH;
  84. FB_AddBusySurface(dst);
  85. if ( dst == this->screen ) {
  86. SDL_mutexV(hw_lock);
  87. }
  88. return(0);
  89. }
  90. static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
  91.                        SDL_Surface *dst, SDL_Rect *dstrect)
  92. {
  93. SDL_VideoDevice *this = current_video;
  94. int srcX, srcY;
  95. int dstX, dstY;
  96. int dstW, dstH;
  97. RivaScreenBlt *Blt = (RivaScreenBlt *)(mapped_io + BLT_OFFSET);
  98. /* FIXME: For now, only blit to display surface */
  99. if ( dst->pitch != SDL_VideoSurface->pitch ) {
  100. return(src->map->sw_blit(src, srcrect, dst, dstrect));
  101. }
  102. /* Don't blit to the display surface when switched away */
  103. if ( dst == this->screen ) {
  104. SDL_mutexP(hw_lock);
  105. }
  106. /* Calculate source and destination base coordinates (in pixels) */
  107. dstW = dstrect->w;
  108. dstH = dstrect->h;
  109. FB_dst_to_xy(this, src, &srcX, &srcY);
  110. FB_dst_to_xy(this, dst, &dstX, &dstY);
  111. /* Adjust for the current blit rectangles */
  112. srcX += srcrect->x;
  113. srcY += srcrect->y;
  114. dstX += dstrect->x;
  115. dstY += dstrect->y;
  116. RIVA_FIFO_FREE(Blt, 3);
  117. Blt->TopLeftSrc  = (srcY << 16) | srcX;
  118. Blt->TopLeftDst  = (dstY << 16) | dstX;
  119. Blt->WidthHeight = (dstH  << 16) | dstW;
  120. FB_AddBusySurface(src);
  121. FB_AddBusySurface(dst);
  122. if ( dst == this->screen ) {
  123. SDL_mutexV(hw_lock);
  124. }
  125. return(0);
  126. }
  127. static int CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst)
  128. {
  129. int accelerated;
  130. /* Set initial acceleration on */
  131. src->flags |= SDL_HWACCEL;
  132. /* Set the surface attributes */
  133. if ( (src->flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
  134. if ( ! this->info.blit_hw_A ) {
  135. src->flags &= ~SDL_HWACCEL;
  136. }
  137. }
  138. if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) {
  139. if ( ! this->info.blit_hw_CC ) {
  140. src->flags &= ~SDL_HWACCEL;
  141. }
  142. }
  143. /* Check to see if final surface blit is accelerated */
  144. accelerated = !!(src->flags & SDL_HWACCEL);
  145. if ( accelerated ) {
  146. src->map->hw_blit = HWAccelBlit;
  147. }
  148. return(accelerated);
  149. }
  150. void FB_RivaAccel(_THIS, __u32 card)
  151. {
  152. RivaRop *Rop = (RivaRop *)(mapped_io + ROP_OFFSET);
  153. /* We have hardware accelerated surface functions */
  154. this->CheckHWBlit = CheckHWBlit;
  155. wait_vbl = WaitVBL;
  156. switch (card) {
  157.     case FB_ACCEL_NV3:
  158. wait_idle = NV3WaitIdle;
  159. break;
  160.     case FB_ACCEL_NV4:
  161. wait_idle = NV4WaitIdle;
  162. break;
  163.     default:
  164. /* Hmm... FIXME */
  165. break;
  166. }
  167. FifoEmptyCount = Rop->FifoFree;
  168. /* The Riva has an accelerated color fill */
  169. this->info.blit_fill = 1;
  170. this->FillHWRect = FillHWRect;
  171. /* The Riva has accelerated normal and colorkey blits. */
  172. this->info.blit_hw = 1;
  173. #if 0 /* Not yet implemented? */
  174. this->info.blit_hw_CC = 1;
  175. this->SetHWColorKey = SetHWColorKey;
  176. #endif
  177. #if 0 /* Not yet implemented? */
  178. /* The Riva has an accelerated alpha blit */
  179. this->info.blit_hw_A = 1;
  180. this->SetHWAlpha = SetHWAlpha;
  181. #endif
  182. }