comparison vidix/drivers/nvidia_vid.c @ 16389:fa804efbfaf6

equalizer fixes: changing one attribute reset the others, brightness control for NV03/NV04
author reimar
date Sun, 04 Sep 2005 21:00:07 +0000
parents 73afe41bb7c3
children 288a27e39393
comparison
equal deleted inserted replaced
16388:9bce6b40def2 16389:fa804efbfaf6
65 // since no useful information whatsoever is passed 65 // since no useful information whatsoever is passed
66 // to the equalizer functions we need this 66 // to the equalizer functions we need this
67 static struct { 67 static struct {
68 uint32_t lum; // luminance (brightness + contrast) 68 uint32_t lum; // luminance (brightness + contrast)
69 uint32_t chrom; // chrominance (saturation + hue) 69 uint32_t chrom; // chrominance (saturation + hue)
70 uint8_t red_off; // for NV03/NV04
71 uint8_t green_off;
72 uint8_t blue_off;
70 vidix_video_eq_t vals; 73 vidix_video_eq_t vals;
71 } eq; 74 } eq;
72 75
73 struct nvidia_cards { 76 struct nvidia_cards {
74 unsigned short chip_id; 77 unsigned short chip_id;
635 yscale = ((info->height - 1) << 11) / (info->d_height - 1); 638 yscale = ((info->height - 1) << 11) / (info->d_height - 1);
636 xscale = ((info->width - 1) << 11) / (info->d_width - 1); 639 xscale = ((info->width - 1) << 11) / (info->d_width - 1);
637 VID_WR32 (info->chip.PVIDEO, 0x200, (yscale << 16) | xscale); 640 VID_WR32 (info->chip.PVIDEO, 0x200, (yscale << 16) | xscale);
638 641
639 /* NV_PVIDEO_RED_CSC_OFFSET */ 642 /* NV_PVIDEO_RED_CSC_OFFSET */
640 VID_WR32 (info->chip.PVIDEO, 0x280, 0x69); 643 VID_WR32 (info->chip.PVIDEO, 0x280, eq.red_off);
641 /* NV_PVIDEO_GREEN_CSC_OFFSET */ 644 /* NV_PVIDEO_GREEN_CSC_OFFSET */
642 VID_WR32 (info->chip.PVIDEO, 0x284, 0x3e); 645 VID_WR32 (info->chip.PVIDEO, 0x284, eq.green_off);
643 /* NV_PVIDEO_BLUE_CSC_OFFSET */ 646 /* NV_PVIDEO_BLUE_CSC_OFFSET */
644 VID_WR32 (info->chip.PVIDEO, 0x288, 0x89); 647 VID_WR32 (info->chip.PVIDEO, 0x288, eq.blue_off);
645 /* NV_PVIDEO_CSC_ADJUST */ 648 /* NV_PVIDEO_CSC_ADJUST */
646 VID_WR32 (info->chip.PVIDEO, 0x28C, 0x00000); /* No colour correction! */ 649 VID_WR32 (info->chip.PVIDEO, 0x28C, 0x00000); /* No colour correction! */
647 650
648 /* NV_PVIDEO_CONTROL_Y (BLUR_ON, LINE_HALF) */ 651 /* NV_PVIDEO_CONTROL_Y (BLUR_ON, LINE_HALF) */
649 VID_WR32 (info->chip.PVIDEO, 0x204, 0x001); 652 VID_WR32 (info->chip.PVIDEO, 0x204, 0x001);
765 info->use_colorkey = 0; 768 info->use_colorkey = 0;
766 769
767 eq.lum = 0x00001000; 770 eq.lum = 0x00001000;
768 eq.chrom = 0x00001000; 771 eq.chrom = 0x00001000;
769 memset(&eq.vals, 0, sizeof(vidix_video_eq_t)); 772 memset(&eq.vals, 0, sizeof(vidix_video_eq_t));
770 eq.vals.cap = VEQ_CAP_BRIGHTNESS | VEQ_CAP_CONTRAST | 773 eq.vals.cap = VEQ_CAP_BRIGHTNESS;
771 VEQ_CAP_SATURATION | VEQ_CAP_HUE; 774 if (info->chip.arch > NV_ARCH_04)
775 eq.vals.cap |= VEQ_CAP_CONTRAST | VEQ_CAP_SATURATION | VEQ_CAP_HUE;
776 eq.red_off = 0x69;
777 eq.green_off = 0x3e;
778 eq.blue_off = 0x89;
772 return 0; 779 return 0;
773 } 780 }
774 781
775 void vixDestroy(void){ 782 void vixDestroy(void){
776 unmap_phys_mem(info->control_base ,0x00C00000 + 0x00008000); 783 unmap_phys_mem(info->control_base ,0x00C00000 + 0x00008000);
885 } 892 }
886 893
887 int vixPlaybackSetEq(const vidix_video_eq_t *eq_parm) { 894 int vixPlaybackSetEq(const vidix_video_eq_t *eq_parm) {
888 double angle; 895 double angle;
889 int16_t chrom_cos, chrom_sin; 896 int16_t chrom_cos, chrom_sin;
890 vidix_video_eq_t new_eq;
891 vixPlaybackGetEq(&new_eq);
892 if (eq_parm->cap & VEQ_CAP_BRIGHTNESS) 897 if (eq_parm->cap & VEQ_CAP_BRIGHTNESS)
893 new_eq.brightness = eq_parm->brightness; 898 eq.vals.brightness = eq_parm->brightness;
894 if (eq_parm->cap & VEQ_CAP_CONTRAST) 899 if (eq_parm->cap & VEQ_CAP_CONTRAST)
895 new_eq.contrast = eq_parm->contrast; 900 eq.vals.contrast = eq_parm->contrast;
896 if (eq_parm->cap & VEQ_CAP_SATURATION) 901 if (eq_parm->cap & VEQ_CAP_SATURATION)
897 new_eq.saturation = eq_parm->saturation; 902 eq.vals.saturation = eq_parm->saturation;
898 if (eq_parm->cap & VEQ_CAP_HUE) 903 if (eq_parm->cap & VEQ_CAP_HUE)
899 new_eq.hue = eq_parm->hue; 904 eq.vals.hue = eq_parm->hue;
900 eq.lum = (((new_eq.brightness * 512 + 500) / 1000) << 16) | 905 eq.lum = (((eq.vals.brightness * 512 + 500) / 1000) << 16) |
901 ((((new_eq.contrast + 1000) * 8191 + 1000) / 2000) & 0xffff); 906 ((((eq.vals.contrast + 1000) * 8191 + 1000) / 2000) & 0xffff);
902 angle = (double)new_eq.hue / 1000.0 * 3.1415927; 907 angle = (double)eq.vals.hue / 1000.0 * 3.1415927;
903 chrom_cos = ((new_eq.saturation + 1000) * 8191 * cos(angle) + 1000) / 2000; 908 chrom_cos = ((eq.vals.saturation + 1000) * 8191 * cos(angle) + 1000) / 2000;
904 chrom_sin = ((new_eq.saturation + 1000) * 8191 * sin(angle) + 1000) / 2000; 909 chrom_sin = ((eq.vals.saturation + 1000) * 8191 * sin(angle) + 1000) / 2000;
905 eq.chrom = chrom_sin << 16 | chrom_cos; 910 eq.chrom = chrom_sin << 16 | chrom_cos;
911 eq.red_off = 0x69 - eq.vals.brightness * 62 / 1000;
912 eq.green_off = 0x3e + eq.vals.brightness * 62 / 1000;
913 eq.blue_off = 0x89 - eq.vals.brightness * 62 / 1000;
906 return 0; 914 return 0;
907 } 915 }
908 916
909 int vixPlaybackGetEq(vidix_video_eq_t *eq_parm) { 917 int vixPlaybackGetEq(vidix_video_eq_t *eq_parm) {
910 memcpy(eq_parm, &eq.vals, sizeof(vidix_video_eq_t)); 918 memcpy(eq_parm, &eq.vals, sizeof(vidix_video_eq_t));