Mesa (gallium-winsys-handle): i965g: Work in progress conversion to winsys handle

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Wed Feb 17 21:56:58 UTC 2010


Module: Mesa
Branch: gallium-winsys-handle
Commit: 30de87adbda336d71c535af69d88e6cd27cbf675
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=30de87adbda336d71c535af69d88e6cd27cbf675

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Wed Feb 17 21:45:41 2010 +0000

i965g: Work in progress conversion to winsys handle

At least now it compiles, all thats left is the driver stuff.

---

 src/gallium/winsys/drm/i965/gem/i965_drm_api.c    |  126 ---------------------
 src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c |   71 ++++++++++++
 2 files changed, 71 insertions(+), 126 deletions(-)

diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_api.c b/src/gallium/winsys/drm/i965/gem/i965_drm_api.c
index a061eef..21e8230 100644
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_api.c
+++ b/src/gallium/winsys/drm/i965/gem/i965_drm_api.c
@@ -37,129 +37,6 @@ i965_libdrm_get_device_id(unsigned int *device_id)
    fclose(file);
 }
 
-static struct i965_libdrm_buffer *
-i965_libdrm_buffer_from_handle(struct i965_libdrm_winsys *idws,
-                               const char* name, unsigned handle)
-{
-   struct i965_libdrm_buffer *buf = CALLOC_STRUCT(i965_libdrm_buffer);
-   uint32_t swizzle = 0;
-
-   if (BRW_DUMP)
-      debug_printf("%s\n", __FUNCTION__);
-
-   if (!buf)
-      return NULL;
-   pipe_reference_init(&buf->base.reference, 1);
-   buf->bo = drm_intel_bo_gem_create_from_name(idws->gem, name, handle);
-   buf->base.size = buf->bo->size;
-   buf->base.sws = &idws->base;
-   buf->flinked = TRUE;
-   buf->flink = handle;
-
-
-   if (!buf->bo)
-      goto err;
-
-   drm_intel_bo_get_tiling(buf->bo, &buf->tiling, &swizzle);
-   if (buf->tiling != 0)
-      buf->map_gtt = TRUE;
-
-   return buf;
-
-err:
-   FREE(buf);
-   return NULL;
-}
-
-
-/*
- * Exported functions
- */
-
-
-static struct pipe_texture *
-i965_libdrm_texture_from_shared_handle(struct drm_api *api,
-                                       struct pipe_screen *screen,
-                                       struct pipe_texture *template,
-                                       const char* name,
-                                       unsigned pitch,
-                                       unsigned handle)
-{
-   /* XXX: this is silly -- there should be a way to get directly from
-    * the "drm_api" struct to ourselves, without peering into
-    * unrelated code:
-    */
-   struct i965_libdrm_winsys *idws = i965_libdrm_winsys(brw_screen(screen)->sws);
-   struct i965_libdrm_buffer *buffer;
-
-   if (BRW_DUMP)
-      debug_printf("%s %s pitch %d handle 0x%x\n", __FUNCTION__,
-		   name, pitch, handle);
-
-   buffer = i965_libdrm_buffer_from_handle(idws, name, handle);
-   if (!buffer)
-      return NULL;
-
-   return brw_texture_blanket_winsys_buffer(screen, template, pitch,
-					    buffer->tiling,
-					    &buffer->base);
-}
-
-
-static boolean
-i965_libdrm_shared_handle_from_texture(struct drm_api *api,
-                                       struct pipe_screen *screen,
-                                       struct pipe_texture *texture,
-                                       unsigned *pitch,
-                                       unsigned *handle)
-{
-   struct i965_libdrm_buffer *buf = NULL;
-   struct brw_winsys_buffer *buffer = NULL;
-
-   if (BRW_DUMP)
-      debug_printf("%s\n", __FUNCTION__);
-
-   if (!brw_texture_get_winsys_buffer(texture, &buffer, pitch))
-      return FALSE;
-
-   buf = i965_libdrm_buffer(buffer);
-   if (!buf->flinked) {
-      if (drm_intel_bo_flink(buf->bo, &buf->flink))
-         return FALSE;
-      buf->flinked = TRUE;
-   }
-
-   *handle = buf->flink;
-
-   if (BRW_DUMP)
-      debug_printf("   -> pitch %d handle 0x%x\n", *pitch, *handle);
-
-   return TRUE;
-}
-
-static boolean
-i965_libdrm_local_handle_from_texture(struct drm_api *api,
-                                      struct pipe_screen *screen,
-                                      struct pipe_texture *texture,
-                                      unsigned *pitch,
-                                      unsigned *handle)
-{
-   struct brw_winsys_buffer *buffer = NULL;
-
-   if (BRW_DUMP)
-      debug_printf("%s\n", __FUNCTION__);
-
-   if (!brw_texture_get_winsys_buffer(texture, &buffer, pitch))
-      return FALSE;
-
-   *handle = i965_libdrm_buffer(buffer)->bo->handle;
-
-   if (BRW_DUMP)
-      debug_printf("   -> pitch %d handle 0x%x\n", *pitch, *handle);
-
-   return TRUE;
-}
-
 static void
 i965_libdrm_winsys_destroy(struct brw_winsys_screen *iws)
 {
@@ -225,9 +102,6 @@ struct drm_api i965_libdrm_api =
 {
    .name = "i965",
    .create_screen = i965_libdrm_create_screen,
-   .texture_from_shared_handle = i965_libdrm_texture_from_shared_handle,
-   .shared_handle_from_texture = i965_libdrm_shared_handle_from_texture,
-   .local_handle_from_texture = i965_libdrm_local_handle_from_texture,
    .destroy = destroy,
 };
 
diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c b/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c
index 07be1df..cd6c671 100644
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c
+++ b/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c
@@ -1,4 +1,5 @@
 
+#include "state_tracker/drm_api.h"
 #include "i965_drm_winsys.h"
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
@@ -122,6 +123,76 @@ err:
    return PIPE_ERROR_OUT_OF_MEMORY;
 }
 
+static enum pipe_error
+i965_libdrm_buffer_from_handle(struct brw_winsys_screen *sws,
+                               struct winsys_handle *whandle,
+                               unsigned *stride,
+                               struct brw_winsys_buffer **bo_out)
+{
+   struct i965_libdrm_winsys *idws = i965_libdrm_winsys(sws);
+   struct i965_libdrm_buffer *buf = CALLOC_STRUCT(i965_libdrm_buffer);
+   uint32_t swizzle = 0;
+
+   if (BRW_DUMP)
+      debug_printf("%s\n", __FUNCTION__);
+
+   if (!buf)
+      return PIPE_ERROR_OUT_OF_MEMORY;
+
+   pipe_reference_init(&buf->base.reference, 1);
+   buf->bo = drm_intel_bo_gem_create_from_name(idws->gem, "FROM_HANDLE", whandle->handle);
+   buf->base.size = buf->bo->size;
+   buf->base.sws = &idws->base;
+   buf->flinked = TRUE;
+   buf->flink = whandle->handle;
+
+
+   if (!buf->bo)
+      goto err;
+
+   drm_intel_bo_get_tiling(buf->bo, &buf->tiling, &swizzle);
+   if (buf->tiling != 0)
+      buf->map_gtt = TRUE;
+
+   *stride = whandle->stride;
+
+   *bo_out = &buf->base;
+   return PIPE_OK;
+
+err:
+   FREE(buf);
+   return PIPE_ERROR_OUT_OF_MEMORY;
+}
+
+static enum pipe_error
+i965_libdrm_buffer_get_handle(struct brw_winsys_buffer *buffer,
+                              struct winsys_handle *whandle,
+                              unsigned stride)
+{
+   struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+
+   if (BRW_DUMP)
+      debug_printf("%s\n", __FUNCTION__);
+
+   if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
+      if (!buf->flinked) {
+         if (drm_intel_bo_flink(buf->bo, &buf->flink))
+            return PIPE_ERROR_BAD_INPUT;
+         buf->flinked = TRUE;
+      }
+
+      whandle->handle = buf->flink;
+   } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
+      whandle->handle = buf->bo->handle;
+   } else {
+      assert(!"unknown usage");
+      return PIPE_ERROR_BAD_INPUT;
+   }
+
+   whandle->stride = stride;
+   return PIPE_OK;
+}
+
 static void 
 i965_libdrm_bo_destroy(struct brw_winsys_buffer *buffer)
 {




More information about the mesa-commit mailing list