identity: Create a drm_api wrapper
authorJakob Bornecrantz <jakob@vmware.com>
Tue, 30 Jun 2009 09:57:29 +0000 (11:57 +0200)
committerJakob Bornecrantz <jakob@vmware.com>
Tue, 30 Jun 2009 10:24:47 +0000 (12:24 +0200)
src/gallium/drivers/identity/Makefile
src/gallium/drivers/identity/id_drm.c [new file with mode: 0644]
src/gallium/drivers/identity/id_drm.h [new file with mode: 0644]
src/gallium/winsys/drm/intel/dri/Makefile
src/gallium/winsys/drm/intel/gem/intel_be_api.c

index 74692d976105a7ae8e0599e32bdd7760911c5505..e32b9102e597cddca45bc9b617a546d0a89040ff 100644 (file)
@@ -6,6 +6,7 @@ LIBNAME = identity
 C_SOURCES = \
        id_objects.c \
        id_context.c \
-       id_screen.c
+       id_screen.c \
+       id_drm.c
 
 include ../../Makefile.template
diff --git a/src/gallium/drivers/identity/id_drm.c b/src/gallium/drivers/identity/id_drm.c
new file mode 100644 (file)
index 0000000..555220f
--- /dev/null
@@ -0,0 +1,187 @@
+/**************************************************************************
+ *
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * 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 NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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.
+ *
+ **************************************************************************/
+
+#include "state_tracker/drm_api.h"
+
+#include "util/u_memory.h"
+#include "identity/id_drm.h"
+#include "identity/id_public.h"
+#include "identity/id_screen.h"
+#include "identity/id_objects.h"
+
+struct identity_drm_api
+{
+   struct drm_api base;
+
+   struct drm_api *api;
+};
+
+static INLINE struct identity_drm_api *
+identity_drm_api(struct drm_api *_api)
+{
+   return (struct identity_drm_api *)_api;
+}
+
+static struct pipe_screen *
+identity_drm_create_screen(struct drm_api *_api, int fd,
+                           struct drm_create_screen_arg *arg)
+{
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct drm_api *api = id_api->api;
+   struct pipe_screen *screen;
+
+   if (arg && arg->mode != DRM_CREATE_NORMAL)
+      return NULL;
+
+   screen = api->create_screen(api, fd, arg);
+
+   return identity_screen_create(screen);
+};
+
+static struct pipe_context *
+identity_drm_create_context(struct drm_api *_api,
+                            struct pipe_screen *_screen)
+{
+   struct identity_screen *id_screen = identity_screen(_screen);
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct pipe_screen *screen = id_screen->screen;
+   struct drm_api *api = id_api->api;
+   struct pipe_context *pipe;
+
+   pipe = api->create_context(api, screen);
+
+   pipe = identity_context_create(_screen, pipe);
+
+   return pipe;
+};
+
+static boolean
+identity_drm_buffer_from_texture(struct drm_api *_api,
+                                 struct pipe_texture *_texture,
+                                 struct pipe_buffer **_buffer,
+                                 unsigned *stride)
+{
+   struct identity_texture *id_texture = identity_texture(_texture);
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct pipe_texture *texture = id_texture->texture;
+   struct drm_api *api = id_api->api;
+   struct pipe_buffer *buffer = NULL;
+   boolean result;
+
+   result = api->buffer_from_texture(api, texture, &buffer, stride);
+
+   if (result && _buffer)
+      buffer = identity_buffer_create(identity_screen(texture->screen), buffer);
+
+   if (_buffer)
+      *_buffer = buffer;
+   else
+      pipe_buffer_reference(&buffer, NULL);
+
+   return result;
+}
+
+static struct pipe_buffer *
+identity_drm_buffer_from_handle(struct drm_api *_api,
+                                struct pipe_screen *_screen,
+                                const char *name,
+                                unsigned handle)
+{
+   struct identity_screen *id_screen = identity_screen(_screen);
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct pipe_screen *screen = id_screen->screen;
+   struct drm_api *api = id_api->api;
+   struct pipe_buffer *result;
+
+   result = api->buffer_from_handle(api, screen, name, handle);
+
+   result = identity_buffer_create(identity_screen(_screen), result);
+
+   return result;
+}
+
+static boolean
+identity_drm_handle_from_buffer(struct drm_api *_api,
+                                struct pipe_screen *_screen,
+                                struct pipe_buffer *_buffer,
+                                unsigned *handle)
+{
+   struct identity_screen *id_screen = identity_screen(_screen);
+   struct identity_buffer *id_buffer = identity_buffer(_buffer);
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct pipe_screen *screen = id_screen->screen;
+   struct pipe_buffer *buffer = id_buffer->buffer;
+   struct drm_api *api = id_api->api;
+
+   return api->handle_from_buffer(api, screen, buffer, handle);
+}
+
+static boolean
+identity_drm_global_handle_from_buffer(struct drm_api *_api,
+                                       struct pipe_screen *_screen,
+                                       struct pipe_buffer *_buffer,
+                                       unsigned *handle)
+{
+   struct identity_screen *id_screen = identity_screen(_screen);
+   struct identity_buffer *id_buffer = identity_buffer(_buffer);
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct pipe_screen *screen = id_screen->screen;
+   struct pipe_buffer *buffer = id_buffer->buffer;
+   struct drm_api *api = id_api->api;
+
+   return api->global_handle_from_buffer(api, screen, buffer, handle);
+}
+
+static void
+identity_drm_destroy(struct drm_api *_api)
+{
+   struct identity_drm_api *id_api = identity_drm_api(_api);
+   struct drm_api *api = id_api->api;
+   api->destroy(api);
+
+   free(id_api);
+}
+
+struct drm_api *
+identity_drm_create(struct drm_api *api)
+{
+   struct identity_drm_api *id_api = CALLOC_STRUCT(identity_drm_api);
+
+   if (!id_api)
+      return NULL;
+
+   id_api->base.create_screen = identity_drm_create_screen;
+   id_api->base.create_context = identity_drm_create_context;
+   id_api->base.buffer_from_texture = identity_drm_buffer_from_texture;
+   id_api->base.buffer_from_handle = identity_drm_buffer_from_handle;
+   id_api->base.handle_from_buffer = identity_drm_handle_from_buffer;
+   id_api->base.global_handle_from_buffer = identity_drm_global_handle_from_buffer;
+   id_api->base.destroy = identity_drm_destroy;
+   id_api->api = api;
+
+   return &id_api->base;
+}
diff --git a/src/gallium/drivers/identity/id_drm.h b/src/gallium/drivers/identity/id_drm.h
new file mode 100644 (file)
index 0000000..cf2ad2c
--- /dev/null
@@ -0,0 +1,35 @@
+/**************************************************************************
+ *
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * 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 NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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.
+ *
+ **************************************************************************/
+
+#ifndef ID_DRM_H
+#define ID_DRM_H
+
+struct drm_api;
+
+struct drm_api* identity_drm_create(struct drm_api *api);
+
+#endif /* ID_DRM_H */
index de39e759d87d9f69f26291eb8fc58f315641c6d2..5e212b62a4657c5cce3041eaeb578592c051e692 100644 (file)
@@ -8,6 +8,7 @@ PIPE_DRIVERS = \
        $(TOP)/src/gallium/winsys/drm/intel/gem/libinteldrm.a \
        $(TOP)/src/gallium/drivers/trace/libtrace.a \
        $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+       $(TOP)/src/gallium/drivers/identity/libidentity.a \
        $(TOP)/src/gallium/drivers/i915simple/libi915simple.a
 
 
index 4a1768a599a9de5dd246873002564cf7a8c44548..d22d11e7237018194f024e123bfecdb32c699803 100644 (file)
@@ -1,6 +1,7 @@
 
 #include "intel_be_api.h"
 #include "i915simple/i915_winsys.h"
+#include "identity/id_drm.h"
 
 static void destroy(struct drm_api *api)
 {
@@ -23,5 +24,9 @@ struct drm_api intel_be_drm_api =
 struct drm_api *
 drm_api_create()
 {
+#ifdef DEBUG
+       return identity_drm_create(&intel_be_drm_api);
+#else
        return &intel_be_drm_api;
+#endif
 }