Win32 API 日本語リファレンス
ホームGraphics.Direct3D11 › D3D11_TRACE_STEP

D3D11_TRACE_STEP

構造体
サイズx64: 24 バイト / x86: 24 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
IDDWORD4+0+0

シェーダーに含まれる実行可能命令へのオフセットとして、命令を識別する番号です。

HLSL のデバッグ情報も同じ規則を使用します。そのため、HLSL 命令は一連の ID に対応付けられます。ID を、ユーザーに表示できる逆アセンブル文字列にマップできます。

InstructionActiveBOOL4+4+4命令がアクティブかどうかを指定する値です。何らかの処理が行われた場合、この値は TRUE になります。したがって、この構造体の他のデータを解析してください。それ以外の場合は何も行われていません。たとえば、スタンプ内の他のピクセルが実行していても、フロー制御によって命令が無効化されている場合などです。
NumRegistersWrittenBYTE1+8+8この命令が書き込みを行うレジスターの数です。レジスターの範囲は [0...NumRegistersWritten-1] です。レジスター番号を ID3D11ShaderTrace::GetWrittenRegisterwrittenRegisterIndex パラメーターに渡すと、個々の書き込みレジスターの情報を取得できます。
NumRegistersReadBYTE1+9+9この命令が読み取りを行うレジスターの数です。レジスターの範囲は [0...NumRegistersRead-1] です。レジスター番号を ID3D11ShaderTrace::GetReadRegisterreadRegisterIndex パラメーターに渡すと、個々の読み取りレジスターの情報を取得できます。
MiscOperationsWORD2+10+10

次の値をビット単位の OR 演算で組み合わせた値です。結果の値は、トレースのその他の操作のマスクを指定します。これらのフラグは、シェーダー操作が出力レジスターに何も書き込まない場合に、その操作が及ぼす可能性のある影響を示します。 たとえば、"add r0, r1 ,r2" 操作は r0 レジスターに書き込むため、トレースの書き込みレジスターの情報を調べることで、その操作によって何が変化したかを判断できます。 しかし、一部のシェーダー命令はレジスターに何も書き込まないにもかかわらず、それらのレジスターに影響を与えます。

フラグ 説明
D3D11_TRACE_MISC_GS_EMIT (0x1) この操作はジオメトリ シェーダーのデータ出力 (emit) でした。
D3D11_TRACE_MISC_GS_CUT (0x2) この操作はジオメトリ シェーダーのストリップ カットでした。
D3D11_TRACE_MISC_PS_DISCARD (0x4) この操作はピクセル シェーダーの discard であり、ピクセルを破棄します。
D3D11_TRACE_MISC_GS_EMIT_STREAM (0x8) D3D11_TRACE_MISC_GS_EMIT と同じですが、シェーダー モデル 5 では出力先となる特定のストリームを指定できる点が異なります。
D3D11_TRACE_MISC_GS_CUT_STREAM (0x10) D3D11_TRACE_MISC_GS_CUT と同じですが、シェーダー モデル 5 ではストリップ カットの対象となる特定のストリームを指定できる点が異なります。
D3D11_TRACE_MISC_HALT (0x20) この操作はシェーダーの halt 命令であり、シェーダーの実行を停止します。HLSL の abort 組み込み関数は halt を発生させます。
D3D11_TRACE_MISC_MESSAGE (0x40) この操作はシェーダーのメッセージ出力であり、情報キューに記録できます。HLSL の printf 組み込み関数と errorf 組み込み関数はメッセージを発生させます。

NumRegistersWritten メンバーが 0 の場合は、このメンバーを調べてください。ただし、このメンバーも空 (0) である可能性があります。

OpcodeTypeDWORD4+12+12命令の種類 (addmul など) を指定する番号です。命令の種類を表す番号がわからない場合は、このメンバーを無視できます。このメンバーは、トレースをわずかに肥大化させる代わりに、ちょっとした利便性をもたらします。 ID メンバーを使用して元のシェーダー コードにマップし直すことで、命令に関する完全な情報を取得できます。
CurrentGlobalCycleULONGLONG8+16+16

このステップにおけるグローバル サイクル数です。 このメンバーを使用すると、たとえばコンピュート シェーダーで、複数の同時トレースによる並列スレッドの実行を関連付けることができます。

メモ 実行上の同じ地点にある複数のスレッドが、同じ CurrentGlobalCycle を記録することがあります。

公式ドキュメント

トレース ステップ (命令) を記述します。

解説(Remarks)

この API には、Windows 8 用 Windows ソフトウェア開発キット (SDK) が必要です。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// D3D11_TRACE_STEP  (x64 24 / x86 24 バイト)
typedef struct D3D11_TRACE_STEP {
    DWORD ID;
    BOOL InstructionActive;
    BYTE NumRegistersWritten;
    BYTE NumRegistersRead;
    WORD MiscOperations;
    DWORD OpcodeType;
    ULONGLONG CurrentGlobalCycle;
} D3D11_TRACE_STEP;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct D3D11_TRACE_STEP
{
    public uint ID;
    [MarshalAs(UnmanagedType.Bool)] public bool InstructionActive;
    public byte NumRegistersWritten;
    public byte NumRegistersRead;
    public ushort MiscOperations;
    public uint OpcodeType;
    public ulong CurrentGlobalCycle;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure D3D11_TRACE_STEP
    Public ID As UInteger
    <MarshalAs(UnmanagedType.Bool)> Public InstructionActive As Boolean
    Public NumRegistersWritten As Byte
    Public NumRegistersRead As Byte
    Public MiscOperations As UShort
    Public OpcodeType As UInteger
    Public CurrentGlobalCycle As ULong
End Structure
import ctypes
from ctypes import wintypes

class D3D11_TRACE_STEP(ctypes.Structure):
    _fields_ = [
        ("ID", wintypes.DWORD),
        ("InstructionActive", wintypes.BOOL),
        ("NumRegistersWritten", ctypes.c_ubyte),
        ("NumRegistersRead", ctypes.c_ubyte),
        ("MiscOperations", ctypes.c_ushort),
        ("OpcodeType", wintypes.DWORD),
        ("CurrentGlobalCycle", ctypes.c_ulonglong),
    ]
#[repr(C)]
pub struct D3D11_TRACE_STEP {
    pub ID: u32,
    pub InstructionActive: i32,
    pub NumRegistersWritten: u8,
    pub NumRegistersRead: u8,
    pub MiscOperations: u16,
    pub OpcodeType: u32,
    pub CurrentGlobalCycle: u64,
}
import "golang.org/x/sys/windows"

type D3D11_TRACE_STEP struct {
	ID uint32
	InstructionActive int32
	NumRegistersWritten byte
	NumRegistersRead byte
	MiscOperations uint16
	OpcodeType uint32
	CurrentGlobalCycle uint64
}
type
  D3D11_TRACE_STEP = record
    ID: DWORD;
    InstructionActive: BOOL;
    NumRegistersWritten: Byte;
    NumRegistersRead: Byte;
    MiscOperations: Word;
    OpcodeType: DWORD;
    CurrentGlobalCycle: UInt64;
  end;
const D3D11_TRACE_STEP = extern struct {
    ID: u32,
    InstructionActive: i32,
    NumRegistersWritten: u8,
    NumRegistersRead: u8,
    MiscOperations: u16,
    OpcodeType: u32,
    CurrentGlobalCycle: u64,
};
type
  D3D11_TRACE_STEP {.bycopy.} = object
    ID: uint32
    InstructionActive: int32
    NumRegistersWritten: uint8
    NumRegistersRead: uint8
    MiscOperations: uint16
    OpcodeType: uint32
    CurrentGlobalCycle: uint64
struct D3D11_TRACE_STEP
{
    uint ID;
    int InstructionActive;
    ubyte NumRegistersWritten;
    ubyte NumRegistersRead;
    ushort MiscOperations;
    uint OpcodeType;
    ulong CurrentGlobalCycle;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; D3D11_TRACE_STEP サイズ: 24 バイト(x64)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; ID : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; InstructionActive : BOOL (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; NumRegistersWritten : BYTE (+8, 1byte)  poke st,8,値  /  値 = peek(st,8)
; NumRegistersRead : BYTE (+9, 1byte)  poke st,9,値  /  値 = peek(st,9)
; MiscOperations : WORD (+10, 2byte)  wpoke st,10,値  /  値 = wpeek(st,10)
; OpcodeType : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; CurrentGlobalCycle : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global D3D11_TRACE_STEP
    #field int ID
    #field bool InstructionActive
    #field byte NumRegistersWritten
    #field byte NumRegistersRead
    #field short MiscOperations
    #field int OpcodeType
    #field int64 CurrentGlobalCycle
#endstruct

stdim st, D3D11_TRACE_STEP        ; NSTRUCT 変数を確保
st->ID = 100
mes "ID=" + st->ID