Merge branch 'mesa_7_6_branch'
[mesa.git] / src / gallium / winsys / drm / radeon / core / radeon_drm.c
index d6e4e4b5eb11c90143424ff733bf88053f2c618d..a4011db0b87df41785be89ce4de387af0a60723d 100644 (file)
 /*
  * Authors:
  *      Corbin Simpson <MostAwesomeDude@gmail.com>
+ *      Joakim Sindholt <opensource@zhasha.com>
  */
 
 #include "radeon_drm.h"
-#include "trace/tr_drm.h"
-
-#include "r300_screen.h"
-#include "xf86drm.h"
-
-#include <sys/ioctl.h>
 
 /* Create a pipe_screen. */
 struct pipe_screen* radeon_create_screen(struct drm_api* api,
                                          int drmFB,
-                                        struct drm_create_screen_arg *arg)
+                                         struct drm_create_screen_arg *arg)
 {
     struct radeon_winsys* winsys = radeon_pipe_winsys(drmFB);
 
@@ -59,7 +54,8 @@ struct pipe_context* radeon_create_context(struct drm_api* api,
     if (getenv("RADEON_SOFTPIPE")) {
         return radeon_create_softpipe(screen->winsys);
     } else {
-        return r300_create_context(screen, screen->winsys);
+        return r300_create_context(screen,
+                                   (struct r300_winsys*)screen->winsys);
     }
 }
 
@@ -102,27 +98,40 @@ struct pipe_buffer* radeon_buffer_from_handle(struct drm_api* api,
     return &radeon_buffer->base;
 }
 
-boolean radeon_handle_from_buffer(struct drm_api* api,
-                                  struct pipe_screen* screen,
-                                  struct pipe_buffer* buffer,
-                                  unsigned* handle)
+static struct pipe_texture*
+radeon_texture_from_shared_handle(struct drm_api *api,
+                                  struct pipe_screen *screen,
+                                  struct pipe_texture *templ,
+                                  const char *name,
+                                  unsigned stride,
+                                  unsigned handle)
 {
-    struct radeon_pipe_buffer* radeon_buffer =
-        (struct radeon_pipe_buffer*)buffer;
-    *handle = radeon_buffer->bo->handle;
-    return TRUE;
+    struct pipe_buffer *buffer;
+
+    buffer = radeon_buffer_from_handle(api, screen, name, handle);
+    if (!buffer) {
+        return NULL;
+    }
+
+    return screen->texture_blanket(screen, templ, &stride, buffer);
 }
 
-boolean radeon_global_handle_from_buffer(struct drm_api* api,
-                                         struct pipe_screen* screen,
-                                         struct pipe_buffer* buffer,
-                                         unsigned* handle)
+static boolean radeon_shared_handle_from_texture(struct drm_api *api,
+                                                 struct pipe_screen *screen,
+                                                 struct pipe_texture *texture,
+                                                 unsigned *stride,
+                                                 unsigned *handle)
 {
     int retval, fd;
     struct drm_gem_flink flink;
-    struct radeon_pipe_buffer* radeon_buffer =
-        (struct radeon_pipe_buffer*)buffer;
+    struct radeon_pipe_buffer* radeon_buffer;
+    struct pipe_buffer *buffer;
+
+    if (!radeon_buffer_from_texture(api, texture, &buffer, stride)) {
+        return FALSE;
+    }
 
+    radeon_buffer = (struct radeon_pipe_buffer*)buffer;
     if (!radeon_buffer->flinked) {
         fd = ((struct radeon_winsys*)screen->winsys)->priv->fd;
 
@@ -143,13 +152,30 @@ boolean radeon_global_handle_from_buffer(struct drm_api* api,
     return TRUE;
 }
 
+static boolean radeon_local_handle_from_texture(struct drm_api *api,
+                                                struct pipe_screen *screen,
+                                                struct pipe_texture *texture,
+                                                unsigned *stride,
+                                                unsigned *handle)
+{
+    struct pipe_buffer *buffer;
+    if (!radeon_buffer_from_texture(api, texture, &buffer, stride)) {
+        return FALSE;
+    }
+
+    *handle = ((struct radeon_pipe_buffer*)buffer)->bo->handle;
+
+    pipe_buffer_reference(&buffer, NULL);
+
+    return TRUE;
+}
+
 struct drm_api drm_api_hooks = {
     .create_screen = radeon_create_screen,
     .create_context = radeon_create_context,
-    .buffer_from_texture = radeon_buffer_from_texture,
-    .buffer_from_handle = radeon_buffer_from_handle,
-    .handle_from_buffer = radeon_handle_from_buffer,
-    .global_handle_from_buffer = radeon_global_handle_from_buffer,
+    .texture_from_shared_handle = radeon_texture_from_shared_handle,
+    .shared_handle_from_texture = radeon_shared_handle_from_texture,
+    .local_handle_from_texture = radeon_local_handle_from_texture,
 };
 
 struct drm_api* drm_api_create()