MESA_multithread_makecurrent.spec revision 49d7e48b33264d94e30af6129c281b6acafa9427
1Name 2 3 MESA_multithread_makecurrent 4 5Name Strings 6 7 GLX_MESA_multithread_makecurrent 8 9Contact 10 11 Eric Anholt (eric@anholt.net) 12 13Status 14 15 Not shipping. 16 17Version 18 19 Last Modified Date: 21 February 2011 20 21Number 22 23 TBD 24 25Dependencies 26 27 OpenGL 1.0 or later is required. 28 GLX 1.3 or later is required. 29 30Overview 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 48IP Status 49 50 Open-source; freely implementable. 51 52Issues 53 54 None. 55 56New Procedures and Functions 57 58 None. 59 60New Tokens 61 62 None. 63 64Changes to Chapter 3 of the GLX 1.3 Specification (Functions and Errors) 65 66 Remove the following sentence from section 3.3.7 Rendering Contexts: 67 If ctx is current to some other thread, then 68 glXMakeContextCurrent will generate a BadAccess error. 69 70 Remove the following sentence from section 3.5 Rendering Contexts: 71 If ctx is current to some other thread, then 72 glXMakeCurrent will generate a BadAccess error. 73 74GLX Protocol 75 76 None. The GLX extension is client-side. 77 78Errors 79 80 None. 81 82New State 83 84 None. 85 86Issues 87 88 (1) What happens if the app binds a context/drawable in multiple 89 threads, then binds a different context/thread in one of them? 90 91 As with binding a new context from the current thread, the old 92 context's refcount is reduced and the new context's refcount is 93 increased. 94 95 (2) What happens if the app binds a context/drawable in multiple 96 threads, then binds None/None in one of them? 97 98 The GLX context is unreferenced from that thread, and the other 99 threads retain their GLX context binding. 100 101 (3) What happens if the app binds a context/drawable in 7 threads, 102 then destroys the context in one of them? 103 104 As with GLX context destruction previously, the XID is destroyed 105 but the context remains usable by threads that have the context 106 current. 107 108 (4) What happens if the app binds a new drawable/readable with 109 glXMakeCurrent() when it is already bound to another thread? 110 111 The context becomes bound to the new drawable/readable, and 112 further rendering in either thread will use the new 113 drawable/readable. 114 115 (5) What requirements should be placed on the user managing contexts 116 from multiple threads? 117 118 The intention is to allow multithreaded access to the GL at the 119 minimal performance cost, so requiring that the GL do general 120 synchronization (beyond that already required by context sharing) 121 is not an option, and synchronizing of GL's access to the GL 122 context between multiple threads is left to the application to do 123 across GL calls. However, it would be unfortunate for a library 124 doing multithread_makecurrent to require that other libraries 125 share in synchronization for binding of their own contexts, so the 126 refcounting of the contexts is required to be threadsafe. 127 128Revision History 129 130 20 November 2009 Eric Anholt - initial specification 131 22 November 2009 Eric Anholt - added issues from Ian Romanick. 132 3 February 2011 Eric Anholt - updated with resolution to issues 1-3 133 3 February 2011 Eric Anholt - added issue 4, 5 134 21 February 2011 Eric Anholt - Include glXMakeCurrent() sentence 135 along with glXMakeContextCurrent() for removal. 136