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


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

Функция D3dDrawPrimitives2 отрисовывает примитивы и возвращает обновленное состояние отрисовки.

Синтаксис

LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;

DWORD Lpd3dhalDrawprimitives2cb(
  LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}

Параметры

unnamedParam1

pdp [in]

Указывает на D3DHAL_DRAWPRIMITIVES2DATA структуру, содержащую сведения, необходимые драйверу для отрисовки одного или нескольких примитивов.

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

D3dDrawPrimitives2 возвращает один из следующих кодов обратного вызова:

Комментарии

D3dDrawPrimitives2 необходимо реализовать в драйверах Microsoft Direct3D.

Драйвер должен сделать следующее:

  • Убедитесь, что дескриптор контекста, заданный членом dwhContext структуры D3DHAL_DRAWPRIMITIVES2DATA в pdp , является допустимым.
  • Убедитесь, что пролистывание поверхности рисования, связанной с контекстом, не выполняется. Если поверхность рисования участвует в переворачивании, драйвер должен задать элемент ddrval D3DHAL_DRAWPRIMITIVES2DATA для DDERR_WASSTILLDRAWING и вернуть DDHAL_DRIVER_HANDLED.
  • Определите расположение первой структуры D3DHAL_DP2COMMAND , добавив количество байтов в элементе dwCommandOffset D3DHAL_DRAWPRIMITIVES2DATA в буфер команд, на который указывает элемент lpDDCommands D3DHAL_DRAWPRIMITIVES2DATA.
  • Определите расположение первой вершины в буфере вершин. Это следует делать только в том случае, если в буфере вершин есть данные; то есть при получении маркера команды D3DDP2OP_Xxx (за исключением случаев, когда маркер D3DDP2OP_LINELIST_IMM или D3DDP2OP_TRIANGLEFAN_IMM). Эти два кода операций указывают на то, что данные вершин передаются немедленно в поток команд, а не в буфер вершин. Таким образом, при условии, что в буфере вершин есть данные, если буфер вершин находится в пользовательской памяти, первая вершина — это байты dwVertexOffset в буфер, на который указывает lpVertices . В противном случае драйвер должен применить dwVertexOffset к памяти, связанной со структурой DD_SURFACE_LOCAL , на которую указывает lpDDVertex . dwVertexOffset, lpVertices и lpDDVertex являются членами D3DHAL_DRAWPRIMITIVES2DATA.
  • Проверьте член dwVertexType D3DHAL_DRAWPRIMITIVES2DATA, чтобы убедиться, что драйвер поддерживает запрошенный FVF. Драйвер не сможет выполнить вызов, если существует одно из следующих условий:
    • Координаты вершин не указаны; то есть, если D3DFVF_XYZRHW не задано.
    • Указываются нормальные значения; то есть, если задано D3DFVF_NORMAL.
    • Задается любой из зарезервированных битов D3DFVF_RESERVED x .
  • Обработайте все команды в буфере команд последовательно. Для каждой структуры D3DHAL_DP2COMMAND драйвер должен выполнять следующие действия.
    • Если команда D3DDP2OP_RENDERSTATE, обработайте структуры wStateCount D3DHAL_DP2RENDERSTATE , которые следуют в буфере команд, обновляя состояние драйвера для каждой структуры состояния отрисовки. При установке флага D3DHALDP2_EXECUTEBUFFER драйвер также должен отражать изменение состояния в массиве, на который указывает lpdwRStates . wStateCount и lpdwRStates являются членами D3DHAL_DRAWPRIMITIVES2DATA.
    • Если команда D3DDP2OP_TEXTURESTAGESTATE, обработайте структуру wStateCount D3DHAL_DP2TEXTURESTAGESTATE в буфере команд, обновив состояние текстуры драйвера, связанное с указанным этапом текстуры, для каждой структуры состояния текстуры.
    • Если команда D3DDP2OP_VIEWPORTINFO, обработайте структуру D3DHAL_DP2VIEWPORTINFO в буфере команд, обновив сведения о окне просмотра, хранящиеся во внутреннем контексте отрисовки драйвера.
    • Если команда D3DDP2OP_WINFO, обработайте структуру D3DHAL_DP2WINFO в буфере команд, обновив сведения w-буферизации, хранящиеся во внутреннем контексте отрисовки драйвера.
    • В противном случае обработайте D3DHAL_DP2 структуры-примитивыXxx , которые следуют команде D3DDP2OP_Xxx в буфере команд.
    • Если команда неизвестна, вызовите обратный вызов D3dParseUnknownCommand среды выполнения. Среда выполнения предоставляет этот обратный вызов обратному вызову DdGetDriverInfo драйвера с GUID_D3DParseUnknownCommandCallback GUID.
Драйверу не нужно проверять удобочитаемость памяти, в которой хранятся буферы команд и вершин. Однако драйвер должен оставаться в пределах, заданных членами dwCommandLength и dwVertexLength D3DHAL_DRAWPRIMITIVES2DATA.

Если драйвер должен завершиться ошибкой D3dDrawPrimitives2, он должен заполнить член dwErrorOffset D3DHAL_DRAWPRIMITIVES2DATA со смещением в буфер команд, где можно найти первый необработанное D3DHAL_DP2COMMAND.

Примечание Следующие комментарии действительны только для приложений, написанных с помощью интерфейсов Microsoft DirectX 7.0 и взаимодействующих с драйверами через среды выполнения DirectX 8.0 и DirectX 8.1.

Следующие комментарии недопустимы для приложений, написанных с помощью интерфейсов DirectX 8.0 и более поздних версий, так как такие приложения больше не используют концепцию текущего буфера вершин (то есть данные вершин больше не передаются через элемент lpDDVertex D3DHAL_DRAWPRIMITIVES2DATA). Таким образом, в этих приложениях функция D3dDrawPrimitives2 драйвера никогда не должна приводить к зависающему отрисовке из буфера вершин, даже если буфер является неявным или явным и на нем имеется незавершенная блокировка.

 
Если драйвер используется со средой выполнения DirectX 8.1 или более поздней версии, функция D3dDrawPrimitives2 драйвера никогда не должна вызывать отрисовку из текущего буфера вершин (переданного через lpDDVertex), если буфер является неявным. Если буфер является явным и на нем имеется незавершенная блокировка, драйвер должен зависнуть в конце своей функции D3dDrawPrimitives2 , если он не переименовывает буфер (не задает D3DHALDP2_SWAPVERTEXBUFFER). Если драйвер переименовывает буфер, драйвер не останавливается. Среды выполнения DirectX 8.1 и более поздних версий вызывают функцию D3dDrawPrimitives2 драйвера для отрисовки из заблокированного явного буфера вершин только при необходимости, поэтому производительность редко возникает. Неявный буфер вершин создается обратным вызовом Драйвера CreateD3DBuffer с установленным флагом DDSCAPS_EXECUTEBUFFER. Явный буфер вершин создается обратным вызовом Драйвера CreateD3DBuffer с установленными флагами DDSCAPS_EXECUTEBUFFER и DDSCAPS2_VERTEXBUFFER. Явный буфер вершин блокируется обратным вызовом LockD3DBuffer драйвера.

Если драйвер используется со средой выполнения DirectX 8.0, иногда драйвер должен зависать при отрисовке из неявного текущего буфера вершин, чтобы предотвратить проблемы синхронизации и повреждения. Кроме того, среда выполнения DirectX 8.0 вызывает функцию D3dDrawPrimitives2 драйвера для отрисовки из заблокированного явного текущего буфера вершин чаще, чем это действительно необходимо, поэтому производительность снижается. Ниже приведены обходные пути для драйвера, используемого со средой выполнения DirectX 8.0.

  • Драйвер должен застопориться при переходе между примитивами пользовательской памяти (определяемыми D3DHALDP2_USERMEMVERTICES) и отрисовкой из неявного текущего буфера вершин только в том случае, если буфер не переименовывался (не задает D3DHALDP2_SWAPVERTEXBUFFER).

    В следующем примере показано, когда D3dDrawPrimitives2 зависает в неявном текущем буфере вершин:

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, 0); // Stall 
    

    В следующем примере показано, когда D3dDrawPrimitives2 не должен зависать в неявном буфере текущих вершин:

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked
    DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked
    DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked
    DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked
    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
    

    Если среда выполнения устанавливает флаг D3DHALDP2_REQCOMMANDBUFSIZE, драйвер не должен зависать. По совпадению среда выполнения DirectX 8.0 также задает D3DHALDP2_REQCOMMANDBUFSIZE, когда она чаще всего отрисовывается из заблокированного явного текущего буфера вершин. Таким образом, драйвер может повысить производительность, не зависая при обнаружении D3DHALDP2_REQCOMMANDBUFSIZE при отрисовке из заблокированного явного текущего буфера вершин.

    В следующем примере показано, когда D3dDrawPrimitives2 зависает в явном текущем буфере вершин:

    DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
    

    В следующем примере показано, когда D3dDrawPrimitives2 не должен зависать в явном текущем буфере вершин:

    DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked
    DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked
    DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
    

    Требования

    Требование Значение
    Целевая платформа Персональный компьютер
    Верхняя часть d3dhal.h (включая D3dhal.h)

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

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF