aboutsummaryrefslogtreecommitdiffstats
path: root/libkms
diff options
context:
space:
mode:
authorJakob Bornecrantz2010-01-22 19:41:49 -0600
committerJakob Bornecrantz2010-01-28 10:32:54 -0600
commit44a0e0a099eeeb6501359f08449dcaa5e9899398 (patch)
tree2bf83614ef44ed81cb16060e7601275c306969c1 /libkms
parentf2730574f2d204eee62d6f37aa56567bd2d94a26 (diff)
downloadexternal-libdrm-44a0e0a099eeeb6501359f08449dcaa5e9899398.tar.gz
external-libdrm-44a0e0a099eeeb6501359f08449dcaa5e9899398.tar.xz
external-libdrm-44a0e0a099eeeb6501359f08449dcaa5e9899398.zip
libkms: Rework interface to not duplicate fields from kms and make formats explicit
List of changes: Fixes the cursor size to 64x64, you still need ti supply width and height Explicitly make the cursor format A8R8G8B8 Explicitly make the scanout format X8R8G8B8
Diffstat (limited to 'libkms')
-rw-r--r--libkms/api.c17
-rw-r--r--libkms/intel.c31
-rw-r--r--libkms/libkms.h25
-rw-r--r--libkms/vmwgfx.c25
4 files changed, 30 insertions, 68 deletions
diff --git a/libkms/api.c b/libkms/api.c
index 7696918a..4a05f3d7 100644
--- a/libkms/api.c
+++ b/libkms/api.c
@@ -40,14 +40,7 @@ int kms_create(int fd, struct kms_driver **out)
40int kms_get_prop(struct kms_driver *kms, unsigned key, unsigned *out) 40int kms_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
41{ 41{
42 switch (key) { 42 switch (key) {
43 case KMS_MAX_SCANOUT_WIDTH: 43 case KMS_BO_TYPE:
44 case KMS_MAX_SCANOUT_HEIGHT:
45 case KMS_MIN_SCANOUT_WIDTH:
46 case KMS_MIN_SCANOUT_HEIGHT:
47 case KMS_MAX_CURSOR_WIDTH:
48 case KMS_MAX_CURSOR_HEIGHT:
49 case KMS_MIN_CURSOR_WIDTH:
50 case KMS_MIN_CURSOR_HEIGHT:
51 break; 44 break;
52 default: 45 default:
53 return -EINVAL; 46 return -EINVAL;
@@ -69,7 +62,7 @@ int kms_bo_create(struct kms_driver *kms, const unsigned *attr, struct kms_bo **
69{ 62{
70 unsigned width = 0; 63 unsigned width = 0;
71 unsigned height = 0; 64 unsigned height = 0;
72 enum kms_bo_type type = KMS_BO_TYPE_SCANOUT; 65 enum kms_bo_type type = KMS_BO_TYPE_SCANOUT_X8R8G8B8;
73 int i; 66 int i;
74 67
75 for (i = 0; attr[i];) { 68 for (i = 0; attr[i];) {
@@ -94,6 +87,12 @@ int kms_bo_create(struct kms_driver *kms, const unsigned *attr, struct kms_bo **
94 if (width == 0 || height == 0) 87 if (width == 0 || height == 0)
95 return -EINVAL; 88 return -EINVAL;
96 89
90 /* XXX sanity check type */
91
92 if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 &&
93 (width != 64 || height != 64))
94 return -EINVAL;
95
97 return kms->bo_create(kms, width, height, type, attr, out); 96 return kms->bo_create(kms, width, height, type, attr, out);
98} 97}
99 98
diff --git a/libkms/intel.c b/libkms/intel.c
index 670494e7..a1914f82 100644
--- a/libkms/intel.c
+++ b/libkms/intel.c
@@ -53,29 +53,8 @@ static int
53intel_get_prop(struct kms_driver *kms, unsigned key, unsigned *out) 53intel_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
54{ 54{
55 switch (key) { 55 switch (key) {
56 case KMS_MAX_SCANOUT_WIDTH: 56 case KMS_BO_TYPE:
57 *out = 4096; 57 *out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 | KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
58 break;
59 case KMS_MAX_SCANOUT_HEIGHT:
60 *out = 4096;
61 break;
62 case KMS_MIN_SCANOUT_WIDTH:
63 *out = 1;
64 break;
65 case KMS_MIN_SCANOUT_HEIGHT:
66 *out = 1;
67 break;
68 case KMS_MAX_CURSOR_WIDTH:
69 *out = 64;
70 break;
71 case KMS_MAX_CURSOR_HEIGHT:
72 *out = 64;
73 break;
74 case KMS_MIN_CURSOR_WIDTH:
75 *out = 64;
76 break;
77 case KMS_MIN_CURSOR_HEIGHT:
78 *out = 64;
79 break; 58 break;
80 default: 59 default:
81 return -EINVAL; 60 return -EINVAL;
@@ -116,10 +95,10 @@ intel_bo_create(struct kms_driver *kms,
116 if (!bo) 95 if (!bo)
117 return -ENOMEM; 96 return -ENOMEM;
118 97
119 if (type == KMS_BO_TYPE_CURSOR) { 98 if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8) {
120 pitch = 64 * 4; 99 pitch = 64 * 4;
121 size = 64 * 64 * 4; 100 size = 64 * 64 * 4;
122 } else if (type == KMS_BO_TYPE_SCANOUT) { 101 } else if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8) {
123 pitch = width * 4; 102 pitch = width * 4;
124 pitch = (pitch + 512 - 1) & ~(512 - 1); 103 pitch = (pitch + 512 - 1) & ~(512 - 1);
125 size = pitch * ((height + 4 - 1) & ~(4 - 1)); 104 size = pitch * ((height + 4 - 1) & ~(4 - 1));
@@ -140,7 +119,7 @@ intel_bo_create(struct kms_driver *kms,
140 bo->base.pitch = pitch; 119 bo->base.pitch = pitch;
141 120
142 *out = &bo->base; 121 *out = &bo->base;
143 if (type == KMS_BO_TYPE_SCANOUT && pitch > 512) { 122 if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8 && pitch > 512) {
144 struct drm_i915_gem_set_tiling tile; 123 struct drm_i915_gem_set_tiling tile;
145 124
146 memset(&tile, 0, sizeof(tile)); 125 memset(&tile, 0, sizeof(tile));
diff --git a/libkms/libkms.h b/libkms/libkms.h
index eb2ed893..46644429 100644
--- a/libkms/libkms.h
+++ b/libkms/libkms.h
@@ -29,31 +29,36 @@
29#ifndef _LIBKMS_H_ 29#ifndef _LIBKMS_H_
30#define _LIBKMS_H_ 30#define _LIBKMS_H_
31 31
32/**
33 * \file
34 *
35 */
36
32struct kms_driver; 37struct kms_driver;
33struct kms_bo; 38struct kms_bo;
34 39
35enum kms_attrib 40enum kms_attrib
36{ 41{
37 KMS_TERMINATE_PROP_LIST, 42 KMS_TERMINATE_PROP_LIST,
43#define KMS_TERMINATE_PROP_LIST KMS_TERMINATE_PROP_LIST
38 KMS_BO_TYPE, 44 KMS_BO_TYPE,
45#define KMS_BO_TYPE KMS_BO_TYPE
39 KMS_WIDTH, 46 KMS_WIDTH,
47#define KMS_WIDTH KMS_WIDTH
40 KMS_HEIGHT, 48 KMS_HEIGHT,
49#define KMS_HEIGHT KMS_HEIGHT
41 KMS_PITCH, 50 KMS_PITCH,
51#define KMS_PITCH KMS_PITCH
42 KMS_HANDLE, 52 KMS_HANDLE,
43 KMS_MAX_SCANOUT_WIDTH, 53#define KMS_HANDLE KMS_HANDLE
44 KMS_MAX_SCANOUT_HEIGHT,
45 KMS_MIN_SCANOUT_WIDTH,
46 KMS_MIN_SCANOUT_HEIGHT,
47 KMS_MAX_CURSOR_WIDTH,
48 KMS_MAX_CURSOR_HEIGHT,
49 KMS_MIN_CURSOR_WIDTH,
50 KMS_MIN_CURSOR_HEIGHT,
51}; 54};
52 55
53enum kms_bo_type 56enum kms_bo_type
54{ 57{
55 KMS_BO_TYPE_SCANOUT = (1 << 0), 58 KMS_BO_TYPE_SCANOUT_X8R8G8B8 = (1 << 0),
56 KMS_BO_TYPE_CURSOR = (1 << 1), 59#define KMS_BO_TYPE_SCANOUT_X8R8G8B8 KMS_BO_TYPE_SCANOUT_X8R8G8B8
60 KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 = (1 << 1),
61#define KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8
57}; 62};
58 63
59int kms_create(int fd, struct kms_driver **out); 64int kms_create(int fd, struct kms_driver **out);
diff --git a/libkms/vmwgfx.c b/libkms/vmwgfx.c
index 0568d6e0..d594b3bd 100644
--- a/libkms/vmwgfx.c
+++ b/libkms/vmwgfx.c
@@ -49,29 +49,8 @@ static int
49vmwgfx_get_prop(struct kms_driver *kms, unsigned key, unsigned *out) 49vmwgfx_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
50{ 50{
51 switch (key) { 51 switch (key) {
52 case KMS_MAX_SCANOUT_WIDTH: 52 case KMS_BO_TYPE:
53 *out = 2048; 53 *out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 | KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
54 break;
55 case KMS_MAX_SCANOUT_HEIGHT:
56 *out = 2048;
57 break;
58 case KMS_MIN_SCANOUT_WIDTH:
59 *out = 1;
60 break;
61 case KMS_MIN_SCANOUT_HEIGHT:
62 *out = 1;
63 break;
64 case KMS_MAX_CURSOR_WIDTH:
65 *out = 64;
66 break;
67 case KMS_MAX_CURSOR_HEIGHT:
68 *out = 64;
69 break;
70 case KMS_MIN_CURSOR_WIDTH:
71 *out = 64;
72 break;
73 case KMS_MIN_CURSOR_HEIGHT:
74 *out = 64;
75 break; 54 break;
76 default: 55 default:
77 return -EINVAL; 56 return -EINVAL;