library for cursors and mode setting
Jon Smirl <jonsmirl-/[email protected]> Mon, 3 May 2004 09:31:51 -0700 (PDT)
| Newsgroups | gmane.comp.freedesktop.xserver,gmane.comp.video.mesa3d.devel |
|---|---|
| Message-ID | <[email protected]> |
At xdevconf we briefly discussed doing a library for cursors and mode setting. First, what do we want to call it? Second, I'll attach a preliminary design for this API that Brian Paul did. What does it need to be complete? For example it is missing color management. X must have a parallel API, what is it, or is it scattered in hundreds of places? Designing this API should help in determining what is needed in terms of device driver support. ===== Jon Smirl jonsmirl-/[email protected] __________________________________ Do you Yahoo!? Win a $20,000 Career Makeover at Yahoo! HotJobs http://hotjobs.sweepstakes.yahoo.com/careermakeover _______________________________________________ xserver mailing list [email protected] http://freedesktop.org/mailman/listinfo/xserver
igl.h
(text/x-chdr, 12.6 KB)
/*
* Platform independent OpenGL interface, with functions for:
* - describing supported pixel formats
* - allocating/managing image buffers
* - allocating/managing visuals and drawing surfaces
* - creating/managing rendering contexts
* - setting dislay modes
* - setting the cursor image/position
* - monitor queries
* - etc...
*/
#ifndef IGL_H
#define IGL_H
#define IGL_MAJOR_VERSION 0
#define IGL_MINOR_VERSION 0
/*
* IGL datatypes
*/
typedef char IGLchar;
typedef char IGLbyte;
typedef unsigned char IGLubyte;
typedef short IGLshort;
typedef unsigned short IGLushort;
typedef int IGLint;
typedef unsigned int IGLuint;
typedef float IGLfloat;
typedef unsigned char IGLboolean;
typedef unsigned int IGLenum;
typedef unsigned int IGLbitfield;
/*
* IGL constants
*/
/* boolean */
#define IGL_FALSE 0x0
#define IGL_TRUE 0x1
/* pixel format channels */
#define IGL_RED 0x1100
#define IGL_GREEN 0x1101
#define IGL_BLUE 0x1102
#define IGL_ALPHA 0x1103
#define IGL_LUMINANCE 0x1104
#define IGL_CR_CB 0x1105
#define IGL_CB_CR 0x1106
#define IGL_COLOR_INDEX 0x1107
#define IGL_DEPTH 0x1108
#define IGL_STENCIL 0x1109
#define IGL_AUX 0x1110
/* pixel format datatypes */
#define IGL_UNSIGNED_INT 0x1000
#define IGL_INT 0x1001
#define IGL_FLOAT 0x1002
/* pixel format targets */
#define IGL_FRAMEBUFFER_BIT 0x1
#define IGL_TEXTURE_BIT 0x2
#define IGL_PBUFFER_BIT 0x4
#define IGL_POINTER_BIT 0x8
/* display mode options */
#define IGL_INTERLACED_BIT 0x8
/* GetString targets */
#define IGL_VERSION 0x1300
#define IGL_VENDOR 0x1301
#define IGL_EXTENSIONS 0x1302
#define IGL_RENDERER 0x1303
#define IGL_LAST_ERROR 0x1304
/* memory map modes */
#define IGL_READ_ONLY 0x1400
#define IGL_WRITE_ONLY 0x1401
#define IGL_READ_WRITE 0x1402
/* limits */
#define IGL_MAX_PIXEL_FORMAT_CHANNELS 4
#define IGL_MAX_PIXEL_FORMATS_PER_VISUAL 16
/**
* IGLRect: for specifying clip rects.
*/
typedef struct {
IGLint x0, y0; /* inclusive */
IGLint x1, y1; /* exclusive */
} IGLRect;
/**
* IGLPixelFormat: describes arrangement of pixel bits for an image buffer.
*/
typedef struct {
IGLenum ChannelType; /* IGL_INT, IGL_UNSIGNED_INT, or IGL_FLOAT */
IGLuint BitsPerPixel;
IGLuint NumChannels;
IGLenum ChannelName[IGL_MAX_PIXEL_FORMAT_CHANNELS];
IGLuint ChannelSize[IGL_MAX_PIXEL_FORMAT_CHANNELS];
IGLuint ChannelShift[IGL_MAX_PIXEL_FORMAT_CHANNELS];
IGLbitfield Targets; /* or of IGL_FRAMEBUFFER/TEXTURE/PBUFFER_BIT */
} IGLPixelFormat;
/**
* IGLVisual: describes a set of pixelformats for a drawing surface.
* A typical visual will describe pixel formats for one or two color buffers,
* a depth buffer, a stencil buffer, etc.
*/
typedef struct {
IGLuint NumPixelFormats;
IGLPixelFormat Formats[IGL_MAX_PIXEL_FORMATS_PER_VISUAL];
} IGLVisual;
/**
* IGLBuffer: an image buffer (pixels store color or Z or stencil, etc).
* May be 1D, 2D or 3D (for textures).
*/
typedef struct {
IGLPixelFormat Format;
IGLuint Width, Height, Depth;
IGLbitfield Flags;
IGLuint RowStride, ImageStride;
void *Address; /* address in VRAM */
void *MappedAddress; /* address in user space if mapped */
} IGLBuffer;
/**
* IGLCanvas: a set of IGBuffers which composes a drawing surface
* (one or more color buffers, depth buffers, stencil buffers, etc).
*/
typedef struct {
IGLVisual Visual;
IGLBuffer Buffer[IGL_MAX_PIXEL_FORMATS_PER_VISUAL];
IGLuint NumClipRects;
IGLRect *ClipRects;
} IGLCanvas;
/**
* IGLContext: a GL rendering context
*/
typedef struct {
IGLVisual Visual;
IGLBuffer *CurrentBuffer;
} IGLContext;
/**********************************************************************
* Pixel format functions.
*/
/**
* Query if the given pixel format is supported by all the specified targets.
* <targets> is a bitmask of the IGL_FRAMEBUFFER_BIT, IGL_TEXTURE_BIT, and
* IGL_PBUFFER_BIT bits.
* \return IGL_TRUE if supported, IGL_FALSE otherwise.
*/
extern IGLboolean
iglIsSupportedPixelFormat(IGLbitfield targets,
const IGLPixelFormat *pixelFormat);
/**
* Return array of pixel formats supported by all the specified targets.
* \param targets is a bitmask of the IGL_FRAMEBUFFER_BIT, IGL_TEXTURE_BIT,
* and IGL_PBUFFER_BIT bits.
* \param maxResults indicates the maximum number of results to put into the
* <pixelFormats> array.
* \return number of pixel formats returned.
*/
extern IGLuint
iglGetSupportedPixelFormats(IGLbitfield targets,
IGLuint maxResults, IGLPixelFormat *pixelFormats);
/**********************************************************************
* Screen functions.
*/
/**
* Return the number of screens supported by the device.
* \return number of screens
*/
extern IGLuint
iglGetNumScreens(void);
/**
* Test if the given display mode is supported.
* \param pixelFormat pixel format of display mode.
* \param width width (in pixels) of display mode.
* \param height height (in pixels) of display mode.
* \param refreshRate refresh rate (in Hz) of display mode.
* \param flags various options such as IGL_INTERLACED_BIT.
* \return IGL_TRUE if suported, IGL_FALSE otherwise
*/
extern IGLboolean
iglIsSupportedDisplayMode(IGLuint screen, const IGLPixelFormat *pixelFormat,
IGLuint width, IGLuint height, IGLuint refreshRate,
IGLbitfield flags);
/**
* Set the current display mode (resolution, refresh, etc) for the given
* screen.
* \param pixelFormat pixel format of display mode.
* \param width width (in pixels) of display mode.
* \param height height (in pixels) of display mode.
* \param refreshRate refresh rate (in Hz) of display mode.
* \param flags various options such as IGL_INTERLACED_BIT.
* \return IGL_TRUE if successful, IGL_FALSE otherwise
*/
extern IGLboolean
iglSetDisplayMode(IGLuint screen, const IGLPixelFormat *pixelFormat,
IGLuint width, IGLuint height, IGLuint refreshRate,
IGLbitfield flags);
/**
* Enable (scan-out) the given screen.
*/
extern void
iglEnableScreen(IGLuint screen);
/**
* Disable (turn off) the given screen.
*/
extern void
iglDisableScreen(IGLuint screen);
/**
* Specify the region of VRAM to display on the monitor.
*/
extern IGLboolean
iglSetScreenPointer(IGLuint screen, IGLuint start, IGLuint stride);
/**
* Wait for start of vertical retrace on given screen.
* Return immediately if the screen is disabled.
*/
extern void
iglWaitRetrace(IGLuint screen);
/**********************************************************************
* Image buffer functions.
*/
/**
* Allocate an image buffer (might be color, depth, etc, 1D, 2D or 3D)
* Initial buffer contents are undefined.
* XXX will probably need more, similar functions for allocating
* mipmapped textures.
* \return new IGLBuffer pointer or NULL if we fail.
*/
extern IGLBuffer *
iglAllocateBuffer(IGLenum target, const IGLPixelFormat *pixelformat,
IGLuint width, IGLuint height, IGLuint depth,
IGLbitfield flags);
/**
* Deallocate the given image buffer.
*/
extern void
iglFreeBuffer(IGLBuffer *buffer);
/**
* Resize the given image buffer. The buffer contents after resize are
* undefined.
* \return IGL_TRUE if successful, IGL_FALSE otherwise
*/
extern IGLboolean
iglResizeBuffer(IGLBuffer *buffer,
IGLuint width, IGLuint height, IGLuint depth);
/**
* Map the given image buffer into the caller's address space.
* \param buffer the image buffer to map
* \param access one of IGL_READ_ONLY, IGL_WRITE_ONLY, IGL_READ_WRITE.
* \param size returns the size of the mapped region.
* \return the mapped address or NULL if we fail.
*/
extern void *
iglMapBuffer(IGLBuffer *buffer, IGLenum access, IGLuint *size);
/**
* Unmap the given image buffer from the caller's address space.
*/
extern void
iglUnmapBuffer(IGLBuffer *buffer);
/**
* Bind the given image buffer as a texture image.
* XXX tentative.
*/
extern void
iglBindTextureBuffer(IGLBuffer *buffer, IGLenum textureTarget,
IGLuint textureID, IGLuint textureLevel);
/**********************************************************************
* Canvas functions.
*/
/**
* Allocate a new drawing canvas.
* \param targets a bitmask of IGL_FRAMEBUFFER_BIT, IGL_TEXTURE_BIT,
* and IGL_PBUFFER_BIT which indicates how the canvas
* might be used.
* A canvas that will also be used as a texture source would
* specify IGL_TEXTURE_BIT | IGL_PBUFFER_BIT.
* \return pointer to new IGLCanvas or NULL if we fail.
*/
extern IGLCanvas *
iglAllocateCanvas(IGLbitfield targets, const IGLVisual *visual,
IGLuint width, IGLuint height, IGLuint depth,
IGLbitfield flags);
/**
* Deallocate the given drawing canvas.
*/
extern void
iglFreeCanvas(IGLCanvas *canvas);
/**
* Resize the given canvas. The buffers' contents after resize are
* undefined.
* \return IGL_TRUE if successful, IGL_FALSE otherwise
*/
extern void
iglResizeCanvas(IGLCanvas *canvas,
IGLuint width, IGLuint height, IGLuint depth);
/**
* Specify a list of clipping rectangles for rendering into the given
* canvas.
*/
extern void
iglSetClipList(IGLCanvas *canvas, IGLuint numRects, const IGLRect *rectList);
/**********************************************************************
* Rendering context functions.
*/
/**
* Create a new OpenGL rendering context.
*/
extern IGLContext *
iglCreateContext(const IGLVisual *visual, IGLContext *shareList);
/**
* Destroy the given OpenGL rendering context.
*/
extern void
iglDestroyContext(IGLContext *context);
/**
* Bind the given rendering context to a read/draw canvas pair for the
* calling thread.
* Typically, readCanvas == drawCanvas.
* \return IGL_TRUE if successful, IGL_FALSE otherwise.
*/
extern IGLboolean
iglMakeCurrent(IGLContext *context,
IGLCanvas *readCanvas, IGLCanvas *drawCanvas);
/**
* Return the current IGLContext for the calling thread.
* \return IGLContext pointer or NULL if no current context.
*/
extern IGLContext *
iglGetCurrentContext(void);
/**
* Return the current IGLCanvas for drawing for the calling thread.
* \return IGLCanvas pointer or NULL if no current canvas.
*/
extern IGLCanvas *
iglGetCurrentDrawCanvas(void);
/**
* Return the current IGLCanvas for reading for the calling thread.
* \return IGLCanvas pointer or NULL if no current canvas.
*/
extern IGLCanvas *
iglGetCurrentReadCanvas(void);
/**********************************************************************
* Misc functions.
*/
/**
* Initialize the IGL driver.
* XXX any parameters???
*/
extern void
iglInitialize(void);
/**
* Return string information.
* \param pname one of IGL_VERSION, IGL_VENDOR, IGL_EXTENSIONS, IGL_RENDERER,
* or IGL_LAST_ERROR.
* \return the string or NULL. If non-null the first and last characters
* will be spaces.
*/
extern IGLchar *
iglGetString(IGLenum pname);
/**
* Return the address of any IGL or OpenGL function.
*/
extern void *
iglGetProcAddress(const char *functionName);
/**********************************************************************
* Cursor functions.
*/
/**
* Return max pointer/sprite size supported on given screen.
*/
extern void
iglGetMaxPointerSize(IGLuint screen, IGLuint *width, IGLuint *height);
/**
* Set the pointer/sprite image for the given screen.
*/
extern void
iglPointerImage(IGLuint screen, IGLuint width, IGLuint height,
const IGLPixelFormat *format, const void *image);
/**
* Show/Hide the pointer/sprite on given screen.
*/
extern void
iglShowPointer(IGLuint screen, IGLboolean visible);
/**
* Set pointer/sprite's current position.
*/
extern void
iglPointerPosition(IGLuint screen, IGLint x, IGLint y);
/**********************************************************************
* Colormap (palette) functions.
*/
/**
* Specify the colormap to use for the given screen when scanning
* out color indexed framebuffers.
* \param screen
* \param type datatype of colormap values: IGL_UNSIGNED_BYTE, etc
* \param components number of components per colortable entry
* \param size number of colortable entries (typically 256)
* \param colormap the colormap values
*/
extern void
iglSetColormap(IGLuint screen, IGLenum type, IGLuint components,
IGLuint size, const IGLvoid *colormap);
/**********************************************************************
* XXX to be determined functions:
* - monitor info / DDC?
* - DMA negotiation?
*/
#endif /* IGL_H */