ModeFB demo now display cursor
parent
b9b6f9234d
commit
841ef9eb8d
|
@ -329,7 +329,10 @@ int drmModeSetCursor(int fd, uint32_t crtcId, drmBO *bo, uint32_t width, uint32_
|
||||||
arg.crtc = crtcId;
|
arg.crtc = crtcId;
|
||||||
arg.width = width;
|
arg.width = width;
|
||||||
arg.height = height;
|
arg.height = height;
|
||||||
|
if (bo)
|
||||||
arg.handle = bo->handle;
|
arg.handle = bo->handle;
|
||||||
|
else
|
||||||
|
arg.handle = 0;
|
||||||
|
|
||||||
return ioctl(fd, DRM_IOCTL_MODE_CURSOR, &arg);
|
return ioctl(fd, DRM_IOCTL_MODE_CURSOR, &arg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,4 +244,5 @@ void prettyCursor(int fd, unsigned int handle)
|
||||||
ptr[i] = 0xFFFF00FF;
|
ptr[i] = 0xFFFF00FF;
|
||||||
|
|
||||||
drmBOUnmap(fd, &bo);
|
drmBOUnmap(fd, &bo);
|
||||||
|
drmBOUnreference(fd, &bo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ all: app
|
||||||
# -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \
|
# -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \
|
||||||
|
|
||||||
app: demo.c
|
app: demo.c
|
||||||
@gcc $(CFLAGS) -o app -Wall demo.c
|
@gcc $(CFLAGS) -o app -Wall -I../../libdrm -I../../shared-core -L../../libdrm/.libs -ldrm demo.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -f app
|
@rm -f app
|
||||||
|
|
|
@ -5,25 +5,37 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "linux/fb.h"
|
#include "linux/fb.h"
|
||||||
#include "sys/ioctl.h"
|
#include "sys/ioctl.h"
|
||||||
|
#include "xf86drm.h"
|
||||||
|
#include "xf86drmMode.h"
|
||||||
|
|
||||||
|
void pretty(int fd);
|
||||||
void setMode(struct fb_var_screeninfo *var);
|
void setMode(struct fb_var_screeninfo *var);
|
||||||
void pan(int fd, struct fb_var_screeninfo *var, int x, int y);
|
void pan(int fd, struct fb_var_screeninfo *var, int x, int y);
|
||||||
void cursor(int fd);
|
void cursor(int fd, int drmfd);
|
||||||
|
void prettyCursor(int fd, unsigned int handle, unsigned int color);
|
||||||
|
|
||||||
|
extern void sleep(int);
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct fb_var_screeninfo var;
|
struct fb_var_screeninfo var;
|
||||||
struct fb_fix_screeninfo fix;
|
struct fb_fix_screeninfo fix;
|
||||||
|
const char* driver = "i915";
|
||||||
const char* name = "/dev/fb0";
|
const char* name = "/dev/fb0";
|
||||||
|
|
||||||
int fd = open(name, O_RDONLY);
|
int fd = open(name, O_RDONLY);
|
||||||
|
int drmfd = drmOpen(driver, NULL);
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
printf("open %s : %s\n", name, strerror(errno));
|
printf("open %s : %s\n", name, strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (drmfd < 0) {
|
||||||
|
printf("drmOpen failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&var, 0, sizeof(struct fb_var_screeninfo));
|
memset(&var, 0, sizeof(struct fb_var_screeninfo));
|
||||||
memset(&fix, 0, sizeof(struct fb_fix_screeninfo));
|
memset(&fix, 0, sizeof(struct fb_fix_screeninfo));
|
||||||
|
|
||||||
|
@ -50,7 +62,7 @@ int main(int argc, char **argv)
|
||||||
sleep(2);
|
sleep(2);
|
||||||
|
|
||||||
printf("cursor\n");
|
printf("cursor\n");
|
||||||
cursor(fd);
|
cursor(fd, drmfd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,38 +78,52 @@ void pan(int fd, struct fb_var_screeninfo *var, int x, int y)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Currently isn't supported in the driver
|
* Cursor support removed from the fb kernel interface
|
||||||
|
* using drm instead.
|
||||||
*/
|
*/
|
||||||
void cursor(int fd)
|
void cursor(int fd, int drmfd)
|
||||||
{
|
{
|
||||||
struct fb_cursor cur;
|
drmModeResPtr res = drmModeGetResources(drmfd);
|
||||||
void *data = malloc(64 * 64 * 4);
|
uint32_t crtc = res->crtcs[1]; /* select crtc here */
|
||||||
memset(&cur, 0, sizeof(cur));
|
drmBO bo;
|
||||||
|
int ret;
|
||||||
|
ret = drmBOCreate(drmfd, 64 * 64 * 4, 0, 0,
|
||||||
|
DRM_BO_FLAG_READ |
|
||||||
|
DRM_BO_FLAG_WRITE |
|
||||||
|
DRM_BO_FLAG_MEM_VRAM |
|
||||||
|
DRM_BO_FLAG_NO_EVICT,
|
||||||
|
DRM_BO_HINT_DONT_FENCE, &bo);
|
||||||
|
|
||||||
cur.set = FB_CUR_SETIMAGE | FB_CUR_SETPOS | FB_CUR_SETSIZE;
|
if (ret) {
|
||||||
cur.enable = 1;
|
printf("failed to create buffer: %s\n", strerror(ret));
|
||||||
cur.image.dx = 1;
|
return;
|
||||||
cur.image.dy = 1;
|
}
|
||||||
cur.image.width = 2;
|
|
||||||
cur.image.height = 2;
|
|
||||||
cur.image.depth = 32;
|
|
||||||
cur.image.data = data;
|
|
||||||
|
|
||||||
if (ioctl(fd, FBIO_CURSOR, &cur))
|
|
||||||
printf("cursor error: %s\n", strerror(errno));
|
|
||||||
|
|
||||||
|
prettyCursor(drmfd, bo.handle, 0xFFFF00FF);
|
||||||
|
drmModeSetCursor(drmfd, crtc, &bo, 64, 64);
|
||||||
|
drmModeMoveCursor(drmfd, crtc, 0, 0);
|
||||||
sleep(2);
|
sleep(2);
|
||||||
|
drmModeMoveCursor(drmfd, crtc, 40, 40);
|
||||||
|
prettyCursor(drmfd, bo.handle, 0xFFFF0000);
|
||||||
|
sleep(2);
|
||||||
|
drmModeSetCursor(drmfd, crtc, 0, 0, 0);
|
||||||
|
drmBOUnreference(drmfd, &bo);
|
||||||
|
}
|
||||||
|
|
||||||
memset(&cur, 0, sizeof(cur));
|
void prettyCursor(int drmfd, unsigned int handle, unsigned int color)
|
||||||
cur.set = FB_CUR_SETPOS;
|
{
|
||||||
cur.enable = 0;
|
drmBO bo;
|
||||||
cur.image.dx = 100;
|
unsigned int *ptr;
|
||||||
cur.image.dy = 100;
|
int i;
|
||||||
|
|
||||||
if (ioctl(fd, FBIO_CURSOR, &cur))
|
drmBOReference(drmfd, handle, &bo);
|
||||||
printf("cursor error: %s\n", strerror(errno));
|
drmBOMap(drmfd, &bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, (void**)&ptr);
|
||||||
|
|
||||||
free(data);
|
for (i = 0; i < (64 * 64); i++)
|
||||||
|
ptr[i] = color;
|
||||||
|
|
||||||
|
drmBOUnmap(drmfd, &bo);
|
||||||
|
drmBOUnreference(drmfd, &bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct drm_mode
|
struct drm_mode
|
||||||
|
|
Loading…
Reference in New Issue