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
main
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,
};