comparison vidix/drivers/radeon_vid.c @ 6254:034b12194350

rage128/radeon fixes, mach64 mess^H^H^H^Hcleanup, pm3 driver. sync with mplayerxp
author arpi
date Fri, 31 May 2002 23:17:43 +0000
parents 51fcb1e5c96e
children 2dd9691fe6b8
comparison
equal deleted inserted replaced
6253:136c061fab12 6254:034b12194350
278 { 278 {
279 if (INREG(GEN_INT_STATUS) & VSYNC_INT) break; 279 if (INREG(GEN_INT_STATUS) & VSYNC_INT) break;
280 } 280 }
281 } 281 }
282 282
283 #ifdef RAGE128
284 static void _radeon_engine_idle(void);
285 static void _radeon_fifo_wait(unsigned);
286 #define radeon_engine_idle() _radeon_engine_idle()
287 #define radeon_fifo_wait(entries) _radeon_fifo_wait(entries)
288 /* Flush all dirty data in the Pixel Cache to memory. */
289 static __inline__ void radeon_engine_flush ( void )
290 {
291 unsigned i;
292
293 OUTREGP(PC_NGUI_CTLSTAT, PC_FLUSH_ALL, ~PC_FLUSH_ALL);
294 for (i = 0; i < 2000000; i++) {
295 if (!(INREG(PC_NGUI_CTLSTAT) & PC_BUSY)) break;
296 }
297 }
298
299 /* Reset graphics card to known state. */
300 static void radeon_engine_reset( void )
301 {
302 uint32_t clock_cntl_index;
303 uint32_t mclk_cntl;
304 uint32_t gen_reset_cntl;
305
306 radeon_engine_flush();
307
308 clock_cntl_index = INREG(CLOCK_CNTL_INDEX);
309 mclk_cntl = INPLL(MCLK_CNTL);
310
311 OUTPLL(MCLK_CNTL, mclk_cntl | FORCE_GCP | FORCE_PIPE3D_CP);
312
313 gen_reset_cntl = INREG(GEN_RESET_CNTL);
314
315 OUTREG(GEN_RESET_CNTL, gen_reset_cntl | SOFT_RESET_GUI);
316 INREG(GEN_RESET_CNTL);
317 OUTREG(GEN_RESET_CNTL,
318 gen_reset_cntl & (uint32_t)(~SOFT_RESET_GUI));
319 INREG(GEN_RESET_CNTL);
320
321 OUTPLL(MCLK_CNTL, mclk_cntl);
322 OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index);
323 OUTREG(GEN_RESET_CNTL, gen_reset_cntl);
324 }
325 #else
283 326
284 static __inline__ void radeon_engine_flush ( void ) 327 static __inline__ void radeon_engine_flush ( void )
285 { 328 {
286 int i; 329 int i;
287 330
343 OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index); 386 OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index);
344 OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); 387 OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset);
345 388
346 return; 389 return;
347 } 390 }
348 391 #endif
349 static void radeon_engine_restore( void ) 392 static void radeon_engine_restore( void )
350 { 393 {
394 #ifndef RAGE128
351 int pitch64; 395 int pitch64;
352 uint32_t xres,yres,bpp; 396 uint32_t xres,yres,bpp;
353 radeon_fifo_wait(1); 397 radeon_fifo_wait(1);
354 xres = radeon_get_xres(); 398 xres = radeon_get_xres();
355 yres = radeon_get_yres(); 399 yres = radeon_get_yres();
387 OUTREG(DP_SRC_FRGD_CLR, 0xffffffff); 431 OUTREG(DP_SRC_FRGD_CLR, 0xffffffff);
388 OUTREG(DP_SRC_BKGD_CLR, 0x00000000); 432 OUTREG(DP_SRC_BKGD_CLR, 0x00000000);
389 OUTREG(DP_WRITE_MASK, 0xffffffff); 433 OUTREG(DP_WRITE_MASK, 0xffffffff);
390 434
391 radeon_engine_idle(); 435 radeon_engine_idle();
392 } 436 #endif
393 437 }
438 #ifdef RAGE128
394 static void _radeon_fifo_wait (unsigned entries) 439 static void _radeon_fifo_wait (unsigned entries)
395 { 440 {
396 int i; 441 unsigned i;
442
443 for(;;)
444 {
445 for (i=0; i<2000000; i++)
446 if ((INREG(GUI_STAT) & GUI_FIFOCNT_MASK) >= entries)
447 return;
448 radeon_engine_reset();
449 radeon_engine_restore();
450 }
451 }
452
453 static void _radeon_engine_idle ( void )
454 {
455 unsigned i;
456
457 /* ensure FIFO is empty before waiting for idle */
458 radeon_fifo_wait (64);
459 for(;;)
460 {
461 for (i=0; i<2000000; i++) {
462 if ((INREG(GUI_STAT) & GUI_ACTIVE) == 0) {
463 radeon_engine_flush ();
464 return;
465 }
466 }
467 radeon_engine_reset();
468 radeon_engine_restore();
469 }
470 }
471 #else
472 static void _radeon_fifo_wait (unsigned entries)
473 {
474 unsigned i;
397 475
398 for(;;) 476 for(;;)
399 { 477 {
400 for (i=0; i<2000000; i++) 478 for (i=0; i<2000000; i++)
401 if ((INREG(RBBM_STATUS) & RBBM_FIFOCNT_MASK) >= entries) 479 if ((INREG(RBBM_STATUS) & RBBM_FIFOCNT_MASK) >= entries)
402 return; 480 return;
403 radeon_engine_reset(); 481 radeon_engine_reset();
404 radeon_engine_restore(); 482 radeon_engine_restore();
405 } 483 }
406 } 484 }
407
408 static void _radeon_engine_idle ( void ) 485 static void _radeon_engine_idle ( void )
409 { 486 {
410 int i; 487 int i;
411 488
412 /* ensure FIFO is empty before waiting for idle */ 489 /* ensure FIFO is empty before waiting for idle */
413 radeon_fifo_wait (64); 490 radeon_fifo_wait (64);
414 for(;;) 491 for(;;)
415 { 492 {
416 for (i=0; i<2000000; i++) { 493 for (i=0; i<2000000; i++) {
417 if (((INREG(RBBM_STATUS) & GUI_ACTIVE)) == 0) { 494 if (((INREG(RBBM_STATUS) & RBBM_ACTIVE)) == 0) {
418 radeon_engine_flush (); 495 radeon_engine_flush ();
419 return; 496 return;
420 } 497 }
421 } 498 }
422 radeon_engine_reset(); 499 radeon_engine_reset();
423 radeon_engine_restore(); 500 radeon_engine_restore();
424 } 501 }
425 } 502 }
426 503 #endif
427
428 504
429 #ifndef RAGE128 505 #ifndef RAGE128
430 /* Reference color space transform data */ 506 /* Reference color space transform data */
431 typedef struct tagREF_TRANSFORM 507 typedef struct tagREF_TRANSFORM
432 { 508 {
1062 case IMGFMT_YV12: 1138 case IMGFMT_YV12:
1063 case IMGFMT_I420: 1139 case IMGFMT_I420:
1064 if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy; 1140 if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy;
1065 else pitch = 32; 1141 else pitch = 32;
1066 break; 1142 break;
1143 case IMGFMT_YVU9:
1144 if(spy > 32 && spu == spy/4 && spv == spy/4) pitch = spy;
1145 else pitch = 64;
1146 break;
1067 default: 1147 default:
1068 if(spy >= 16) pitch = spy; 1148 if(spy >= 16) pitch = spy;
1069 else pitch = 16; 1149 else pitch = 16;
1070 break; 1150 break;
1071 } 1151 }
1097 config->fourcc == IMGFMT_BGR15) is_rgb = 1; 1177 config->fourcc == IMGFMT_BGR15) is_rgb = 1;
1098 best_pitch = radeon_query_pitch(config->fourcc,&config->src.pitch); 1178 best_pitch = radeon_query_pitch(config->fourcc,&config->src.pitch);
1099 mpitch = best_pitch-1; 1179 mpitch = best_pitch-1;
1100 switch(config->fourcc) 1180 switch(config->fourcc)
1101 { 1181 {
1182 case IMGFMT_YVU9:
1102 /* 4:2:0 */ 1183 /* 4:2:0 */
1103 case IMGFMT_IYUV: 1184 case IMGFMT_IYUV:
1104 case IMGFMT_YV12: 1185 case IMGFMT_YV12:
1105 case IMGFMT_I420: pitch = (src_w + mpitch) & ~mpitch; 1186 case IMGFMT_I420: pitch = (src_w + mpitch) & ~mpitch;
1106 config->dest.pitch.y = 1187 config->dest.pitch.y =
1123 break; 1204 break;
1124 } 1205 }
1125 dest_w = config->dest.w; 1206 dest_w = config->dest.w;
1126 dest_h = config->dest.h; 1207 dest_h = config->dest.h;
1127 if(radeon_is_dbl_scan()) dest_h *= 2; 1208 if(radeon_is_dbl_scan()) dest_h *= 2;
1128 else
1129 if(radeon_is_interlace()) dest_h /= 2;
1130 besr.dest_bpp = radeon_vid_get_dbpp(); 1209 besr.dest_bpp = radeon_vid_get_dbpp();
1131 besr.fourcc = config->fourcc; 1210 besr.fourcc = config->fourcc;
1132 besr.v_inc = (src_h << 20) / dest_h; 1211 besr.v_inc = (src_h << 20) / dest_h;
1212 if(radeon_is_interlace()) besr.v_inc *= 2;
1133 h_inc = (src_w << 12) / dest_w; 1213 h_inc = (src_w << 12) / dest_w;
1134 step_by = 1; 1214 step_by = 1;
1135 while(h_inc >= (2 << 12)) { 1215 while(h_inc >= (2 << 12)) {
1136 step_by++; 1216 step_by++;
1137 h_inc >>= 1; 1217 h_inc >>= 1;
1234 { 1314 {
1235 case IMGFMT_I420: 1315 case IMGFMT_I420:
1236 case IMGFMT_YV12: 1316 case IMGFMT_YV12:
1237 case IMGFMT_IYUV: 1317 case IMGFMT_IYUV:
1238 awidth = (info->src.w + (pitch-1)) & ~(pitch-1); 1318 awidth = (info->src.w + (pitch-1)) & ~(pitch-1);
1239 info->frame_size = (awidth*(info->src.h+info->src.h/2)+dbpp-1)/dbpp; 1319 info->frame_size = awidth*(info->src.h+info->src.h/2);
1240 break; 1320 break;
1241 case IMGFMT_RGB32: 1321 case IMGFMT_RGB32:
1242 case IMGFMT_BGR32: 1322 case IMGFMT_BGR32:
1243 awidth = (info->src.w*4 + (pitch-1)) & ~(pitch-1); 1323 awidth = (info->src.w*4 + (pitch-1)) & ~(pitch-1);
1244 info->frame_size = ((awidth*info->src.h)+dbpp-1)/dbpp; 1324 info->frame_size = awidth*info->src.h;
1245 break; 1325 break;
1246 /* YUY2 YVYU, RGB15, RGB16 */ 1326 /* YUY2 YVYU, RGB15, RGB16 */
1247 default: 1327 default:
1248 awidth = (info->src.w*2 + (pitch-1)) & ~(pitch-1); 1328 awidth = (info->src.w*2 + (pitch-1)) & ~(pitch-1);
1249 info->frame_size = ((awidth*info->src.h)+dbpp-1)/dbpp; 1329 info->frame_size = awidth*info->src.h;
1250 break; 1330 break;
1251 } 1331 }
1252 info->frame_size *= dbpp;
1253 } 1332 }
1254 1333
1255 int vixConfigPlayback(vidix_playback_t *info) 1334 int vixConfigPlayback(vidix_playback_t *info)
1256 { 1335 {
1257 unsigned rgb_size; 1336 unsigned rgb_size,nfr;
1258 if(!is_supported_fourcc(info->fourcc)) return ENOSYS; 1337 if(!is_supported_fourcc(info->fourcc)) return ENOSYS;
1259 if(info->num_frames>=VID_PLAY_MAXFRAMES) info->num_frames=VID_PLAY_MAXFRAMES-1; 1338 if(info->num_frames>VID_PLAY_MAXFRAMES) info->num_frames=VID_PLAY_MAXFRAMES;
1260 if(info->num_frames==1) besr.double_buff=0; 1339 if(info->num_frames==1) besr.double_buff=0;
1261 else besr.double_buff=1; 1340 else besr.double_buff=1;
1262 radeon_compute_framesize(info); 1341 radeon_compute_framesize(info);
1263 1342
1264 rgb_size = radeon_get_xres()*radeon_get_yres()*radeon_vid_get_dbpp(); 1343 rgb_size = radeon_get_xres()*radeon_get_yres()*((radeon_vid_get_dbpp()+7)/8);
1265 for(;info->num_frames>0; info->num_frames--) 1344 nfr = info->num_frames;
1345 for(;nfr>0; nfr--)
1266 { 1346 {
1267 radeon_overlay_off = radeon_ram_size - info->frame_size*info->num_frames; 1347 radeon_overlay_off = radeon_ram_size - info->frame_size*nfr;
1268 radeon_overlay_off &= 0xffff0000; 1348 radeon_overlay_off &= 0xffff0000;
1269 if(radeon_overlay_off >= (int)rgb_size ) break; 1349 if(radeon_overlay_off >= (int)rgb_size ) break;
1270 } 1350 }
1271 if(info->num_frames <= 3) 1351 if(nfr <= 3)
1272 for(;info->num_frames>0; info->num_frames--) 1352 {
1353 nfr = info->num_frames;
1354 for(;nfr>0; nfr--)
1273 { 1355 {
1274 radeon_overlay_off = radeon_ram_size - info->frame_size*info->num_frames; 1356 radeon_overlay_off = radeon_ram_size - info->frame_size*nfr;
1275 radeon_overlay_off &= 0xffff0000; 1357 radeon_overlay_off &= 0xffff0000;
1276 if(radeon_overlay_off > 0) break; 1358 if(radeon_overlay_off > 0) break;
1277 } 1359 }
1278 if(info->num_frames <= 0) return EINVAL; 1360 }
1361 if(nfr <= 0) return EINVAL;
1362 info->num_frames = nfr;
1279 besr.vid_nbufs = info->num_frames; 1363 besr.vid_nbufs = info->num_frames;
1280 info->dga_addr = (char *)radeon_mem_base + radeon_overlay_off; 1364 info->dga_addr = (char *)radeon_mem_base + radeon_overlay_off;
1281 radeon_vid_init_video(info); 1365 radeon_vid_init_video(info);
1282 return 0; 1366 return 0;
1283 } 1367 }
1451 1535
1452 static void set_gr_key( void ) 1536 static void set_gr_key( void )
1453 { 1537 {
1454 if(radeon_grkey.ckey.op == CKEY_TRUE) 1538 if(radeon_grkey.ckey.op == CKEY_TRUE)
1455 { 1539 {
1540 int dbpp=radeon_vid_get_dbpp();
1456 besr.ckey_on=1; 1541 besr.ckey_on=1;
1457 1542
1458 switch(radeon_vid_get_dbpp()) 1543 switch(dbpp)
1459 { 1544 {
1460 case 15: 1545 case 15:
1461 besr.graphics_key_clr= 1546 besr.graphics_key_clr=
1462 ((radeon_grkey.ckey.blue &0xF8)>>3) 1547 ((radeon_grkey.ckey.blue &0xF8)>>3)
1463 | ((radeon_grkey.ckey.green&0xF8)<<2) 1548 | ((radeon_grkey.ckey.green&0xF8)<<2)
1484 default: 1569 default:
1485 besr.ckey_on=0; 1570 besr.ckey_on=0;
1486 besr.graphics_key_msk=0; 1571 besr.graphics_key_msk=0;
1487 besr.graphics_key_clr=0; 1572 besr.graphics_key_clr=0;
1488 } 1573 }
1489 besr.graphics_key_msk = besr.graphics_key_clr; 1574 #ifdef RAGE128
1575 besr.graphics_key_msk=(1<<dbpp)-1;
1576 besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_NE|CMP_MIX_AND;
1577 #else
1578 besr.graphics_key_msk=besr.graphics_key_clr;
1490 besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND; 1579 besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND;
1580 #endif
1491 } 1581 }
1492 else 1582 else
1493 { 1583 {
1494 besr.ckey_on=0; 1584 besr.ckey_on=0;
1495 besr.graphics_key_msk=0; 1585 besr.graphics_key_msk=0;