5. レイアウト変換

ブロックフォーマットとリニアフォーマット間のレイアウト変換を行う関数は nn::gd::Memory クラスに定義されています。

5.1. ブロックフォーマットからリニアフォーマットへの変換

ブロックフォーマットからリニアフォーマットへの変換を行うための関数が用意されています。.

コード 5-1. ブロックフォーマットからリニアフォーマットへの変換関数
static nnResult nn::gd::Memory::CopyTexture2DResourceBlockToLinear(
        const nn::gd::Texture2DResource* source,
        s32 srcMipLevelIndex, u32 srcOffsetY, s32 srcCountRow,
        const nn::gd::Texture2DResource* dest,
        s32 dstMipLevelIndex, u32 dstOffsetY,
        nn::gd::Memory::DownScalingMode downScalingMode, gdBool yFlip);
static nnResult nn::gd::Memory::CopyTexture2DResourceBlockToLinear(
        const nn::gd::Texture2DResource* source,
        s32 srcMipLevelIndex, u32 srcOffsetY,
        u8* dstAddr, u32 dstWidth, u32 dstHeight, u32 dstFormat,
        nn::gd::Memory::DownScalingMode downScalingMode, gdBool yFlip);

source に指定された Texture2DResource オブジェクトのリソースデータが、ブロックフォーマットからリニアフォーマットに変換されて転送されます。また、変換するミップマップレベルを srcMipLevelIndex に指定することができます。-1 を指定した場合は Texture2DResource オブジェクトの最大のミップマップレベルが使用されます。

srcOffsetY には変換を開始する Y 座標値を指定します。アドレッシングの違いを関数内で吸収しますので、リソースデータの座標値そのままを指定してください。

転送先に Texture2DResource オブジェクトを指定する関数では、srcCountRow に変換するライン数を指定します。-1 を指定した場合は Texture2DResource オブジェクトの高さが使用されます。dstMipLevelIndexdstOffsetY には、転送先のミップマップレベルと転送開始位置の Y 座標値を指定します。

転送先にアドレスを指定する関数では、dstAddr に先頭アドレス、dstWidth に幅、dstHeight に高さ、dstFormat にピクセルフォーマットを指定します。

downScalingMode にはアンチエイリアスの指定を、yFlip には縦方向のフリップを有効にする場合に GD_TRUE を指定します。

これらの関数は内部で nngxAddB2LTransferCommand() を呼び出していますので、実際の変換処理はコマンドリストの実行時に行われます。

ブロックフォーマットからリニアフォーマットへの変換関数は、主にカラーバッファからディスプレイバッファへの転送時に使用します。コードの例は「2.7. 描画結果の表示」にあります。

5.2. リニアフォーマットからブロックフォーマットへの変換

リニアフォーマットからブロックフォーマットへの変換を行うための関数が用意されています。

コード 5-2. リニアフォーマットからブロックフォーマットへの変換関数
static nnResult nn::gd::Memory::CopyTexture2DResourceLinearToBlock(
        const nn::gd::Texture2DResource* source,
        s32 srcMipLevelIndex, u32 srcOffsetY, s32 srcCountRow,
        const nn::gd::Texture2DResource* dest,
        s32 dstMipLevelIndex, u32 dstOffsetY);
static nnResult nn::gd::Memory::CopyTexture2DResourceLinearToBlock(
        u8* srcAddr, u32 width, u32 height,
        const nn::gd::Texture2DResource* dest,
        s32 dstMipLevelIndex, u32 dstOffsetY);

dest に指定された Texture2DResource オブジェクトに、転送元のデータがリニアフォーマットからブロックフォーマットに変換されて転送されます。また、変換されたデータを受け取るミップマップレベルを dstMipLevelIndex に指定することができます。-1 を指定した場合は Texture2DResource オブジェクトの最大のミップマップレベルが使用されます。また、dstOffsetY にはデータの受け取りを開始する Y 座標値を指定します。アドレッシングの違いを関数内で吸収しますので、リソースデータの座標値そのままを指定してください。

転送元に Texture2DResource オブジェクトを指定する関数では、srcCountRow に変換するライン数を指定します。-1 を指定した場合は Texture2DResource オブジェクトの高さが使用されます。srcMipLevelIndexsrcOffsetY には、転送元のミップマップレベルと転送開始位置の Y 座標値を指定します。

転送元にアドレスを指定する関数では、srcAddr に先頭アドレス、width に幅、height に高さを指定します。

これらの関数は内部で nngxAddL2BTransferCommand() を呼び出していますので、実際の変換処理はコマンドリストの実行時に行われます。