Home | History | Annotate | Download | only in specs
      1 Name
      2 
      3     MESA_multithread_makecurrent
      4 
      5 Name Strings
      6 
      7     GLX_MESA_multithread_makecurrent
      8 
      9 Contact
     10 
     11     Eric Anholt (eric@anholt.net)
     12 
     13 Status
     14 
     15     Not shipping.
     16 
     17 Version
     18 
     19     Last Modified Date:  21 February 2011
     20 
     21 Number
     22 
     23     TBD
     24 
     25 Dependencies
     26 
     27     OpenGL 1.0 or later is required.
     28     GLX 1.3 or later is required.
     29 
     30 Overview
     31 
     32     The GLX context setup encourages multithreaded applications to
     33     create a context per thread which each operate on their own
     34     objects in parallel, and leaves synchronization for write access
     35     to shared objects up to the application.
     36 
     37     For some applications, maintaining per-thread contexts and
     38     ensuring that the glFlush happens in one thread before another
     39     thread starts working on that object is difficult.  For them,
     40     using the same context across multiple threads and protecting its
     41     usage with a mutex is both higher performance and easier to
     42     implement.  This extension gives those applications that option by
     43     relaxing the context binding requirements.
     44 
     45     This new behavior matches the requirements of AGL, while providing
     46     a feature not specified in WGL.
     47 
     48 IP Status
     49 
     50     Open-source; freely implementable.
     51 
     52 Issues
     53 
     54     None.
     55 
     56 New Procedures and Functions
     57 
     58     None.
     59 
     60 New Tokens
     61 
     62     None.
     63 
     64 Changes to Chapter 2 of the GLX 1.3 Specification (Functions and Errors)
     65 
     66     Replace the following sentence from section 2.2 Rendering Contexts:
     67 	In addition, a rendering context can be current for only one
     68 	thread at a time.
     69     with:
     70 	In addition, an indirect rendering context can be current for
     71 	only one thread at a time.  A direct rendering context may be
     72 	current to multiple threads, with synchronization of access to
     73 	the context thruogh the GL managed by the application through
     74 	mutexes.
     75 
     76 Changes to Chapter 3 of the GLX 1.3 Specification (Functions and Errors)
     77 
     78     Replace the following sentence from section 3.3.7 Rendering Contexts:
     79 	If ctx is current to some other thread, then
     80 	glXMakeContextCurrent will generate a BadAccess error.
     81     with:
     82 	If ctx is an indirect context current to some other thread,
     83 	then glXMakeContextCurrent will generate a BadAccess error.
     84 
     85     Replace the following sentence from section 3.5 Rendering Contexts:
     86 	If ctx is current to some other thread, then
     87 	glXMakeCurrent will generate a BadAccess error.
     88     with:
     89 	If ctx is an indirect context current to some other thread,
     90 	then glXMakeCurrent will generate a BadAccess error.
     91 
     92 GLX Protocol
     93 
     94     None.  The GLX extension only extends to direct rendering contexts.
     95 
     96 Errors
     97 
     98     None.
     99 
    100 New State
    101 
    102     None.
    103 
    104 Issues
    105 
    106     (1) What happens if the app binds a context/drawable in multiple
    107 	threads, then binds a different context/thread in one of them?
    108 
    109     As with binding a new context from the current thread, the old
    110     context's refcount is reduced and the new context's refcount is
    111     increased.
    112 
    113     (2) What happens if the app binds a context/drawable in multiple
    114 	threads, then binds None/None in one of them?
    115 
    116     The GLX context is unreferenced from that thread, and the other
    117     threads retain their GLX context binding.
    118 
    119     (3) What happens if the app binds a context/drawable in 7 threads,
    120 	then destroys the context in one of them?
    121 
    122     As with GLX context destruction previously, the XID is destroyed
    123     but the context remains usable by threads that have the context
    124     current.
    125 
    126     (4) What happens if the app binds a new drawable/readable with
    127         glXMakeCurrent() when it is already bound to another thread?
    128 
    129     The context becomes bound to the new drawable/readable, and
    130     further rendering in either thread will use the new
    131     drawable/readable.
    132 
    133     (5) What requirements should be placed on the user managing contexts
    134         from multiple threads?
    135 
    136     The intention is to allow multithreaded access to the GL at the
    137     minimal performance cost, so requiring that the GL do general
    138     synchronization (beyond that already required by context sharing)
    139     is not an option, and synchronizing of GL's access to the GL
    140     context between multiple threads is left to the application to do
    141     across GL calls.  However, it would be unfortunate for a library
    142     doing multithread_makecurrent to require that other libraries
    143     share in synchronization for binding of their own contexts, so the
    144     refcounting of the contexts is required to be threadsafe.
    145 
    146     (6) Does this apply to indirect contexts?
    147 
    148     This was ignored in the initial revision of the spec.  Behavior
    149     for indirect contexts is left as-is.
    150 
    151 Revision History
    152 
    153     20 November 2009 Eric Anholt - initial specification
    154     22 November 2009 Eric Anholt - added issues from Ian Romanick.
    155     3 February 2011 Eric Anholt - updated with resolution to issues 1-3
    156     3 February 2011 Eric Anholt - added issue 4, 5
    157     21 February 2011 Eric Anholt - Include glXMakeCurrent() sentence
    158     along with glXMakeContextCurrent() for removal.
    159