メモ20200611 – 関数定義をわざわざ int (func)(){}とするケース

  • 実は int(func)(){}も関数定義になる
  • int(func)(){}と書かないとけない時は#define func(var) というマクロが定義されている時にマクロ展開されないようにするため。例:numeric_limits::max

メモ20200608 – ビットマスクを扱う時の型について

ビット幅を意識しないで済む場合にインタフェースをintで統一すると利用者はキャストしないで済むというメリットがあり、時折ビットマスクもintで扱っている場合があるが僕はそれには反対する。

マスクを扱った処理としてintから64bitに拡張したい場合にint64_t/uint64_tにキャストした時に32bit型の最上位ビットが立っているとそれが64bitの最上位ビットとなってしまうというのはビットを扱っている場合に意図するところではないからである。int型なのだから当たり前ではあるがビット操作をする場合にはこういう不都合がある。

メモ20200407 – 固定小数点

固定小数点とは小数点の位置が固定されている表現。

C 言語での表現

メモ20200328 – メモ

メモ20200322 – メモ

  • ダンプ関数はopcodeをインデックスとする関数ポインタのテーブルにして引けばいい。

メモ20200313 – non-type parameterを使う事について

  • コンストラクタの引数に渡そうが個別の型になる
    • Temp<3>のインスタンスにTemp<4>のインスタンスはコピーできない。
    • Temp<3>のインスタンスにTemp<3>のインスタンスは代入できる
  • コンストラクタにnon-type parameterを渡す事の是非は?私はそれこそ個別の型として代入不可能な別のtypeを作りたい時は良いと思う。non-type parameterをenum classとかにして。enum classの列挙子毎に型にするとか。

メモ20200313 – レジスタ表現の参考実装

実装例: arm intrinsics

https://github.com/intel/ARM_NEON_2_x86_SSE/blob/master/NEON_2_SSE.h

  • uint64_t vget_lane_u64()
    64bitレジスタの値を取得
  • vld1_dup_u64(uint64_t const * ptr)
    64bitデータをneonレジスタにロード
  • vget_low(), vget_high()
    ローサイド、ハイサイドをそれぞれ取得

メモ20200312 – setter/getter の考え方

参考:https://www.artima.com/intv/goldilocks.html#part3

  • classの存在意義というのはinvariabntにある
    • 例:vectorの例だとストレージのポインタと配列サイズをinvariantという
  • classはこのinvariantを管理する事に意味がある
  • インタフェースはこのinvariantが壊れない様なインタフェースにすべき
  • 例えば全てのメンバ変数がどんな値でも取れる時はclassにする必要がない
  • classが必要になる場合はname, addressがデータとしてあった場合にaddressが有効なアドレスかどうかをチェックしないといけない場合などはそのメソッドを追加する。

その他参考

https://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197?pgno=1

https://stackoverflow.com/questions/31854808/holder-template-class-to-store-different-object-types-constructors-with-and-w

templateのHolderクラスとダウンキャストについて

安全にアクセスする実装例

 

メモ20200307

  • レジスタファイルの全メンバ変数に対して便利にmovを発行できないか?
  • vectorにpushしてイテレータでゲットする様な事ができると良さそうでは?
  • TODO: イテレータ
  • テンプレートクラスが渡されて最初のメンバのベースクラスにダイレクトキャストしているがこれ何とかならんのか?
  • 下記でDrawRegisterFileとPixelRegisterFileを受け取ったビルダーが先頭をRegisterStorage<false>にキャストしてアクセスして大丈夫なのか?という話。

  • 結局メンバ変数でイテレートする機能があればいいんあがどう実装するのか?
  • 例えばこういう解法もあるかもしれないけどこれはキャストしているのと同じ。サイズは同じなのが保証されるから多少は安全。
  • アクセサからstorage32にキャストすれば取得個所を1箇所にできるのでそうするか…

メモ 20200305

  • 独自のレジスタファイル型を定義し、そのストレージは SSBO として使える
  • レジスタファイル内のメンバ変数をイテレータで巡回して値を取得したい
    • -> メンバ変数毎に mov を発行するため
    • イテレータでアクセスが想定されるメソッドは
      • GetValue()
      • ::RegisterIndex
      • IsPaird()
      • GetValue64() : 64bit 値で取得
    • 考え方
      • mov 時はただの 32bit or 64bit のデータが取得できればいいので型はどうでもいい
    • その他
      • パラメータはフルのレジスタファイルに固めてメソッドチェインで値をセットしている。フルレジスタファイルが取得できる。そこから更にmovなら必要なパラメータを拾ってmovを追加しないといけない。ldmの場合もレジスタファイルマスクを作らないといけない。問題点はレジスタファイルを作るためにパラメータ選択、mov生成、ldm生成のためにまたパラメータ選択をしているのが無駄に感じる。
      • 先に選択して値のセットをし、mov生成、ldm生成できないか?
      • 取り敢えずCRTPで子クラスに実装したメソッドをコールして*derivedを返すメソッドをベースクラスに実装すればレジスタに値を入れてかつメソッドチェインを作れそう。
        • 課題
          • その場合ストレージはどこに持たせるか?
          • レジスタファイルクラスである事をそのベースクラスに教えてやらないといけないけどどうやってレジスタファイルクラスであるのを保証させるか?
            • あるクラス内に定義されたレジスタクラスがCRTPのベースクラスから呼べればいいだけなので保証とかは要らないかも?
          • やっぱあるパラメータだけいらんわーの場合のために手動でオフレル仕組みは必要。

疑似コード 20200303

 

疑似コード

.h

.cpp

 

オールド

  •  アライン計算に必要な物
    • format
    • tiling
      • タイリングも必要なんだっけ?
    • plane index
      • 書き出し時は plane によってアラインが異なるため
      • read 時は plane によらず同じ
    • usage
    • 圧縮フラグ
  • row stride 計算に必要な物
    • format
      • ピクセルサイズ
      • コンポーネントサイズ
      • ブロックサイズ
        • Linear
          • 非圧縮 ⇒ ピクセルサイズで並べただけ
          • 圧縮 ⇒ 圧縮ブロックを並べる
        • Block
          • 非圧縮 ⇒ ピクセルサイズを 16×16 のブロックで並べる
          • 圧縮 ⇒ 圧縮ブロックを 4×4 で並べる
        • TODO: YUV のブロックサイズが分からない。
    • tiling
    • plane index
    • usage
      • read/write で変わる可能性があるから
    • 圧縮フラグ
    • format/usage/圧縮フラグから求まるアライメントの情報も必要

YUV フォーマット

参考:YUV のメモリレイアウト

YUV444

Y 面について UV 面を一切間引かないフォーマット。

DXGI_FORMAT_Y410 が対応する。

YUV422

UV 面について水平方向に間引いたフォーマットの事を 4:2:2 と言う。

4 つの Y 画素について 2 つの U と V の画素がある。

YUV420

UV 面について水平・垂直方向に間引いて UV 面の解像度を 1/2 に落としたフォーマットの事を 4:2:0 と言う。

420 は特に意味は無く慣例的に 422 特別するための記号と考えて良い。

DXGI_FORMAT_420_OPAQUE では 8bit