dri: Merge drisw_util.c into dri_util.c
[mesa.git] / src / mesa / drivers / dri / common / dri_util.c
index fec05a0c20e93f2d8e396ae4b83c8b7eefc300c6..424b65d7a2fc10ff48db199146bd81f46ba0a7da 100644 (file)
@@ -39,7 +39,9 @@
  */
 
 
+#ifndef __NOT_HAVE_DRM_H
 #include <xf86drm.h>
+#endif
 #include "dri_util.h"
 #include "utils.h"
 #include "xmlpool.h"
@@ -70,6 +72,8 @@ setupLoaderExtensions(__DRIscreen *psp,
            psp->dri2.image = (__DRIimageLookupExtension *) extensions[i];
        if (strcmp(extensions[i]->name, __DRI_USE_INVALIDATE) == 0)
            psp->dri2.useInvalidate = (__DRIuseInvalidateExtension *) extensions[i];
+       if (strcmp(extensions[i]->name, __DRI_SWRAST_LOADER) == 0)
+           psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i];
     }
 }
 
@@ -87,7 +91,6 @@ dri2CreateNewScreen(int scrn, int fd,
 {
     static const __DRIextension *emptyExtensionList[] = { NULL };
     __DRIscreen *psp;
-    drmVersionPtr version;
 
     psp = calloc(1, sizeof(*psp));
     if (!psp)
@@ -95,13 +98,17 @@ dri2CreateNewScreen(int scrn, int fd,
 
     setupLoaderExtensions(psp, extensions);
 
-    version = drmGetVersion(fd);
-    if (version) {
-       psp->drm_version.major = version->version_major;
-       psp->drm_version.minor = version->version_minor;
-       psp->drm_version.patch = version->version_patchlevel;
-       drmFreeVersion(version);
+#ifndef __NOT_HAVE_DRM_H
+    if (fd != -1) {
+       drmVersionPtr version = drmGetVersion(fd);
+       if (version) {
+          psp->drm_version.major = version->version_major;
+          psp->drm_version.minor = version->version_minor;
+          psp->drm_version.patch = version->version_patchlevel;
+          drmFreeVersion(version);
+       }
     }
+#endif
 
     psp->loaderPrivate = data;
 
@@ -123,6 +130,14 @@ dri2CreateNewScreen(int scrn, int fd,
     return psp;
 }
 
+/** swrast driver createNewScreen entrypoint. */
+static __DRIscreen *
+driCreateNewScreen(int scrn, const __DRIextension **extensions,
+                  const __DRIconfig ***driver_configs, void *data)
+{
+   return dri2CreateNewScreen(scrn, -1, extensions, driver_configs, data);
+}
+
 /**
  * Destroy the per-screen private information.
  * 
@@ -562,6 +577,19 @@ dri2GetAPIMask(__DRIscreen *screen)
     return screen->api_mask;
 }
 
+/**
+ * swrast swapbuffers entrypoint.
+ *
+ * DRI2 implements this inside the loader with only flushes handled by the
+ * driver.
+ */
+static void
+driSwapBuffers(__DRIdrawable *pdp)
+{
+    assert(pdp->driScreenPriv->swrast_loader);
+
+    driDriverAPI.SwapBuffers(pdp);
+}
 
 /** Core interface */
 const __DRIcoreExtension driCoreExtension = {
@@ -574,8 +602,8 @@ const __DRIcoreExtension driCoreExtension = {
     .indexConfigAttrib          = driIndexConfigAttrib,
     .createNewDrawable          = NULL,
     .destroyDrawable            = driDestroyDrawable,
-    .swapBuffers                = NULL,
-    .createNewContext           = NULL,
+    .swapBuffers                = driSwapBuffers, /* swrast */
+    .createNewContext           = dri2CreateNewContext, /* swrast */
     .copyContext                = driCopyContext,
     .destroyContext             = driDestroyContext,
     .bindContext                = driBindContext,
@@ -596,6 +624,14 @@ const __DRIdri2Extension driDRI2Extension = {
     .createContextAttribs       = dri2CreateContextAttribs
 };
 
+const __DRIswrastExtension driSWRastExtension = {
+    { __DRI_SWRAST, __DRI_SWRAST_VERSION },
+    driCreateNewScreen,
+    dri2CreateNewDrawable,
+    dri2CreateNewContextForAPI,
+    dri2CreateContextAttribs
+};
+
 const __DRI2configQueryExtension dri2ConfigQueryExtension = {
    .base = { __DRI2_CONFIG_QUERY, __DRI2_CONFIG_QUERY_VERSION },