Vala プログラミング

WebGPU プログラミング

おなが@京都先端科学大

Rust Vulkano Triangle (3)

Rust Vulkano Triangle (2)の続きです。

スワップチェインとイメージの作成
 screen(サーフェイス)にイメージを描画するには、Swapchain
スワップチェイン)が必要になります。
 スワップチェインの作成と同時にSwapchainImage(イメージ)が作成され
ます。スワップチェインは、イメージをサーフェイスに描画する役目をします。

 スワップチェインは、Struct vulkano::swapchain::Swapchainのnewメソッドで
作成する。
書式

fn new(device, surface, num_images, format, dimensions,
    layers, usage, sharing, transform, alpha, mode,
    clipped, old_swapchain)
  -> Result<(Swapchain, SwapchainImage), SwapchainCreationError>

引数には、
device(使用するVulkanデバイス)、
surface(使用するサーフェイス)、
num_images(イメージバッファの数)、
format(イメージフォーマット)、
dimensions(イメージのサイズ)、
layers(各イメージのレイヤーの数)、
usage(イメージの使用形式)、
sharing(sharing mode、キューファミリーの使用モードを指定)、
transform(surface transform、スクリーンに描画する前のイメージ変換)、
alpha(Composite alphaの指定)、
mode(present mode、イメージの表示モードの指定)、
clipped(ブッファの非表示部分をクリップ)、
old_swapchain(以前のスワップチェインの使用)
を指定する。
戻り値はResult型で、Okの場合はスワップチェインとスワップチェインイメージ
のタプル ( Swapchain, SwapcainImage ) を返す。

 引数 num_images、format、dimensions、usage、alphaは、サーフェイスの
capabilitiesメソッドを用いて取得した値を指定する。
capabilitiesの取得と引数

let caps = window.surface().capabilities(physical)
    .expect("failed to get surface capabilities");

num_images : caps.min_image_count
format : caps.supported_formats[0].0 (タプルの最初の値)
dimensions : caps.current_extent.unwrap()
usage : caps.supported_usage_flags
alpha : caps.supported_composite_alpha.iter().next().unwrap()

その他の引数は、次のようにする。

・device : device.clone()
・surface : window.surface().clone()
・layers : 1
・sharing : &queue
・transform : SurfaceTransform::Identity
・present : PresentMode::Fifo
・clipped : true
・old_swapchain : None

スワップチェインとイメージの作成は次のようになる。

// dimension
let mut dimensions;

// Swapchain and images  
let (mut swapchain, mut images) = {
    // Surface capabilities
    let caps = window.surface().capabilities(physical)
        .expect("failed to get surface capabilities");
    // dimension
    dimensions = caps.current_extent.unwrap();
    // composite alpha
    let alpha = caps.supported_composite_alpha.iter().next().unwrap();
    // format
    let format = caps.supported_formats[0].0;
    //  Swapchain and images
    Swapchain::new(device.clone(), window.surface().clone(), caps.min_image_count, format,
        dimensions, 1, caps.supported_usage_flags, &queue, SurfaceTransform::Identity, alpha,
        PresentMode::Fifo, true, None).expect("failed to create swapchain")
};