XFree86 X server ``New Design'' (DRAFT) : DGA Extension
Previous: DPMS Extension
Next: The XFree86 X Video Extension (Xv) Device Dependent Layer

15. DGA Extension

Drivers can support the XFree86 Direct Graphics Architecture (DGA) by filling out a structure of function pointers and a list of modes and passing them to DGAInit.

Bool DGAInit(ScreenPtr pScreen, DGAFunctionPtr funcs,
          DGAModePtr modes, int num)

/** The DGAModeRec **/

typedef struct {
  int num;             
  DisplayModePtr mode;
  int flags;          
  int imageWidth;
  int imageHeight;
  int pixmapWidth;
  int pixmapHeight;   
  int bytesPerScanline; 
  int byteOrder;  
  int depth;           
  int bitsPerPixel;
  unsigned long red_mask;
  unsigned long green_mask;
  unsigned long blue_mask;
  int viewportWidth;
  int viewportHeight;
  int xViewportStep;   
  int yViewportStep;
  int maxViewportX; 
  int maxViewportY;
  int viewportFlags;   
  int offset;     
  unsigned char *address;      
  int reserved1;
  int reserved2;
} DGAModeRec, *DGAModePtr;

num

Can be ignored. The DGA DDX will assign these numbers.

mode

A pointer to the DisplayModeRec for this mode.

flags

The following flags are defined and may be OR'd together:

DGA_CONCURRENT_ACCESS

Indicates that the driver supports concurrent graphics accelerator and linear framebuffer access.

DGA_FILL_RECT
DGA_BLIT_RECT
DGA_BLIT_RECT_TRANS

Indicates that the driver supports the FillRect, BlitRect or BlitTransRect functions in this mode.

DGA_PIXMAP_AVAILABLE

Indicates that Xlib may be used on the framebuffer. This flag will usually be set unless the driver wishes to prohibit this for some reason.

DGA_INTERLACED
DGA_DOUBLESCAN

Indicates that these are interlaced or double scan modes.

imageWidth
imageHeight

These are the dimensions of the linear framebuffer accessible by the client.

pixmapWidth
pixmapHeight

These are the dimensions of the area of the framebuffer accessible by the graphics accelerator.

bytesPerScanline

Pitch of the framebuffer in bytes.

byteOrder

Usually the same as pScrn->imageByteOrder.

depth

The depth of the framebuffer in this mode.

bitsPerPixel

The number of bits per pixel in this mode.

red_mask
green_mask
blue_mask

The RGB masks for this mode, if applicable.

viewportWidth
viewportHeight

Dimensions of the visible part of the framebuffer. Usually mode->HDisplay and mode->VDisplay.

xViewportStep
yViewportStep

The granularity of x and y viewport positions that the driver supports in this mode.

maxViewportX
maxViewportY

The maximum viewport position supported by the driver in this mode.

viewportFlags

The following may be OR'd together:

DGA_FLIP_IMMEDIATE

The driver supports immediate viewport changes.

DGA_FLIP_RETRACE

The driver supports viewport changes at retrace.

offset

The offset into the linear framebuffer that corresponds to pixel (0,0) for this mode.

address

The virtual address of the framebuffer as mapped by the driver. This is needed when DGA_PIXMAP_AVAILABLE is set.

/** The DGAFunctionRec **/

typedef struct {
  Bool (*OpenFramebuffer)(
       ScrnInfoPtr pScrn, 
       char **name,
       unsigned char **mem, 
       int *size,
       int *offset,
       int *extra
  );
  void (*CloseFramebuffer)(ScrnInfoPtr pScrn);
  Bool (*SetMode)(ScrnInfoPtr pScrn, DGAModePtr pMode);
  void (*SetViewport)(ScrnInfoPtr pScrn, int x, int y, int flags);
  int  (*GetViewport)(ScrnInfoPtr pScrn);
  void (*Sync)(ScrnInfoPtr);
  void (*FillRect)(
       ScrnInfoPtr pScrn, 
       int x, int y, int w, int h, 
       unsigned long color
  );
  void (*BlitRect)(
       ScrnInfoPtr pScrn, 
       int srcx, int srcy, 
       int w, int h, 
       int dstx, int dsty
  );
  void (*BlitTransRect)(
       ScrnInfoPtr pScrn, 
       int srcx, int srcy, 
       int w, int h, 
       int dstx, int dsty,
       unsigned long color
  );
} DGAFunctionRec, *DGAFunctionPtr;

Bool OpenFramebuffer (pScrn, name, mem, size, offset, extra)

OpenFramebuffer() should pass the client everything it needs to know to be able to open the framebuffer. These parameters are OS specific and their meanings are to be interpreted by an OS specific client library.

name

The name of the device to open or NULL if there is no special device to open. A NULL name tells the client that it should open whatever device one would usually open to access physical memory.

mem

The physical address of the start of the framebuffer.

size

The size of the framebuffer in bytes.

offset

Any offset into the device, if applicable.

flags

Any additional information that the client may need. Currently, only the DGA_NEED_ROOT flag is defined.

void CloseFramebuffer (pScrn)

CloseFramebuffer() merely informs the driver (if it even cares) that client no longer needs to access the framebuffer directly. This function is optional.

Bool SetMode (pScrn, pMode)

SetMode() tells the driver to initialize the mode passed to it. If pMode is NULL, then the driver should restore the original pre-DGA mode.

void SetViewport (pScrn, x, y, flags)

SetViewport() tells the driver to make the upper left-hand corner of the visible screen correspond to coordinate (x,y) on the framebuffer. Flags currently defined are:

DGA_FLIP_IMMEDIATE

The viewport change should occur immediately.

DGA_FLIP_RETRACE

The viewport change should occur at the vertical retrace, but this function should return sooner if possible.

The (x,y) locations will be passed as the client specified them, however, the driver is expected to round these locations down to the next supported location as specified by the xViewportStep and yViewportStep for the current mode.

int GetViewport (pScrn)

GetViewport() gets the current page flip status. Set bits in the returned int correspond to viewport change requests still pending. For instance, set bit zero if the last SetViewport request is still pending, bit one if the one before that is still pending, etc.

void Sync (pScrn)

This function should ensure that any graphics accelerator operations have finished. This function should not return until the graphics accelerator is idle.

void FillRect (pScrn, x, y, w, h, color)

This optional function should fill a rectangle w × h located at (x,y) in the given color.

void BlitRect (pScrn, srcx, srcy, w, h, dstx, dsty)

This optional function should copy an area w × h located at (srcx,srcy) to location (dstx,dsty). This function will need to handle copy directions as appropriate.

void BlitTransRect (pScrn, srcx, srcy, w, h, dstx, dsty, color)

This optional function is the same as BlitRect except that pixels in the source corresponding to the color key color should be skipped.


XFree86 X server ``New Design'' (DRAFT) : DGA Extension
Previous: DPMS Extension
Next: The XFree86 X Video Extension (Xv) Device Dependent Layer