X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fwinsys%2Fr600%2Fdrm%2Fradeon_bo.c;h=1d3766e55b57b275c6aa6458d6acec7cc509d7bc;hb=5229ba494b4b3f19085d13131a37626b914d4014;hp=51ce86497428f75e072845daa430d231fdcfce9a;hpb=da96313afe3cff66d8ae0c9675a6299b3d7510f9;p=mesa.git diff --git a/src/gallium/winsys/r600/drm/radeon_bo.c b/src/gallium/winsys/r600/drm/radeon_bo.c index 51ce8649742..1d3766e55b5 100644 --- a/src/gallium/winsys/r600/drm/radeon_bo.c +++ b/src/gallium/winsys/r600/drm/radeon_bo.c @@ -24,125 +24,48 @@ * Jerome Glisse */ #define _FILE_OFFSET_BITS 64 -#include -#include -#include +#include "r600_priv.h" +#include "util/u_hash_table.h" +#include "util/u_memory.h" +#include "radeon_drm.h" +#include "xf86drm.h" #include #include -#include "radeon_priv.h" -#include "xf86drm.h" -#include "radeon_drm.h" + +#include "state_tracker/drm_driver.h" struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle, - unsigned size, unsigned alignment, void *ptr) + unsigned size, unsigned alignment, unsigned bind, + unsigned initial_domain) { struct radeon_bo *bo; - int r; + struct winsys_handle whandle = {}; + whandle.handle = handle; bo = calloc(1, sizeof(*bo)); if (bo == NULL) { return NULL; } - bo->size = size; - bo->handle = handle; pipe_reference_init(&bo->reference, 1); - bo->alignment = alignment; if (handle) { - struct drm_gem_open open_arg; - - memset(&open_arg, 0, sizeof(open_arg)); - open_arg.name = handle; - r = drmIoctl(radeon->fd, DRM_IOCTL_GEM_OPEN, &open_arg); - if (r != 0) { - free(bo); - return NULL; - } - bo->handle = open_arg.handle; - bo->size = open_arg.size; + bo->buf = radeon->ws->buffer_from_handle(radeon->ws, &whandle, NULL, &size); } else { - struct drm_radeon_gem_create args; - - args.size = size; - args.alignment = alignment; - args.initial_domain = RADEON_GEM_DOMAIN_CPU; - args.flags = 0; - args.handle = 0; - r = drmCommandWriteRead(radeon->fd, DRM_RADEON_GEM_CREATE, - &args, sizeof(args)); - bo->handle = args.handle; - if (r) { - fprintf(stderr, "Failed to allocate :\n"); - fprintf(stderr, " size : %d bytes\n", size); - fprintf(stderr, " alignment : %d bytes\n", alignment); - free(bo); - return NULL; - } + bo->buf = radeon->ws->buffer_create(radeon->ws, size, alignment, bind, initial_domain); } - if (ptr) { - if (radeon_bo_map(radeon, bo)) { - fprintf(stderr, "%s failed to copy data into bo\n", __func__); - radeon_bo_reference(radeon, &bo, NULL); - return bo; - } - memcpy(bo->data, ptr, size); - radeon_bo_unmap(radeon, bo); + if (!bo->buf) { + FREE(bo); + return NULL; } + bo->cs_buf = radeon->ws->buffer_get_cs_handle(bo->buf); + bo->size = size; return bo; } -int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo) -{ - struct drm_radeon_gem_mmap args; - void *ptr; - int r; - - if (bo->map_count != 0) { - goto success; - } - /* Zero out args to make valgrind happy */ - memset(&args, 0, sizeof(args)); - args.handle = bo->handle; - args.offset = 0; - args.size = (uint64_t)bo->size; - r = drmCommandWriteRead(radeon->fd, DRM_RADEON_GEM_MMAP, - &args, sizeof(args)); - if (r) { - fprintf(stderr, "error mapping %p 0x%08X (error = %d)\n", - bo, bo->handle, r); - return r; - } - ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, radeon->fd, args.addr_ptr); - if (ptr == MAP_FAILED) { - fprintf(stderr, "%s failed to map bo\n", __func__); - return -errno; - } - bo->data = ptr; - -success: - bo->map_count++; - - return 0; -} - -void radeon_bo_unmap(struct radeon *radeon, struct radeon_bo *bo) -{ - if (--bo->map_count > 0) { - return; - } - munmap(bo->data, bo->size); - bo->data = NULL; -} - static void radeon_bo_destroy(struct radeon *radeon, struct radeon_bo *bo) { - struct drm_gem_close args; - - memset(&args, 0, sizeof(args)); - args.handle = bo->handle; - drmIoctl(radeon->fd, DRM_IOCTL_GEM_CLOSE, &args); - memset(bo, 0, sizeof(struct radeon_bo)); - free(bo); + pb_reference(&bo->buf, NULL); + FREE(bo); } void radeon_bo_reference(struct radeon *radeon, @@ -155,34 +78,3 @@ void radeon_bo_reference(struct radeon *radeon, } *dst = src; } - -int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo) -{ - struct drm_radeon_gem_wait_idle args; - int ret; - - /* Zero out args to make valgrind happy */ - memset(&args, 0, sizeof(args)); - args.handle = bo->handle; - do { - ret = drmCommandWriteRead(radeon->fd, DRM_RADEON_GEM_WAIT_IDLE, - &args, sizeof(args)); - } while (ret == -EBUSY); - return ret; -} - -int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain) -{ - struct drm_radeon_gem_busy args; - int ret; - - memset(&args, 0, sizeof(args)); - args.handle = bo->handle; - args.domain = 0; - - ret = drmCommandWriteRead(radeon->fd, DRM_RADEON_GEM_BUSY, - &args, sizeof(args)); - - *domain = args.domain; - return ret; -}