mesa: Change "BRIAN PAUL" to "THE AUTHORS" in license text.
[mesa.git] / src / mesa / drivers / dri / common / drisw_util.c
index a19123f706429943e4aefeb97cd64a1002d11346..a4bfa0f677657539064775ac61a5c642562aa50f 100644 (file)
@@ -16,7 +16,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
@@ -68,7 +68,7 @@ driCreateNewScreen(int scrn, const __DRIextension **extensions,
 
     *driver_configs = driDriverAPI.InitScreen(psp);
     if (*driver_configs == NULL) {
-       FREE(psp);
+       free(psp);
        return NULL;
     }
 
@@ -79,7 +79,7 @@ static void driDestroyScreen(__DRIscreen *psp)
 {
     if (psp) {
        driDriverAPI.DestroyScreen(psp);
-       FREE(psp);
+       free(psp);
     }
 }
 
@@ -94,47 +94,125 @@ static const __DRIextension **driGetExtensions(__DRIscreen *psp)
  */
 
 static __DRIcontext *
-driCreateNewContextForAPI(__DRIscreen *psp, int api,
-                          const __DRIconfig *config,
-                          __DRIcontext *shared, void *data)
+driCreateContextAttribs(__DRIscreen *screen, int api,
+                       const __DRIconfig *config,
+                       __DRIcontext *shared,
+                       unsigned num_attribs,
+                       const uint32_t *attribs,
+                       unsigned *error,
+                       void *data)
 {
     __DRIcontext *pcp;
     const struct gl_config *modes = (config != NULL) ? &config->modes : NULL;
     void * const shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
     gl_api mesa_api;
+    unsigned major_version = 1;
+    unsigned minor_version = 0;
+    uint32_t flags = 0;
+
+    /* Either num_attribs is zero and attribs is NULL, or num_attribs is not
+     * zero and attribs is not NULL.
+     */
+    assert((num_attribs == 0) == (attribs == NULL));
 
     switch (api) {
     case __DRI_API_OPENGL:
-            mesa_api = API_OPENGL;
+            mesa_api = API_OPENGL_COMPAT;
             break;
     case __DRI_API_GLES:
             mesa_api = API_OPENGLES;
             break;
     case __DRI_API_GLES2:
+    case __DRI_API_GLES3:
             mesa_api = API_OPENGLES2;
             break;
+    case __DRI_API_OPENGL_CORE:
+            mesa_api = API_OPENGL_CORE;
+            break;
     default:
+            *error = __DRI_CTX_ERROR_BAD_API;
             return NULL;
     }
 
+    for (unsigned i = 0; i < num_attribs; i++) {
+       switch (attribs[i * 2]) {
+       case __DRI_CTX_ATTRIB_MAJOR_VERSION:
+           major_version = attribs[i * 2 + 1];
+           break;
+       case __DRI_CTX_ATTRIB_MINOR_VERSION:
+           minor_version = attribs[i * 2 + 1];
+           break;
+       case __DRI_CTX_ATTRIB_FLAGS:
+           flags = attribs[i * 2 + 1];
+           break;
+       default:
+           /* We can't create a context that satisfies the requirements of an
+            * attribute that we don't understand.  Return failure.
+            */
+           return NULL;
+       }
+    }
+
+    /* Mesa does not support the GL_ARB_compatibilty extension or the
+     * compatibility profile.  This means that we treat a API_OPENGL_COMPAT 3.1 as
+     * API_OPENGL_CORE and reject API_OPENGL_COMPAT 3.2+.
+     */
+    if (mesa_api == API_OPENGL_COMPAT && major_version == 3 && minor_version == 1)
+       mesa_api = API_OPENGL_CORE;
+
+    if (mesa_api == API_OPENGL_COMPAT
+        && ((major_version > 3)
+            || (major_version == 3 && minor_version >= 2))) {
+       *error = __DRI_CTX_ERROR_BAD_API;
+       return NULL;
+    }
+    /* There are no forward-compatible contexts before OpenGL 3.0.  The
+     * GLX_ARB_create_context spec says:
+     *
+     *     "Forward-compatible contexts are defined only for OpenGL versions
+     *     3.0 and later."
+     *
+     * Moreover, Mesa can't fulfill the requirements of a forward-looking
+     * context.  Return failure if a forward-looking context is requested.
+     *
+     * In Mesa, a debug context is the same as a regular context.
+     */
+    if (major_version >= 3) {
+       if ((flags & ~__DRI_CTX_FLAG_DEBUG) != 0)
+           return NULL;
+    }
+
     pcp = CALLOC_STRUCT(__DRIcontextRec);
     if (!pcp)
         return NULL;
 
     pcp->loaderPrivate = data;
 
-    pcp->driScreenPriv = psp;
+    pcp->driScreenPriv = screen;
     pcp->driDrawablePriv = NULL;
     pcp->driReadablePriv = NULL;
 
-    if (!driDriverAPI.CreateContext(mesa_api, modes, pcp, shareCtx)) {
-        FREE(pcp);
+    if (!driDriverAPI.CreateContext(mesa_api, modes, pcp,
+                                   major_version, minor_version,
+                                   flags, error, shareCtx)) {
+        free(pcp);
         return NULL;
     }
 
     return pcp;
 }
 
+static __DRIcontext *
+driCreateNewContextForAPI(__DRIscreen *psp, int api,
+                          const __DRIconfig *config,
+                          __DRIcontext *shared, void *data)
+{
+    unsigned error;
+
+    return driCreateContextAttribs(psp, api, config, shared, 0, NULL,
+                                  &error, data);
+}
+
 static __DRIcontext *
 driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config,
                    __DRIcontext *shared, void *data)
@@ -148,7 +226,7 @@ driDestroyContext(__DRIcontext *pcp)
 {
     if (pcp) {
        driDriverAPI.DestroyContext(pcp);
-       FREE(pcp);
+       free(pcp);
     }
 }
 
@@ -228,7 +306,7 @@ static void dri_put_drawable(__DRIdrawable *pdp)
            return;
 
        driDriverAPI.DestroyBuffer(pdp);
-       FREE(pdp);
+       free(pdp);
     }
 }
 
@@ -250,7 +328,7 @@ driCreateNewDrawable(__DRIscreen *psp,
     dri_get_drawable(pdp);
 
     if (!driDriverAPI.CreateBuffer(psp, pdp, &config->modes, GL_FALSE)) {
-       FREE(pdp);
+       free(pdp);
        return NULL;
     }
 
@@ -288,12 +366,9 @@ const __DRIcoreExtension driCoreExtension = {
 };
 
 const __DRIswrastExtension driSWRastExtension = {
-    /* Force the version to 2 because the underlying driver don't (can't!)
-     * support the extra requirements of CreateContextAttribs.
-     */
-    { __DRI_SWRAST, 2 },
+    { __DRI_SWRAST, __DRI_SWRAST_VERSION },
     driCreateNewScreen,
     driCreateNewDrawable,
     driCreateNewContextForAPI,
-    NULL
+    driCreateContextAttribs
 };