radeon-gallium: Use FLINK to do proper global buffers.

This commit is contained in:
Corbin Simpson
2009-07-05 11:55:47 -07:00
parent df04e72d25
commit c8e0d55ac6
3 changed files with 26 additions and 2 deletions
@@ -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;
@@ -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;
@@ -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;
}