Введение в отложенные контексты
Этот раздел относится только к Windows 7 и более поздних версий, а также Windows Server 2008 R2 и более поздних версий операционной системы Windows.
Отложенные контексты используются приложением для создания списков команд. Если драйвер отображения пользовательского режима указывает, что он поддерживает списки команд с помощью флага D3D11DDICAPS_COMMANDLISTS_BUILD_2 структуры D3D11DDI_THREADING_CAPS , он также должен поддерживать возможность создания отложенных контекстов и управления ими. Дополнительные сведения о том, как драйвер указывает возможности потоков, см. в разделе Поддержка потоков, списков команд и трехмерного конвейера. Отложенные контексты отличаются от непосредственного контекста тем, что команды, которые записываются в отложенных контекстах, не могут выполняться до тех пор, пока приложение явно не запросит выполнение команд, выполнив созданный список команд. Для создания и использования отложенного контекста Direct3D версии 11 предоставляет следующие новые функции DDI. Эти функции представляют собой подмножество сведений, необходимых для создания сочетания контекста устройства и немедленного контекста.
Семантика функций CalcPrivateDeferredContextSize и CreateDeferredContext аналогична другим аналогичным функциям DDI.
Среда выполнения Direct3D передает новый дескриптор драйвера и дескриптор уровня ядра для каждого вызова функции CreateDeferredContext драйвера, чтобы создать каждый отложенный контекст. Состояние конвейера каждого отложенного контекста должно быть эквивалентно состоянию конвейера, которое имеет непосредственный контекст после выполнения в нем операции очистки состояния. Драйвер должен заполнить элементы структуры D3D11DDI_DEVICEFUNCS , на которую указывает элемент p11ContextFuncsструктуры D3D11DDIARG_CREATEDEFERREDCONTEXT , подмножеством функций из таблицы функций; Среда выполнения использует каждый из соответствующих отложенных контекстов D3D10DDI_HDEVICE дескриптор значений, которые член hDrvContext D3D11DDIARG_CREATEDEFERREDCONTEXT указывает с помощью этой таблицы функций.
Драйвер должен продолжать предоставлять функции, которые начинаются с pfnCreate, pfnOpen и pfnDeки для отложенного контекста. Эти функции используют ту же семантику потоков, что и остальная часть отложенного контекста, и используются для открытия и закрытия локальных дескрипторов DDI, как описано в разделе Использование дескрипторов Context-Local DDI. Функции, начинающиеся с pfnCalcPrivate или pfnCheck , не используются для отложенных контекстов; Поэтому драйвер может задать для членов D3D11DDI_DEVICEFUNCS для этих функций значение NULL при создании отложенного контекста. Большинство оставшихся функций устройства используются для отложенной поддержки контекста. Однако драйвер не использует свою функцию QueryGetData . Однако драйвер использует свои функции ResourceMap и ResourceUnmap . Драйвер поддерживает только функцию ResourceIsStagingBusy и новые функции DDI для зажимов ресурсов Direct3D версии 11 в непосредственном контексте с помощью дескрипторов немедленного контекста. Полный список функций, которые не используются для отложенных контекстов, см. в разделе Исключение функций DDI для отложенных контекстов.
Драйвер использует функции обратного вызова уровня ядра, предоставляемые в блоке памяти, на который указывает элемент p11UMCallbackD3D11DDIARG_CREATEDEFERREDCONTEXT . Эти функции обратного вызова базового уровня предоставляют DDI состояния обновления для каждого отложенного контекста. Однако наиболее важным является добавление функции обратного вызова pfnPerformAmortizedProcessingCb , описанной в разделе Изменения direct3D 10.
Драйвер не должен ожидать, что функция обратного вызова pfnDisableDeferredStagingResourceDestruction , на которую указывает действительный член pfnDisableDeferredStagingResourceDestructionD3D11DDI_CORELAYER_DEVICECALLBACKS . Драйвер должен вызвать pfnDisableDeferredStagingResourceDestruction в функции CreateDevice(D3D10) для контекста устройства или интерпретации; После этого драйвер никогда не должен вызывать pfnDisableDeferredStagingResourceDestruction с новой семантикой DDI Direct3D версии 11.
Функция RecycleCreateDeferredContext драйвера должна очистить состояние конвейера для отложенного контекста, аналогично тому, как createDeferredContext драйвера очищает состояние конвейера для отложенного контекста. После того как среда выполнения вызовет драйвер AbandonCommandList, CreateCommandList или RecycleCreateCommandList, среда выполнения может использовать дескриптор отложенного контекста с функцией DestroyDevice(D3D10) драйвера или RecycleCreateDeferredContext . Дополнительные сведения о RecycleCreateDeferredContext см. в разделе Оптимизация небольших списков команд.