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


функция обратного вызова PFND3DDDI_ALLOCATECB (d3dumddi.h)

Функция pfnAllocateCb выделяет системную или видеопамяти.

Синтаксис

PFND3DDDI_ALLOCATECB Pfnd3dddiAllocatecb;

HRESULT Pfnd3dddiAllocatecb(
  [in] HANDLE hDevice,
       D3DDDICB_ALLOCATE *unnamedParam2
)
{...}

Параметры

[in] hDevice

Дескриптор устройства отображения (графический контекст).

unnamedParam2

pData [in, out]

Указатель на структуру D3DDDICB_ALLOCATE , описывающую выделение.

Возвращаемое значение

pfnAllocateCb возвращает одно из следующих значений:

Код возврата Описание
S_OK Память была успешно выделена.
E_INVALIDARG Параметры были проверены и определены как неверные.
E_OUTOFMEMORY pfnAllocateCb не удалось выделить память, необходимую для ее завершения.
D3DERR_OUTOFVIDEOMEMORY Не удалось завершить pfnAllocateCb из-за нехватки видеопамяти. Диспетчер видеопаметь пытается виртуализировать видеопамять; Однако в случае сбоя виртуализации (например, при нехватке виртуального адресного пространства) диспетчер памяти может вернуть этот код ошибки.
D3DDDIERR_DEVICEREMOVED pfnAllocateCb не удалось инициировать вызов функции DxgkDdiCreateAllocation драйвера дисплея miniport, так как произошло событие остановки Plug and Play (PnP) или события обнаружения и восстановления времени ожидания (TDR). Функция драйвера отображения в пользовательском режиме, которая вызвала функцию pfnAllocateCb (обычно это функция CreateResource, CreateResource(D3D10) или CreateResource(D3D11), должна возвращать этот код ошибки обратно в среду выполнения Direct3D.
Direct3D версии 9 Примечание. Дополнительные сведения о возврате кодов ошибок см. в разделе Возврат кодов ошибок, полученных от функций среды выполнения.
Direct3D версий 10 и 11 Примечание. Если функция драйвера не возвращает значение (то есть имеет VOID для типа возвращаемого параметра), функция драйвера вызывает функцию pfnSetErrorCb для отправки кода ошибки обратно в среду выполнения. Дополнительные сведения об обработке кодов ошибок см. в разделе Обработка ошибок.

Эта функция также может возвращать другие значения HRESULT.

Комментарии

Драйвер отображения пользовательского режима вызывает pfnAllocateCb для выделения системной или видеопамяти (также известной как выделение). Затем подсистема ядра графики Microsoft DirectX (Dxgkrnl.sys) вызывает функцию DxgkDdiCreateAllocation драйвера минипорта дисплея для интерпретации и хранения личных данных, переданных в запросе pfnAllocateCb . Драйвер мини-порта дисплея возвращает сведения из вызова DxgkDdiCreateAllocation , который диспетчер видеопамяти (который является частью Dxgkrnl.sys) используется для фактического выделения памяти.

Драйвер отображения пользовательского режима обычно создает выделение в ответ на вызов функции CreateResource, CreateResource(D3D10) или CreateResource(D3D11). Однако драйвер отображения пользовательского режима может создать выделение в любое время, например, когда функция CreateDevice драйвера пользовательского режима отображения или CreateDevice(D3D10) создает области временной панели в видеопамять.

Драйвер отображения пользовательского режима может создавать следующие типы выделений:

  • Выделение системной памяти, при которой среда выполнения Microsoft Direct3D предварительно выделяет системную память. В этом случае драйвер отображения пользовательского режима не может задать выравнивание или любой другой параметр. Если драйверу отображения пользовательского режима требуется предварительно выделить системную память, доступную для оборудования, он вызывает pfnAllocateCb. Среда выполнения Direct3D возвращает указатель системной памяти в элементе pSystemMem структуры D3DDDI_ALLOCATIONINFO для элементов в элементе pAllocationInfoструктуры D3DDDICB_ALLOCATE , на которую указывает pData. Если драйвер дисплея пользовательского режима не требует предварительной памяти системы, доступной оборудованием, он не должен вызывать pfnAllocateCb для этого типа памяти.
  • Выделение системной и видеопамять, в создании которых может участвовать драйвер дисплея пользовательского режима.
Когда драйвер пытается создать несколько выделений, драйвер может связать все выделения с родительским ресурсом (например, при создании перевернутой цепочки, в которой каждый backbuffer является отдельным выделением). Драйвер может выполнить такую связь, задав для элемента hResourceструктуры D3DDDICB_ALLOCATE , на которую указывает pData значение, переданное в функцию CreateResource, CreateResource(D3D10) или CreateResource(D3D11) драйвера. В ответ среда выполнения Direct3D возвращает дескриптор ресурса в режиме ядра (который имеет тип данных D3DKMT_HANDLE) в элементе hKMResource D3DDDICB_ALLOCATE. Драйвер отображения пользовательского режима впоследствии может вставить этот дескриптор ресурса режима ядра в поток команд для использования драйвером мини-порта дисплея.

Драйвер мини-порта отображения может вызывать функцию DxgkCbGetHandleData для этого дескриптора ресурса режима ядра (обычно в его функции DxgkDdiRender ) для получения личных данных, связанных с ресурсом, или драйвер мини-порта отображения может вызвать функцию DxgkCbEnumHandleChildren , чтобы получить все выделения, связанные с ресурсом. Драйвер мини-порта дисплея также может вызывать функцию DxgkCbGetHandleParent , чтобы получить родительский дескриптор ресурса режима ядра из дочернего дескриптора выделения.

Обратите внимание, что если элемент hResource D3DDDICB_ALLOCATE имеет значение NULL , когда драйвер отображения пользовательского режима вызывает pfnAllocateCb, выделение связано с устройством, а не с ресурсом. Драйвер может определить только, что разница является семантической. Связывание выделений с ресурсом является необязательным, но рекомендуется для целей отладки и диагностики.

Direct3D версии 9 Примечание. Дополнительные сведения о создании и уничтожении ресурсов см. в разделе Обработка создания и уничтожения ресурсов.

Direct3D версии 11 Примечание. Дополнительные сведения о том, как драйвер вызывает pfnAllocateCb, см. в разделе Изменения direct3D 10.

В следующем примере кода показано, как выделить память для ресурса.

    D3DDDICB_ALLOCATE           allocCB;
    D3DDDI_ALLOCATIONINFO       allocInfo;
    HRESULT                     hr;
    memset(&allocInfo,   0, sizeof(allocInfo));
    memset(&allocCB,     0, sizeof(allocCB));
    // Set the VidPN source ID for the primary and fullscreen back buffer
    if (m_dwCurResCaps.Primary) {
        allocInfo.Flags.Primary = TRUE;
        allocInfo.VidPnSourceId = m_VidPnSourceId;
    }
    // Check if the allocation is in system memory
    if (pSysMem) {
        allocInfo.pSystemMem = pSysMem;
    }
    // Use the runtime handle of the resource being created
    // NOTE: This is critical for supporting a shared resource
    allocCB.hResource = m_hCurResRuntime;

    allocCB.NumAllocations = 1;
    allocCB.pAllocationInfo = &allocInfo;

    hr = m_d3dCallbacks.pfnAllocateCb(m_hD3D, &allocCB);

    if (FAILED(hr)) {
        allocInfo.hAllocation = NULL;
    }
    else {
        *phAllocation = allocInfo.hAllocation;
    }

    return (hr);

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows Vista и более поздних версиях операционных систем Windows.
Целевая платформа Персональный компьютер
Верхняя часть d3dumddi.h (включая D3dumddi.h)

См. также раздел

CreateDevice

CreateDevice(D3D10)

CreateResource

CreateResource(D3D10)

CreateResource(D3D11)

D3DDDICB_ALLOCATE

D3DDDI_ALLOCATIONINFO

D3DDDI_DEVICECALLBACKS

DxgkCbEnumHandleChildren

DxgkCbGetHandleData

DxgkCbGetHandleParent

DxgkDdiCreateAllocation  

Функции среды выполнения Direct3D, вызываемые драйверами отображения User-Mode