Дескрипторы среды выполнения и драйвера Direct3D версии 10
Среда выполнения Direct3D версии 10 и дескриптор драйвера используют одинаковый период жизни. Среда выполнения Direct3D задает время существования объекта между вызовами функций типа создания (например, CreateResource(D3D10)) и вызовами функций типа destroy (например, DestroyResource(D3D10)). Среда выполнения предоставляет значения обработчика драйвера, а также значения дескриптора среды выполнения. По сути, эти дескрипторы представляют собой указатели, заключенные в оболочку со строгим типом для идентификации объекта, с которым выполняется операция. Ниже приведены примеры дескрипторов среды выполнения и драйвера для ресурсов.
// Strongly typed handle to identify a resource object to the driver:
typedef struct D3D10DDI_HRESOURCE
{
void* pDrvPrivate; // Pointer to memory location as large as the driver requested.
} D3D10DDI_HRESOURCE;
// Strongly typed handle to identify a resource object to the runtime:
typedef struct D3D10DDI_HRTRESOURCE
{
void* handle;
} D3D10DDI_HRTRESOURCE;
Все дескрипторы драйвера для объекта устройства отрисовки и его дочерних объектов проходят следующий механизм создания двух проходов:
Чтобы определить значение указателя дескриптора драйвера, среда выполнения сначала вызывает функцию CalcPrivateObjTypeSize (например, функцию CalcPrivateResourceSize ). В этом вызове среда выполнения передает параметры создания (например, указатель на структуру D3D10DDIARG_CREATERESOURCE ). Среда выполнения также передает параметры создания в вызове функции CreateObjType .
Драйвер отображения в пользовательском режиме обычно не требуется выделять что-либо во время вызова CalcPrivateObjTypeSize. Однако если драйвер выполняет ошибку или должен указать любой другой тип условия сбоя, драйвер может вернуть SIZE_T( -1 ), чтобы предотвратить создание обработки. Затем среда выполнения возвращает вызывающей приложению ошибку E_OUTOFMEMORY.
Как минимум, драйвер должен возвращать sizeof( void* ) из вызова CalcPrivateObjTypeSize.
Если среда выполнения может выделить достаточно места для удовлетворения размера, требуемого драйвером отображения пользовательского режима, среда выполнения вызовет функцию CreateObjType (например, CreateResource(D3D10)) с теми же параметрами создания, а также новым уникальным значением для дескриптора драйвера. Значение указателя дескриптора драйвера будет уникальным и постоянным в течение срока его существования, так как оно указывает на область памяти, размер которой был возвращен CalcPrivateObjTypeSize. Драйвер отображения пользовательского режима может использовать эту область памяти при необходимости. Драйвер должен повысить эффективность, размещая часто используемые данные в области памяти, предоставляемой средой выполнения.