/***************************************************************************** * Display: displays previously rendered output *****************************************************************************/ static void Display( vout_thread_t *p_vout, picture_t *p_pic ) { grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); grBufferSwap( 0 ); if ( grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, GR_ORIGIN_UPPER_LEFT, FXFALSE, &p_vout->p_sys->p_buffer_info) == FXFALSE ) { msg_Err( p_vout, "cannot take 3dfx back buffer lock" ); } }
void glide64ReadScreen2(void *dest, int *width, int *height, int front) { GrLfbInfo_t info; uint8_t *line = (uint8_t*)dest; *width = settings.res_x; *height = settings.res_y; if (!line) return; info.size = sizeof(GrLfbInfo_t); if (grLfbLock (GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER, GR_LFBWRITEMODE_888, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { uint32_t y, x; // Copy the screen, let's hope this works. for (y = 0; y < settings.res_y; y++) { uint8_t *ptr = (uint8_t*) info.lfbPtr + (info.strideInBytes * y); for (x = 0; x < settings.res_x; x++) { line[x*3] = ptr[2]; // red line[x*3+1] = ptr[1]; // green line[x*3+2] = ptr[0]; // blue ptr += 4; } line += settings.res_x * 3; } // Unlock the frontbuffer grLfbUnlock (GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER); } }
void main( int argc, char **argv) { char match; char **remArgs; int rv; GrScreenResolution_t resolution = GR_RESOLUTION_640x480; float scrWidth = 640.0f; float scrHeight = 480.0f; int frames = -1; GrContext_t gc = 0; static unsigned short colorBuf[64][64]; static unsigned short grabBuf[64][64]; int x,y; /* Initialize Glide */ grGlideInit(); assert( hwconfig = tlVoodooType() ); /* Process Command Line Arguments */ while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) { if ( rv == -1 ) { printf( "Unrecognized command line argument\n" ); printf( "%s %s\n", name, usage ); printf( "Available resolutions:\n%s\n", tlGetResolutionList() ); return; } switch( match ) { case 'n': frames = atoi( remArgs[0] ); break; case 'r': resolution = tlGetResolutionConstant( remArgs[0], &scrWidth, &scrHeight ); break; } } tlSetScreen( scrWidth, scrHeight ); version = grGetString( GR_VERSION ); printf( "%s:\n%s\n", name, purpose ); printf( "%s\n", version ); printf( "Resolution: %s\n", tlGetResolutionString( resolution ) ); if ( frames == -1 ) { printf( "Press A Key To Begin Test.\n" ); tlGetCH(); } grSstSelect( 0 ); gc = grSstWinOpen(tlGethWnd(), resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, GR_ORIGIN_UPPER_LEFT, 2, 1 ); if (!gc) { printf("Could not allocate glide fullscreen context.\n"); goto __errExit; } tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, 60, 15, 0xffffff ); /* Set up Render State - disable dithering*/ grDitherMode( GR_DITHER_DISABLE ); /* Create Source Bitmap to be copied to framebuffer */ for( y = 0; y < 64; y++ ) { for( x = 0; x < 64; x++ ) { FxU8 red = x << 2; FxU8 grn = y << 2; FxU8 blu = ( x + y )<<1; colorBuf[y][x] = (red & 0xF8) << 8; colorBuf[y][x] |= (grn & 0xFC) << 3; colorBuf[y][x] |= (blu & 0xF8) >> 3; } } tlConOutput( "Press any key to quit\n" ); while( frames-- && tlOkToRender()) { GrLfbInfo_t info; int startX, startY; if (hwconfig == TL_VOODOORUSH) { tlGetDimsByConst(resolution, &scrWidth, &scrHeight ); grClipWindow(0, 0, (FxU32) scrWidth, (FxU32) scrHeight); } grBufferClear( 0x00, 0, 0 ); /* prepare info structure */ info.size = sizeof( GrLfbInfo_t ); /* lock back buffer */ if ( grLfbLock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info )==FXFALSE) { tlConOutput( "Error, failed to take write lock\n" ); break; } if ( tlScaleX(1.0f) < 64.0 || tlScaleY(1.0f) < 64.0 ) return; /* generate random start position */ startX = (int)rRandom( 64, (int)tlScaleX(1.0f) - 65 ); startY = (int)rRandom( 64, (int)tlScaleY(1.0f) - 65 ); /* render image to back buffer */ for( y = 0; y < 64; y++ ) { for( x = 0; x < 64; x++ ) { FxU16 *pixel = (FxU16*)(((char*)info.lfbPtr) + (y+startY)*info.strideInBytes+ (x+startX)*2); *pixel = colorBuf[y][x]; } } /* unlock the backbuffer */ grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); /* swap to front buffer */ grBufferSwap( 1 ); grBufferClear( 0,0,0 ); tlSleep( 1 ); /* lock the front buffer */ if ( grLfbLock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER, GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info )==FXFALSE) { tlConOutput( "Error, failed to take read lock\n" ); break; } /* grab the source image out of the front buffer */ for( y = 0; y < 64; y++ ) { for( x = 0; x < 64; x++ ) { FxU16 *pixel = (FxU16*)(((char*)info.lfbPtr) + (y+startY)*info.strideInBytes+ (x+startX)*2); grabBuf[y][x] = *pixel; } } /* unlock the front buffer */ grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER ); tlConClear(); /* compare the source image to the readback image */ if ( memcmp( colorBuf, grabBuf, sizeof( colorBuf ) ) ) { tlConOutput( "Failed readback test\n" ); } else { tlConOutput( "Passed readback test\n" ); } grBufferSwap( 1 ); tlConOutput( "Press any key to quit\n" ); tlConRender(); grBufferSwap( 1 ); tlSleep( 1 ); while( tlKbHit() ) { switch( tlGetCH() ) { default: frames = 0; break; } } } __errExit: grGlideShutdown(); return; }
static int OpenDisplay( vout_thread_t *p_vout ) { static char version[80]; GrHwConfiguration hwconfig; GrScreenResolution_t resolution = GR_RESOLUTION_800x600; GrLfbInfo_t p_front_buffer_info; /* front buffer info */ grGlideGetVersion( version ); grGlideInit(); if( !grSstQueryHardware(&hwconfig) ) { msg_Err( p_vout, "cannot get 3dfx hardware config" ); return( 1 ); } grSstSelect( 0 ); if( !grSstWinOpen( 0, resolution, GR_REFRESH_60Hz, GR_COLORFORMAT_ABGR, GR_ORIGIN_UPPER_LEFT, 2, 1 ) ) { msg_Err( p_vout, "cannot open 3dfx screen" ); return( 1 ); } /* disable dithering */ /*grDitherMode( GR_DITHER_DISABLE );*/ /* clear both buffers */ grRenderBuffer( GR_BUFFER_BACKBUFFER ); grBufferClear( 0, 0, 0 ); grRenderBuffer( GR_BUFFER_FRONTBUFFER ); grBufferClear( 0, 0, 0 ); grRenderBuffer( GR_BUFFER_BACKBUFFER ); p_vout->p_sys->p_buffer_info.size = sizeof( GrLfbInfo_t ); p_front_buffer_info.size = sizeof( GrLfbInfo_t ); /* lock the buffers to find their adresses */ if ( grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_FRONTBUFFER, GR_LFBWRITEMODE_565, GR_ORIGIN_UPPER_LEFT, FXFALSE, &p_front_buffer_info) == FXFALSE ) { msg_Err( p_vout, "cannot take 3dfx front buffer lock" ); grGlideShutdown(); return( 1 ); } grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_FRONTBUFFER ); if ( grLfbLock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER, GR_LFBWRITEMODE_565, GR_ORIGIN_UPPER_LEFT, FXFALSE, &p_vout->p_sys->p_buffer_info) == FXFALSE ) { msg_Err( p_vout, "cannot take 3dfx back buffer lock" ); grGlideShutdown(); return( 1 ); } grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER ); grBufferClear( 0, 0, 0 ); p_vout->p_sys->pp_buffer[0] = p_vout->p_sys->p_buffer_info.lfbPtr; p_vout->p_sys->pp_buffer[1] = p_front_buffer_info.lfbPtr; p_vout->p_sys->i_index = 0; return( 0 ); }