Ian Romanick wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> [email protected] wrote:
>
>> From: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
>>
>> 1) If MakeContextCurrent is called with (NULL, None, None), Don't
>> send the request to the X server if the current context is direct.
>> 2) Return BadMatch in some error cases according to the glx spec.
>> 3) If MakeContextCurrent is called for a context which is current in
>> another thread, return BadAccess according to the glx spec.
>>
>> Signed-off-by: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
>> ---
>> src/glx/x11/glxclient.h | 5 +++++
>> src/glx/x11/glxcurrent.c | 33 +++++++++++++++++++++++++++++++++
>> 2 files changed, 38 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h
>> index fa3ec26..bf68d0f 100644
>> --- a/src/glx/x11/glxclient.h
>> +++ b/src/glx/x11/glxclient.h
>> @@ -426,6 +426,11 @@ struct __GLXcontextRec {
>> int server_minor; /**< Minor version number. */
>> /*...@}*/
>>
>> + /**
>> + * Thread ID we're currently current in. Zero if none.
>> + */
>> + unsigned long thread_id;
>> +
>>
>
> Is this the right type? Would uintptr_t be better? void *?
>
>
IIRC, unsigned long is the return type of _glthread_getID().
>> char gl_extension_bits[ __GL_EXT_BYTES ];
>> };
>>
>> diff --git a/src/glx/x11/glxcurrent.c b/src/glx/x11/glxcurrent.c
>> index 4d0a7c6..c36c611 100644
>> --- a/src/glx/x11/glxcurrent.c
>> +++ b/src/glx/x11/glxcurrent.c
>> @@ -369,8 +369,36 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
>> return GL_FALSE;
>> }
>>
>> + if ((gc == NULL && (draw != None || read != None)) ||
>> + (gc != NULL && (draw == None || read == None))) {
>> + xError error;
>> +
>> + error.errorCode = BadMatch;
>> + error.resourceID = draw;
>> + error.sequenceNumber = dpy->request;
>> + error.type = X_Error;
>> + error.majorCode = gc->majorOpcode;
>> + error.minorCode = X_GLXMakeContextCurrent;
>> + _XError(dpy, &error);
>> + return False;
>> + }
>> +
>> _glapi_check_multithread();
>>
>> + if (gc != NULL && gc->thread_id != 0 &&
>> + gc->thread_id != _glthread_GetID()) {
>> + xError error;
>> +
>> + error.errorCode = BadAccess;
>> + error.resourceID = gc->xid;
>> + error.sequenceNumber = dpy->request;
>> + error.type = X_Error;
>> + error.majorCode = gc->majorOpcode;
>> + error.minorCode = X_GLXMakeContextCurrent;
>> + _XError(dpy, &error);
>> + return False;
>>
>
> There are a lot of places where we don't generate correct X errors in
> the direct rendering path. Perhaps we could make a small function that
> encapsulates this? I expect those code will see a lot of copy-and-paste
> otherwise. Something like:
>
> void __glXGenerateError(Display *dpy, __GLXcontext *gc, BYTE errorCode,
> CARD16 minorCode);
>
>
Sure, We should include the resourceID in the parameter list as well.
I'll fix the whitespaces up as well.
/Thomas
------------------------------------------------------------------------------
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev