Home | History | Annotate | Download | only in libkms
      1 /**************************************************************************
      2  *
      3  * Copyright  2009 VMware, Inc., Palo Alto, CA., USA
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     21  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
     22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 
     29 #ifdef HAVE_CONFIG_H
     30 #include "config.h"
     31 #endif
     32 
     33 #include <errno.h>
     34 #include <stdlib.h>
     35 #include <string.h>
     36 
     37 #include "libdrm_macros.h"
     38 #include "internal.h"
     39 
     40 int kms_create(int fd, struct kms_driver **out)
     41 {
     42 	return linux_create(fd, out);
     43 }
     44 
     45 int kms_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
     46 {
     47 	switch (key) {
     48 	case KMS_BO_TYPE:
     49 		break;
     50 	default:
     51 		return -EINVAL;
     52 	}
     53 	return kms->get_prop(kms, key, out);
     54 }
     55 
     56 int kms_destroy(struct kms_driver **kms)
     57 {
     58 	if (!(*kms))
     59 		return 0;
     60 
     61 	free(*kms);
     62 	*kms = NULL;
     63 	return 0;
     64 }
     65 
     66 int kms_bo_create(struct kms_driver *kms, const unsigned *attr, struct kms_bo **out)
     67 {
     68 	unsigned width = 0;
     69 	unsigned height = 0;
     70 	enum kms_bo_type type = KMS_BO_TYPE_SCANOUT_X8R8G8B8;
     71 	int i;
     72 
     73 	for (i = 0; attr[i];) {
     74 		unsigned key = attr[i++];
     75 		unsigned value = attr[i++];
     76 
     77 		switch (key) {
     78 		case KMS_WIDTH:
     79 			width = value;
     80 			break;
     81 		case KMS_HEIGHT:
     82 			height = value;
     83 			break;
     84 		case KMS_BO_TYPE:
     85 			type = value;
     86 			break;
     87 		default:
     88 			return -EINVAL;
     89 		}
     90 	}
     91 
     92 	if (width == 0 || height == 0)
     93 		return -EINVAL;
     94 
     95 	/* XXX sanity check type */
     96 
     97 	if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 &&
     98 	    (width != 64 || height != 64))
     99 		return -EINVAL;
    100 
    101 	return kms->bo_create(kms, width, height, type, attr, out);
    102 }
    103 
    104 int kms_bo_get_prop(struct kms_bo *bo, unsigned key, unsigned *out)
    105 {
    106 	switch (key) {
    107 	case KMS_PITCH:
    108 		*out = bo->pitch;
    109 		break;
    110 	case KMS_HANDLE:
    111 		*out = bo->handle;
    112 		break;
    113 	default:
    114 		return -EINVAL;
    115 	}
    116 
    117 	return 0;
    118 }
    119 
    120 int kms_bo_map(struct kms_bo *bo, void **out)
    121 {
    122 	return bo->kms->bo_map(bo, out);
    123 }
    124 
    125 int kms_bo_unmap(struct kms_bo *bo)
    126 {
    127 	return bo->kms->bo_unmap(bo);
    128 }
    129 
    130 int kms_bo_destroy(struct kms_bo **bo)
    131 {
    132 	int ret;
    133 
    134 	if (!(*bo))
    135 		return 0;
    136 
    137 	ret = (*bo)->kms->bo_destroy(*bo);
    138 	if (ret)
    139 		return ret;
    140 
    141 	*bo = NULL;
    142 	return 0;
    143 }
    144