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


Структура VIDEOMEMORY (ddrawint.h)

Структура VIDEOMEMORY позволяет драйверу управлять своей памятью дисплея в кучах.

Синтаксис

typedef struct _VIDEOMEMORY {
  DWORD   dwFlags;
  FLATPTR fpStart;
  union {
    FLATPTR fpEnd;
    DWORD   dwWidth;
  };
  DDSCAPS ddsCaps;
  DDSCAPS ddsCapsAlt;
  union {
#if ...
    _VMEMHEAP        *lpHeap;
#else
    struct _VMEMHEAP *lpHeap;
#endif
    DWORD            dwHeight;
  };
} VIDEOMEMORY;

Члены

dwFlags

Задает набор флагов, описывающих этот конкретный раздел отображаемой памяти. Этот элемент может быть побитовой или любого из следующих значений:

Flag Значение
VIDMEM_ISLINEAR Память дисплея представляет собой непрерывный блок памяти.
VIDMEM_ISRECTANGULAR Память дисплея прямоугольная.
VIDMEM_ISHEAP Этот флаг зарезервирован для системного использования и должен игнорироваться драйвером.
VIDMEM_ISNONLOCAL Куча находится в нелокальной памяти (AGP).
VIDMEM_ISWC Драйвер включил объединение операций записи в памяти дисплея в этой куче. Объединение операций записи — это специальный режим кэширования в процессорах класса Xeon Pro, который пакетирует операции записи в одну и ту же строку кэша, чтобы их можно было передавать в один час шины. Объединение операций записи не сохраняет порядок операций записи, что обычно приемлемо для буферов кадров. Дополнительные сведения об объединении операций записи см. в документации Intel. Этот флаг нельзя использовать, если не установлен флаг VIDMEM_ISNONLOCAL.
VIDMEM_HEAPDISABLED Среда выполнения Microsoft DirectDraw использует этот флаг для отключения кучи при сбое инициализации кучи. Скорее всего, это происходит с кучей AGP. Драйвер не должен задавать этот бит.

fpStart

Указывает на начальный адрес диапазона памяти в куче.

fpEnd

Указывает на конечный адрес диапазона памяти, если куча является линейной. Этот адрес является инклюзивным, то есть указывает последний допустимый адрес в диапазоне. Таким образом, число байтов, указанное в fpStart и fpEnd , равно (fpEnd - fpStart + 1).

dwWidth

Задает ширину в байтах раздела памяти, на который указывает fpStart. Этот элемент следует использовать только для описания прямоугольных областей памяти.

ddsCaps

Задает структуру DDSCAPS , в которой драйвер возвращает возможности, для которых этот раздел памяти не может быть использован.

ddsCapsAlt

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

lpHeap

Зарезервировано для использования системой и должно игнорироваться драйвером.

dwHeight

Задает высоту блока памяти, на который указывает fpStart . Этот элемент следует использовать только для описания прямоугольных областей памяти.

Комментарии

В Microsoft Windows 2000 и более поздних версиях структура данных называется VIDEOMEMORY, а в Windows 98/Me структура данных называется VIDMEM.

GDI выделяет и передает массив структур VIDEOMEMORY во второй вызов функции DrvGetDirectDrawInfo драйвера. Драйвер должен заполнить соответствующие элементы каждой структуры, чтобы описать каждый конкретный раздел памяти. Список содержит полное описание памяти драйвера за кадром.

DirectDraw выполняет сканирование, чтобы выделить свои поверхности в порядке перечисления кучи памяти дисплея. Кучи управляются в массиве структур VIDEOMEMORY. Память, выделенная первым, будет памятью, к которому обращается первым. Структура VIDEOMEMORY настраивает определенные начальные точки и определяет объем памяти на поверхности и то, что нельзя сделать с поверхностью. DirectDraw управляет им путем выделения и освобождения памяти, т. е. создания и уничтожения поверхностей под юрисдикцией каждой кучи. Физические ограничения определяют способ настройки этих атрибутов.

Диспетчер кучи DirectDraw выполняет два прохода через структуры VIDEOMEMORY. Член ddsCaps указывает DirectDraw, для чего нельзя использовать память в куче при первом проходе. Например, если куча была достаточно большой для заднего буфера, спрайты можно исключить из выделения на первом проходе, установив флаг DSCAPS_OFFSCREENPLAIN в структуре DDSCAPS . Таким образом, другие поверхности будут заполнять спрайтами, сохраняя при этом задний буфер для перелистывания страниц. Член ddsCapsAlt может разрешать спрайты на втором проходе (путем удаления флага DSCAPS_OFFSCREENPLAIN). Это позволяет использовать кучи преимущественно для их наивысшего и наилучшего использования, не исключив альтернативные варианты использования. При тщательном выборе порядка выделения (например, путем перечисления заднего буфера последним) иногда можно устранить необходимость сортировки по ddsCaps и ddsCapsAlt .

Требования

   
Верхняя часть ddrawint.h (включая Winddi.h)

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

DDSCAPS

DrvGetDirectDrawInfo