mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
David Reveman's GLX_EXT_texture_from_pixmap extension patch
This commit is contained in:
parent
4cd0e24f86
commit
42725d6f54
4 changed files with 117 additions and 22 deletions
|
|
@ -200,6 +200,7 @@ GetDrawableAttribute( Display *dpy, GLXDrawable drawable,
|
||||||
GLboolean use_glx_1_3 = ((priv->majorVersion > 1)
|
GLboolean use_glx_1_3 = ((priv->majorVersion > 1)
|
||||||
|| (priv->minorVersion >= 3));
|
|| (priv->minorVersion >= 3));
|
||||||
|
|
||||||
|
*value = 0;
|
||||||
|
|
||||||
if ( (dpy == NULL) || (drawable == 0) ) {
|
if ( (dpy == NULL) || (drawable == 0) ) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -230,33 +231,41 @@ GetDrawableAttribute( Display *dpy, GLXDrawable drawable,
|
||||||
|
|
||||||
_XReply(dpy, (xReply*) &reply, 0, False);
|
_XReply(dpy, (xReply*) &reply, 0, False);
|
||||||
|
|
||||||
|
if (reply.type == X_Error)
|
||||||
|
{
|
||||||
|
UnlockDisplay(dpy);
|
||||||
|
SyncHandle();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
length = reply.length;
|
length = reply.length;
|
||||||
num_attributes = (use_glx_1_3) ? reply.numAttribs : length / 2;
|
if (length)
|
||||||
data = (CARD32 *) Xmalloc( length * sizeof(CARD32) );
|
{
|
||||||
if ( data == NULL ) {
|
num_attributes = (use_glx_1_3) ? reply.numAttribs : length / 2;
|
||||||
/* Throw data on the floor */
|
data = (CARD32 *) Xmalloc( length * sizeof(CARD32) );
|
||||||
_XEatData(dpy, length);
|
if ( data == NULL ) {
|
||||||
} else {
|
/* Throw data on the floor */
|
||||||
_XRead(dpy, (char *)data, length * sizeof(CARD32) );
|
_XEatData(dpy, length);
|
||||||
|
} else {
|
||||||
|
_XRead(dpy, (char *)data, length * sizeof(CARD32) );
|
||||||
|
|
||||||
|
/* Search the set of returned attributes for the attribute requested by
|
||||||
|
* the caller.
|
||||||
|
*/
|
||||||
|
for ( i = 0 ; i < num_attributes ; i++ ) {
|
||||||
|
if ( data[i*2] == attribute ) {
|
||||||
|
*value = data[ (i*2) + 1 ];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Xfree( data );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UnlockDisplay(dpy);
|
UnlockDisplay(dpy);
|
||||||
SyncHandle();
|
SyncHandle();
|
||||||
|
|
||||||
|
|
||||||
/* Search the set of returned attributes for the attribute requested by
|
|
||||||
* the caller.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for ( i = 0 ; i < num_attributes ; i++ ) {
|
|
||||||
if ( data[i*2] == attribute ) {
|
|
||||||
*value = data[ (i*2) + 1 ];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Xfree( data );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2589,7 +2589,87 @@ PUBLIC Bool glXSet3DfxModeMESA( int mode )
|
||||||
}
|
}
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
PUBLIC Bool glXBindTexImageEXT(Display *dpy,
|
||||||
|
GLXDrawable drawable,
|
||||||
|
int buffer)
|
||||||
|
{
|
||||||
|
xGLXVendorPrivateReq *req;
|
||||||
|
GLXContext gc = __glXGetCurrentContext();
|
||||||
|
CARD32 *drawable_ptr;
|
||||||
|
INT32 *buffer_ptr;
|
||||||
|
CARD8 opcode;
|
||||||
|
|
||||||
|
if (gc == NULL)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
#ifdef GLX_DIRECT_RENDERING
|
||||||
|
if (gc->isDirect)
|
||||||
|
return False;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
opcode = __glXSetupForCommand(dpy);
|
||||||
|
if (!opcode)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
LockDisplay(dpy);
|
||||||
|
GetReqExtra(GLXVendorPrivate, sizeof(CARD32)+sizeof(INT32),req);
|
||||||
|
req->reqType = opcode;
|
||||||
|
req->glxCode = X_GLXVendorPrivate;
|
||||||
|
req->vendorCode = X_GLXvop_BindTexImageEXT;
|
||||||
|
req->contextTag = gc->currentContextTag;
|
||||||
|
|
||||||
|
drawable_ptr = (CARD32 *) (req + 1);
|
||||||
|
buffer_ptr = (INT32 *) (drawable_ptr + 1);
|
||||||
|
|
||||||
|
*drawable_ptr = drawable;
|
||||||
|
*buffer_ptr = buffer;
|
||||||
|
|
||||||
|
UnlockDisplay(dpy);
|
||||||
|
SyncHandle();
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
PUBLIC Bool glXReleaseTexImageEXT(Display *dpy,
|
||||||
|
GLXDrawable drawable,
|
||||||
|
int buffer)
|
||||||
|
{
|
||||||
|
xGLXVendorPrivateReq *req;
|
||||||
|
GLXContext gc = __glXGetCurrentContext();
|
||||||
|
CARD32 *drawable_ptr;
|
||||||
|
INT32 *buffer_ptr;
|
||||||
|
CARD8 opcode;
|
||||||
|
|
||||||
|
if (gc == NULL)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
#ifdef GLX_DIRECT_RENDERING
|
||||||
|
if (gc->isDirect)
|
||||||
|
return False;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
opcode = __glXSetupForCommand(dpy);
|
||||||
|
if (!opcode)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
LockDisplay(dpy);
|
||||||
|
GetReqExtra(GLXVendorPrivate, sizeof(CARD32)+sizeof(INT32),req);
|
||||||
|
req->reqType = opcode;
|
||||||
|
req->glxCode = X_GLXVendorPrivate;
|
||||||
|
req->vendorCode = X_GLXvop_ReleaseTexImageEXT;
|
||||||
|
req->contextTag = gc->currentContextTag;
|
||||||
|
|
||||||
|
drawable_ptr = (CARD32 *) (req + 1);
|
||||||
|
buffer_ptr = (INT32 *) (drawable_ptr + 1);
|
||||||
|
|
||||||
|
*drawable_ptr = drawable;
|
||||||
|
*buffer_ptr = buffer;
|
||||||
|
|
||||||
|
UnlockDisplay(dpy);
|
||||||
|
SyncHandle();
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \c strdup is actually not a standard ANSI C or POSIX routine.
|
* \c strdup is actually not a standard ANSI C or POSIX routine.
|
||||||
|
|
@ -2771,6 +2851,10 @@ static const struct name_address_pair GLX_functions[] = {
|
||||||
GLX_FUNCTION( glXGetMscRateOML ),
|
GLX_FUNCTION( glXGetMscRateOML ),
|
||||||
GLX_FUNCTION( glXGetSyncValuesOML ),
|
GLX_FUNCTION( glXGetSyncValuesOML ),
|
||||||
|
|
||||||
|
/*** GLX_EXT_texture_from_pixmap ***/
|
||||||
|
GLX_FUNCTION( glXBindTexImageEXT ),
|
||||||
|
GLX_FUNCTION( glXReleaseTexImageEXT ),
|
||||||
|
|
||||||
#ifdef GLX_DIRECT_RENDERING
|
#ifdef GLX_DIRECT_RENDERING
|
||||||
/*** DRI configuration ***/
|
/*** DRI configuration ***/
|
||||||
GLX_FUNCTION( glXGetScreenDriver ),
|
GLX_FUNCTION( glXGetScreenDriver ),
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@ static const struct extension_info known_glx_extensions[] = {
|
||||||
{ GLX(SGIX_video_source), VER(0,0), N, N, N, N },
|
{ GLX(SGIX_video_source), VER(0,0), N, N, N, N },
|
||||||
{ GLX(SGIX_visual_select_group), VER(0,0), Y, Y, N, N },
|
{ GLX(SGIX_visual_select_group), VER(0,0), Y, Y, N, N },
|
||||||
{ GLX(SUN_get_transparent_index), VER(0,0), N, N, N, N },
|
{ GLX(SUN_get_transparent_index), VER(0,0), N, N, N, N },
|
||||||
|
{ GLX(EXT_texture_from_pixmap), VER(0,0), Y, N, N, N },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,8 @@ enum {
|
||||||
SGIX_video_resize_bit,
|
SGIX_video_resize_bit,
|
||||||
SGIX_video_source_bit,
|
SGIX_video_source_bit,
|
||||||
SGIX_visual_select_group_bit,
|
SGIX_visual_select_group_bit,
|
||||||
SUN_get_transparent_index_bit
|
SUN_get_transparent_index_bit,
|
||||||
|
EXT_texture_from_pixmap_bit
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue