i915g: Conversion to winsys handle
authorJakob Bornecrantz <jakob@vmware.com>
Wed, 17 Feb 2010 21:28:01 +0000 (21:28 +0000)
committerJakob Bornecrantz <jakob@vmware.com>
Mon, 1 Mar 2010 16:05:40 +0000 (16:05 +0000)
src/gallium/drivers/i915/i915_texture.c
src/gallium/drivers/i915/intel_winsys.h
src/gallium/winsys/drm/intel/gem/intel_drm_api.c
src/gallium/winsys/drm/intel/gem/intel_drm_buffer.c

index 5ad65a2e9c8a0c85f7d4e538d178218df735b3ce..334959c46da378f8f0e1dd71d5d449b9b36cd9ff 100644 (file)
@@ -672,6 +672,58 @@ fail:
    return NULL;
 }
 
+static struct pipe_texture *
+i915_texture_from_handle(struct pipe_screen * screen,
+                         const struct pipe_texture *templat,
+                         struct winsys_handle *whandle)
+{
+   struct i915_screen *is = i915_screen(screen);
+   struct i915_texture *tex;
+   struct intel_winsys *iws = is->iws;
+   struct intel_buffer *buffer;
+   unsigned stride;
+
+   assert(screen);
+
+   buffer = iws->buffer_from_handle(iws, whandle, &stride);
+
+   /* Only supports one type */
+   if (templat->target != PIPE_TEXTURE_2D ||
+       templat->last_level != 0 ||
+       templat->depth0 != 1) {
+      return NULL;
+   }
+
+   tex = CALLOC_STRUCT(i915_texture);
+   if (!tex)
+      return NULL;
+
+   tex->base = *templat;
+   pipe_reference_init(&tex->base.reference, 1);
+   tex->base.screen = screen;
+
+   tex->stride = stride;
+
+   i915_miptree_set_level_info(tex, 0, 1, templat->width0, templat->height0, 1);
+   i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
+
+   tex->buffer = buffer;
+
+   return &tex->base;
+}
+
+static boolean
+i915_texture_get_handle(struct pipe_screen * screen,
+                        struct pipe_texture *texture,
+                        struct winsys_handle *whandle)
+{
+   struct i915_screen *is = i915_screen(screen);
+   struct i915_texture *tex = (struct i915_texture *)texture;
+   struct intel_winsys *iws = is->iws;
+
+   return iws->buffer_get_handle(iws, tex->buffer, whandle, tex->stride);
+}
+
 static struct pipe_texture *
 i915_texture_blanket(struct pipe_screen * screen,
                      const struct pipe_texture *base,
@@ -869,6 +921,8 @@ void
 i915_init_screen_texture_functions(struct i915_screen *is)
 {
    is->base.texture_create = i915_texture_create;
+   is->base.texture_from_handle = i915_texture_from_handle;
+   is->base.texture_get_handle = i915_texture_get_handle;
    is->base.texture_blanket = i915_texture_blanket;
    is->base.texture_destroy = i915_texture_destroy;
    is->base.get_tex_surface = i915_get_tex_surface;
@@ -878,53 +932,3 @@ i915_init_screen_texture_functions(struct i915_screen *is)
    is->base.transfer_unmap = i915_transfer_unmap;
    is->base.tex_transfer_destroy = i915_tex_transfer_destroy;
 }
-
-struct pipe_texture *
-i915_texture_blanket_intel(struct pipe_screen *screen,
-                           struct pipe_texture *base,
-                           unsigned stride,
-                           struct intel_buffer *buffer)
-{
-   struct i915_texture *tex;
-   assert(screen);
-
-   /* Only supports one type */
-   if (base->target != PIPE_TEXTURE_2D ||
-       base->last_level != 0 ||
-       base->depth0 != 1) {
-      return NULL;
-   }
-
-   tex = CALLOC_STRUCT(i915_texture);
-   if (!tex)
-      return NULL;
-
-   tex->base = *base;
-   pipe_reference_init(&tex->base.reference, 1);
-   tex->base.screen = screen;
-
-   tex->stride = stride;
-
-   i915_miptree_set_level_info(tex, 0, 1, base->width0, base->height0, 1);
-   i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
-
-   tex->buffer = buffer;
-
-   return &tex->base;
-}
-
-boolean
-i915_get_texture_buffer_intel(struct pipe_texture *texture,
-                              struct intel_buffer **buffer,
-                              unsigned *stride)
-{
-   struct i915_texture *tex = (struct i915_texture *)texture;
-
-   if (!texture)
-      return FALSE;
-
-   *stride = tex->stride;
-   *buffer = tex->buffer;
-
-   return TRUE;
-}
index b3a802b0e293ec2eb1a2d4e8ad3b52b79102fc2c..00fd0c1efea4a1135aa74dd941240a93068061ca 100644 (file)
@@ -33,6 +33,7 @@ struct intel_buffer;
 struct intel_batchbuffer;
 struct pipe_texture;
 struct pipe_fence_handle;
+struct winsys_handle;
 
 enum intel_buffer_usage
 {
@@ -128,6 +129,25 @@ struct intel_winsys {
                                          unsigned size, unsigned alignment,
                                          enum intel_buffer_type type);
 
+   /**
+    * Creates a buffer from a handle.
+    * Used to implement pipe_screen::texture_from_handle.
+    * Also provides the stride information needed for the
+    * texture via the stride argument.
+    */
+   struct intel_buffer *(*buffer_from_handle)(struct intel_winsys *iws,
+                                              struct winsys_handle *whandle,
+                                              unsigned *stride);
+
+   /**
+    * Used to implement pipe_screen::texture_get_handle.
+    * The winsys might need the stride information.
+    */
+   boolean (*buffer_get_handle)(struct intel_winsys *iws,
+                                struct intel_buffer *buffer,
+                                struct winsys_handle *whandle,
+                                unsigned stride);
+
    /**
     * Fence a buffer with a fence reg.
     * Not to be confused with pipe_fence_handle.
@@ -204,23 +224,4 @@ struct intel_winsys {
 struct pipe_screen *i915_create_screen(struct intel_winsys *iws, unsigned pci_id);
 
 
-/**
- * Get the intel_winsys buffer backing the texture.
- *
- * TODO UGLY
- */
-boolean i915_get_texture_buffer_intel(struct pipe_texture *texture,
-                                      struct intel_buffer **buffer,
-                                      unsigned *stride);
-
-/**
- * Wrap a intel_winsys buffer with a texture blanket.
- *
- * TODO UGLY
- */
-struct pipe_texture * i915_texture_blanket_intel(struct pipe_screen *screen,
-                                                 struct pipe_texture *tmplt,
-                                                 unsigned pitch,
-                                                 struct intel_buffer *buffer);
-
 #endif
index 377ed2551311204e0cc4ac69c6b6a7a7322de622..e3b980a832b480e34b8cf4112c60e86a7f534d55 100644 (file)
@@ -38,99 +38,6 @@ intel_drm_get_device_id(unsigned int *device_id)
    fclose(file);
 }
 
-static struct intel_buffer *
-intel_drm_buffer_from_handle(struct intel_drm_winsys *idws,
-                             const char* name, unsigned handle)
-{
-   struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
-   uint32_t tile = 0, swizzle = 0;
-
-   if (!buf)
-      return NULL;
-
-   buf->magic = 0xDEAD1337;
-   buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, name, handle);
-   buf->flinked = TRUE;
-   buf->flink = handle;
-
-   if (!buf->bo)
-      goto err;
-
-   drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
-   if (tile != INTEL_TILE_NONE)
-      buf->map_gtt = TRUE;
-
-   return (struct intel_buffer *)buf;
-
-err:
-   FREE(buf);
-   return NULL;
-}
-
-
-/*
- * Exported functions
- */
-
-
-static struct pipe_texture *
-intel_drm_texture_from_shared_handle(struct drm_api *api,
-                                     struct pipe_screen *screen,
-                                     struct pipe_texture *templ,
-                                     const char* name,
-                                     unsigned pitch,
-                                     unsigned handle)
-{
-   struct intel_drm_winsys *idws = intel_drm_winsys(i915_screen(screen)->iws);
-   struct intel_buffer *buffer;
-
-   buffer = intel_drm_buffer_from_handle(idws, name, handle);
-   if (!buffer)
-      return NULL;
-
-   return i915_texture_blanket_intel(screen, templ, pitch, buffer);
-}
-
-static boolean
-intel_drm_shared_handle_from_texture(struct drm_api *api,
-                                     struct pipe_screen *screen,
-                                     struct pipe_texture *texture,
-                                     unsigned *pitch,
-                                     unsigned *handle)
-{
-   struct intel_drm_buffer *buf = NULL;
-   struct intel_buffer *buffer = NULL;
-   if (!i915_get_texture_buffer_intel(texture, &buffer, pitch))
-      return FALSE;
-
-   buf = intel_drm_buffer(buffer);
-   if (!buf->flinked) {
-      if (drm_intel_bo_flink(buf->bo, &buf->flink))
-         return FALSE;
-      buf->flinked = TRUE;
-   }
-
-   *handle = buf->flink;
-
-   return TRUE;
-}
-
-static boolean
-intel_drm_local_handle_from_texture(struct drm_api *api,
-                                    struct pipe_screen *screen,
-                                    struct pipe_texture *texture,
-                                    unsigned *pitch,
-                                    unsigned *handle)
-{
-   struct intel_buffer *buffer = NULL;
-   if (!i915_get_texture_buffer_intel(texture, &buffer, pitch))
-      return FALSE;
-
-   *handle = intel_drm_buffer(buffer)->bo->handle;
-
-   return TRUE;
-}
-
 static void
 intel_drm_winsys_destroy(struct intel_winsys *iws)
 {
@@ -192,9 +99,6 @@ struct drm_api intel_drm_api =
    .name = "i915",
    .driver_name = "i915",
    .create_screen = intel_drm_create_screen,
-   .texture_from_shared_handle = intel_drm_texture_from_shared_handle,
-   .shared_handle_from_texture = intel_drm_shared_handle_from_texture,
-   .local_handle_from_texture = intel_drm_local_handle_from_texture,
    .destroy = destroy,
 };
 
index ac4dd6e00e94ca2e8844131cffdf70a5237b3570..cb4f92a3b1711be55d9e3334f1e918bf5b40e1b4 100644 (file)
@@ -1,4 +1,5 @@
 
+#include "state_tracker/drm_api.h"
 #include "intel_drm_winsys.h"
 #include "util/u_memory.h"
 
@@ -52,6 +53,66 @@ err:
    return NULL;
 }
 
+static struct intel_buffer *
+intel_drm_buffer_from_handle(struct intel_winsys *iws,
+                             struct winsys_handle *whandle,
+                             unsigned *stride)
+{
+   struct intel_drm_winsys *idws = intel_drm_winsys(iws);
+   struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
+   uint32_t tile = 0, swizzle = 0;
+
+   if (!buf)
+      return NULL;
+
+   buf->magic = 0xDEAD1337;
+   buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, "gallium3d_from_handle", whandle->handle);
+   buf->flinked = TRUE;
+   buf->flink = whandle->handle;
+
+   if (!buf->bo)
+      goto err;
+
+   drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
+   if (tile != INTEL_TILE_NONE)
+      buf->map_gtt = TRUE;
+
+   *stride = whandle->stride;
+
+   return (struct intel_buffer *)buf;
+
+err:
+   FREE(buf);
+   return NULL;
+}
+
+static boolean
+intel_drm_buffer_get_handle(struct intel_winsys *iws,
+                            struct intel_buffer *buffer,
+                            struct winsys_handle *whandle,
+                            unsigned stride)
+{
+   struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
+
+   if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
+      if (!buf->flinked) {
+         if (drm_intel_bo_flink(buf->bo, &buf->flink))
+            return FALSE;
+         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 FALSE;
+   }
+
+   whandle->stride = stride;
+   return TRUE;
+}
+
 static int
 intel_drm_buffer_set_fence_reg(struct intel_winsys *iws,
                                struct intel_buffer *buffer,
@@ -146,6 +207,8 @@ void
 intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws)
 {
    idws->base.buffer_create = intel_drm_buffer_create;
+   idws->base.buffer_from_handle = intel_drm_buffer_from_handle;
+   idws->base.buffer_get_handle = intel_drm_buffer_get_handle;
    idws->base.buffer_set_fence_reg = intel_drm_buffer_set_fence_reg;
    idws->base.buffer_map = intel_drm_buffer_map;
    idws->base.buffer_unmap = intel_drm_buffer_unmap;