# HG changeset patch # User nick # Date 1007374219 0 # Node ID 404cfc1a0942c6792697596d8c94e4bbc23bd76e # Parent 9d4a7b4afba2f7f2bf50146e29692401e9163726 Color key still causes some troubles diff -r 9d4a7b4afba2 -r 404cfc1a0942 drivers/radeon/README --- a/drivers/radeon/README Mon Dec 03 01:51:02 2001 +0000 +++ b/drivers/radeon/README Mon Dec 03 10:10:19 2001 +0000 @@ -67,7 +67,6 @@ brightness=decval (-64:+63) doesn't work on radeons saturation=decval (0:+31) doesn't work on radeons double_buff=on/off enables/disables double buffering -colour_key=hexval defines colour key deinterlace=on/off enables/disables adaprive deinterlacing deinterlace_pattern=hexval defines deinterlacing pattern @@ -105,7 +104,7 @@ Full example: ~~~~~~~~~~~~~ modprobe radeon_vid mtrr=1 -echo "deinterlace_pattern=F0055555">>/dev/radeon_vid +echo "deinterlace_pattern=F0055555">/dev/radeon_vid mplayer -vo vesa:lvo:/dev/radeon_vid -fs -zoom -bpp 32 filename Enjoy! \ No newline at end of file diff -r 9d4a7b4afba2 -r 404cfc1a0942 drivers/radeon/radeon_vid.c --- a/drivers/radeon/radeon_vid.c Mon Dec 03 01:51:02 2001 +0000 +++ b/drivers/radeon/radeon_vid.c Mon Dec 03 10:10:19 2001 +0000 @@ -107,6 +107,7 @@ /* base address of yuv framebuffer */ uint32_t yuv_base; uint32_t fourcc; + uint32_t dest_bpp; /* YUV BES registers */ uint32_t reg_load_cntl; uint32_t h_inc; @@ -138,16 +139,21 @@ uint32_t exclusive_horz; uint32_t auto_flip_cntl; uint32_t filter_cntl; - uint32_t graphics_key_msk; uint32_t key_cntl; uint32_t test; /* Configurable stuff */ int double_buff; + int brightness; int saturation; + + int ckey_on; uint32_t graphics_key_clr; + uint32_t graphics_key_msk; + int deinterlace_on; uint32_t deinterlace_pattern; + } bes_registers_t; typedef struct video_registers_s @@ -188,8 +194,8 @@ { OV0_AUTO_FLIP_CNTL, 0 }, { OV0_FILTER_CNTL, 0 }, { OV0_COLOUR_CNTL, 0 }, + { OV0_GRAPHICS_KEY_CLR, 0 }, { OV0_GRAPHICS_KEY_MSK, 0 }, - { OV0_GRAPHICS_KEY_CLR, 0 }, { OV0_KEY_CNTL, 0 }, { OV0_TEST, 0 } }; @@ -270,6 +276,21 @@ #define INREG(addr) readl((radeon_mmio_base)+addr) #define OUTREG(addr,val) writel(val, (radeon_mmio_base)+addr) +static uint32_t radeon_vid_get_dbpp( void ) +{ + uint32_t dbpp,retval; + dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0xF; + switch(dbpp) + { + case DST_8BPP: retval = 8; break; + case DST_15BPP: retval = 15; break; + case DST_16BPP: retval = 16; break; + case DST_24BPP: retval = 24; break; + default: retval=32; break; + } + return retval; +} + static void __init radeon_vid_save_state( void ) { size_t i; @@ -315,6 +336,14 @@ OUTREG(OV0_COLOUR_CNTL, (besr.brightness & 0x7f) | (besr.saturation << 8) | (besr.saturation << 16)); + + if(besr.ckey_on) + { + OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk); + OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr); + OUTREG(OV0_KEY_CNTL,GRAPHIC_KEY_FN_FALSE|VIDEO_KEY_FN_FALSE|CMP_MIX_OR); + } + else OUTREG(OV0_KEY_CNTL,GRAPHIC_KEY_FN_NE); OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); @@ -380,6 +409,22 @@ OUTREG(OV0_REG_LOAD_CNTL, 0); } +void radeon_vid_set_color_key(int ckey_on, uint8_t R, uint8_t G, uint8_t B) +{ + besr.ckey_on = ckey_on; + if(radeon_vid_get_dbpp() == 16) + { /* 5.6.5 mode, + note that these values depend on DAC_CNTL.EXPAND_MODE setting */ + R = (R<<3); + G = (G<<2); + B = (B<<3); + besr.graphics_key_msk=((R|0x7)<<16)|((G|0x3)<<8)|(B|0x7)|(0xff<<24); + } + else besr.graphics_key_msk = ((R)<<16)|((G) <<8)|(B)|(0xff<<24); + besr.graphics_key_clr=(R<<16)|(G<<8)|(B)|(0x00 << 24); +} + + #define XXX_SRC_X 0 #define XXX_SRC_Y 0 @@ -463,8 +508,8 @@ case IMGFMT_BGR32: pitch = ((src_w*4) + 15) & ~15; break; } + besr.dest_bpp = radeon_vid_get_dbpp(); besr.fourcc = config->format; - besr.v_inc = (src_h << 20) / XXX_DRW_H; h_inc = (src_w << 12) / XXX_DRW_W; step_by = 1; @@ -640,6 +685,10 @@ printk(RVID_MSG"failed copy to userspace\n"); return -EFAULT; } + radeon_vid_set_color_key(radeon_config.colkey_on, + radeon_config.colkey_red, + radeon_config.colkey_green, + radeon_config.colkey_blue); if(swap_fourcc) radeon_config.format = swab32(radeon_config.format); printk(RVID_MSG"configuring for '%s' fourcc\n",fourcc_format_name(radeon_config.format)); return radeon_vid_init_video(&radeon_config); @@ -792,7 +841,6 @@ #define PARAM_BRIGHTNESS "brightness=" #define PARAM_SATURATION "saturation=" #define PARAM_DOUBLE_BUFF "double_buff=" -#define PARAM_COLOUR_KEY "colour_key=" #define PARAM_DEINTERLACE "deinterlace=" #define PARAM_DEINTERLACE_PATTERN "deinterlace_pattern=" @@ -811,14 +859,15 @@ #ifdef CONFIG_MTRR len += sprintf(&radeon_param_buff[len],"Tune MTRR: %s\n",mtrr?"on":"off"); #endif + if(besr.ckey_on) len += sprintf(&radeon_param_buff[len],"Last used color_key=%X (mask=%X)\n",besr.graphics_key_clr,besr.graphics_key_msk); len += sprintf(&radeon_param_buff[len],"Swapped fourcc: %s\n",swap_fourcc?"on":"off"); + len += sprintf(&radeon_param_buff[len],"Last BPP: %u\n",besr.dest_bpp); len += sprintf(&radeon_param_buff[len],"Last fourcc: %s\n\n",fourcc_format_name(besr.fourcc)); len += sprintf(&radeon_param_buff[len],"Configurable stuff:\n"); len += sprintf(&radeon_param_buff[len],"~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(&radeon_param_buff[len],PARAM_DOUBLE_BUFF"%s\n",besr.double_buff?"on":"off"); len += sprintf(&radeon_param_buff[len],PARAM_BRIGHTNESS"%i\n",brightness); len += sprintf(&radeon_param_buff[len],PARAM_SATURATION"%u\n",saturation); - len += sprintf(&radeon_param_buff[len],PARAM_COLOUR_KEY"%X\n",besr.graphics_key_clr); len += sprintf(&radeon_param_buff[len],PARAM_DEINTERLACE"%s\n",besr.deinterlace_on?"on":"off"); len += sprintf(&radeon_param_buff[len],PARAM_DEINTERLACE_PATTERN"%X\n",besr.deinterlace_pattern); radeon_param_buff_len = len; @@ -864,13 +913,6 @@ else besr.double_buff = 0; } else - if(memcmp(buf,PARAM_COLOUR_KEY,min(count,strlen(PARAM_COLOUR_KEY))) == 0) - { - long ckey; - ckey=simple_strtol(&buf[strlen(PARAM_COLOUR_KEY)],NULL,16); - OUTREG(OV0_GRAPHICS_KEY_CLR, ckey); - } - else if(memcmp(buf,PARAM_DEINTERLACE,min(count,strlen(PARAM_DEINTERLACE))) == 0) { if(memcmp(&buf[strlen(PARAM_DEINTERLACE)],"on",2) == 0) besr.deinterlace_on = 1;