Поделиться через


Ретроактивное требование Free-Threaded DDIs CalcPrivate

Direct3D версии 11 задним числом требует функций драйвера отображения в пользовательском режиме, которые начинаются с pfnCalcPrivate в функциях Direct3D версии 10 DDI, которые являются свободными потоками. Это ретроактивное требование соответствует поведению direct3D версии 11 DDI, так как всегда требуются функции pfnCalcPrivate* и pfnCalcDeferredContextHandleSize , которые являются свободными, даже если драйвер указывает, что они не поддерживают потоки DDI. Дополнительные сведения о том, как драйвер указывает поддержку потоков, см. в разделе Поддержка потоков, списки команд и трехмерный конвейер. Причина этого ретроактивного требования заключается в том, что такие функции обычно очень просты, так как они возвращают немедленное значение размера. Функции, которые являются более сложными, определяют, какое немедленное значение следует возвращать на основе параметров, передаваемых в функцию. Требование для функций, которые начинаются с pfnCalcPrivate , фактически записывать данные в места, отличные от стека, не существует. Требование к этим функциям для чтения любых данных, отличных от параметров, является редкостью. Любые требования к чтению данных не создают проблем с состязанием. Это позволяет API Direct3D версии 11 выполнить столь необходимую оптимизацию и предотвратить выполнение дорогостоящей синхронизации дважды за создание (например, любой вызов для создания объекта, например вызов CreateResource(D3D10) или CreateGeometryShader), а не один раз.

Заметным исключением из этого ретроактивного требования к свободнопотоковому использованию является функция CalcPrivateDeviceSize , которая используется для выполнения создания устройства отображения. CalcPrivateDeviceSize находится в таблице функций адаптера (D3D10_2DDI_ADAPTERFUNCS или D3D10DDI_ADAPTERFUNCS). CalcPrivateDeviceSize не подпадает под группу функций, которые испытали расслабление в потоковой модели. Функция CalcPrivateDeviceSize не требуется в свободном потоке.