DXGKDDI_DSITRANSMISSION コールバック関数 (dispmprt.h)
DxgkddiDsiTransmission コールバック関数は、Display Serial Interface (DSI) 転送を実行します。
構文
DXGKDDI_DSITRANSMISSION DxgkddiDsitransmission;
NTSTATUS DxgkddiDsitransmission(
[in] HANDLE Context,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[out] PDXGK_DSI_TRANSMISSION pArgs
)
{...}
パラメーター
[in] Context
[in] TargetId
モニターのターゲット識別子。
[out] pArgs
DXGI_DSI_TRANSMISSION構造体へのポインター。
戻り値
DxgkddiDsiTransmission は成功した場合STATUS_SUCCESSを返します。それ以外の場合は、 Ntstatus.h で定義されているエラー コードのいずれかを返します。
注釈
OEM パネル ドライバーがグラフィックス アダプターとパネル ハードウェアの間のプライベート インターフェイスを介して対話できるようにするには、トランザクションは、バスを占有する時間以外のグラフィックス ドライバー効果を持たないか、グラフィックス ドライバーが制御されるように完全に定義する必要があります。 OEM パネル ドライバーの対話を許可するポイントは、グラフィックス ドライバーに不透明なカスタム パネル機能のサポートを提供するため、完全に定義された操作は、パネル ドライバーがグラフィックス ドライバーの関与なしでは実行できない標準化された操作を実行する必要があるトランザクションに限定することを目的としています。 このようなトランザクションは、転送としてではなく、明示的にルーティングされた例外として扱われます。
各 DSI 送信要求は、OEM パネル ドライバーによって入力され、モニター スタックを渡され、転送の結果 (存在する場合) と共に返される 1 つのバッファーで構成されます。 バッファーには送信に関する全体的な情報が含まれており、入力フィールドと出力フィールドの両方に続いて、 DXGK_DSI_PACKET 構造体の可変サイズの配列が続きます。 パケットは DSI の用語で記述されています。これにより、DSI パケットを記述できますが、OS はパケットを解析し、許可されていないパケットを含む送信を拒否します。 最後を除くすべてのパケットは、DSI 定義によって、短い書き込み (バッファーが使用されていない場合 Payload
) またはバッファー内に収まる長い書き込みのいずれかである可能性があるパケットを Payload
書き込みます。 送信の最後のパケット (読み取りまたは書き込み) は、64K-1 データ バイトの DSI 長いパケット データ制限までの任意のサイズの読み取りまたは書き込みを可能にする大きなバッファーを割り当て、記述することによって拡張ペイロードを使用できます。 これにより、小さな書き込みパケットのシーケンスを 1 回の呼び出しでドライバーにキューに入れますが、より大きなパケットを個別に送信する必要があります。 フィールドの FinalPacketExtraPayload
値は、割り当てられた余分なバイト数を示しますが、これはフィールドでも TotalBufferSize
考慮する必要があります。
OEM パネル ドライバーは、要求する転送が競合したり、他の転送の処理の遅延を引き起こす可能性のある操作を要求したりするため、グラフィックス ドライバーがパネルとの通常の対話に使用する他の転送に干渉しないようにする責任があります。 パネル ドライバーは、グラフィックス ドライバーで後続のエラーを引き起こす状態を変更することはできません 。たとえば、MCS コマンドを使用してパネルのタイミングを変更します。 同様に、OS がグラフィックス ドライバーを介してディスプレイの変更を要求した場合(明るさの向上など)、パネル ドライバーは DSI コマンドを使用して、応答または他の目的で変更を元に戻す必要があります。
IOCTL_MIPI_DSI_TRANSMISSIONは、1 つ以上の DSI パケットを含む周辺機器への送信を要求するために使用されます。 パネル ドライバーは、常に を初期化し、各パケットの最初の 3 バイトを初期化TotalBufferSize
PacketCount
する必要があります。 パネル ドライバーは、および の 0 以外の値TransmissionMode
ReportMipiErrors
SecondaryPort
ClearMipiErrors
ManufacturingMode
を使用して、既定の動作をFinalCommandExtraPayload
オーバーライドできます。 初期化されていない値はすべて 0 に設定する必要があります。
OS では、DSI パケットのシーケンスが整形式であり、すべての定義済みフィールドと正しいバッファー サイズに有効な情報が含まれます。 OS は、特定のパケットで問題が見つかった場合にのみ、OS またはドライバーで追加の検証を行う必要があるフィールドをDXGK_DSI_INVALID_PACKET_INDEXに初期化 FailedPacket
する役割を担います。 DXGK_DSI_TRANSMISSIONが整形式でない場合、OS はフィールドに DXGK_HOST_DSI_INVALID_TRANSMISSION フラグをHostErrors
設定して、他の無効なパラメーター エラーと区別します。
整形式と見なすには、次のすべてが当てはまる必要があります。
- TotalBufferSize >= sizeof(DXGK_DSI_TRANSMISSION) + ((PacketCount - 1) * sizeof(DXGK_DSI_PACKET)) + FinalPacketExtraPayload
- FinalPacketExtraPayload <= 64K-1-DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE (0xFFF7)
- TotalBufferSize <= ROUND_TO_PAGES( sizeof(DXGK_DSI_TRANSMISSION) + (0xFE * sizeof(DXGK_DSI_PACKET)) + 0xFFF7 )
- PacketCount != 0
- 最後のパケットのみが読み取り可能
- 最終的な長い書き込みパケットのみが [DXGK_DSI_PACKET_EMBEDDED_PAYLOAD_SIZE] より大きい値を
LongWriteWordCount
持つことができます
パケット検証
OS はすべてのパケットの内容を完全に検証しようとはしませんが、次以外の DSI コマンドを含む転送を拒否し、グラフィックス ドライバーを呼び出さずに IOCTL を完了します。
データ型の値 | 説明 |
---|---|
0x03 | ジェネリック Short WRITE、パラメーターなし |
0x13 | 汎用 Short WRITE、1 パラメーター |
0x23 | 汎用の Short WRITE、2 つのパラメーター |
0x04 | ジェネリック READ、パラメーターなし |
0x14 | ジェネリック READ、1 パラメーター |
0x24 | ジェネリック READ、2 つのパラメーター |
0x05 | DCS Short WRITE、パラメーターなし |
0x15 | DCS Short WRITE、1 パラメーター |
0x06 | DCS READ、パラメーターなし |
0x29 | 汎用長書き込み |
0x39 | DCS の長い書き込み/write_LUT |
汎用の読み取りコマンドと書き込みコマンドでは、パネルの仕様を理解する必要があるため、バスが過度に使用されていない限り、グラフィックス ドライバーの問題を引き起こすことなく、パネル ドライバーがこれらのコマンドを自由に使用できることを期待します。 同様に、DCS MCS コマンドは製造元用に明示的に定義されているため、グラフィックス ドライバーとパネル ドライバーの間の干渉に問題はありません。
DCS UCS の場合、未定義のコマンドはグラフィックス ドライバーで使用されることが想定されていないため、OS ではパネル ドライバーで使用できるようになりますが、将来の MIPI-DCS 仕様の変更によってコマンドが定義され、MCS コマンドが優先されるリスクは明らかです。
標準化された DCS UCS コマンドは、通常の操作中にグラフィックス ドライバーによって使用され、パネル ドライバーで使用できる可能性があるため、OEM パネル ドライバーから送信されたコマンドによって後続のグラフィックス ドライバー コマンドの問題が発生するリスクを軽減する必要があります。 これを行うには、OS は DCS コマンドを解析し、OEM パネル ドライバーがフラグを設定 ManufacturingMode
し、OS がシステムが製造モードであることを確認しない限り、競合が発生することが予想されるパケットを拒否します。 フラグが設定されているが、システムが製造モードでない場合は、グラフィックス ドライバーを呼び出さずに、DXGK_HOST_DSI_INVALID_TRANSMISSION フラグが HostErrors
フィールドに設定された状態で伝送 IOCTL が完了します。
転送を使用する代わりに完全に定義されたトランザクションを必要とする条件は、次のようになります。
- DCS soft_resetなど、アイドル時間の前後に必要なアイドル期間
- DCS set_vsync_timingやenter_sleep_modeなど、フレーム出力の動作環境を変更する
- グラフィックス ドライバーが DCS write_memory_start/write_memory_continue など、同じデータにアクセスする必要がある場合がある開始/継続セマンティクスでトランザクションを使用する
さらに、転送として送信されるときに OS によって拒否される DCS コマンドのクラスもあります。
- 上記のように、完全に定義する必要があるコマンド
- 画面スクレイピングに使用できるピクセル データの読み取り
- ピクセル データの書き込み
OS がグラフィックス ドライバーに渡す UCS コマンド:
Hex | コマンド |
---|---|
00h | Nop |
26h | set_gamma_curve |
2Dh | write_LUT |
51h | set_display_brightness |
52h | get_display_brightness |
53h | write_control_display |
54h | get_control_display |
55h | write_power_save |
56h | get_power_save |
5Eh | set_CABC_min_brightness |
5Fh | get_CABC_min_brightness |
03h | get_compression_mode |
05h | get_error_count_on_DSI |
06h | get_red_channel |
07h | get_green_channel |
08h | get_blue_channel |
0Ah | get_power_mode |
0Bh | get_address_mode |
0Ch | get_pixel_format |
0Dh | get_display_mode |
0Eh | get_signal_mode |
0Fh | get_diagnostic_result |
14h | get_image_checksum_rgb |
15h | get_image_checksum_ct |
3Fh | get_3D_control |
45h | get_scanline |
OS が拒否する UCS コマンド:
Hex | コマンド |
---|---|
01h | soft_reset ( IOCTL_MIPI_DSI_RESET経由で送信する必要があります) |
10h | enter_sleep_mode |
11h | exit_sleep_mode |
12h | enter_partial_mode |
13h | enter_normal_mode |
20h | exit_invert_mode |
21h | enter_invert_mode |
28h | set_display_off |
29h | set_display_on |
2Ah | set_column_address |
2Bh | set_page_address |
2Ch | write_memory_start |
2Eh | read_memory_start |
30h | set_partial_rows |
31h | set_partial_columns |
33h | set_scroll_area |
34h | set_tear_off |
35h | set_tear_on |
36h | set_address_mode |
37h | set_scroll_start |
38h | exit_idle_mode |
39h | enter_idle_mode |
3Ah | set_pixel_format |
Ch | write_memory_continue |
3Dh | set_3D_control |
3Eh | read_memory_continue |
40h | set_vsync_timing |
44h | set_tear_scanline |
A1h | read_DDB_start |
A2h | read_PPS_start |
A8h | read_DDB_continue |
A9h | read_PPS_continue |
グラフィックス ドライバーの実装
転送が OS 検証に合格した場合、OS は DxgkDsiTransmission DDI を呼び出してバッファーをグラフィックス ドライバーに渡します。
OS 要求と周辺機器制御のニーズに基づいてピクセルデータと制御データの両方を送信するために既に使用されているインターフェイスに OEM 転送を追加することは、必然的に、グラフィックス ドライバーがこの追加のパケット ストリームを正しく組み込むことができるように内部シーケンス処理を強化する必要があることを意味します。 グラフィックス ドライバーは、OEM パネル ドライバーからの伝送内のパケットを並べ替え、中断されずに、他のパケットをインターリーブせずにシーケンス全体を送信する必要があります。 グラフィックス ドライバーは、OEM パネル転送要求の到着時刻に関して独自のパケットの順序を維持する必要がないため、OEM パネル転送を送信する前 (または後) に次のフレームを設定するパケットを送信することを選択できます。 開始された OEM パネル転送が完了すると、重要なパケットが時間枠を逃す恐れがある場合、ドライバーは転送を取り消し済みとして報告する必要があります。 転送が開始されていないが、ドライバーが重要なパケットの時間枠を逃すと予想される場合、ドライバーは次の空白期間まで転送の開始を延期する必要があります。 OEM パネル転送を遅延すると、2 フレームを超えるフレームが開始されるのを待機していた場合、ドライバーは送信を破棄済みとして報告する必要があります。
グラフィックス ドライバーでは、パネル ドライバーの代わりに送信される転送が、コントロールを持つ転送と競合しないようにすることはできません。 ドライバーは、転送内のパケットを検査し、問題が発生する場合は転送を拒否することを選択できますが、安全でないと見なされるパケットには OS レベルの拒否のフラグを設定する必要があるため、ドライバー レベルの拒否は、グラフィックス ベンダー固有の懸念が原因であることが理想的です。 ドライバーは、パケットが標準化されたコマンドのように見える場合でも、読み取りまたは書き込みをキャッシュまたは最適化しようとしないでください。
パケットの問題が原因でグラフィックス ドライバーが送信を拒否した場合は、最初のパケットのインデックスを使用してフィールドを更新 FailedPacket
し、転送を拒否し、戻る前に DXGK_HOST_DSI_DRIVER_REJECTED_PACKET フラグを設定 HostErrors
する必要があります。 転送モードのオーバーライドが指定されている場合、ドライバーは、オーバーライドがハードウェア制約と互換性があることを確認し、そうでない場合は、戻る前にDXGK_HOST_DSI_BAD_TRANSMISSION_MODE フラグを設定 HostErrors
する必要があります。
通信中にエラーが発生した場合、グラフィックス ドライバーは失敗したパケットのインデックスを使用してフィールドを更新 FailedPacket
する必要がありますが、ドライバーがパケットを識別できない可能性があるため、ドライバーは既定値のままにDXGK_DSI_INVALID_PACKET_INDEX。
グラフィックス ドライバーはパケットの通信を担当するため、チェック合計が計算および検証されていることを確認する必要があります。 読み取りで終わる送信はすべて短いパケットであるため、Data0 フィールドと Data1 フィールドにはパラメーターが含まれており、応答は短いパケットまたは長いパケットのいずれかになります。 グラフィックス ドライバーでは、返されるデータの形式と期間がわからない場合がありますが、最大サイズは、 を含む FinalPacketExtraPayload
最終的なパケットのペイロードのフル サイズです。 OS は、この値がターゲットの機能でドライバーによって報告されたよりも大きく TargetMaximumReturnPacketSize
ないことを検証しますが、ドライバーは、このバッファーがより多くのデータを報告する周辺機器によってオーバーランされていないことと、周辺機器に現在適用されている MaximumReturnPacketSize よりも大きいために周辺機器からのデータが切り捨てられないことを確認する必要があります。 ドライバーは、バッファーに読み取られたバイト数を転送を ReadWordCount
記述するフィールドに書き込みます。
グラフィックス ドライバーがパネルへの通信インターフェイス、または OEM パネル ドライバーに対して監視できないエラーが原因でパネル全体を強制的にリセットする場合があります。 これに対処するには、ドライバーは、OEM パネル ドライバーが状況を検出し、回復できるように、リセット後の最初の転送試行で HostErrors
フィールドに設定DXGK_HOST_DSI_INTERFACE_RESETまたはDXGK_HOST_DSI_DEVICE_RESETを報告する必要があります。 ドライバーは、ハードウェアにこの転送を送信することはできませんが、OEM パネル ドライバーは、回復が必要ない場合は、同じコマンドを再試行する場合があります。その場合、ドライバーは通常どおり転送の処理を続行する必要があります。
転送の完了
IOCTL が読み取り (最終) パケットの FailedPacket
、 ReadWordCount
、 MipiErrors
、 HostErrors
および ペイロードを完了すると、結果に応じて更新されている可能性があります。 転送の処理中にエラーが見つかった場合、OEM パネル ドライバーは、 と HostErrors
の出力値を使用MipiErrors
して、復旧と続行の方法を決定する必要があります。
エラーの詳細を提供するために出力が呼び出し元に返されるようにするには、エラーが見つかった場合でも、IOCTL と DDI の呼び出しで成功を報告する必要があります。 成功はトランザクションが成功したことを示すのではなく、トランザクションを処理するための呼び出しが期待どおりに進み、必要に応じてエラー フラグが設定されていることを示します。 サポートされていない DDI 呼び出し (ドライバーの不一致、メモリ割り当てエラー、NULL バッファーの渡しなど、完全に無効なパラメーターの渡しなど) などの条件に対して、エラーが報告される場合があります。 呼び出しが成功した場合にエラーが報告されない場合、呼び出し元はトランザクションが成功したと見なす必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 10 バージョン 2004 |
Header | dispmprt.h |