forked from KolibriOS/kolibrios
e7b0ce1747
git-svn-id: svn://kolibrios.org@2176 a494cfbc-eb01-0410-851d-a64ba20cac60
80 lines
1.5 KiB
C
80 lines
1.5 KiB
C
|
|
#include <drmP.h>
|
|
#include <drm.h>
|
|
#include "radeon_drm.h"
|
|
#include "../radeon.h"
|
|
#include "../display.h"
|
|
|
|
extern struct radeon_device *main_device;
|
|
|
|
typedef struct
|
|
{
|
|
kobj_t header;
|
|
|
|
int width;
|
|
int height;
|
|
int stride;
|
|
uint64_t gaddr;
|
|
void *uaddr;
|
|
struct radeon_bo *robj;
|
|
}bitmap_t;
|
|
|
|
int create_bitmap(bitmap_t **pbitmap, int width, int height)
|
|
{
|
|
size_t size;
|
|
size_t pitch;
|
|
bitmap_t *bitmap;
|
|
uint64_t gaddr;
|
|
void *uaddr;
|
|
|
|
struct radeon_device *rdev = main_device;
|
|
struct radeon_bo *sobj = NULL;
|
|
|
|
int r;
|
|
|
|
bitmap = CreateObject(GetPid(), sizeof(bitmap_t));
|
|
if( bitmap == NULL)
|
|
{
|
|
*pbitmap = NULL;
|
|
return -1;
|
|
}
|
|
|
|
pitch = radeon_align_pitch(rdev, width, 32, false) * 4;
|
|
|
|
size = pitch * height;
|
|
|
|
r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
|
|
RADEON_GEM_DOMAIN_GTT, &sobj);
|
|
if (r) {
|
|
goto fail;
|
|
}
|
|
r = radeon_bo_reserve(sobj, false);
|
|
if (unlikely(r != 0))
|
|
goto fail;
|
|
r = radeon_bo_pin(sobj, RADEON_GEM_DOMAIN_GTT, &gaddr);
|
|
if (r) {
|
|
goto fail;
|
|
}
|
|
|
|
r = radeon_bo_user_map(sobj, &uaddr);
|
|
if (r) {
|
|
goto fail;
|
|
}
|
|
|
|
bitmap->width = width;
|
|
bitmap->height = height;
|
|
bitmap->stride = pitch;
|
|
bitmap->gaddr = gaddr;
|
|
bitmap->uaddr = uaddr;
|
|
bitmap->robj = sobj;
|
|
|
|
*pbitmap = bitmap;
|
|
return 0;
|
|
|
|
fail:
|
|
|
|
DestroyObject(bitmap);
|
|
return -1;
|
|
|
|
};
|