open-src/lib/libdga/sun-src/dga.h
author X gate hg captive account <xhg@xserver.us.oracle.com>
Wed, 19 Aug 2015 13:48:41 -0700
changeset 1484 bc8922b8e1d2
parent 943 294f64612d23
permissions -rw-r--r--
Added tag s11u3_30 for changeset 221e9d9cc9cb

/* Copyright (c) 1993, 1997, Oracle and/or its affiliates. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */


/*
 * dga.h - Sun Direct Graphics Access interface
 */

#ifndef _DGA_H
#define _DGA_H

#include <sys/types.h>
#ifndef	SERVER_DGA
#include "X11/Xlib.h"
#endif /* SERVER_DGA */
#include "dga_externaldefs.h"

#if defined (_POSIX_C_SOURCE)
#define u_int uint_t
#endif

#ifdef SERVER_DGA
#define Display void
#define Bool    int
#endif  /* SERVER_DGA */

#define	DGA_X_EOL		(-32767)
#define	DGA_Y_EOL		(-32768)

#define DGA_DB_DEV_INFO_SZ 	132

#define DGA_RTN_NOT_CACHED      0
#define DGA_RTN_SAME_DEV        1
#define DGA_RTN_NEW_DEV         2

#define DGA_CLIENT_VERSION	1

typedef u_int Dga_token;

typedef struct dga_curs_memimage {
	u_int		width;
	u_int		height;
	u_int		depth;
	u_int		linebytes;
	void		*memptr;
} Dga_curs_memimage;

typedef struct dga_dbinfo {
	short		number_buffers;
	short		read_buffer;
	short		write_buffer;
	short		display_buffer;
	u_int		reserved_1;	/* for future use */
	u_int		reserved_2;	/* for future use */
	u_int		reserved_3;	/* for the future  */
	u_int		reserved_4;	/* for the future */
	u_int		reserved_5;	/* for the future */
	u_int		wid;		/* db window id. */
	u_int		unique;
	u_char		device_info[DGA_DB_DEV_INFO_SZ];
} Dga_dbinfo;

#ifndef DGA_NUM_BUFFER_TYPES
/* The following buffer types also defined(duplicated) in 
 * dga_winshared.h file.  * I can't include dga.h in hw/solaris/dga  
 * due to some declarations inconsistency.
 * Whenever someone changes/addes/deleted to this enumerated values, 
 * please also update dga_winshared.h which is located
 * in xc/include/dga/
 */

/* Known types of ancillary buffers */
typedef enum {
   DGA_DEPTH_BUFFER =0,
   DGA_STENCIL_BUFFER,
   DGA_ACCUM_BUFFER,
   DGA_ALPHA_BUFFER,
   DGA_BACK_BUFFER,
   DGA_AUX_BUFFER0,
   DGA_AUX_BUFFER1,
   DGA_AUX_BUFFER2,
   DGA_AUX_BUFFER3
} Dga_buffer_type;
 
#define DGA_NUM_BUFFER_TYPES (DGA_AUX_BUFFER3+1)
#endif

typedef void *Dga_buffer;

typedef struct dga_widinfo {
	short		number_wids;	/* number of contiguous wids alloc */
	short		start_wid;	/* starting wid */
	short		wid;		/* current wid */
	short		reserved_1;	/* for the future */
} Dga_widinfo;

typedef void* Dga_window;
typedef void* Dga_cmap;

/* May be either a window, the main window of a multibuffer set, or a pixmap */
typedef void* Dga_drawable;

typedef struct dga_opaque {
    int     loc_1;
    u_int   loc_2;
    u_int   *loc_3;
    int	    loc_4;
    u_int   *loc_5;
    u_int   *loc_6;
    int	    (*loc_7)(Dga_window);
    int	    (*loc_8)(Dga_window);
    int	    (*loc_9)(Dga_window);
    int	    loc_10;
} *Dga_opaque;

typedef struct dga_opaque_draw {
    int     loc_1;
    u_int   loc_2;
    u_int   *loc_3;
    int	    loc_4;
    u_int   *loc_5;
    u_int   *loc_6;
    int	    (*loc_7)(Dga_drawable);
    int	    (*loc_8)(Dga_drawable);
    int	    (*loc_9)(Dga_drawable);
    int	    loc_10;
    u_int   loc_11[DGA_MAX_GRABBABLE_BUFS + 1];
    u_int   *loc_12;
} *Dga_opaque_draw;

/* Types for drawable notification functions */
typedef void (*DgaSiteNotifyFunc)(Dga_drawable, short, void *, int);
typedef void (*DgaMbNotifyFunc)(Dga_drawable, void *, int);
typedef void (*DgaRendBufNotifyFunc)(Dga_drawable, short, void *);
typedef void (*DgaCursTakeDownFunc)(void *, Dga_drawable, int, int, Dga_curs_memimage *);
typedef void (*DgaOvlStateNotifyFunc)(Dga_drawable, void *, int);

#define DGA_LOCK(x)	(*(((Dga_opaque)(x))->loc_5)) = 1
#define DGA_UNLOCK(x)	(*(((Dga_opaque)(x))->loc_6)) = 0

#define	DGA_WIN_LOCK(win)						\
    do {								\
    if ((((Dga_opaque)(win))->loc_4)++ == 0) {				\
	DGA_LOCK(win);							\
	((Dga_opaque)win)->loc_10 = (((((Dga_opaque)(win))->loc_2) ==	\
	    (*(((Dga_opaque)(win))->loc_3))) ?				\
	    0 : (*(((Dga_opaque)(win))->loc_9))(win));			\
	}								\
    } while (0)

#define DGA_WIN_UNLOCK(win)			\
    do {					\
    if (--(((Dga_opaque)(win))->loc_4) == 0) { 	\
	DGA_UNLOCK(win);			\
	if (((Dga_opaque)(win))->loc_8)		\
		(*(((Dga_opaque)(win))->loc_8))(win);		\
	}					\
    } while (0)

#define	DGA_WIN_MODIF(win)	(((Dga_opaque)win)->loc_10)


/* this is so we can we can enter the opaque interface */
#define DGA_CASTDRAW(dgadraw) ((Dga_opaque_draw)(dgadraw))

typedef int (*DgaDrawUpdateFunc)(Dga_drawable, short);
#define DGA_CASTFUNC(func)    ((DgaDrawUpdateFunc)(func))


#define	DGA_DRAW_LOCK(dgadraw, bufIndex)			              \
{						                              \
    if ((DGA_CASTDRAW(dgadraw)->loc_4)++ == 0) {			      \
    DGA_LOCK(dgadraw);					        	      \
    DGA_CASTDRAW(dgadraw)->loc_10 =                                           \
	      (								      \
	        ((DGA_CASTDRAW(dgadraw)->loc_11[bufIndex + 1]) ==             \
					   (*(DGA_CASTDRAW(dgadraw)->loc_3))) \
		    ? 0							      \
	            : (*DGA_CASTFUNC(DGA_CASTDRAW(dgadraw)->loc_9))           \
			 		          ((dgadraw), (bufIndex))     \
	      );							      \
    }							              \
}

#define DGA_DRAW_UNLOCK(dgadraw)					      \
{									      \
    if (--(DGA_CASTDRAW(dgadraw)->loc_4) == 0) { 			      \
        DGA_UNLOCK(dgadraw);						      \
        if (DGA_CASTDRAW(dgadraw)->loc_8)				      \
	    (*(DGA_CASTDRAW(dgadraw)->loc_8))(dgadraw);			      \
    }									      \
}

#define DGA_DRAW_LOCK_SRC_AND_DST(dgasrc, bufIndexSrc, dgadst, bufIndexDst)  \
{									     \
    /* Always lock pixmap first. */					     \
    if ((DGA_CASTDRAW(dgasrc)->loc_1 == DGA_DRAW_WINDOW) &&	             \
        (DGA_CASTDRAW(dgadst)->loc_1 == DGA_DRAW_PIXMAP)) {	             \
        DGA_DRAW_LOCK(dgadst, bufIndexDst);				     \
        DGA_DRAW_LOCK(dgasrc, bufIndexSrc);				     \
    } else if ((DGA_CASTDRAW(dgasrc)->loc_1 == DGA_DRAW_PIXMAP) &&           \
               (DGA_CASTDRAW(dgadst)->loc_1 == DGA_DRAW_WINDOW)) {           \
        DGA_DRAW_LOCK(dgasrc, bufIndexSrc);				     \
        DGA_DRAW_LOCK(dgadst, bufIndexDst);				     \
    } else if ((DGA_CASTDRAW(dgasrc)->loc_1 == DGA_DRAW_PIXMAP) &&           \
               (DGA_CASTDRAW(dgadst)->loc_1 == DGA_DRAW_PIXMAP)) {           \
        /* We lock the src pixmap and since all pixmaps share the same       \
         * lock page, the dst pixmap is locked as well. */		     \
 									     \
        DGA_DRAW_LOCK(dgasrc, bufIndexSrc);				     \
                							     \
        /* Now update dest pixmap's modif */				     \
 									     \
        DGA_CASTDRAW(dgadst)->loc_10 =					     \
              (((DGA_CASTDRAW(dgadst)->loc_11[0]) ==   	                     \
				 (*(DGA_CASTDRAW(dgadst)->loc_3)))           \
                 ? 0 : (*DGA_CASTFUNC(DGA_CASTDRAW(dgadst)->loc_9))          \
					       ((dgadst), (bufIndexDst)));   \
    }									     \
}
 
#define DGA_DRAW_UNLOCK_SRC_AND_DST(dgasrc, dgadst)			     \
{									     \
    /* Always unlock window first */					     \
    if ((DGA_CASTDRAW(dgasrc)->loc_1 == DGA_DRAW_WINDOW) &&	             \
        (DGA_CASTDRAW(dgadst)->loc_1 == DGA_DRAW_PIXMAP)) {	             \
        DGA_DRAW_UNLOCK(dgasrc);					     \
        DGA_DRAW_UNLOCK(dgadst);					     \
    } else if ((DGA_CASTDRAW(dgasrc)->loc_1 == DGA_DRAW_PIXMAP) &&           \
               (DGA_CASTDRAW(dgadst)->loc_1 == DGA_DRAW_WINDOW)) {           \
        DGA_DRAW_UNLOCK(dgadst);					     \
        DGA_DRAW_UNLOCK(dgasrc);					     \
    } else if ((DGA_CASTDRAW(dgasrc)->loc_1 == DGA_DRAW_PIXMAP) &&           \
               (DGA_CASTDRAW(dgadst)->loc_1 == DGA_DRAW_PIXMAP)) {           \
        /* Unlock the src pixmap */					     \
        DGA_DRAW_UNLOCK(dgasrc);					     \
    }									     \
}	

#define	DGA_DRAW_MODIF(dgadraw)	(((Dga_opaque_draw)(dgadraw))->loc_10)

#define DGA_INIT()	dga_init_version(DGA_CLIENT_VERSION)


#ifdef	__cplusplus
extern "C" {
#endif

 /* General DGA functions */
extern	void		dga_init_version(int);
/*
 *  X protocol extension functions
 */
extern	Dga_token	XDgaGrabWindow(Display*, Window);
extern	int		XDgaUnGrabWindow(Display*, Window);
extern	Dga_token	XDgaGrabColormap(Display*, Colormap);
extern	int		XDgaUnGrabColormap(Display*, Colormap);
extern	int		XDgaGrabWids(Display*, Window, int);
extern	int		XDgaGrabFCS(Display*, Window, int);
extern	int		XDgaGrabZbuf(Display*, Window, int);
extern	int		XDgaGrabStereo(Display*, Window, int);
/*
 *  Window Compatibility Interface - Window grabber functions
 */

extern	Dga_window	dga_win_grab(int, Dga_token);
extern	void		dga_win_ungrab(Dga_window, int);
extern	char		*dga_win_fbname(Dga_window);
extern	int		dga_win_devfd(Dga_window);
extern	int		dga_win_clipchg(Dga_window);
extern	int		dga_win_curschg(Dga_window);
extern	int		dga_win_rtnchg(Dga_window);
extern	short		*dga_win_clipinfo(Dga_window);
extern	void		dga_win_bbox(Dga_window, int *, int *, int *, int *);
extern	int		dga_win_singlerect(Dga_window);
extern	int		dga_win_empty(Dga_window);
extern	int		dga_win_obscured(Dga_window);
extern	int		dga_win_cursactive(Dga_window);
extern	void		dga_win_cursupdate(Dga_window, void(*)(void *,
			    Dga_window, int, int, Dga_curs_memimage*), void *);
extern	Dga_dbinfo	*dga_win_dbinfop(Dga_window);
extern	Dga_widinfo	*dga_win_widinfop(Dga_window);
extern  void		*dga_win_bboxinfop(Dga_window);
extern u_char		dga_win_depth(Dga_window);
extern u_short		dga_win_borderwidth(Dga_window);
extern void		dga_win_set_client_infop(Dga_window, void *);
extern void		*dga_win_get_client_infop(Dga_window);

/*
 *  Colormap grabber functions
 */

extern	Dga_cmap	dga_cm_grab(int, Dga_token);
extern	void		dga_cm_ungrab(Dga_cmap, int);
extern	void		dga_cm_read(Dga_cmap, int, int, u_char *, u_char *,
					u_char *);
extern	void		dga_cm_write(Dga_cmap, int, int, u_char *, u_char*,
					u_char *, void (*)(Dga_window, int,
					int, u_char *, u_char *, u_char *));
extern int		dga_cm_devfd(Dga_cmap);
extern void		dga_cm_set_client_infop(Dga_cmap, void *);
extern void		*dga_cm_get_client_infop(Dga_cmap);
extern void		*dga_cm_devinfop(Dga_cmap);

/*
 *  Window Compatibility Interface - double buffering functions
 */

extern	int		dga_db_grab(Dga_window, int, int (*)(Dga_window),
			     u_int * );
extern	int		dga_db_ungrab(Dga_window);
extern	void		dga_db_write(Dga_window, int,
			    int(*)(void*, Dga_window, int), void *);
extern	void		dga_db_read(Dga_window,int,
			    int(*)(void*, Dga_window, int), void *);
extern	void		dga_db_display(Dga_window, int,
			    int(*)(void*, Dga_window, int), void *);
extern	void		dga_db_interval(Dga_window, int);
extern	void		dga_db_interval_wait(Dga_window);
extern	int		dga_db_interval_check(Dga_window);
extern	int		dga_db_write_inquire(Dga_window);
extern	int		dga_db_read_inquire(Dga_window);
extern	int		dga_db_display_inquire(Dga_window);
extern	int		dga_db_display_done(Dga_window, int, 
			    int (*)(Dga_window));
/*
 *  Window Compatibility Interface - Retained window grabber functions
 */

extern	int		dga_rtn_grab(Dga_window);
extern	int		dga_rtn_ungrab(Dga_window);
extern	int		dga_rtn_active(Dga_window);
extern	int		dga_rtn_cached(Dga_window);
extern	void		*dga_rtn_devinfo(Dga_window);
extern	void		dga_rtn_devtype(Dga_window, u_char *, char **);
extern	void		dga_rtn_dimensions(Dga_window, short *, short *,
			    u_int*);
extern	void		*dga_rtn_pixels(Dga_window);

/*
 *  Drawable grabber functions
 */

extern Dga_drawable	XDgaGrabDrawable(Display *dpy, Drawable drawid);
extern int 		XDgaUnGrabDrawable(Dga_drawable dgadraw);
extern Display *	dga_draw_display (Dga_drawable dgadraw);
extern Drawable 	dga_draw_id(Dga_drawable);
extern int		dga_draw_type (Dga_drawable dgadraw);
extern char *		dga_draw_devname (Dga_drawable dgadraw);
extern int		dga_draw_devfd (Dga_drawable dgadraw);
extern int		dga_draw_depth (Dga_drawable dgadraw);
extern void		dga_draw_set_client_infop (Dga_drawable dgadraw, void *client_info_ptr);
extern void *		dga_draw_get_client_infop (Dga_drawable dgadraw);
extern void *		dga_draw_devinfo (Dga_drawable dgadraw);
extern int		dga_draw_sitechg (Dga_drawable dgadraw, int *reason);
extern void		dga_draw_sitesetnotify (Dga_drawable dgadraw, 
						    DgaSiteNotifyFunc site_notify_func,
						    void *client_data);
extern void		dga_draw_sitegetnotify (Dga_drawable dgadraw, 
						    DgaSiteNotifyFunc *site_notify_func,
						    void **client_data);
extern int		dga_draw_site (Dga_drawable dgadraw);
extern void *		dga_draw_address (Dga_drawable dgadraw);
extern int		dga_draw_linebytes (Dga_drawable dgadraw);
extern int		dga_draw_clipchg (Dga_drawable dgadraw);
extern void		dga_draw_bbox(Dga_drawable dgadraw, int *xp, int *yp, 
					  int *widthp, int *heightp);
extern int		dga_draw_visibility (Dga_drawable dgadraw);
extern int		dga_draw_empty (Dga_drawable dgadraw);
extern short *		dga_draw_clipinfo (Dga_drawable dgadraw);
extern int		dga_draw_singlerect (Dga_drawable dgadraw);
extern int		dga_draw_obscured (Dga_drawable dgadraw);
extern u_short		dga_draw_borderwidth (Dga_drawable dgadraw);
extern void		dga_draw_curshandle (Dga_drawable dgadraw, 
					     DgaCursTakeDownFunc take_down_func,
					     void *client_data);
extern int		dga_draw_rtngrab (Dga_drawable dgadraw);
extern int		dga_draw_rtnungrab (Dga_drawable dgadraw);
extern int		dga_draw_rtnchg (Dga_drawable dgadraw);
extern int		dga_draw_rtnactive (Dga_drawable dgadraw);
extern int		dga_draw_rtncached (Dga_drawable dgadraw);
extern void *		dga_draw_rtndevinfop (Dga_drawable dgadraw);
extern void		dga_draw_rtndevtype (Dga_drawable dgadraw, u_char *type, 
					     char **name);
extern void		dga_draw_rtndimensions (Dga_drawable dgadraw, short *width, 
						short *height, u_int *linebytes);
extern void *		dga_draw_rtnpixels (Dga_drawable dgadraw);
extern int		dga_draw_mbchg (Dga_drawable dgadraw, int *reason);
extern void		dga_draw_mbsetnotify (Dga_drawable dgadraw, DgaMbNotifyFunc mb_notify_func,
						  void *client_data);
extern void		dga_draw_mbgetnotify (Dga_drawable dgadraw, DgaMbNotifyFunc *mb_notify_func,
						  void **client_data);
extern int		dga_draw_mbaccessmode (Dga_drawable dgadraw);
extern int		dga_draw_mbsitetypeconst (Dga_drawable dgadraw);
extern void		dga_draw_mbsetrendbufnotify (Dga_drawable dgadraw, 
							 DgaRendBufNotifyFunc rb_notify_func,
							 void *client_data);
extern void		dga_draw_mbgetrendbufnotify (Dga_drawable dgadraw, 
							 DgaRendBufNotifyFunc *rb_notify_func,
							 void **client_data);
extern int		dga_draw_ovlstatechg (Dga_drawable dgadraw);
extern int		dga_draw_ovlstate (Dga_drawable dgadraw);
extern void		dga_draw_ovlstatesetnotify (Dga_drawable dgadraw, 
						    DgaOvlStateNotifyFunc ovlstate_notify_func,
						    void *client_data);
extern void		dga_draw_ovlstategetnotify (Dga_drawable dgadraw, 
						    DgaOvlStateNotifyFunc *ovlstate_notify_func,
						    void **client_data);


/*
 *  Drawable grabber functions - Buffer Control Compatibility
 */

extern int		dga_draw_db_grab (Dga_drawable dgadraw, int nbuffers, 
			  int (*vrtfunc)(Dga_drawable), u_int *vrtcounterp);
extern int		dga_draw_db_ungrab (Dga_drawable dgadraw);
extern void		dga_draw_db_write (Dga_drawable dgadraw, int buffer,
			   int (*writefunc)(void*, Dga_drawable, int), 
			   void *data);
extern void		dga_draw_db_read (Dga_drawable dgadraw, int buffer,
			  int (*readfunc)(void*, Dga_drawable, int), 
			  void *data);
extern void		dga_draw_db_display (Dga_drawable dgadraw, int buffer,
			  int (*visfunc)(void*, Dga_drawable, int), 
			  void *data);
extern void		dga_draw_db_interval (Dga_drawable dgadraw, int interval);
extern void		dga_draw_db_interval_wait (Dga_drawable dgadraw);
extern int		dga_draw_db_interval_check (Dga_drawable dgadraw);
extern int		dga_draw_db_write_inquire (Dga_drawable dgadraw);
extern int		dga_draw_db_read_inquire (Dga_drawable dgadraw);
extern int		dga_draw_db_display_inquire (Dga_drawable dgadraw);
extern int		dga_draw_db_display_done (Dga_drawable dgadraw, int flag, 
			  int (*display_done_func)(Dga_drawable));
extern Dga_dbinfo 	*dga_draw_db_dbinfop (Dga_drawable dgadraw);
extern int		dga_draw_devinfochg(Dga_drawable dgadraw);

/*
 *  Misc. grabber functions
 */

extern	int		XDgaDrawGrabWids(Display*, Drawable, int);
extern	Dga_widinfo	*dga_draw_widinfop(Dga_drawable);
extern	int		XDgaDrawGrabFCS(Display*, Drawable, int);
extern	int		XDgaDrawGrabZbuf(Display*, Drawable, int);
extern	int		XDgaDrawGrabStereo(Display*, Drawable, int);

/*
 *  Window Compatibility Interface - Ancillary buffers functions
 *  New feature for 2.6
 */

extern Dga_buffer      dga_draw_grab_buffer(Dga_drawable, 
                                            Dga_buffer_type, int);
extern int             dga_draw_ungrab_buffer(Dga_drawable, Dga_buffer_type);
extern int             dga_draw_get_buffers(Dga_drawable, Dga_buffer **);
extern Dga_buffer_type dga_buffer_type(Dga_buffer);
extern int             dga_buffer_site(Dga_buffer);
extern int             dga_draw_bufferchg(Dga_drawable);
extern int             dga_buffer_sitechg(Dga_buffer, int *);
extern void*           dga_buffer_address(Dga_buffer);
extern int             dga_buffer_linebytes(Dga_buffer);
extern int             dga_buffer_bitsperpixel(Dga_buffer);

#ifdef	__cplusplus
}
#endif

#endif /* _DGA_H */