Back to index

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

Go to the source code of this file.

Classes

struct  intel_bo

Defines

#define HAVE_STDINT_H
#define _FILE_OFFSET_BITS   64

Functions

static int intel_get_prop (struct kms_driver *kms, unsigned key, unsigned *out)
static int intel_destroy (struct kms_driver *kms)
static int intel_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 intel_bo_get_prop (struct kms_bo *bo, unsigned key, unsigned *out)
static int intel_bo_map (struct kms_bo *_bo, void **out)
static int intel_bo_unmap (struct kms_bo *_bo)
static int intel_bo_destroy (struct kms_bo *_bo)
int intel_create (int fd, struct kms_driver **out)

Class Documentation

struct intel_bo

Definition at line 44 of file intel.c.

Class Members
unsigned map_count

Define Documentation

#define _FILE_OFFSET_BITS   64

Definition at line 30 of file intel.c.

#define HAVE_STDINT_H

Definition at line 29 of file intel.c.


Function Documentation

static int intel_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 71 of file intel.c.

{
       struct drm_i915_gem_create arg;
       unsigned size, pitch;
       struct intel_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 -ENOMEM;

       if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8) {
              pitch = 64 * 4;
              size = 64 * 64 * 4;
       } else if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8) {
              pitch = width * 4;
              pitch = (pitch + 512 - 1) & ~(512 - 1);
              size = pitch * ((height + 4 - 1) & ~(4 - 1));
       } else {
              return -EINVAL;
       }

       memset(&arg, 0, sizeof(arg));
       arg.size = size;

       ret = drmCommandWriteRead(kms->fd, DRM_I915_GEM_CREATE, &arg, sizeof(arg));
       if (ret)
              goto err_free;

       bo->base.kms = kms;
       bo->base.handle = arg.handle;
       bo->base.size = size;
       bo->base.pitch = pitch;

       *out = &bo->base;
       if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8 && pitch > 512) {
              struct drm_i915_gem_set_tiling tile;

              memset(&tile, 0, sizeof(tile));
              tile.handle = bo->base.handle;
              tile.tiling_mode = I915_TILING_X;
              tile.stride = bo->base.pitch;

              ret = drmCommandWriteRead(kms->fd, DRM_I915_GEM_SET_TILING, &tile, sizeof(tile));
#if 0
              if (ret) {
                     kms_bo_destroy(out);
                     return ret;
              }
#endif
       }

       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 intel_bo_destroy ( struct kms_bo _bo) [static]

Definition at line 194 of file intel.c.

{
       struct intel_bo *bo = (struct intel_bo *)_bo;
       struct drm_gem_close arg;
       int ret;

       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;

       ret = drmIoctl(bo->base.kms->fd, DRM_IOCTL_GEM_CLOSE, &arg);
       if (ret)
              return -errno;

       free(bo);
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 145 of file intel.c.

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

Here is the caller graph for this function:

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

Definition at line 154 of file intel.c.

{
       struct intel_bo *bo = (struct intel_bo *)_bo;
       struct drm_i915_gem_mmap_gtt arg;
       void *map = NULL;
       int ret;

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

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

       ret = drmCommandWriteRead(bo->base.kms->fd, DRM_I915_GEM_MMAP_GTT, &arg, sizeof(arg));
       if (ret)
              return ret;

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

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

       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int intel_bo_unmap ( struct kms_bo _bo) [static]

Definition at line 186 of file intel.c.

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

Here is the caller graph for this function:

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

Definition at line 218 of file intel.c.

{
       struct kms_driver *kms;

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

       kms->fd = fd;

       kms->bo_create = intel_bo_create;
       kms->bo_map = intel_bo_map;
       kms->bo_unmap = intel_bo_unmap;
       kms->bo_get_prop = intel_bo_get_prop;
       kms->bo_destroy = intel_bo_destroy;
       kms->get_prop = intel_get_prop;
       kms->destroy = intel_destroy;
       *out = kms;

       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int intel_destroy ( struct kms_driver kms) [static]

Definition at line 64 of file intel.c.

{
       free(kms);
       return 0;
}

Here is the caller graph for this function:

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

Definition at line 51 of file intel.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: