From 7da5705b090d9c97a9b765d786c5e89afe9d1f25 Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Date: Mon, 14 Jan 2008 18:31:05 -0500 Subject: Add new DRI2 infrastructure. --- include/GL/internal/dri_interface.h | 38 +++++++++-- include/GL/internal/dri_sarea.h | 131 ++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 include/GL/internal/dri_sarea.h (limited to 'include') diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index 1b637afaf3..50f1d1a765 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -230,12 +230,6 @@ struct __DRItexOffsetExtensionRec { #define __DRI_REAL_MAKE_VERSION(name, version) name ## _ ## version #define __DRI_MAKE_VERSION(name, version) __DRI_REAL_MAKE_VERSION(name, version) -#define __DRI_CREATE_NEW_SCREEN \ - __DRI_MAKE_VERSION(__driCreateNewScreen, __DRI_INTERFACE_VERSION) - -#define __DRI_CREATE_NEW_SCREEN_STRING \ - __DRI_STRINGIFY(__DRI_CREATE_NEW_SCREEN) - /** * \name Functions and data provided by the driver. */ @@ -250,9 +244,32 @@ typedef void *(CREATENEWSCREENFUNC)(int scr, __DRIscreen *psc, const __DRIinterfaceMethods * interface, __GLcontextModes ** driver_modes); typedef CREATENEWSCREENFUNC* PFNCREATENEWSCREENFUNC; + +#define __DRI_CREATE_NEW_SCREEN \ + __DRI_MAKE_VERSION(__driCreateNewScreen, __DRI_INTERFACE_VERSION) + +#define __DRI_CREATE_NEW_SCREEN_STRING \ + __DRI_STRINGIFY(__DRI_CREATE_NEW_SCREEN) + extern CREATENEWSCREENFUNC __DRI_CREATE_NEW_SCREEN; +/* DRI2 Entry point */ + +typedef void *(__DRI2_CREATE_NEW_SCREEN_FUNC)(int scr, __DRIscreen *psc, + const __DRIversion * ddx_version, const __DRIversion * dri_version, + const __DRIversion * drm_version, int fd, + unsigned int sarea_handle, + const __DRIinterfaceMethods * interface, + __GLcontextModes ** driver_modes); +#define __DRI2_CREATE_NEW_SCREEN \ + __DRI_MAKE_VERSION(__dri2CreateNewScreen, __DRI_INTERFACE_VERSION) + +#define __DRI2_CREATE_NEW_SCREEN_STRING \ + __DRI_STRINGIFY(__DRI2_CREATE_NEW_SCREEN) + +extern __DRI2_CREATE_NEW_SCREEN_FUNC __DRI2_CREATE_NEW_SCREEN; + /** * XML document describing the configuration options supported by the @@ -357,6 +374,15 @@ struct __DRIinterfaceMethodsRec { int x, int y, drm_clip_rect_t *rects, int num_rects, GLboolean front_buffer); + + /** + * Ping the windowing system to get it to reemit info for the + * specified drawable in the DRI2 event buffer. + * + * \param draw the drawable for which to request info + */ + void (*reemitDrawableInfo)(__DRIdrawable *draw); + }; diff --git a/include/GL/internal/dri_sarea.h b/include/GL/internal/dri_sarea.h new file mode 100644 index 0000000000..ff4ff1021c --- /dev/null +++ b/include/GL/internal/dri_sarea.h @@ -0,0 +1,131 @@ +/* + * Copyright 2007 Red Hat, Inc + * 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 + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS 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. + */ + +#ifndef DRI_SAREA_H +#define DRI_SAREA_H + +#include + +/* The DRI2 SAREA holds a list of self-describing blocks. Each block + * is 8 byte aligned and has a common 32-bit header word. The upper + * 16 bits describe the type of the block and the lower 16 bits the + * size. DRI2 only defines a couple of blocks and allows drivers to + * define driver specific blocks using type codes from 0x8000 and up. + * The type code 0x0000 defines the end of the sarea. */ + +#define DRI2_SAREA_BLOCK_HEADER(type, size) (((type) << 16) | (size)) +#define DRI2_SAREA_BLOCK_TYPE(b) ((b) >> 16) +#define DRI2_SAREA_BLOCK_SIZE(b) ((b) & 0xffff) +#define DRI2_SAREA_BLOCK_NEXT(p) \ + ((void *) ((unsigned char *) (p) + \ + DRI2_SAREA_BLOCK_SIZE(*(unsigned int *) p))) + +#define DRI2_SAREA_BLOCK_END 0x0000 +#define DRI2_SAREA_BLOCK_LOCK 0x0001 +#define DRI2_SAREA_BLOCK_EVENT_BUFFER 0x0002 + +/* Chipset specific blocks start at 0x8000, 0xffff is reserved. */ + +typedef struct __DRILock __DRILock; +typedef struct __DRIEventBuffer __DRIEventBuffer; +typedef struct __DRIDrawableBuffer __DRIDrawableBuffer; +typedef struct __DRIDrawableConfigEvent __DRIDrawableConfigEvent; +typedef struct __DRIBufferAttachEvent __DRIBufferAttachEvent; + +struct __DRILock { + unsigned int block_header; + drm_hw_lock_t lock; +}; + +struct __DRIEventBuffer { + unsigned int block_header; + unsigned int head; /* last valid event */ + unsigned int prealloc; /* event currently being written */ + unsigned int size; /* size of data */ + unsigned char data[0]; +}; + +enum { + /* the four standard color buffers */ + DRI_DRAWABLE_BUFFER_FRONT_LEFT = 0, + DRI_DRAWABLE_BUFFER_BACK_LEFT = 1, + DRI_DRAWABLE_BUFFER_FRONT_RIGHT = 2, + DRI_DRAWABLE_BUFFER_BACK_RIGHT = 3, + /* optional aux buffer */ + DRI_DRAWABLE_BUFFER_AUX0 = 4, + DRI_DRAWABLE_BUFFER_AUX1 = 5, + DRI_DRAWABLE_BUFFER_AUX2 = 6, + DRI_DRAWABLE_BUFFER_AUX3 = 7, + DRI_DRAWABLE_BUFFER_DEPTH = 8, + DRI_DRAWABLE_BUFFER_STENCIL = 9, + DRI_DRAWABLE_BUFFER_ACCUM = 10, + /* generic renderbuffers */ + DRI_DRAWABLE_BUFFER_COLOR0 = 11, + DRI_DRAWABLE_BUFFER_COLOR1 = 12, + DRI_DRAWABLE_BUFFER_COLOR2 = 13, + DRI_DRAWABLE_BUFFER_COLOR3 = 14, + DRI_DRAWABLE_BUFFER_COLOR4 = 15, + DRI_DRAWABLE_BUFFER_COLOR5 = 16, + DRI_DRAWABLE_BUFFER_COLOR6 = 17, + DRI_DRAWABLE_BUFFER_COLOR7 = 18, + DRI_DRAWABLE_BUFFER_COUNT = 19 +}; + +struct __DRIDrawableBuffer { + unsigned int attachment; + unsigned int handle; + unsigned int pitch; + unsigned short cpp; + + /* Upper 8 bits are driver specific, lower 8 bits generic. The + * bits can inidicate buffer properties such as tiled, swizzled etc. */ + unsigned short flags; +}; + +#define DRI2_EVENT_HEADER(type, size) (((type) << 16) | (size)) +#define DRI2_EVENT_TYPE(b) ((b) >> 16) +#define DRI2_EVENT_SIZE(b) ((b) & 0xffff) + +#define DRI2_EVENT_PAD 0x0000 +#define DRI2_EVENT_DRAWABLE_CONFIG 0x0001 +#define DRI2_EVENT_BUFFER_ATTACH 0x0002 + +struct __DRIDrawableConfigEvent { + unsigned int event_header; + drm_drawable_t drawable; + short x; + short y; + unsigned int width; + unsigned int height; + unsigned int num_rects; + struct drm_clip_rect rects[0]; +}; + +struct __DRIBufferAttachEvent { + unsigned int event_header; + drm_drawable_t drawable; + __DRIDrawableBuffer buffer; +}; + +#endif /* DRI_SAREA_H */ -- cgit v1.2.3