FrameBufferの各行に書き込まれたバイト数を取得する方法は?

FrameBufferの各行に書き込まれたバイト数を取得する方法は?

ターゲット:私はフレームバッファ用の非常に単純な画像ビューアを書いています/dev/fb0(例:FBI)。

現在の状態:

  1. /sys/class/graphics/fb0/virtual_size私のソフトウェアは(たとえば)からピクセル解像度を取得します1920,1080
  2. 次に(各行ごとに)1920行ピクセル(合計4×1920 = 7680バイト)あたり4バイト(BGRA)を/dev/fb0
  3. より正確には、y-row -col =>の値がそれぞれ(、および)のピクセルをx設定します。arr[y * 1920 * 4 + x * 4 + channel]channel0,1,2,3BGRA

質問:

/sys/.../virtual_size( - >解像度)を使用して以前のノートブックで1366,768同じソフトウェアを試したときに画像が正しく表示されませんでした(少し傾いた)。そのため、ピクセル幅の値を調べたところ、値は次のようになりました。1376(1366ではない)。

質問:

  1. この10個の追加バイトはどこから来るのでしょうか?
  2. そして、他のコンピュータでこの10バイトの値をどのように取得できますか(手動で調整せずに自動的に)?
  3. なぜ一部のシステムにはこれらの追加の10バイトが必要であり、一部のシステムには必要ないのですか?

答え1

プログラムでフレームバッファに関する情報を取得するには、次のものを使用する必要があります。FBIOGET_FSCREENINFOそしてFBIOGET_VSCREENINFO ioctl:

#include <fcntl.h>
#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>

int main(int argc, char **argv) {
  struct fb_fix_screeninfo fix;
  struct fb_var_screeninfo var;

  int fb = open("/dev/fb0", O_RDWR);
  if (fb < 0) {
    perror("Opening fb0");
    exit(1);
  }

  if (ioctl(fb, FBIOGET_FSCREENINFO, &fix) != 0) {
    perror("FSCREENINFO");
    exit(1);
  }

  if (ioctl(fb, FBIOGET_VSCREENINFO, &var) != 0) {
    perror("VSCREENINFO");
    exit(1);
  }

  printf("Line length: %ld\n", fix.line_length);
  printf("Visible resolution: %ldx%ld\n", var.xres, var.yres);
  printf("Virtual resolution: %ldx%ld\n", var.xres_virtual, var.yres_virtual);
}

line_lengthあなたに行ストライドを与えます。

答え2

いいねストライドに関連する必要はありません;1920ワイドスクリーンでは、ソフトウェアは「偶然」動作します(偶然ではありません。ストライドは通常ハードウェアのアライメント要件に基づいて選択され、1920はすでに一般的なアライメント要件である16に分割できます)。

既存のLinuxフレームバッファインフラストラクチャに慣れていないため、これを行う方法を直接話すことはできませんが、進捗状況を把握する必要があります。

Linux では行の並べ替えを 16 の倍数として記録するので、常に幅を次の倍数に丸めるか、/sys/class/graphics/fb0/ にストライドや行の並べ替えを定義する他のダミー ファイルを含める必要があります。

関連情報