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 バイトを初期化TotalBufferSizePacketCountする必要があります。 パネル ドライバーは、および の 0 以外の値TransmissionModeReportMipiErrorsSecondaryPortClearMipiErrorsManufacturingModeを使用して、既定の動作を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 が読み取り (最終) パケットの FailedPacketReadWordCountMipiErrorsHostErrors および ペイロードを完了すると、結果に応じて更新されている可能性があります。 転送の処理中にエラーが見つかった場合、OEM パネル ドライバーは、 と HostErrors の出力値を使用MipiErrorsして、復旧と続行の方法を決定する必要があります。

エラーの詳細を提供するために出力が呼び出し元に返されるようにするには、エラーが見つかった場合でも、IOCTL と DDI の呼び出しで成功を報告する必要があります。 成功はトランザクションが成功したことを示すのではなく、トランザクションを処理するための呼び出しが期待どおりに進み、必要に応じてエラー フラグが設定されていることを示します。 サポートされていない DDI 呼び出し (ドライバーの不一致、メモリ割り当てエラー、NULL バッファーの渡しなど、完全に無効なパラメーターの渡しなど) などの条件に対して、エラーが報告される場合があります。 呼び出しが成功した場合にエラーが報告されない場合、呼び出し元はトランザクションが成功したと見なす必要があります。

要件

要件
サポートされている最小のクライアント Windows 10 バージョン 2004
Header dispmprt.h

こちらもご覧ください

DXGI_DSI_TRANSMISSION