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