frame buffer [3]
frame buffer
2002-09-17 00:00 - leon
리눅스로 frame buffer programming을 하고 있는데
xmanager로 frame buffer를 접근해서 그래픽을 그릴려고 할때
실제 호스트에서 그래픽이 보이고
xmanager상에서는 보이지 않는구요 ?
해결책이 업나요 ?
이에 대한 대처 방안은 생각해 놓으신게..
xmanager로 frame buffer를 접근해서 그래픽을 그릴려고 할때
실제 호스트에서 그래픽이 보이고
xmanager상에서는 보이지 않는구요 ?
해결책이 업나요 ?
이에 대한 대처 방안은 생각해 놓으신게..
DISPLAY 값을 확인해 주세요..
2002-09-17 00:00 - 강성광
특정 프로그램에서 그래픽 출력 결과가 콘솔에서 출력이 된다는 것은
프로그램이 콘솔 전용으로 그래픽 출력을 하도록 되어 있기 때문입니다.
일반적으로 프로그램이 디스플레이 정보를 얻어오는 방법은
mydisplay = XOpenDisplay("");
구문을 이용하여 얻어 오게 됩니다. 이때 ("") 구문을 이용하게 되면
현재 설정상의 $DISPLAY 값을 얻어와서 그 값을 이용하게 됩니다.
프로그램의 DISPLAY 설정을 얻어 오는 부분에서 콘솔로 강제 지정하는
부분을 제거해 주시면 될거 같습니다.
그럼 이만
프로그램이 콘솔 전용으로 그래픽 출력을 하도록 되어 있기 때문입니다.
일반적으로 프로그램이 디스플레이 정보를 얻어오는 방법은
mydisplay = XOpenDisplay("");
구문을 이용하여 얻어 오게 됩니다. 이때 ("") 구문을 이용하게 되면
현재 설정상의 $DISPLAY 값을 얻어와서 그 값을 이용하게 됩니다.
프로그램의 DISPLAY 설정을 얻어 오는 부분에서 콘솔로 강제 지정하는
부분을 제거해 주시면 될거 같습니다.
그럼 이만
X windows program 이 아니구요.(source include)
2002-09-17 00:00 - leon
x windows program이 아니고요
리눅스의 frame buffer를 직접적으로 접근하여 프로그램하는 것을 말합니다.
소스도 올려드리지요 .
아래 프로그램을 컴파일 해서 xmanager에서 실행시키면 서버 컴퓨터에만 그그림이 보인다는 것입니다.
이에 대해 해결책이 없는냐는 것이지요 ?
왜냐하면 서버는 멀리 있고 이렇게 프레임 버퍼를 직접 건드려서 프로그래밍을 해야하는 상황인지라..
아래 소스를 gcc로 컴파일 하셔서 한번 돌려보세요..
***********************************************************************************************
#include
#include
#include
#include
#include
int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0;
long int location = 0;
// Open the file for reading and writing
fbfd = open("/dev/fb0", O_RDWR);
if (!fbfd) {
printf("Error: cannot open framebuffer device.n");
exit(1);
}
printf("The framebuffer device was opened successfully.n");
// Get fixed screen information
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
printf("Error reading fixed information.n");
exit(2);
}
// Get variable screen information
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
printf("Error reading variable information.n");
exit(3);
}
printf("%dx%d, %dbppn", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );
// Figure out the size of the screen in bytes
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
// Map the device to memory
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
fbfd, 0);
if ((int)fbp == -1) {
printf("Error: failed to map framebuffer device to memory.n");
exit(4);
}
printf("The framebuffer device was mapped to memory successfully.n");
x = 100; y = 100; // Where we are going to put the pixel
// Figure out where in memory to put the pixel
for ( y = 100; y < 300; y++ )
for ( x = 100; x < 300; x++ ) {
location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
(y+vinfo.yoffset) * finfo.line_length;
if ( vinfo.bits_per_pixel == 32 ) {
*(fbp + location) = 100; // Some blue
*(fbp + location + 1) = 15+(x-100)/2; // A little green
*(fbp + location + 2) = 200-(y-100)/5; // A lot of red
*(fbp + location + 3) = 0; // No transparency
} else { //assume 16bpp
int b = 10;
int g = (x-100)/6; // A little green
int r = 31-(y-100)/16; // A lot of red
unsigned short int t = r<<11 | g << 5 | b;
*((unsigned short int*)(fbp + location)) = t;
}
}
munmap(fbp, screensize);
close(fbfd);
return 0;
}
리눅스의 frame buffer를 직접적으로 접근하여 프로그램하는 것을 말합니다.
소스도 올려드리지요 .
아래 프로그램을 컴파일 해서 xmanager에서 실행시키면 서버 컴퓨터에만 그그림이 보인다는 것입니다.
이에 대해 해결책이 없는냐는 것이지요 ?
왜냐하면 서버는 멀리 있고 이렇게 프레임 버퍼를 직접 건드려서 프로그래밍을 해야하는 상황인지라..
아래 소스를 gcc로 컴파일 하셔서 한번 돌려보세요..
***********************************************************************************************
#include
#include
#include
#include
#include
int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0;
long int location = 0;
// Open the file for reading and writing
fbfd = open("/dev/fb0", O_RDWR);
if (!fbfd) {
printf("Error: cannot open framebuffer device.n");
exit(1);
}
printf("The framebuffer device was opened successfully.n");
// Get fixed screen information
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {
printf("Error reading fixed information.n");
exit(2);
}
// Get variable screen information
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
printf("Error reading variable information.n");
exit(3);
}
printf("%dx%d, %dbppn", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );
// Figure out the size of the screen in bytes
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
// Map the device to memory
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
fbfd, 0);
if ((int)fbp == -1) {
printf("Error: failed to map framebuffer device to memory.n");
exit(4);
}
printf("The framebuffer device was mapped to memory successfully.n");
x = 100; y = 100; // Where we are going to put the pixel
// Figure out where in memory to put the pixel
for ( y = 100; y < 300; y++ )
for ( x = 100; x < 300; x++ ) {
location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
(y+vinfo.yoffset) * finfo.line_length;
if ( vinfo.bits_per_pixel == 32 ) {
*(fbp + location) = 100; // Some blue
*(fbp + location + 1) = 15+(x-100)/2; // A little green
*(fbp + location + 2) = 200-(y-100)/5; // A lot of red
*(fbp + location + 3) = 0; // No transparency
} else { //assume 16bpp
int b = 10;
int g = (x-100)/6; // A little green
int r = 31-(y-100)/16; // A lot of red
unsigned short int t = r<<11 | g << 5 | b;
*((unsigned short int*)(fbp + location)) = t;
}
}
munmap(fbp, screensize);
close(fbfd);
return 0;
}
Re: X windows program 이 아니구요.(source include)
2002-09-17 00:00 - 김형모
리눅스의 frame buffer에 직접 그리면 당연히 콘솔 화면이 업데이트됩니다. Xmanager에 나타나는 모든 그림은 X window 프로그램으로 작성되어야 합니다.
왜 그런 프로그램이 필요한지는 모르겠지만 정상적으로 Xmanager에서 볼 수 있는 방법이 없네요.
xwd라는 유틸리티로 콘솔의 화면을 덤프한 후 xwud로 Xmanager에서 replay하는 방법이 있는데 잘 될지 모르겠네요.
# xwd -display :0 > dump.out
# xwud -in dump.out -display IP_of_PC:0
왜 그런 프로그램이 필요한지는 모르겠지만 정상적으로 Xmanager에서 볼 수 있는 방법이 없네요.
xwd라는 유틸리티로 콘솔의 화면을 덤프한 후 xwud로 Xmanager에서 replay하는 방법이 있는데 잘 될지 모르겠네요.
# xwd -display :0 > dump.out
# xwud -in dump.out -display IP_of_PC:0
이전 조회수: 649