src/video/fbcon/SDL_fb3dfx.c
branchSDL-1.3
changeset 1668 4da1ee79c9af
parent 1662 782fd950bd46
equal deleted inserted replaced
1667:1fddae038bc8 1668:4da1ee79c9af
    27 #include "3dfx_mmio.h"
    27 #include "3dfx_mmio.h"
    28 
    28 
    29 
    29 
    30 /* Wait for vertical retrace */
    30 /* Wait for vertical retrace */
    31 static void
    31 static void
    32 WaitVBL (_THIS)
    32 WaitVBL(_THIS)
    33 {
    33 {
    34     /* find start of retrace */
    34     /* find start of retrace */
    35     tdfx_waitidle ();
    35     tdfx_waitidle();
    36     while ((tdfx_in32 (TDFX_STATUS) & STATUS_RETRACE) == STATUS_RETRACE);
    36     while ((tdfx_in32(TDFX_STATUS) & STATUS_RETRACE) == STATUS_RETRACE);
    37     /* wait until we're past the start */
    37     /* wait until we're past the start */
    38     while ((tdfx_in32 (TDFX_STATUS) & STATUS_RETRACE) == 0);
    38     while ((tdfx_in32(TDFX_STATUS) & STATUS_RETRACE) == 0);
    39 }
    39 }
    40 static void
    40 static void
    41 WaitIdle (_THIS)
    41 WaitIdle(_THIS)
    42 {
    42 {
    43     tdfx_waitidle ();
    43     tdfx_waitidle();
    44 }
    44 }
    45 
    45 
    46 /* Sets video mem colorkey and accelerated blit function */
    46 /* Sets video mem colorkey and accelerated blit function */
    47 static int
    47 static int
    48 SetHWColorKey (_THIS, SDL_Surface * surface, Uint32 key)
    48 SetHWColorKey(_THIS, SDL_Surface * surface, Uint32 key)
    49 {
    49 {
    50     return (0);
    50     return (0);
    51 }
    51 }
    52 
    52 
    53 static int
    53 static int
    54 FillHWRect (_THIS, SDL_Surface * dst, SDL_Rect * rect, Uint32 color)
    54 FillHWRect(_THIS, SDL_Surface * dst, SDL_Rect * rect, Uint32 color)
    55 {
    55 {
    56     int bpp;
    56     int bpp;
    57     char *dst_base;
    57     char *dst_base;
    58     Uint32 format;
    58     Uint32 format;
    59     int dstX, dstY;
    59     int dstX, dstY;
    61     /* Don't blit to the display surface when switched away */
    61     /* Don't blit to the display surface when switched away */
    62     if (switched_away) {
    62     if (switched_away) {
    63         return -2;              /* no hardware access */
    63         return -2;              /* no hardware access */
    64     }
    64     }
    65     if (dst == this->screen) {
    65     if (dst == this->screen) {
    66         SDL_mutexP (hw_lock);
    66         SDL_mutexP(hw_lock);
    67     }
    67     }
    68 
    68 
    69     /* Set the destination pixel format */
    69     /* Set the destination pixel format */
    70     dst_base = (char *) ((char *) dst->pixels - mapped_mem);
    70     dst_base = (char *) ((char *) dst->pixels - mapped_mem);
    71     bpp = dst->format->BitsPerPixel;
    71     bpp = dst->format->BitsPerPixel;
    74     /* Calculate source and destination base coordinates */
    74     /* Calculate source and destination base coordinates */
    75     dstX = rect->x;
    75     dstX = rect->x;
    76     dstY = rect->y;
    76     dstY = rect->y;
    77 
    77 
    78     /* Execute the fill command */
    78     /* Execute the fill command */
    79     tdfx_wait (6);
    79     tdfx_wait(6);
    80     tdfx_out32 (DSTBASE, (Uint32) dst_base);
    80     tdfx_out32(DSTBASE, (Uint32) dst_base);
    81     tdfx_out32 (DSTFORMAT, format);
    81     tdfx_out32(DSTFORMAT, format);
    82     tdfx_out32 (COLORFORE, color);
    82     tdfx_out32(COLORFORE, color);
    83     tdfx_out32 (COMMAND_2D, COMMAND_2D_FILLRECT);
    83     tdfx_out32(COMMAND_2D, COMMAND_2D_FILLRECT);
    84     tdfx_out32 (DSTSIZE, rect->w | (rect->h << 16));
    84     tdfx_out32(DSTSIZE, rect->w | (rect->h << 16));
    85     tdfx_out32 (LAUNCH_2D, dstX | (dstY << 16));
    85     tdfx_out32(LAUNCH_2D, dstX | (dstY << 16));
    86 
    86 
    87     FB_AddBusySurface (dst);
    87     FB_AddBusySurface(dst);
    88 
    88 
    89     if (dst == this->screen) {
    89     if (dst == this->screen) {
    90         SDL_mutexV (hw_lock);
    90         SDL_mutexV(hw_lock);
    91     }
    91     }
    92     return (0);
    92     return (0);
    93 }
    93 }
    94 
    94 
    95 static int
    95 static int
    96 HWAccelBlit (SDL_Surface * src, SDL_Rect * srcrect,
    96 HWAccelBlit(SDL_Surface * src, SDL_Rect * srcrect,
    97              SDL_Surface * dst, SDL_Rect * dstrect)
    97             SDL_Surface * dst, SDL_Rect * dstrect)
    98 {
    98 {
    99     SDL_VideoDevice *this = current_video;
    99     SDL_VideoDevice *this = current_video;
   100     int bpp;
   100     int bpp;
   101     Uint32 src_format;
   101     Uint32 src_format;
   102     Uint32 dst_format;
   102     Uint32 dst_format;
   110     /* Don't blit to the display surface when switched away */
   110     /* Don't blit to the display surface when switched away */
   111     if (switched_away) {
   111     if (switched_away) {
   112         return -2;              /* no hardware access */
   112         return -2;              /* no hardware access */
   113     }
   113     }
   114     if (dst == this->screen) {
   114     if (dst == this->screen) {
   115         SDL_mutexP (hw_lock);
   115         SDL_mutexP(hw_lock);
   116     }
   116     }
   117 
   117 
   118     /* Set the source and destination pixel format */
   118     /* Set the source and destination pixel format */
   119     src_base = (char *) ((char *) src->pixels - mapped_mem);
   119     src_base = (char *) ((char *) src->pixels - mapped_mem);
   120     bpp = src->format->BitsPerPixel;
   120     bpp = src->format->BitsPerPixel;
   129     dstY = dstrect->y;
   129     dstY = dstrect->y;
   130 
   130 
   131     /* Assemble the blit operation */
   131     /* Assemble the blit operation */
   132     blitop = COMMAND_2D_BITBLT | (0xCC << 24);
   132     blitop = COMMAND_2D_BITBLT | (0xCC << 24);
   133     if (srcX <= dstX) {
   133     if (srcX <= dstX) {
   134         blitop |= BIT (14);
   134         blitop |= BIT(14);
   135         srcX += (dstrect->w - 1);
   135         srcX += (dstrect->w - 1);
   136         dstX += (dstrect->w - 1);
   136         dstX += (dstrect->w - 1);
   137     }
   137     }
   138     if (srcY <= dstY) {
   138     if (srcY <= dstY) {
   139         blitop |= BIT (15);
   139         blitop |= BIT(15);
   140         srcY += (dstrect->h - 1);
   140         srcY += (dstrect->h - 1);
   141         dstY += (dstrect->h - 1);
   141         dstY += (dstrect->h - 1);
   142     }
   142     }
   143 
   143 
   144     /* Perform the blit! */
   144     /* Perform the blit! */
   145     if ((src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY) {
   145     if ((src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY) {
   146         tdfx_wait (3);
   146         tdfx_wait(3);
   147         tdfx_out32 (SRCCOLORKEYMIN, src->format->colorkey);
   147         tdfx_out32(SRCCOLORKEYMIN, src->format->colorkey);
   148         tdfx_out32 (SRCCOLORKEYMAX, src->format->colorkey);
   148         tdfx_out32(SRCCOLORKEYMAX, src->format->colorkey);
   149         tdfx_out32 (ROP_2D, 0xAA00);
   149         tdfx_out32(ROP_2D, 0xAA00);
   150         use_colorkey = 1;
   150         use_colorkey = 1;
   151     } else {
   151     } else {
   152         use_colorkey = 0;
   152         use_colorkey = 0;
   153     }
   153     }
   154     tdfx_wait (9);
   154     tdfx_wait(9);
   155     tdfx_out32 (SRCBASE, (Uint32) src_base);
   155     tdfx_out32(SRCBASE, (Uint32) src_base);
   156     tdfx_out32 (SRCFORMAT, src_format);
   156     tdfx_out32(SRCFORMAT, src_format);
   157     tdfx_out32 (DSTBASE, (Uint32) dst_base);
   157     tdfx_out32(DSTBASE, (Uint32) dst_base);
   158     tdfx_out32 (DSTFORMAT, src_format);
   158     tdfx_out32(DSTFORMAT, src_format);
   159     tdfx_out32 (COMMAND_2D, blitop);
   159     tdfx_out32(COMMAND_2D, blitop);
   160     tdfx_out32 (COMMANDEXTRA_2D, use_colorkey);
   160     tdfx_out32(COMMANDEXTRA_2D, use_colorkey);
   161     tdfx_out32 (DSTSIZE, dstrect->w | (dstrect->h << 16));
   161     tdfx_out32(DSTSIZE, dstrect->w | (dstrect->h << 16));
   162     tdfx_out32 (DSTXY, dstX | (dstY << 16));
   162     tdfx_out32(DSTXY, dstX | (dstY << 16));
   163     tdfx_out32 (LAUNCH_2D, srcX | (srcY << 16));
   163     tdfx_out32(LAUNCH_2D, srcX | (srcY << 16));
   164 
   164 
   165     FB_AddBusySurface (src);
   165     FB_AddBusySurface(src);
   166     FB_AddBusySurface (dst);
   166     FB_AddBusySurface(dst);
   167 
   167 
   168     if (dst == this->screen) {
   168     if (dst == this->screen) {
   169         SDL_mutexV (hw_lock);
   169         SDL_mutexV(hw_lock);
   170     }
   170     }
   171     return (0);
   171     return (0);
   172 }
   172 }
   173 
   173 
   174 static int
   174 static int
   175 CheckHWBlit (_THIS, SDL_Surface * src, SDL_Surface * dst)
   175 CheckHWBlit(_THIS, SDL_Surface * src, SDL_Surface * dst)
   176 {
   176 {
   177     int accelerated;
   177     int accelerated;
   178 
   178 
   179     /* Set initial acceleration on */
   179     /* Set initial acceleration on */
   180     src->flags |= SDL_HWACCEL;
   180     src->flags |= SDL_HWACCEL;
   198     }
   198     }
   199     return (accelerated);
   199     return (accelerated);
   200 }
   200 }
   201 
   201 
   202 void
   202 void
   203 FB_3DfxAccel (_THIS, __u32 card)
   203 FB_3DfxAccel(_THIS, __u32 card)
   204 {
   204 {
   205     /* We have hardware accelerated surface functions */
   205     /* We have hardware accelerated surface functions */
   206     this->CheckHWBlit = CheckHWBlit;
   206     this->CheckHWBlit = CheckHWBlit;
   207     wait_vbl = WaitVBL;
   207     wait_vbl = WaitVBL;
   208     wait_idle = WaitIdle;
   208     wait_idle = WaitIdle;
   209 
   209 
   210     /* Reset the 3Dfx controller */
   210     /* Reset the 3Dfx controller */
   211     tdfx_out32 (BRESERROR0, 0);
   211     tdfx_out32(BRESERROR0, 0);
   212     tdfx_out32 (BRESERROR1, 0);
   212     tdfx_out32(BRESERROR1, 0);
   213 
   213 
   214     /* The 3Dfx has an accelerated color fill */
   214     /* The 3Dfx has an accelerated color fill */
   215     this->info.blit_fill = 1;
   215     this->info.blit_fill = 1;
   216     this->FillHWRect = FillHWRect;
   216     this->FillHWRect = FillHWRect;
   217 
   217