Xmanager 게시판

frame buffer

최종입력: 2002-09-17 00:00 - 김형모 | 답글: 3건

 
2002-09-17 00:00 - leon

frame buffer

 
리눅스로 frame buffer programming을 하고 있는데

xmanager로 frame buffer를 접근해서 그래픽을 그릴려고 할때

실제 호스트에서 그래픽이 보이고

xmanager상에서는 보이지 않는구요 ?

해결책이 업나요 ?

이에 대한 대처 방안은 생각해 놓으신게..
2002-09-17 00:00 - 강성광

DISPLAY 값을 확인해 주세요..

 
특정 프로그램에서 그래픽 출력 결과가 콘솔에서 출력이 된다는 것은
프로그램이 콘솔 전용으로 그래픽 출력을 하도록 되어 있기 때문입니다.

일반적으로 프로그램이 디스플레이 정보를 얻어오는 방법은
mydisplay = XOpenDisplay("");
구문을 이용하여 얻어 오게 됩니다. 이때 ("") 구문을 이용하게 되면
현재 설정상의 $DISPLAY 값을 얻어와서 그 값을 이용하게 됩니다.

프로그램의 DISPLAY 설정을 얻어 오는 부분에서 콘솔로 강제 지정하는
부분을 제거해 주시면 될거 같습니다.

그럼 이만
2002-09-17 00:00 - leon

X windows program 이 아니구요.(source include)

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

2002-09-17 00:00 - 김형모

Re: X windows program 이 아니구요.(source include)

 
리눅스의 frame buffer에 직접 그리면 당연히 콘솔 화면이 업데이트됩니다. Xmanager에 나타나는 모든 그림은 X window 프로그램으로 작성되어야 합니다.

왜 그런 프로그램이 필요한지는 모르겠지만 정상적으로 Xmanager에서 볼 수 있는 방법이 없네요.

xwd라는 유틸리티로 콘솔의 화면을 덤프한 후 xwud로 Xmanager에서 replay하는 방법이 있는데 잘 될지 모르겠네요.

# xwd -display :0 > dump.out
# xwud -in dump.out -display IP_of_PC:0