функция обратного вызова 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.
Если драйвер должен завершиться ошибкой D3dDrawPrimitives2, он должен заполнить член dwErrorOffset D3DHAL_DRAWPRIMITIVES2DATA со смещением в буфер команд, где можно найти первый необработанное D3DHAL_DP2COMMAND.
Следующие комментарии недопустимы для приложений, написанных с помощью интерфейсов DirectX 8.0 и более поздних версий, так как такие приложения больше не используют концепцию текущего буфера вершин (то есть данные вершин больше не передаются через элемент lpDDVertex D3DHAL_DRAWPRIMITIVES2DATA). Таким образом, в этих приложениях функция D3dDrawPrimitives2 драйвера никогда не должна приводить к зависающему отрисовке из буфера вершин, даже если буфер является неявным или явным и на нем имеется незавершенная блокировка.
Если драйвер используется со средой выполнения 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) См. также раздел