「 プログラミング 」一覧

gcc 組込み関数(memcpyとか)のインライン展開抑制


アライメントに寛容な x86 の話ではなく、 ARM プロセッサのお話になります。OSが動いていてソフトウェア例外を処理できるような状況では非アライメントなデータであってもなんとか動くので表面化しませんが、そのアタリをケアしない状況ではプログラムが停止してしまう原因の1つです。

さて非アライメントなデータ列をコピーしたりクリアしたりする際に、memcpy, memset などを使用することがあります。
デバッグ時にはうまく動いていたのに、最適化を有効にしたリリースビルドでは, このあたりでうまく動作せずに例外を出してしまったりすることがあります。

仕方なくこれらの関数の自前版を用意してこちらを使うようにしてしまうのも1つの手です。しかし memcpy, memset などのまま対処することも可能なことがわかりましたのでここで紹介したいと思います。
ここまでに言い忘れてしまいましたが、 gcc を使用した開発環境でのお話です。

原因

そもそも最適化によって何が起こり、正常に動かなくなってしまうのか。この原因は gcc が自分の組み込み関数を使用し、最適化によってインライン展開されてしまうことによります。

インライン展開されてもアライメント寛容なコードであればまだ良かったりしますが、速度重視のために最適化されているのでそうはならないのが現実です。

対策

gcc のコンパイルオプションで実はこのインライン展開の抑制が可能です。
-fno-builtin-(functionname) というオプションになります。なので、 memset,memcpy らを抑制する場合には、 -fno-builtin-memset, -fno-builtin-memcpy といったようなオプションを指定することとなります。


マウスによるウィンドウのリサイズや移動処理を実装 (wayland)


前回のモデル描画を実装してみたところで中身が入った感じなので、ウィンドウとしてリサイズができるように処理を追加していきたいと思います。
実はこのウィンドウサイズのリサイズの処理のためにも、 EGL を使った描画実装に変更したのです。

まずは動作状況をお見せします。以下のような感じで動作するようになりました。

wayland-resize-window
続きを読む


GPUView の導入について


以前とりあえず GPUView を起動させてみることはやってみました。今回はそんな GPUView をもっと簡単に試せる方法が見つかったのでブログにまとめてみます。

通常の方法

簡単に使える版の前に通常の導入・使用方法をまとめておきます。

Windows Performance Kit の導入

GPUView は Windows Performance Kit の一部として含まれています。現時点ではこれが所属するパッケージが OS の種類によって異なります。

続きを読む


Wayland で EGL を使った描画に変更してみる


Wayland と weston でシンプルなアプリケーションを今まで作ってきましたが、このあたりで EGL を用いた方法に変更することにしました。他の情報ソースを見てみても、共有メモリ実装と EGL を使ったものの2種類に大別されているかなと思います。例によって調べてみて手探りでやっていたりするので、間違っていることもあるかと思いますのでご注意ください。
(Wayland プログラミングな書籍やまとめサイトっていつかできあがってくるのでしょうか)。 続きを読む




libX11 未使用で linux で OpenGL アプリを作る?!


今やレガシー扱いとされている X11 ですが、wayland への移行もあまり進んでいないようです。期待していた Fedora 24 でも採用が見送られてしまいました。 今回はそんな X11アプリを libX11 を使わないで組んでみたいと思います。 OpenGL を使ってアプリケーションを作る場合には X11 のオブジェクト群はほとんど使用しないで済むので最初のウィンドウだけ作ればなんとかなるんじゃないでしょうか.

続きを読む