Mercurial > mplayer.hg
comparison vidix/drivers/cyberblade_vid.c @ 8513:679abb24a76e
more safer version by the author
author | alex |
---|---|
date | Sat, 21 Dec 2002 21:01:19 +0000 |
parents | d794e866cf5f |
children | e40760677a83 |
comparison
equal
deleted
inserted
replaced
8512:9c784bd027ad | 8513:679abb24a76e |
---|---|
1 /* | 1 /* |
2 Driver for CyberBlade/i1 - Version 0.1.1 | 2 Driver for CyberBlade/i1 - Version 0.1.1 |
3 | 3 |
4 Copyright (C) 2002 by Alastair M. Robinson. | 4 Copyright (C) 2002 by Alastair M. Robinson. |
5 Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml | |
6 | |
5 Based on Permedia 3 driver by Måns Rullgård | 7 Based on Permedia 3 driver by Måns Rullgård |
6 | 8 |
7 Thanks to Gilles Frattini for bugfixes | 9 Thanks to Gilles Frattini for bugfixes |
8 | |
9 Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml | |
10 | 10 |
11 This program is free software; you can redistribute it and/or modify | 11 This program is free software; you can redistribute it and/or modify |
12 it under the terms of the GNU General Public License as published by | 12 it under the terms of the GNU General Public License as published by |
13 the Free Software Foundation; either version 2 of the License, or | 13 the Free Software Foundation; either version 2 of the License, or |
14 (at your option) any later version. | 14 (at your option) any later version. |
198 SROUTB(0x55,save_colourkey[4]); | 198 SROUTB(0x55,save_colourkey[4]); |
199 SROUTB(0x56,save_colourkey[5]); | 199 SROUTB(0x56,save_colourkey[5]); |
200 SROUTB(0x11, protect); | 200 SROUTB(0x11, protect); |
201 unmap_phys_mem(cyberblade_reg_base, 0x20000); | 201 unmap_phys_mem(cyberblade_reg_base, 0x20000); |
202 unmap_phys_mem(cyberblade_mem, 0x800000); | 202 unmap_phys_mem(cyberblade_mem, 0x800000); |
203 disable_app_io(); | |
203 } | 204 } |
204 | 205 |
205 | 206 |
206 int vixGetCapability(vidix_capability_t *to) | 207 int vixGetCapability(vidix_capability_t *to) |
207 { | 208 { |
253 } | 254 } |
254 | 255 |
255 int vixSetGrKeys(const vidix_grkey_t *grkey) | 256 int vixSetGrKeys(const vidix_grkey_t *grkey) |
256 { | 257 { |
257 int pixfmt=CRINB(0x38); | 258 int pixfmt=CRINB(0x38); |
259 int protect; | |
258 memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t)); | 260 memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t)); |
261 | |
262 protect=SRINB(0x11); | |
263 SROUTB(0x11, 0x92); | |
259 | 264 |
260 if(pixfmt&0x28) /* 32 or 24 bpp */ | 265 if(pixfmt&0x28) /* 32 or 24 bpp */ |
261 { | 266 { |
262 SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */ | 267 SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */ |
263 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ | 268 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ |
276 SROUTB(0x52, 0); /* Colour Key */ | 281 SROUTB(0x52, 0); /* Colour Key */ |
277 SROUTB(0x54, 0xff); /* Colour Key Mask */ | 282 SROUTB(0x54, 0xff); /* Colour Key Mask */ |
278 SROUTB(0x55, 0xff); /* Colour Key Mask */ | 283 SROUTB(0x55, 0xff); /* Colour Key Mask */ |
279 SROUTB(0x56, 0x00); /* Colour Key Mask */ | 284 SROUTB(0x56, 0x00); /* Colour Key Mask */ |
280 } | 285 } |
286 SROUTB(0x11,protect); | |
281 return(0); | 287 return(0); |
282 } | 288 } |
283 | 289 |
284 | 290 |
285 vidix_video_eq_t equal = | 291 vidix_video_eq_t equal = |
383 info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/4); | 389 info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/4); |
384 layout=0x51; /* planar, 16:1:1 */ | 390 layout=0x51; /* planar, 16:1:1 */ |
385 break; | 391 break; |
386 } | 392 } |
387 | 393 |
388 /* Assume we have 4 MB to play with */ | 394 /* Assume we have 2 MB to play with */ |
389 info->num_frames = 0x400000 / info->frame_size; | 395 info->num_frames = 0x200000 / info->frame_size; |
390 if(info->num_frames > VID_PLAY_MAXFRAMES) | 396 if(info->num_frames > VID_PLAY_MAXFRAMES) |
391 info->num_frames = VID_PLAY_MAXFRAMES; | 397 info->num_frames = VID_PLAY_MAXFRAMES; |
392 | 398 |
393 /* Start at 4 MB. Let's hope it's not in use. */ | 399 /* Start at 6 MB. Let's hope it's not in use. */ |
394 base0 = 0x400000; | 400 base0 = 0x600000; |
395 info->dga_addr = cyberblade_mem + base0; | 401 info->dga_addr = cyberblade_mem + base0; |
396 | 402 |
397 info->dest.pitch.y = 16; | 403 info->dest.pitch.y = 16; |
398 info->dest.pitch.u = 16; | 404 info->dest.pitch.u = 16; |
399 info->dest.pitch.v = 16; | 405 info->dest.pitch.v = 16; |
401 for(i = 0; i < info->num_frames; i++) | 407 for(i = 0; i < info->num_frames; i++) |
402 { | 408 { |
403 info->offsets[i] = info->frame_size * i; | 409 info->offsets[i] = info->frame_size * i; |
404 frames[i] = base0+info->offsets[i]; | 410 frames[i] = base0+info->offsets[i]; |
405 } | 411 } |
412 | |
413 enable_app_io(); | |
414 OUTPORT8(0x3d4,0x39); | |
415 OUTPORT8(0x3d5,INPORT(0x3d5)|1); | |
416 | |
417 SRINB(0x0b); /* Select new mode */ | |
406 | 418 |
407 /* Unprotect hardware registers... */ | 419 /* Unprotect hardware registers... */ |
408 protect=SRINB(0x11); | 420 protect=SRINB(0x11); |
409 SROUTB(0x11, 0x92); | 421 SROUTB(0x11, 0x92); |
410 | 422 |
420 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ | 432 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ |
421 SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */ | 433 SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */ |
422 SROUTB(0x54, 0xff); /* Colour Key Mask */ | 434 SROUTB(0x54, 0xff); /* Colour Key Mask */ |
423 SROUTB(0x55, 0xff); /* Colour Key Mask */ | 435 SROUTB(0x55, 0xff); /* Colour Key Mask */ |
424 SROUTB(0x56, 0xff); /* Colour Key Mask */ | 436 SROUTB(0x56, 0xff); /* Colour Key Mask */ |
437 printf("[cyberblade] 24/32-bit mode detected\n"); | |
425 } | 438 } |
426 else | 439 else |
427 { | 440 { |
428 int tmp=((cyberblade_grkey.ckey.blue & 0xf8)>>3) | 441 int tmp=((cyberblade_grkey.ckey.blue & 0xf8)>>3) |
429 |((cyberblade_grkey.ckey.green & 0xfc)<<3) | 442 |((cyberblade_grkey.ckey.green & 0xfc)<<3) |
432 SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */ | 445 SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */ |
433 SROUTB(0x52, 0x00); /* Colour Key */ | 446 SROUTB(0x52, 0x00); /* Colour Key */ |
434 SROUTB(0x54, 0xff); /* Colour Key Mask */ | 447 SROUTB(0x54, 0xff); /* Colour Key Mask */ |
435 SROUTB(0x55, 0xff); /* Colour Key Mask */ | 448 SROUTB(0x55, 0xff); /* Colour Key Mask */ |
436 SROUTB(0x56, 0x00); /* Colour Key Mask */ | 449 SROUTB(0x56, 0x00); /* Colour Key Mask */ |
450 printf("[cyberblade] 16-bit assumed\n"); | |
437 } | 451 } |
438 } | 452 } |
439 /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ | 453 /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ |
440 { | 454 { |
441 int HTotal,VTotal,HSync,VSync,Overflow; | 455 int HTotal,VTotal,HSync,VSync,Overflow; |
442 int tx1,ty1,tx2,ty2; | 456 int tx1,ty1,tx2,ty2; |
443 | 457 |
444 if(CRINB(0xd1)&0x80) | 458 if(CRINB(0xd1)&0x80) |
445 { | 459 { |
446 fprintf(stderr,"[cyberblade] Using TV-CRTC\n"); | 460 printf("[cyberblade] Using TV-CRTC\n"); |
447 HTotal=CRINB(0xe0); | 461 HTotal=CRINB(0xe0); |
448 HSync=CRINB(0xe4); | 462 HSync=CRINB(0xe4); |
449 VTotal=CRINB(0xe6); | 463 VTotal=CRINB(0xe6); |
450 VSync=CRINB(0xf0); | 464 VSync=CRINB(0xf0); |
451 Overflow=CRINB(0xe7); | 465 Overflow=CRINB(0xe7); |
457 VSync |= (Overflow & 4) <<6; | 471 VSync |= (Overflow & 4) <<6; |
458 VSync |= (Overflow & 0x80) <<2; | 472 VSync |= (Overflow & 0x80) <<2; |
459 } | 473 } |
460 else | 474 else |
461 { | 475 { |
462 fprintf(stderr,"[cyberblade] Using Standard CRTC\n"); | 476 printf("[cyberblade] Using Standard CRTC\n"); |
463 HTotal=CRINB(0x00); | 477 HTotal=CRINB(0x00); |
464 HSync=CRINB(0x04); | 478 HSync=CRINB(0x04); |
465 VTotal=CRINB(0x06); | 479 VTotal=CRINB(0x06); |
466 VSync=CRINB(0x10); | 480 VSync=CRINB(0x10); |
467 Overflow=CRINB(0x07); | 481 Overflow=CRINB(0x07); |
468 HTotal <<=3; | 482 HTotal <<=3; |
469 HSync <<=3; | 483 HSync <<=3; |
470 VTotal |= (Overflow & 1) <<8; | 484 VTotal |= (Overflow & 1) <<8; |
471 VTotal |= (Overflow & 0x20) <<4; | 485 VTotal |= (Overflow & 0x20) <<4; |
486 VTotal +=4; | |
472 VSync |= (Overflow & 4) <<6; | 487 VSync |= (Overflow & 4) <<6; |
473 VSync |= (Overflow & 0x80) <<2; | 488 VSync |= (Overflow & 0x80) <<2; |
474 } | 489 } |
475 | 490 |
491 printf("[cyberblade] HTotal: 0x%x, HSStart: 0x%x\n",HTotal,HSync); | |
492 printf(" VTotal: 0x%x, VStart: 0x%x\n",VTotal,VSync); | |
476 tx1=(HTotal-HSync)+15+info->dest.x; | 493 tx1=(HTotal-HSync)+15+info->dest.x; |
477 ty1=(VTotal-VSync)-8+info->dest.y; | 494 ty1=(VTotal-VSync)-8+info->dest.y; |
478 tx2=tx1+info->dest.w; | 495 tx2=tx1+info->dest.w; |
479 ty2=ty1+info->dest.h; | 496 ty2=ty1+info->dest.h; |
480 | 497 |