Сводка по функциям (Direct3D 9 для Windows Vista)

Эта документация относится к расширениям Windows Vista для графики DirectX. Чтобы разработать возможности DirectX для Windows Vista, необходимо установить пакет SDK для Windows Vista, а также пакет SDK для DirectX. Приложения, использующие DirectX для Windows Vista, должны использовать оборудование, использующее драйвер WDDM (модель драйвера устройства Windows) в отличие от XPDM (модель драйвера XP); Драйверы, которые не реализуют WDDM, не могут создавать экземпляры графических интерфейсов Windows Vista DirectX.

Ознакомьтесь с новыми графическими функциями DirectX в Windows Vista в одном из следующих разделов:

Изменения в поведении устройства

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

После остановки драйвера необходимо повторно создать объект IDirect9Ex, чтобы возобновить отрисовку.

Если область представления скрыта другим окном в оконном режиме или когда полноэкранное приложение свернуто, PresentEx вернет S_D3DPRESENTATIONOCCLUDED. Полноэкранные приложения могут возобновить отрисовку при получении сообщения обратного вызова WM_ACTIVATEAPP .

В предыдущих версиях DirectX при изменении режима в приложении единственным способом восстановления было сброс устройства и повторное создание всех ресурсов видеопамяти и цепочек буферов. Теперь при использовании DirectX для Windows Vista вызов сброса после изменения режима не приводит к потере поверхностей памяти текстур, текстур и сведений о состоянии, и эти ресурсы не нужно воссоздавать.

Отключение многопоточной программной обработки вершин

Добавлен новый бит caps (D3DCREATE_DISABLE_PSGP_THREADING), который отключит многопоточность для программной обработки вершин (swvp). Используйте этот макрос для создания флага поведения для IDirect3D9::CreateDevice.

#define D3DCREATE_DISABLE_PSGP_THREADING

Однобитовые поверхности

Существует новый однобитовый тип формата поверхности, который может быть особенно полезен для обработки глифов текста. Новый формат называется D3DFMT_A1. Однобитовая поверхность предназначена для использования в качестве текстуры по пикселям или выходных данных целевого объекта отрисовки, созданных ComposeRects или ColorFill. Для ширины и высоты поверхности нет отдельных колпачок; реализация должна поддерживать поверхность одного размера, которая составляет 2 КБ текселей x 8 КБ текселей.

Однобитовая поверхность имеет по одному биту на тексель; таким образом, один означает, что все компоненты (r,g,b,a) пикселя равны 1, а ноль будет означать, что все компоненты равны 0. Одноразрядные поверхности можно использовать со следующими API: ColorFill, UpdateSurface и UpdateTexture.

При чтении однобитовой поверхности среда выполнения может выполнять фильтрацию точечной выборки или свертки. Фильтр свертки можно настроить (см. SetConvolutionMonoKernel).

Существуют некоторые ограничения для однобитовых поверхностей:

  • MIP-сопоставление не поддерживается
  • Данные sRGB не могут быть прочитаны или записаны на однобитовой поверхности.
  • Однобитовую поверхность нельзя использовать в качестве текстуры вершин или для множественной дискретизации.

Буферы глубины чтения и трафарета

Используйте IDirect3DDevice9::UpdateSurface для чтения или записи данных глубины и трафарета из поверхностей, полученных из IDirect3DDevice9::CreateDepthStencilSurface или IDirect3DDevice9::GetDepthStencilSurface.

Сначала создайте область с блокировкой, глубиной или только трафаретом с помощью IDirect3DDevice9::CreateOffscreenPlainSurface. Используйте один из следующих форматов:

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

Во-вторых, перенесите данные между буфером глубины или трафарета и вновь созданной областью глубины или трафарета с блокировкой. Передача выполняется с помощью IDirect3DDevice9::UpdateSurface.

UpdateSurface завершится ошибкой, если обе поверхности имеют формат LOCKABLE или обе не блокируются.

Передача несуществующих данных приведет к ошибке (например, при переносе из неблокируемой поверхности, доступной только для глубины, на поверхность D3DFMT_S8_LOCKABLE).

Остальные ограничения для IDirect3DDevice9::UpdateSurface по-прежнему применяются.

Общий доступ к ресурсам

Теперь ресурсы Direct3D можно совместно использовать между устройствами или процессами. Это относится к любому ресурсу Direct3D, включая текстуры, буферы вершин, буферы индексов или поверхности (например, целевые объекты отрисовки, буферы трафаретов глубины или обычные поверхности вне экрана). Чтобы предоставить общий доступ, необходимо назначить ресурс для совместного использования во время создания и найти ресурс в пуле по умолчанию (D3DPOOL_DEFAULT). После создания ресурса для предоставления общего доступа его можно использовать на разных устройствах в рамках процесса или в разных процессах.

Чтобы включить общие ресурсы, API создания ресурсов имеют дополнительный параметр дескриптора. Это handle, указывающий на общий ресурс. В предыдущих версиях DirectX этот аргумент был частью сигнатуры API, но не используется и должен иметь значение NULL. Начиная с Windows Vista, используйте pSharedHandle следующими способами:

  • Установите для указателя (pSharedHandle) значение NULL , чтобы не предоставлять общий доступ к ресурсу. Это аналогично поведению DirectX до Windows Vista.
  • Чтобы создать общий ресурс, вызовите любой API создания ресурсов (см. ниже) с неинициализированным дескриптором (сам указатель не имеет значение NULL (pSharedHandle != NULL), но указатель указывает на значение NULL (*pSharedHandle == NULL)). API создаст общий ресурс и вернет допустимый дескриптор.
  • Чтобы открыть ранее созданный общий ресурс и получить доступ к ним с помощью дескриптора общего ресурса, отличного отNULL, задайте для параметра pSharedHandle адрес этого дескриптора. После открытия ранее созданного общего ресурса таким образом можно использовать возвращенный интерфейс в API Direct3D 9 или Direct3D 9Ex, как если бы интерфейс был типичным ресурсом этого типа.

Api создания ресурсов включают: CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx и CreateRenderTargetEx.

Существуют некоторые ограничения на использование общих ресурсов. К ним относятся следующие объекты.

  • API, используемый для открытия общего ресурса, должен соответствовать API, который использовался для создания общего ресурса. Например, если вы использовали CreateTexture для создания общего ресурса, необходимо использовать CreateTexture , чтобы открыть этот общий ресурс; Если вы использовали CreateRenderTarget для создания общего ресурса, необходимо использовать CreateRenderTarget для открытия этого общего ресурса и т. д.
  • При открытии общего ресурса необходимо указать D3DPOOL_DEFAULT.
  • Блокируемые ресурсы (например, текстуры с D3DUSAGE_DYNAMIC, буферы вершин и буферы индексов) могут испытывать низкую производительность при совместном использовании. Блокируемые целевые файлы отрисовки не будут совместно использоваться на некотором оборудовании.
  • Ссылки на общий ресурс между процессами должны иметь те же измерения, что и исходный ресурс. При передаче дескриптора между процессами включите сведения об измерении, чтобы можно было создать ссылку одинаково.
  • Общие поверхности между процессами не обеспечивают механизм синхронизации. Изменения для чтения и записи в общей поверхности могут не отражать представление процесса ссылки на поверхность, когда это ожидается. Чтобы обеспечить синхронизацию, используйте запросы событий или заблокируйте текстуру.
  • Только процесс, который изначально создает общий ресурс, может заблокировать его (любой процесс, открывающий ссылку на этот общий ресурс, не может заблокировать его).
  • Если общий ресурс заблокирован, нет проверки для других процессов, чтобы узнать, доступен ли ресурс.

Преобразование sRGB перед смешения

Теперь можно проверка, чтобы узнать, может ли устройство преобразовывать данные конвейера в sRGB перед смешения буфера кадров. Это означает, что устройство преобразует значения цели отрисовки из sRGB. Чтобы узнать, поддерживается ли преобразование оборудованием, проверка для этого ограничения:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Это ограничение определяет оборудование, которое поддерживает преобразование в sRGB перед смешения. Эта возможность важна для высококачественной отрисовки из буферов кадров fp16 в диспетчере окон рабочего стола (DWM).

Улучшения StretchRect

В предыдущих версиях DirectX StretchRect имеет множество ограничений для размещения различных драйверов (см. раздел IDirect3DDevice9::StretchRect). Windows Vista создана на основе модели драйвера устройств Windows (WDDM). Эта новая модель драйвера является гораздо более надежной и позволяет драйверам обрабатывать особые случаи на оборудовании.

Как правило, единственное оставшееся ограничение заключается в том, что целевой объект отрисовки должен быть создан с использованием целевого объекта отрисовки (D3DUSAGE_RENDERTARGET). Это ограничение снимается, если выполняется простое копирование (где исходный и dest имеют один и тот же формат, одинаковый размер и нет вложенных прямоугольников).

Создание текстур в системной памяти

Приложения, которым требуется больше гибкости в использовании, выделении и удалении системной памяти, теперь могут создавать текстуры из указателя системной памяти. Например, приложение может создать текстуру Direct3D из указателя растрового изображения системной памяти GDI.

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

  • Выделите достаточно системной памяти для размещения поверхности текстуры. Минимальное число байтов — ширина x высота x байт на пиксель.
  • Передайте адрес указателя на область системной памяти для параметра HANDLE* в IDirect3Ddevice9::CreateTexture.

Ниже приведен прототип функции для IDirect3DDevice9::CreateTexture:

STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, 
    DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, 
    HANDLE* pSharedHandle)

Текстура системной памяти имеет следующие ограничения:

  • Шаг текстуры должен равняться ширине текстуры, равной количеству байтов на пиксель.
  • При использовании сжатых форматов (форматы DXT) приложение отвечает за выделение правильного размера.
  • Поддерживаются только текстуры с одним уровнем MIP-карты.
  • Значение, передаваемое в CreateTexture для аргумента Pool, должно быть D3DPOOL_SYSTEMMEM.
  • Этот API заключает предоставленную память в текстуру. Не отменяйте выделение этой памяти, пока не закончите работу с ней.