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


Сводка по функциям (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, вызов Reset после изменения режима не приводит к потере поверхностей памяти текстур, самих текстур и сведений о состоянии, и эти ресурсы не требуют повторного создания.

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

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

#define D3DCREATE_DISABLE_PSGP_THREADING

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

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

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

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

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

  • Мип-маппинг не поддерживается
  • Данные 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 создаст общий ресурс и вернёт допустимый дескриптор.
  • Чтобы открыть и получить доступ к ранее созданному общему ресурсу с помощью ненулевого дескриптора общего ресурса, задайте 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 имеет множество ограничений для размещения различных драйверов (см. раздел IDirect3Device9::StretchRect). Windows Vista основана на модели драйвера устройств Windows (WDDM). Эта новая модель драйверов является гораздо более надежной и позволяет драйверам обрабатывать специальные случаи в оборудовании.

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

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

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

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

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

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

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

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

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