Subject: Re: XF86 wsfb driver and wscons ioctl
To: None <tech-x11@netbsd.org>
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
List: tech-x11
Date: 03/24/2005 23:18:15
> > I was thinking of the TC mfb, which is mono but uses byte addressing.
> > Only the lowest bit is significant (so depth of 1 and bpp of 8). Are
> > there other devices like that?

In this case (depth of 1 and bpp of N), I guess we should
handle mono flamebuffers which have something like "bit stride"
for each pixel, but

> Yes. Various HP framebuffers found in hp300 machines, like the CatsEye 
> - depth 6, bpp 8 ( or more? I'm not too sure... ). Tomcat uses depth 1 
> bpp 8 if I remember correctly.

Umm, in this case, actually topcat could have bpp of 8 but various
(from 1 to 8?) depth.

Maybe we should provide info about "the number of bits that are
actually significant" for FBs with bpp of 8 or less, right?
(I don't know if there are any FBs with bpp of 2 or 4, though)

Current rasops handles these N depth and 8bpp flamebuffers
by rasops8 and RI_FORCEMONO flag, but rasops2 and rasops4
are not implemented yet.

> > It may not be possible to drive certain types of display with the
> > usual code (as is the case with the PixelStamp, no direct FB access).
> > Rather than teaching the X server about each of the black sheep, why
> > not have a flag passed down by the kernel?
> This looks awfully like exposing a bunch of functions to userland and 
> let the driver decide which ones to accelerate by hardware... before we 
> know it we have half a GDI in the kernel. On the other hand - we 
> already do, there's just no abstraction layer to make it accessible 
> from outside.

I don't have any particular idea which type of info should be passed
from kernel to userland by the new WSDISPLAYIO_GINFO ioctl, but
I'll prepare one reserved member like "uint32_t flags" for now.

How about this one? (maybe some member names should be rethinked though)
---
struct wsdisplay_fbinfo {
	/* compat members with old structure */
	u_int height;	/* height of visible area in pixels (lines) */
	u_int width;	/* width of visible area in pixels */
	u_int depth;	/* bits per pixel */
	u_int cmsize;	/* color map size (entries) */

	/* extended members from here */
	u_int vramsize;	/* total VRAM size in bytes */
	u_int stride;	/* horizontal stride in bytes */
	u_int voff;	/* offset from the top of VRAM top to start of
			   visible area in bytes */
	u_int hoff;	/* offset from each stride to start of
			   visible area in horizontal pixels (or bytes) */
	off_t mmapoff;	/* offset to be passed to mmap() to map VRAM region */

	/* depth info for 2/4/8 bits per pexel displays */
	u_int bitnum;	/* number of bits actually significant in bpp */
	u_int bitpos;	/* which bit starts at */

	/* depth info for 15/16/24/32 bits per pexel displays */
	/* XXX should be u_char like struct raspos_info? */
	u_int rbitnum;	/* number of bits for red */
	u_int gbitnum;	/* number of bits for green */
	u_int bbitnum;	/* number of bits for blue */
	u_int rbitpos;	/* which bit red starts at */
	u_int gbitpos;	/* which bit green starts at */
	u_int bbitpos;	/* which bit blue starts at */

	uint32_t flags;	/* reserved; will be used to pass fb specific info */
};
---

We also have to decide which units (pixels or bytes) we should use
for hoff, but if we don't have FB drivers which require non-zero hoff,
we can change it later...
---
Izumi Tsutsui