OpenGL 3.1は新機能としてUniform Bufferが追加されたんだけど、Texture Bufferとかぶると思ってたら勘違いだった。
基本的にはEXT_bindable_uniformのパワーアップ版。シェーダのuniform変数群をバッファオブジェクトで一括設定!という便利拡張だ。
EXT_bindable_uniformではbindable指定をuniform変数一個単位でしか出来ないのでstructは使えないものだと思い込んでたから、配列にしか使えないのかー、いまいちつかえないなー、とか思ってたんだけど普通にstructで使えたらしい*1。
Uniform bufferではstructでなくuniformグループみたいなのを作ってその中のuniform変数を一括設定できる。
structだとアクセスするときにfoo.barみたいにメンバを指定しないといけないけど、グループはその必要がないみたい。
EXT_bindable_uniformではバッファ内のバイナリレイアウトが決まってるのはfloatとvec2からvec4だけで、それ以外の型は宣言は出来るけど実質的に使えなかった。
Uniform bufferではsampler以外の全ての型がレイアウトも決まっててちゃんと使えるようになった。これでやっと行列とかも設定できて、本当の一括設定が出来るのね。
あとsharedなんかの指定があるけどこれはまだちゃんと読んでないので良くわかんね。
使いかたはグループの名前を指定して、そこに割り当てたいバッファオブジェクトを指定してあげればおっけー、というのが基本でまあ想像通りの使いかただ。
Texture BufferはARBだかEXTだかの拡張で既にあったけど名前の前後まちがってんじゃねーのと言う拡張。
バッファオブジェクトを1次元のテクスチャとしてサンプリングできるよ!って機能。Buffer Textureっていう方があってね?
SNORMテクスチャとかいうのがひっそり追加されてるけど、これは単体のフォーマットじゃなくてRGB8_SNORMみたいになる。たとえば8bitなら-127から128を-1.0から1.0にマッピングするような値らしい。きっと便利な時は便利なのかもしれない。
ほかになんか新機能あったっけ。
DrawInstancedは一回の描画コールでおんなじものを何回も描くよ!ってやつ。拡張として前からあったね。
本当に同じものを何回も描いてもしかたないので、頂点シェーダには組み込み変数で今何回目の描画だよーってのが渡ってくるのでこれでなんとかしる。
Rectangle Textureは2の乗数サイズじゃないテクスチャを作る。2.0から標準でテクスチャは2の乗数サイズじゃなくても良くなったけど、それと違う点はテクスチャ座標をテクセル単位で指定する。つまり古くからあったrectangle_texture。
Primitive Restartは前書いたから省略。
こんなもんだっけな。
あと新機能では無いけどdeprecatedな項目が仕様書から一掃されて読みやすくなったかもしれない。
*1 というかGLSLにstructがないと思ってた。なぜか。
Monotoneの0.43がでてたんだけど訳に時間かかってしまった。
2009年3月22日(日) 22:26:00
0.43リリース。
変更点
- Monotoneのソース配布にサードパーティのライブラリを含まない
ようになりました。monotoneをビルドする前には必要なライブラ
リを別途ダウンロードしてビルドしておく必要があります。
必要なライブラリ一覧はINSTALLファイルをみてください。
これによりmonotone開発者が外部ライブラリのアップデートに気
を配るよりmonotone自身の開発に集中できるようになります。
具体例として、monotoneは未だにsqlite 3.4.1を同梱していま
したが、これは何年も前のバージョンです。
またグローバルな共有ライブラリを使いたがっていた各バイナリ配
布者から長い間リクエストされていたものでもあります。
- 新しいDB変数"database delta-direction"が追加されまし
た。"reverse"(デフォルト)、"forward"、"both"のいずれか
の値をとります。これは新しいファイルバージョンの差分をどのよ
うに保持するかを制御するものです。
前方差分(Forward deltas)はnetsyncではとても速いのです
が、他の用途には遅くなります。
"both"(またはディスク容量のために"forward")に設定した空
のdbを作り、そこに全部pullしておくことでサーバー用途(特に最
初のpull)に高速化されたデータベースを作ることが出来ます。
- 'mtn help <コマンドまたはグループ>'や'mtn <コマンドまたはグループ> --help'
が長いグローバルオプションを表示しなくなり、指定されたものの
ヘルプをコンパクトに出力するようになりました。グローバルオプ
ションを全部みたいときには引数無しの'mtn help'を実行してく
ださい。
- ワークスペースが変更無しの場合に'mtn automate get_current_revision'
がエラーでなく空のチェンジセットを返すようになりました。
新機能
- monotoneのデータベースをgit_exportコマンドでgitのfast-import
フォーマットに出力できるようになりました。この出力はgit fast-import
やこのフォーマットに対応する他のツールの入力として使えます。
- 'u:'と'm:'のセレクタが追加されました。
それぞれ、ワークスペースが最後にアップデートされてからのリビ
ジョン、changelogとcommentのcertが指定したメッセージに
マッチするリビジョンを選択します。
- 'mtn log'に指定したリビジョンのログを出力する'--revision'
オプションを追加しました。
- 'mtn db info'に'--full'オプションが追加され、データベー
ス中のdate certの静的解析を行えるようになりました。
- EDITORやVISUAL環境変数中のコマンドラインオプションがちゃ
んと効くようになりました。EDITOR="emacs -nw"なんかがちゃ
んと動きます。(Debian bug #320565.)
- Lua関数の`mtn_automate'がautomateコマンド実行時に正しく
オプションをパースして設定するようになりました。
- 'commit'コマンドに'--message-file=_MTN/log'を渡したと
きは、_MTN/logが空でなくとも受け付けるようになりました。
バグ修正
- logコマンドがすげー速くなりました。
以前のバージョンまではsqliteがインデックスを正しく扱わな
かったためにリビジョンごとにcertを名前で検索していました。
今バージョンからはsqliteのpreferredインデックスを使い、
各リビジョンごとに一括でcertを読み込みその中から個々のcert
を選択するようになりました。
- 0.42ではnetsync書き込み時に書き込みデータが決定したら一気
に書き込み、イベントループを通ったりはしていませんでした。
おかげで大量のデータを送るときには、長い停止が発生しタイムア
ウトして接続が切れる(10分以上)事がありました。
このバグは修正され、書き込み操作はちゃんと戻ってくるための
安全タイマーを持つようにしました。
- netsyncサーバーがネットワークからゴミデータを受け取ったと
きに、サーバー自体を落とす変わりに接続を終了させるだけになり
ました。
- logコマンドには'--depth'や'--exclude'オプションが無く、
表示するリビジョンを限定しづらくなっていましたが、これらのオ
プションも適切に使えるようにしました。
- 'mtn:execute'属性が消されてもupdateでファイルの実行パー
ミッションを消さなかったのを修正しました。
- ワークスペースでの属性の扱いについて細かいバグを修正しまし
た。
以前のバージョンではワークスペースを変更するコマンドが実行さ
れるたびに全てのファイルについてmtn:executeのような属性を
設定し直していました。
今バージョンからは属性の変更適用はファイルの内容やファイル名
の変更と同じように、もっと選択的に適用されるようになりまし
た。
- netsyncでselect()を読んだ後のread()がend of fileを表す
0を返したとき(これは特にFreeBSDやMac OS Xなどで起きます
が)におかしなエラーメッセージがでていました。
これをselect_tut manページで推奨されるようにEOFを特別扱い
しそのファイルハンドルでさらにselect()を呼び出さないように
して修正しました。
- `mtn ssh_agent_export'にファイル名を渡したとき、ファイル
を適切なパーミッション(600とか)で作成し、必要ならディレクト
リを作成し、ファイルの書き込みに失敗しても内部エラーを投げな
いようになりました。(キーを標準出力のリダイレクトでファイル
に書き込むときは、自分でディレクトリを作ったりパーミッション
を設定する必要があります。)
- `p:'セレクタが一文字のリビジョンIDも受け付けるようになりま
した。
- `mtn merge_into_workspace'でワークスペースの親や子を
マージしようとしたときに、クラッシュせずにまともなエラーメッ
セージを出すようになりました。
- `mtn automate stdio'に関するバグを修正しました:
* 文法とコマンドのエラーを正しく分別し、ドキュメント通り前
者にはエラーコード1、後者には2を返すようになりました。
* stdioのイベントループが文法エラー発生時でも終了せずに、
間違った状態を破棄して次の(正常な)コマンドを受け付けるよ
うになりました。
* オプションのエラーが正しく捕捉されず、stdioでも出力され
なかったのを修正しました。
* 前のコマンドで設定や変更されたグローバルオプションが次の
コマンドがきたときにもリセットされなかったのを修正しまし
た。
例えば前のコマンドで`--ignore-suspend-certs'が指定され
ていると`branches'コマンドで待機状態(suspended)のブラ
ンチを「無視しない」ことが出来なくなっていました。
これからはグローバルオプションはstdioから直接渡された実行
コマンドの実行中でのみ保持されるようになりました。
内部的な変更
- 日付を表すのに64bit整数を使うようにしました。ユーザーから
みた影響はありません。
- ユニットテストのコードがメインのソースからわけられ、テスト
をビルドするのにフル再コンパイルをする必要が無くなりました。
またユニットテストにリンクされるモジュールの数がかなり削減さ
れました。
- パフォーマンス調整のためのデバッグコマンドが`database'コマ
ンド群に追加されました。使えるコマンド一覧は`mtn help --hidden db'
でみることが出来ます。
- 内部的なエラー処理が見直されました。N()がなくなって、E()が
2つでなく三つの引数E(bool, origin::type, i18n_format)
をとるようになりました。
origin::typeはソースのエラーなのか、ネットワークなのか、
ユーザーなのか、内部的なものなのかを表すenumです。
データタイプはorigin_aware(文字どおりの意味です)を
origin::typeの公開メンバー'made_from'から継承することが
出来ます。これはデータの汚染チェックのためにE()に渡すことが
出来ます。origin_awareとorigin::typeはorigin_type.hh
にあります。
I()はunrecoverable_failureを投げますが、E()は渡された
origin::typeによってunrecoverable_failureか
recoverable_failureを投げます。informative_failureは
無くなりました。
今回の訳はだいぶ怪しい箇所が多いわ。やけに長かったし。N810に辞書が欲しい所。
EDITOR変数で引数を渡せないのが直ったのは大変嬉しい。オプションを渡したいだけがためにLuaスクリプト書くとかねーよ。
logコマンドにリビジョン指定が効くのも嬉しい。今まで今日のコミット分のログを出すのに
mtn log --from=d:2009-04-02 --to=d:2009-04-02
と、fromとtoに同じ日付を指定してたけど
mtn log -r d:2009-04-02
で済むってわけだ。
mtn log -r d:today
が出来ればもっといいんだが、なぜかtodayが使えないんだよね…。msysだからだろうか。
u:セレクタも欲しいものではあったが、ほんとに訳があってんのか自信がいまいちない。使ってみりゃ分かるけどな。
LLVMをあまり知らないのでソースみてもよくわからなかったが、特別すごいことをやってそうなわけでもないのにずいぶん速くなるんだな。
しかしMacRubyのサイトが派手になって、今まで以上に内容が薄くなって、英語以外を正規表現に渡すと壊れんだよというチケットもあがっていたtracはお亡くなりになってしまった。
いくら速くてもいまどきUTF-8すら使えないようじゃなぁ。
ついでにIronRubyもみてみたがあまりに激しくコミットされててログが追いかけられなかった。ネストしたクラスが使えるようになってるかまた試してみるか。
追記: 今見たらMacRubyのtracがちゃんと動いてた。よかった。