Mesa (master): radeon-gallium: Use FLINK to do proper global buffers.
Corbin Simpson
csimpson at kemper.freedesktop.org
Sun Jul 5 19:02:03 UTC 2009
Module: Mesa
Branch: master
Commit: c8e0d55ac6e7fcb778a8e884e27b84dba10fa5db
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c8e0d55ac6e7fcb778a8e884e27b84dba10fa5db
Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date: Sun Jul 5 11:55:47 2009 -0700
radeon-gallium: Use FLINK to do proper global buffers.
---
src/gallium/winsys/drm/radeon/core/radeon_buffer.c | 1 +
src/gallium/winsys/drm/radeon/core/radeon_buffer.h | 5 ++++
src/gallium/winsys/drm/radeon/core/radeon_drm.c | 22 ++++++++++++++++++-
3 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_buffer.c b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
index 93748e2..263f684 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
@@ -200,6 +200,7 @@ struct radeon_winsys* radeon_pipe_winsys(int fd)
return NULL;
}
+ radeon_ws->priv->fd = fd;
radeon_ws->priv->bom = radeon_bo_manager_gem_ctor(fd);
radeon_ws->base.flush_frontbuffer = radeon_flush_frontbuffer;
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_buffer.h b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
index ca8bbb3..14c463d 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.h
@@ -48,11 +48,16 @@
struct radeon_pipe_buffer {
struct pipe_buffer base;
struct radeon_bo *bo;
+ boolean flinked;
+ uint32_t flink;
};
#define RADEON_MAX_BOS 24
struct radeon_winsys_priv {
+ /* DRM FD */
+ int fd;
+
/* Radeon BO manager. */
struct radeon_bo_manager* bom;
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_drm.c b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
index 4cad960..8561e12 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_drm.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_drm.c
@@ -113,10 +113,28 @@ boolean radeon_global_handle_from_buffer(struct drm_api* api,
struct pipe_buffer* buffer,
unsigned* handle)
{
- /* XXX WTF is the difference here? global? */
+ int retval, fd;
+ struct drm_gem_flink flink;
struct radeon_pipe_buffer* radeon_buffer =
(struct radeon_pipe_buffer*)buffer;
- *handle = radeon_buffer->bo->handle;
+
+ if (!radeon_buffer->flinked) {
+ fd = ((struct radeon_winsys*)screen->winsys)->priv->fd;
+
+ flink.handle = radeon_buffer->bo->handle;
+
+ retval = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
+ if (retval) {
+ debug_printf("radeon: DRM_IOCTL_GEM_FLINK failed, error %d\n",
+ retval);
+ return FALSE;
+ }
+
+ radeon_buffer->flink = flink.name;
+ radeon_buffer->flinked = TRUE;
+ }
+
+ *handle = radeon_buffer->flink;
return TRUE;
}
More information about the mesa-commit
mailing list