changeset 4769:75a701b39d61

BGR15, BGR16, BGR32 support
author michael
date Wed, 20 Feb 2002 17:23:00 +0000
parents a64075b4970a
children 59f8fd64538b
files vidix/drivers/mach64_vid.c
diffstat 1 files changed, 97 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/vidix/drivers/mach64_vid.c	Wed Feb 20 17:03:35 2002 +0000
+++ b/vidix/drivers/mach64_vid.c	Wed Feb 20 17:23:00 2002 +0000
@@ -534,20 +534,41 @@
     vf = INREG(VIDEO_FORMAT);
 
 // Bits 16-19 seem to select the format
-// Bit 28 seems to toggle something affects luma & chroma
+// 0x0  dunno behaves strange
+// 0x1  dunno behaves strange
+// 0x2  dunno behaves strange
+// 0x3  BGR15
+// 0x4  BGR16
+// 0x5  BGR16 (hmm, that need investigation, 2 BGR16 formats, i guess 1 will have only 5bits for green)
+// 0x6  BGR32
+// 0x7  BGR32 with somehow mixed even / odd pixels ?
+// 0x8	YYYYUVUV
+// 0x9	YVU9
+// 0xA	YV12
+// 0xB	YUY2
+// 0xC	UYVY
+// 0xD  UYVY (not again ... dont ask me, i dunno the difference)
+// 0xE  dunno behaves strange
+// 0xF  dunno behaves strange
+// Bit 28 all values are assumed to be 7 bit with chroma=64 for black (tested with YV12 & YUY2)
 // the remaining bits seem to have no effect
 
+
     switch(besr.fourcc)
     {
+	/* BGR formats */
+	case IMGFMT_BGR15: OUTREG(VIDEO_FORMAT, 0x00030000);  break;
+	case IMGFMT_BGR16: OUTREG(VIDEO_FORMAT, 0x00040000);  break;
+	case IMGFMT_BGR32: OUTREG(VIDEO_FORMAT, 0x00060000);  break;
         /* 4:2:0 */
 	case IMGFMT_IYUV:
 	case IMGFMT_I420:
-	case IMGFMT_YV12:  OUTREG(VIDEO_FORMAT, (vf & ~0xF0000) | 0xA0000);  break;
+	case IMGFMT_YV12:  OUTREG(VIDEO_FORMAT, 0x000A0000);  break;
         /* 4:2:2 */
         case IMGFMT_YVYU:
-	case IMGFMT_UYVY:  OUTREG(VIDEO_FORMAT, (vf & ~0xF0000) | 0xC0000); break;
+	case IMGFMT_UYVY:  OUTREG(VIDEO_FORMAT, 0x000C0000); break;
 	case IMGFMT_YUY2:
-	default:           OUTREG(VIDEO_FORMAT, (vf & ~0xF0000) | 0xB0000); break;
+	default:           OUTREG(VIDEO_FORMAT, 0x000B0000); break;
     }
     if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs();
 }
@@ -576,6 +597,7 @@
 			  config->dest.pitch.y = 
 			  config->dest.pitch.u = 
 			  config->dest.pitch.v = best_pitch;
+			  besr.vid_buf_pitch= pitch;
 			  break;
 	/* RGB 4:4:4:4 */
 	case IMGFMT_RGB32:
@@ -583,6 +605,7 @@
 			  config->dest.pitch.y = 
 			  config->dest.pitch.u = 
 			  config->dest.pitch.v = best_pitch;
+			  besr.vid_buf_pitch= pitch>>2;
 			  break;
 	/* 4:2:2 */
         default: /* RGB15, RGB16, YVYU, UYVY, YUY2 */
@@ -590,6 +613,7 @@
 			  config->dest.pitch.y =
 			  config->dest.pitch.u =
 			  config->dest.pitch.v = best_pitch;
+			  besr.vid_buf_pitch= pitch>>1;
 			  break;
     }
     dest_w = config->dest.w;
@@ -660,7 +684,7 @@
     if(mach64_is_interlace()) y_pos/=2;
     besr.y_x_end = y_pos | ((config->dest.x + dest_w) << 16);
     besr.height_width = ((src_w - left)<<16) | (src_h - top);
-    besr.vid_buf_pitch = is_420 ? pitch : pitch/2;
+
     return 0;
 }
 
@@ -668,7 +692,8 @@
 uint32_t supported_fourcc[] = 
 {
   IMGFMT_YV12, IMGFMT_I420, IMGFMT_IYUV, 
-  IMGFMT_UYVY, IMGFMT_YUY2, IMGFMT_YVYU
+  IMGFMT_UYVY, IMGFMT_YUY2, IMGFMT_YVYU,
+  IMGFMT_BGR15,IMGFMT_BGR16,IMGFMT_BGR32
 };
 
 __inline__ static int is_supported_fourcc(uint32_t fourcc)
@@ -754,6 +779,72 @@
       off[3] = besr.vid_buf3_base_adrs;
       off[4] = besr.vid_buf4_base_adrs;
       off[5] = besr.vid_buf5_base_adrs;
+#if 0 // debuging code, can be removed
+{
+int x,y;
+char *buf0= (char *)mach64_mem_base + mach64_overlay_offset;
+char *buf1= (char *)mach64_mem_base + mach64_overlay_offset;
+char *buf2= (char *)mach64_mem_base + mach64_overlay_offset;
+buf0 += ((besr.vid_buf0_base_adrs)&~15) - mach64_overlay_offset;
+buf1 += ((besr.vid_buf1_base_adrs)&~15) - mach64_overlay_offset;
+buf2 += ((besr.vid_buf2_base_adrs)&~15) - mach64_overlay_offset;
+/*for(y=0; y<480/4; y++)
+{
+	for(x=0; x<640/4; x++)
+	{
+		buf1[x + y*160]= 0; // buf1[2*x + y*160*4];
+		buf2[x + y*160]= 0; //buf2[2*x + y*160*4];
+	}
+}*/
+/*)for(y=479; y>0; y--)
+{
+	for(x=0; x<640; x++)
+	{
+		buf0[x*2 + y*1280+1]=
+		buf0[x*2 + y*1280]= buf0[x + y*640];
+	}
+}*/
+for(y=0; y<480; y++)
+{
+//	for(x=0; x<1280; x++) buf0[x + y*1280]=0;
+	for(x=0; x<1280/4; x++)
+	{
+// 1-> gray0
+//		buf0[x*2 + y*1280 +0] ^= buf0[x*2 + y*1280 +1];
+//		buf0[x*2 + y*1280 +1] ^= buf0[x*2 + y*1280 +0];
+//		buf0[x*2 + y*1280 +0] ^= buf0[x*2 + y*1280 +1];
+		
+		buf0[x*4 + y*1280 +1] =x; //buf0[x*4 + y*1280 +0]>>1;
+		buf0[x*4 + y*1280 +3] =128; //buf0[x*4 + y*1280 +2]>>1;
+		buf0[x*4 + y*1280 +0] =128;
+		buf0[x*4 + y*1280 +2] =128;
+
+//		buf0[x*8 + y*1280 +0]= 1;
+//		buf0[x*2 + y*1280 +1]= 7;
+//		buf0[x*2 + y*1280+6 ]= 255;
+	}
+// Y, Y, Y, Y, U, V, U, V
+}
+/*for(y=0; y<480; y++)
+{
+//	for(x=0; x<1280; x++) buf0[x + y*1280]=128;
+	for(x=0; x<640; x++)
+	{
+		buf0[x + y*640 ]>>=1;
+		buf0[x + y*640 ]|=128;
+	}
+}
+for(y=0; y<480/2; y++)
+{
+//	for(x=0; x<1280; x++) buf0[x + y*1280]=128;
+	for(x=0; x<640/2; x++)
+	{
+		buf1[x + y*320 ]>>=1;
+		buf2[x + y*320 ]>>=1;
+	}
+}*/
+}
+#endif
     }
 
     mach64_wait_vsync();