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
This commit is contained in:
Jakob Bornecrantz 2010-01-23 01:41:49 +00:00
parent f2730574f2
commit 44a0e0a099
5 changed files with 31 additions and 69 deletions

View file

@ -40,14 +40,7 @@ int kms_create(int fd, struct kms_driver **out)
int kms_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
{
switch (key) {
case KMS_MAX_SCANOUT_WIDTH:
case KMS_MAX_SCANOUT_HEIGHT:
case KMS_MIN_SCANOUT_WIDTH:
case KMS_MIN_SCANOUT_HEIGHT:
case KMS_MAX_CURSOR_WIDTH:
case KMS_MAX_CURSOR_HEIGHT:
case KMS_MIN_CURSOR_WIDTH:
case KMS_MIN_CURSOR_HEIGHT:
case KMS_BO_TYPE:
break;
default:
return -EINVAL;
@ -69,7 +62,7 @@ int kms_bo_create(struct kms_driver *kms, const unsigned *attr, struct kms_bo **
{
unsigned width = 0;
unsigned height = 0;
enum kms_bo_type type = KMS_BO_TYPE_SCANOUT;
enum kms_bo_type type = KMS_BO_TYPE_SCANOUT_X8R8G8B8;
int i;
for (i = 0; attr[i];) {
@ -94,6 +87,12 @@ int kms_bo_create(struct kms_driver *kms, const unsigned *attr, struct kms_bo **
if (width == 0 || height == 0)
return -EINVAL;
/* XXX sanity check type */
if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 &&
(width != 64 || height != 64))
return -EINVAL;
return kms->bo_create(kms, width, height, type, attr, out);
}

View file

@ -53,29 +53,8 @@ static int
intel_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
{
switch (key) {
case KMS_MAX_SCANOUT_WIDTH:
*out = 4096;
break;
case KMS_MAX_SCANOUT_HEIGHT:
*out = 4096;
break;
case KMS_MIN_SCANOUT_WIDTH:
*out = 1;
break;
case KMS_MIN_SCANOUT_HEIGHT:
*out = 1;
break;
case KMS_MAX_CURSOR_WIDTH:
*out = 64;
break;
case KMS_MAX_CURSOR_HEIGHT:
*out = 64;
break;
case KMS_MIN_CURSOR_WIDTH:
*out = 64;
break;
case KMS_MIN_CURSOR_HEIGHT:
*out = 64;
case KMS_BO_TYPE:
*out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 | KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
break;
default:
return -EINVAL;
@ -116,10 +95,10 @@ intel_bo_create(struct kms_driver *kms,
if (!bo)
return -ENOMEM;
if (type == KMS_BO_TYPE_CURSOR) {
if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8) {
pitch = 64 * 4;
size = 64 * 64 * 4;
} else if (type == KMS_BO_TYPE_SCANOUT) {
} else if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8) {
pitch = width * 4;
pitch = (pitch + 512 - 1) & ~(512 - 1);
size = pitch * ((height + 4 - 1) & ~(4 - 1));
@ -140,7 +119,7 @@ intel_bo_create(struct kms_driver *kms,
bo->base.pitch = pitch;
*out = &bo->base;
if (type == KMS_BO_TYPE_SCANOUT && pitch > 512) {
if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8 && pitch > 512) {
struct drm_i915_gem_set_tiling tile;
memset(&tile, 0, sizeof(tile));

View file

@ -29,31 +29,36 @@
#ifndef _LIBKMS_H_
#define _LIBKMS_H_
/**
* \file
*
*/
struct kms_driver;
struct kms_bo;
enum kms_attrib
{
KMS_TERMINATE_PROP_LIST,
#define KMS_TERMINATE_PROP_LIST KMS_TERMINATE_PROP_LIST
KMS_BO_TYPE,
#define KMS_BO_TYPE KMS_BO_TYPE
KMS_WIDTH,
#define KMS_WIDTH KMS_WIDTH
KMS_HEIGHT,
#define KMS_HEIGHT KMS_HEIGHT
KMS_PITCH,
#define KMS_PITCH KMS_PITCH
KMS_HANDLE,
KMS_MAX_SCANOUT_WIDTH,
KMS_MAX_SCANOUT_HEIGHT,
KMS_MIN_SCANOUT_WIDTH,
KMS_MIN_SCANOUT_HEIGHT,
KMS_MAX_CURSOR_WIDTH,
KMS_MAX_CURSOR_HEIGHT,
KMS_MIN_CURSOR_WIDTH,
KMS_MIN_CURSOR_HEIGHT,
#define KMS_HANDLE KMS_HANDLE
};
enum kms_bo_type
{
KMS_BO_TYPE_SCANOUT = (1 << 0),
KMS_BO_TYPE_CURSOR = (1 << 1),
KMS_BO_TYPE_SCANOUT_X8R8G8B8 = (1 << 0),
#define KMS_BO_TYPE_SCANOUT_X8R8G8B8 KMS_BO_TYPE_SCANOUT_X8R8G8B8
KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 = (1 << 1),
#define KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8
};
int kms_create(int fd, struct kms_driver **out);

View file

@ -49,29 +49,8 @@ static int
vmwgfx_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
{
switch (key) {
case KMS_MAX_SCANOUT_WIDTH:
*out = 2048;
break;
case KMS_MAX_SCANOUT_HEIGHT:
*out = 2048;
break;
case KMS_MIN_SCANOUT_WIDTH:
*out = 1;
break;
case KMS_MIN_SCANOUT_HEIGHT:
*out = 1;
break;
case KMS_MAX_CURSOR_WIDTH:
*out = 64;
break;
case KMS_MAX_CURSOR_HEIGHT:
*out = 64;
break;
case KMS_MIN_CURSOR_WIDTH:
*out = 64;
break;
case KMS_MIN_CURSOR_HEIGHT:
*out = 64;
case KMS_BO_TYPE:
*out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 | KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
break;
default:
return -EINVAL;

View file

@ -44,7 +44,7 @@ int test_bo(struct kms_driver *kms)
unsigned attrs[7] = {
KMS_WIDTH, 1024,
KMS_HEIGHT, 768,
KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT,
KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
KMS_TERMINATE_PROP_LIST,
};