Back to index

libdrm  2.4.37
Classes | Defines | Functions
vmwgfx.c File Reference
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include "internal.h"
#include <sys/mman.h>
#include "xf86drm.h"
#include "vmwgfx_drm.h"

Go to the source code of this file.

Classes

struct  vmwgfx_bo

Defines

#define HAVE_STDINT_H
#define _FILE_OFFSET_BITS   64

Functions

static int vmwgfx_get_prop (struct kms_driver *kms, unsigned key, unsigned *out)
static int vmwgfx_destroy (struct kms_driver *kms)
static int vmwgfx_bo_create (struct kms_driver *kms, const unsigned width, const unsigned height, const enum kms_bo_type type, const unsigned *attr, struct kms_bo **out)
static int vmwgfx_bo_get_prop (struct kms_bo *bo, unsigned key, unsigned *out)
static int vmwgfx_bo_map (struct kms_bo *_bo, void **out)
static int vmwgfx_bo_unmap (struct kms_bo *_bo)
static int vmwgfx_bo_destroy (struct kms_bo *_bo)
int vmwgfx_create (int fd, struct kms_driver **out)

Class Documentation

struct vmwgfx_bo

Definition at line 41 of file vmwgfx.c.

Class Members
unsigned map_count
uint64_t map_handle

Define Documentation

#define _FILE_OFFSET_BITS   64

Definition at line 30 of file vmwgfx.c.

#define HAVE_STDINT_H

Definition at line 29 of file vmwgfx.c.


Function Documentation

static int vmwgfx_bo_create ( struct kms_driver kms,
const unsigned  width,
const unsigned  height,
const enum kms_bo_type  type,
const unsigned *  attr,
struct kms_bo **  out 
) [static]

Definition at line 69 of file vmwgfx.c.

{
       struct vmwgfx_bo *bo;
       int i, ret;

       for (i = 0; attr[i]; i += 2) {
              switch (attr[i]) {
              case KMS_WIDTH:
              case KMS_HEIGHT:
              case KMS_BO_TYPE:
                     break;
              default:
                     return -EINVAL;
              }
       }

       bo = calloc(1, sizeof(*bo));
       if (!bo)
              return -EINVAL;

       {
              union drm_vmw_alloc_dmabuf_arg arg;
              struct drm_vmw_alloc_dmabuf_req *req = &arg.req;
              struct drm_vmw_dmabuf_rep *rep = &arg.rep;

              memset(&arg, 0, sizeof(arg));
              req->size = width * height * 4;
              bo->base.size = req->size;
              bo->base.pitch = width * 4;
              bo->base.kms = kms;

              do {
                     ret = drmCommandWriteRead(bo->base.kms->fd,
                                            DRM_VMW_ALLOC_DMABUF,
                                            &arg, sizeof(arg));
              } while (ret == -ERESTART);

              if (ret)
                     goto err_free;

              bo->base.handle = rep->handle;
              bo->map_handle = rep->map_handle;
              bo->base.handle = rep->cur_gmr_id;
              bo->base.offset = rep->cur_gmr_offset;
       }

       *out = &bo->base;

       return 0;

err_free:
       free(bo);
       return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int vmwgfx_bo_destroy ( struct kms_bo _bo) [static]

Definition at line 168 of file vmwgfx.c.

{
       struct vmwgfx_bo *bo = (struct vmwgfx_bo *)_bo;
       struct drm_vmw_unref_dmabuf_arg arg;

       if (bo->base.ptr) {
              /* XXX Sanity check map_count */
              munmap(bo->base.ptr, bo->base.size);
              bo->base.ptr = NULL;
       }

       memset(&arg, 0, sizeof(arg));
       arg.handle = bo->base.handle;
       drmCommandWrite(bo->base.kms->fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg));

       free(bo);
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int vmwgfx_bo_get_prop ( struct kms_bo bo,
unsigned  key,
unsigned *  out 
) [static]

Definition at line 128 of file vmwgfx.c.

{
       switch (key) {
       default:
              return -EINVAL;
       }
}

Here is the caller graph for this function:

static int vmwgfx_bo_map ( struct kms_bo _bo,
void **  out 
) [static]

Definition at line 137 of file vmwgfx.c.

{
       struct vmwgfx_bo *bo = (struct vmwgfx_bo *)_bo;
       void *map;

       if (bo->base.ptr) {
              bo->map_count++;
              *out = bo->base.ptr;
              return 0;
       }

       map = mmap(NULL, bo->base.size, PROT_READ | PROT_WRITE, MAP_SHARED, bo->base.kms->fd, bo->map_handle);
       if (map == MAP_FAILED)
              return -errno;

       bo->base.ptr = map;
       bo->map_count++;
       *out = bo->base.ptr;

       return 0;
}

Here is the caller graph for this function:

static int vmwgfx_bo_unmap ( struct kms_bo _bo) [static]

Definition at line 160 of file vmwgfx.c.

{
       struct vmwgfx_bo *bo = (struct vmwgfx_bo *)_bo;
       bo->map_count--;
       return 0;
}

Here is the caller graph for this function:

int vmwgfx_create ( int  fd,
struct kms_driver **  out 
)

Definition at line 188 of file vmwgfx.c.

{
       struct kms_driver *kms;

       kms = calloc(1, sizeof(*kms));
       if (!kms)
              return -ENOMEM;

       kms->fd = fd;

       kms->bo_create = vmwgfx_bo_create;
       kms->bo_map = vmwgfx_bo_map;
       kms->bo_unmap = vmwgfx_bo_unmap;
       kms->bo_get_prop = vmwgfx_bo_get_prop;
       kms->bo_destroy = vmwgfx_bo_destroy;
       kms->get_prop = vmwgfx_get_prop;
       kms->destroy = vmwgfx_destroy;
       *out = kms;
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int vmwgfx_destroy ( struct kms_driver kms) [static]

Definition at line 62 of file vmwgfx.c.

{
       free(kms);
       return 0;
}

Here is the caller graph for this function:

static int vmwgfx_get_prop ( struct kms_driver kms,
unsigned  key,
unsigned *  out 
) [static]

Definition at line 49 of file vmwgfx.c.

{
       switch (key) {
       case KMS_BO_TYPE:
              *out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 | KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
              break;
       default:
              return -EINVAL;
       }
       return 0;
}

Here is the caller graph for this function: