GL_AMD_pinned_memory を試してみた


以前から気になってはいた GL_AMD_pinned_memory 拡張を試してみました。自分の環境は、APUではない通常のRADEONボードをさした環境であるので、一応動くには動くだろうと思って試してみました。ただ動いたとしても本当に効果を発揮するのは、GPU,CPUともに同じメモリを使用するAPU環境だと思います。

使い方は簡単で、通常のバッファ作成のところ(glGenBuffers周辺コード)のところを変更するだけです。

コードを見ておおよそわかると思うのですが、説明すると以下のような感じです。

  1. バッファを作成する
  2. バッファを GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD でバインドする
  3. メインメモリ上にデータ元となるバッファを用意する。このときにアラインメントを考慮する必要がある。
  4. アライメントされたバッファにデータを詰める。
  5. アライメントされたデータを元に glBufferData で転送する

次に、毎フレーム実行される部分で、先ほどのアライメントされたバッファの中身をいじってみます。

この状態で描画を行うとこんな感じになります。

OpenGLを使い慣れている人は、この動作にびっくりするはずです。
通常だと、VBOを使用して頂点データを扱いますが、これを更新するには glMapBufferやglBufferDataといった関数を用いて、更新されたデータを1度転送する必要がありました。
 しかし、この拡張を使用すると、メインメモリのバッファを書き換えただけで描画のデータも反映されている!ということに。実際のところは同一のデータを使うため拡張なので、同期というのがメインではないのですが。

当然ながら、target変数に GL_ARRAY_BUFFER を設定してデータを作成してみるとこのようには動かず、単に四角形がスタティックに描画されるだけの状態となります。

動作環境

Windows7 SP1
RADEON 6850 (Catalyst 13.4)

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする