r128_state.c (113995) | r128_state.c (119098) |
---|---|
1/* r128_state.c -- State support for r128 -*- linux-c -*- 2 * Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com 3 * 4 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), --- 12 unchanged lines hidden (view full) --- 21 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24 * DEALINGS IN THE SOFTWARE. 25 * 26 * Authors: 27 * Gareth Hughes <gareth@valinux.com> 28 * | 1/* r128_state.c -- State support for r128 -*- linux-c -*- 2 * Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com 3 * 4 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), --- 12 unchanged lines hidden (view full) --- 21 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24 * DEALINGS IN THE SOFTWARE. 25 * 26 * Authors: 27 * Gareth Hughes <gareth@valinux.com> 28 * |
29 * $FreeBSD: head/sys/dev/drm/r128_state.c 113995 2003-04-25 01:18:47Z anholt $ | 29 * $FreeBSD: head/sys/dev/drm/r128_state.c 119098 2003-08-19 02:57:31Z anholt $ |
30 */ 31 32#include "dev/drm/r128.h" 33#include "dev/drm/drmP.h" 34#include "dev/drm/drm.h" 35#include "dev/drm/r128_drm.h" 36#include "dev/drm/r128_drv.h" 37 --- 459 unchanged lines hidden (view full) --- 497 (dev_priv->color_fmt << 8) | 498 R128_GMC_SRC_DATATYPE_COLOR | 499 R128_ROP3_S | 500 R128_DP_SRC_SOURCE_MEMORY | 501 R128_GMC_CLR_CMP_CNTL_DIS | 502 R128_GMC_AUX_CLIP_DIS | 503 R128_GMC_WR_MSK_DIS ); 504 | 30 */ 31 32#include "dev/drm/r128.h" 33#include "dev/drm/drmP.h" 34#include "dev/drm/drm.h" 35#include "dev/drm/r128_drm.h" 36#include "dev/drm/r128_drv.h" 37 --- 459 unchanged lines hidden (view full) --- 497 (dev_priv->color_fmt << 8) | 498 R128_GMC_SRC_DATATYPE_COLOR | 499 R128_ROP3_S | 500 R128_DP_SRC_SOURCE_MEMORY | 501 R128_GMC_CLR_CMP_CNTL_DIS | 502 R128_GMC_AUX_CLIP_DIS | 503 R128_GMC_WR_MSK_DIS ); 504 |
505 OUT_RING( dev_priv->back_pitch_offset_c ); 506 OUT_RING( dev_priv->front_pitch_offset_c ); | 505 /* Make this work even if front & back are flipped: 506 */ 507 if (dev_priv->current_page == 0) { 508 OUT_RING( dev_priv->back_pitch_offset_c ); 509 OUT_RING( dev_priv->front_pitch_offset_c ); 510 } 511 else { 512 OUT_RING( dev_priv->front_pitch_offset_c ); 513 OUT_RING( dev_priv->back_pitch_offset_c ); 514 } |
507 508 OUT_RING( (x << 16) | y ); 509 OUT_RING( (x << 16) | y ); 510 OUT_RING( (w << 16) | h ); 511 512 ADVANCE_RING(); 513 } 514 --- 10 unchanged lines hidden (view full) --- 525 526 ADVANCE_RING(); 527} 528 529static void r128_cce_dispatch_flip( drm_device_t *dev ) 530{ 531 drm_r128_private_t *dev_priv = dev->dev_private; 532 RING_LOCALS; | 515 516 OUT_RING( (x << 16) | y ); 517 OUT_RING( (x << 16) | y ); 518 OUT_RING( (w << 16) | h ); 519 520 ADVANCE_RING(); 521 } 522 --- 10 unchanged lines hidden (view full) --- 533 534 ADVANCE_RING(); 535} 536 537static void r128_cce_dispatch_flip( drm_device_t *dev ) 538{ 539 drm_r128_private_t *dev_priv = dev->dev_private; 540 RING_LOCALS; |
533 DRM_DEBUG( "page=%d\n", dev_priv->current_page ); | 541 DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n", 542 __FUNCTION__, 543 dev_priv->current_page, 544 dev_priv->sarea_priv->pfCurrentPage); |
534 535#if R128_PERFORMANCE_BOXES 536 /* Do some trivial performance monitoring... 537 */ 538 r128_cce_performance_boxes( dev_priv ); 539#endif 540 541 BEGIN_RING( 4 ); 542 543 R128_WAIT_UNTIL_PAGE_FLIPPED(); 544 OUT_RING( CCE_PACKET0( R128_CRTC_OFFSET, 0 ) ); 545 546 if ( dev_priv->current_page == 0 ) { 547 OUT_RING( dev_priv->back_offset ); | 545 546#if R128_PERFORMANCE_BOXES 547 /* Do some trivial performance monitoring... 548 */ 549 r128_cce_performance_boxes( dev_priv ); 550#endif 551 552 BEGIN_RING( 4 ); 553 554 R128_WAIT_UNTIL_PAGE_FLIPPED(); 555 OUT_RING( CCE_PACKET0( R128_CRTC_OFFSET, 0 ) ); 556 557 if ( dev_priv->current_page == 0 ) { 558 OUT_RING( dev_priv->back_offset ); |
548 dev_priv->current_page = 1; | |
549 } else { 550 OUT_RING( dev_priv->front_offset ); | 559 } else { 560 OUT_RING( dev_priv->front_offset ); |
551 dev_priv->current_page = 0; | |
552 } 553 554 ADVANCE_RING(); 555 556 /* Increment the frame counter. The client-side 3D driver must 557 * throttle the framerate by waiting for this value before 558 * performing the swapbuffer ioctl. 559 */ 560 dev_priv->sarea_priv->last_frame++; | 561 } 562 563 ADVANCE_RING(); 564 565 /* Increment the frame counter. The client-side 3D driver must 566 * throttle the framerate by waiting for this value before 567 * performing the swapbuffer ioctl. 568 */ 569 dev_priv->sarea_priv->last_frame++; |
570 dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page = 571 1 - dev_priv->current_page; |
|
561 562 BEGIN_RING( 2 ); 563 564 OUT_RING( CCE_PACKET0( R128_LAST_FRAME_REG, 0 ) ); 565 OUT_RING( dev_priv->sarea_priv->last_frame ); 566 567 ADVANCE_RING(); 568} --- 230 unchanged lines hidden (view full) --- 799 */ 800 switch ( blit->format ) { 801 case R128_DATATYPE_ARGB8888: 802 dword_shift = 0; 803 break; 804 case R128_DATATYPE_ARGB1555: 805 case R128_DATATYPE_RGB565: 806 case R128_DATATYPE_ARGB4444: | 572 573 BEGIN_RING( 2 ); 574 575 OUT_RING( CCE_PACKET0( R128_LAST_FRAME_REG, 0 ) ); 576 OUT_RING( dev_priv->sarea_priv->last_frame ); 577 578 ADVANCE_RING(); 579} --- 230 unchanged lines hidden (view full) --- 810 */ 811 switch ( blit->format ) { 812 case R128_DATATYPE_ARGB8888: 813 dword_shift = 0; 814 break; 815 case R128_DATATYPE_ARGB1555: 816 case R128_DATATYPE_RGB565: 817 case R128_DATATYPE_ARGB4444: |
818 case R128_DATATYPE_YVYU422: 819 case R128_DATATYPE_VYUY422: |
|
807 dword_shift = 1; 808 break; 809 case R128_DATATYPE_CI8: 810 case R128_DATATYPE_RGB8: 811 dword_shift = 2; 812 break; 813 default: 814 DRM_ERROR( "invalid blit format %d\n", blit->format ); --- 446 unchanged lines hidden (view full) --- 1261 1262 /* Make sure we restore the 3D state next time. 1263 */ 1264 dev_priv->sarea_priv->dirty |= R128_UPLOAD_CONTEXT | R128_UPLOAD_MASKS; 1265 1266 return 0; 1267} 1268 | 820 dword_shift = 1; 821 break; 822 case R128_DATATYPE_CI8: 823 case R128_DATATYPE_RGB8: 824 dword_shift = 2; 825 break; 826 default: 827 DRM_ERROR( "invalid blit format %d\n", blit->format ); --- 446 unchanged lines hidden (view full) --- 1274 1275 /* Make sure we restore the 3D state next time. 1276 */ 1277 dev_priv->sarea_priv->dirty |= R128_UPLOAD_CONTEXT | R128_UPLOAD_MASKS; 1278 1279 return 0; 1280} 1281 |
1282static int r128_do_init_pageflip( drm_device_t *dev ) 1283{ 1284 drm_r128_private_t *dev_priv = dev->dev_private; 1285 DRM_DEBUG( "\n" ); 1286 1287 dev_priv->crtc_offset = R128_READ( R128_CRTC_OFFSET ); 1288 dev_priv->crtc_offset_cntl = R128_READ( R128_CRTC_OFFSET_CNTL ); 1289 1290 R128_WRITE( R128_CRTC_OFFSET, dev_priv->front_offset ); 1291 R128_WRITE( R128_CRTC_OFFSET_CNTL, 1292 dev_priv->crtc_offset_cntl | R128_CRTC_OFFSET_FLIP_CNTL ); 1293 1294 dev_priv->page_flipping = 1; 1295 dev_priv->current_page = 0; 1296 dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page; 1297 1298 return 0; 1299} 1300 1301int r128_do_cleanup_pageflip( drm_device_t *dev ) 1302{ 1303 drm_r128_private_t *dev_priv = dev->dev_private; 1304 DRM_DEBUG( "\n" ); 1305 1306 R128_WRITE( R128_CRTC_OFFSET, dev_priv->crtc_offset ); 1307 R128_WRITE( R128_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl ); 1308 1309 if (dev_priv->current_page != 0) 1310 r128_cce_dispatch_flip( dev ); 1311 1312 dev_priv->page_flipping = 0; 1313 return 0; 1314} 1315 1316/* Swapping and flipping are different operations, need different ioctls. 1317 * They can & should be intermixed to support multiple 3d windows. 1318 */ 1319 1320int r128_cce_flip( DRM_IOCTL_ARGS ) 1321{ 1322 DRM_DEVICE; 1323 drm_r128_private_t *dev_priv = dev->dev_private; 1324 DRM_DEBUG( "%s\n", __FUNCTION__ ); 1325 1326 LOCK_TEST_WITH_RETURN( dev, filp ); 1327 1328 RING_SPACE_TEST_WITH_RETURN( dev_priv ); 1329 1330 if (!dev_priv->page_flipping) 1331 r128_do_init_pageflip( dev ); 1332 1333 r128_cce_dispatch_flip( dev ); 1334 1335 return 0; 1336} 1337 |
|
1269int r128_cce_swap( DRM_IOCTL_ARGS ) 1270{ 1271 DRM_DEVICE; 1272 drm_r128_private_t *dev_priv = dev->dev_private; 1273 drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv; 1274 DRM_DEBUG( "%s\n", __FUNCTION__ ); 1275 1276 LOCK_TEST_WITH_RETURN( dev, filp ); 1277 1278 RING_SPACE_TEST_WITH_RETURN( dev_priv ); 1279 1280 if ( sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS ) 1281 sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS; 1282 | 1338int r128_cce_swap( DRM_IOCTL_ARGS ) 1339{ 1340 DRM_DEVICE; 1341 drm_r128_private_t *dev_priv = dev->dev_private; 1342 drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv; 1343 DRM_DEBUG( "%s\n", __FUNCTION__ ); 1344 1345 LOCK_TEST_WITH_RETURN( dev, filp ); 1346 1347 RING_SPACE_TEST_WITH_RETURN( dev_priv ); 1348 1349 if ( sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS ) 1350 sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS; 1351 |
1283 if ( !dev_priv->page_flipping ) { 1284 r128_cce_dispatch_swap( dev ); 1285 dev_priv->sarea_priv->dirty |= (R128_UPLOAD_CONTEXT | 1286 R128_UPLOAD_MASKS); 1287 } else { 1288 r128_cce_dispatch_flip( dev ); 1289 } | 1352 r128_cce_dispatch_swap( dev ); 1353 dev_priv->sarea_priv->dirty |= (R128_UPLOAD_CONTEXT | 1354 R128_UPLOAD_MASKS); |
1290 1291 return 0; 1292} 1293 1294int r128_cce_vertex( DRM_IOCTL_ARGS ) 1295{ 1296 DRM_DEVICE; 1297 drm_r128_private_t *dev_priv = dev->dev_private; --- 309 unchanged lines hidden --- | 1355 1356 return 0; 1357} 1358 1359int r128_cce_vertex( DRM_IOCTL_ARGS ) 1360{ 1361 DRM_DEVICE; 1362 drm_r128_private_t *dev_priv = dev->dev_private; --- 309 unchanged lines hidden --- |