ubuntuusers.de

Problem mit Framebuffer und Graphiktreiber

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.10 (Yakkety Yak)
Antworten |

tsoj

Anmeldungsdatum:
30. Oktober 2016

Beiträge: 2

Hallo,

ich habe ein Problem mit dem linux-framebuffer und diesem Code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char **argv) {
    int row, col, width, height, bitspp, bytespp;
    unsigned int *data;
 
       int fd = open("/dev/fb0", O_RDWR);
 
    struct fb_var_screeninfo screeninfo;
    ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo);
 
    bitspp = screeninfo.bits_per_pixel;
    if(bitspp != 32) {
        printf("Farbaufloesung = %i Bits pro Pixel\n", bitspp);
        printf("Bitte aendern Sie die Farbtiefe auf 32 Bits pro Pixel\n");
        close(fd);
        return 1;
    }
 
    width  = screeninfo.xres;
    height = screeninfo.yres;
    bytespp = bitspp/8;
    if(sizeof(unsigned int) != bytespp) {
        close(fd);
        return 1;
    }
     
     
    data = (unsigned int*) mmap(0, width * height * bytespp, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
     
    int x=0;
    int i=1;
    while(1){
        for(row = 0; row < height; row++){
            for(col = 0; col < width; col++){
                data[row * width + col] = 0xFFFFFF;
                if(col == x){
                    data[row * width + col] = 0x0;
                }
            }
        }
        x+=i;
        if(x==width || x == 0){
            i*=-1;
        }
    }
    munmap(data, width * height * bytespp);
     
    close(fd);
    return 0;
}

wenn ich das Program laufen lasse mit dem NVIDIA binary driver version 367.57 sieht das so aus: http://i.imgur.com/hzj9J3z.jpg aber wenn ich es mit dem Xorg-nouveau treiber laufen lasse sieht es so aus: http://i.imgur.com/F6Pm9m7.jpg Die "framerate" mit dem NVIDIA-treiber ist ziemlich schlecht, jedenfalls schlechter als die mit dem Xorg treiber. vor einiger Zeit mit 16.04 und einem NVIDIA treiber (weiß die version nicht mehr) war die framerate besser. Warum ist das so und wie kann ich das beheben? By the way mein system sieht so aus ('inxi -F'):

System:    Host: S5520 Kernel: 4.8.0-26-generic x86_64 (64 bit) Desktop: Unity 7.5.0  Distro: Ubuntu 16.10
Machine:   System: Intel product: TERRA Server v: ....................
           Mobo: Intel model: S5520HC v: E26045-454
           BIOS: Intel v: S5500.86B.01.00.0064.050520141428 date: 05/05/2014
CPU(s):    2 Hexa core Intel Xeon X5650s (-HT-MCP-SMP-) cache: 24576 KB 
           clock speeds: max: 2661 MHz 1: 1596 MHz 2: 1596 MHz 3: 1596 MHz 4: 1596 MHz 5: 1596 MHz 6: 1596 MHz
           7: 1596 MHz 8: 1596 MHz 9: 1596 MHz 10: 1596 MHz 11: 1596 MHz 12: 1596 MHz 13: 1596 MHz 14: 1596 MHz
           15: 1596 MHz 16: 1596 MHz 17: 1596 MHz 18: 1596 MHz 19: 1596 MHz 20: 1596 MHz 21: 1596 MHz
           22: 1596 MHz 23: 1596 MHz 24: 1596 MHz
Graphics:  Card: NVIDIA GK106 [GeForce GTX 650 Ti]
           Display Server: X.Org 1.18.4 drivers: nouveau (unloaded: fbdev,vesa) Resolution: 1440x900@59.89hz
           GLX Renderer: Gallium 0.4 on NVE6 GLX Version: 3.0 Mesa 12.0.3

Bearbeitet von rklm:

Titel eingedeutscht

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Sieht auf den ersten Blick so aus, als würde er bei Verwendung von Nouveau die Framebuffergröße und/oder -farbtiefe nicht richtig erkennen bzw. an dein Programm melden. Hast du dir diese Werte mal ausgeben lassen und mit den Soll-Werten verglichen?

Im struct fb_var_screeninfo stehen auch noch ein paar mehr Informationen drin als nur Höhe und Breite. Unter anderem xres_virtual und xoffset. Vielleicht kommst du damit weiter. Wie sind die Werte davon?

Wie genau wechselst du zwischen den beiden Treibern?

Warum sich die Performance verändert hat … Mutmaßung: Weil niemand (mehr?) den Framebuffer auf diese Weise direkt verwendet und daher Regressions nicht auffallen.

(Als ich noch eine nVidia-Karte hatte, gab es im nVidia-Treiber übrigens noch gar keinen Support für /dev/fb0. Auch interessant, dass das heute anscheinend drin ist.)

Antworten |