Mercurial > mplayer.hg
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; |