Resumen de características (Direct3D 9 para Windows Vista)

Esta documentación hace referencia específicamente a las extensiones de Windows Vista para gráficos directX. Para desarrollar la eficacia de DirectX para Windows Vista, debe instalar el SDK de Windows Vista, así como el SDK de DirectX. Las aplicaciones que usan DirectX para Windows Vista deben usar hardware que use el controlador WDDM (modelo de controlador de dispositivo de Windows) en lugar de XPDM (modelo de controlador XP); Los controladores que no implementan WDDM no pueden crear instancias de interfaces gráficas de Windows Vista DirectX.

Descubra las nuevas características de gráficos de DirectX en Windows Vista en una de estas secciones:

Cambios en el comportamiento del dispositivo

Los dispositivos ahora solo se pierden en dos circunstancias; cuando se restablece el hardware porque está colgado y cuando se detiene el controlador del dispositivo. Cuando el hardware se bloquea, el dispositivo se puede restablecer llamando a ResetEx. Si el hardware se bloquea, se pierde la memoria de textura.

Una vez detenido un controlador, se debe volver a crear el objeto IDirect9Ex para reanudar la representación.

Cuando el área de presentación está oculta por otra ventana en modo de ventana, o cuando se minimiza una aplicación de pantalla completa, PresentEx devolverá S_D3DPRESENTATIONOCCLUDED. Las aplicaciones de pantalla completa pueden reanudar la representación cuando reciben un mensaje de devolución de llamada WM_ACTIVATEAPP .

En versiones anteriores de DirectX, cuando una aplicación experimentaba un cambio de modo, la única manera de recuperarse era restablecer el dispositivo y volver a crear todos los recursos de memoria de vídeo y las cadenas de intercambio. Ahora con DirectX para Windows Vista, llamar a Reset después de un cambio de modo no hace que se pierdan superficies de memoria de textura, texturas e información de estado y estos recursos no es necesario volver a crear.

Deshabilitación del procesamiento de vértices de software multiproceso

Se ha agregado un nuevo bit de límites (D3DCREATE_DISABLE_PSGP_THREADING) que deshabilitará la multiproceso para el procesamiento de vértices de software (swvp). Use esta macro para generar una marca de comportamiento para IDirect3D9::CreateDevice.

#define D3DCREATE_DISABLE_PSGP_THREADING

Superficies de un bit

Hay un nuevo tipo de formato de superficie de un bit que puede ser especialmente útil para procesar glifos de texto. El nuevo formato se denomina D3DFMT_A1. Una superficie de un solo bit está diseñada para usarse como textura por píxel o la salida de destino de representación generada por ComposeRects o ColorFill. No hay tapones separados para el ancho y el alto de la superficie; una implementación debe admitir una superficie de tamaño único que sea de 2 000 texturas x 8K.

Una superficie de un bit tiene un bit por elemento de textura; por lo tanto, una significaría que todos los componentes (r,g,b,a) de un píxel son 1 y cero significaría que todos los componentes son iguales a 0. Puede usar superficies de un bit con las SIGUIENTES API: ColorFill, UpdateSurface y UpdateTexture.

Cuando se lee una superficie de un bit, el tiempo de ejecución puede realizar el filtrado de ejemplo de punto o convolución. El filtro de convolución es ajustable (consulte SetConvoluciónMonoKernel).

Hay algunas restricciones para las superficies de un bit:

  • No se admite la asignación de Mip
  • Los datos sRGB no se pueden leer ni escribir en una superficie de un solo bit.
  • Una superficie de un solo bit no se puede usar como textura de vértice ni para el muestreo múltiple.

Búferes de profundidad y galería de símbolos de lectura

Use IDirect3DDevice9::UpdateSurface para leer o escribir datos de profundidad/galería de símbolos de superficies obtenidas de IDirect3DDevice9::CreateDepthStencilSurface o IDirect3DDevice9::GetDepthStencilSurface.

En primer lugar, cree una superficie de solo bloqueo, profundidad o galería de símbolos usando IDirect3DDevice9::CreateOffscreenPlainSurface. Use uno de los formatos siguientes:

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

En segundo lugar, transfiera datos entre el búfer de profundidad/galería de símbolos y la superficie de galería de símbolos o profundidad bloqueable recién creada. La transferencia se realiza mediante IDirect3DDevice9::UpdateSurface.

UpdateSurface producirá un error cuando ambas superficies sean un formato LOCKABLE o ambas no se puedan bloquear.

La transferencia de datos inexistentes producirá un error (por ejemplo, la transferencia de una superficie de solo profundidad no bloqueable a una superficie de D3DFMT_S8_LOCKABLE).

El resto de las restricciones para IDirect3DDevice9::UpdateSurface se siguen aplicando.

Uso compartido de recursos

Los recursos de Direct3D ahora se pueden compartir entre dispositivos o procesos. Esto se aplica a cualquier recurso de Direct3D, incluidas texturas, búferes de vértices, búferes de índice o superficies (como destinos de representación, búferes de galería de símbolos de profundidad o superficies sin formato en pantalla). Para compartirlo, debe designar un recurso para compartir en el momento de la creación y buscar el recurso en el grupo predeterminado (D3DPOOL_DEFAULT). Una vez creado un recurso para compartirlo, se puede compartir entre dispositivos dentro de un proceso o compartirlos entre procesos.

Para habilitar recursos compartidos, las API de creación de recursos tienen un parámetro de identificador adicional. Se trata de un identificador que apunta al recurso compartido. En las revisiones anteriores de DirectX, este argumento ha sido parte de la firma de la API, pero no se hausado y debe establecerse en NULL. A partir de Windows Vista, use pSharedHandle de las siguientes maneras:

  • Establezca el puntero (pSharedHandle) en NULL para no compartir un recurso. Esto es igual que el comportamiento de DirectX antes de Windows Vista.
  • Para crear un recurso compartido, llame a cualquier API de creación de recursos (consulte a continuación) con un identificador sin inicializar (el propio puntero no es NULL (pSharedHandle != NULL), pero el puntero apunta a un valor NULL (*pSharedHandle == NULL)). La API generará un recurso compartido y devolverá un identificador válido.
  • Para abrir y acceder a un recurso compartido creado anteriormente mediante un identificador de recursos compartidos que no sea NULL, establezca pSharedHandle en la dirección de ese identificador. Después de abrir el recurso compartido creado anteriormente de esta manera, puede usar la interfaz devuelta en la API direct3D 9 o Direct3D 9Ex como si la interfaz fuera un recurso típico de ese tipo.

Las API de creación de recursos incluyen: CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx y CreateRenderTargetEx.

Hay algunas restricciones para usar recursos compartidos. Entre ellas se incluyen las siguientes:

  • La API que se usa para abrir un recurso compartido debe coincidir con la API que usó para crear el recurso compartido. Por ejemplo, si usó CreateTexture para crear un recurso compartido, debe usar CreateTexture para abrir ese recurso compartido; Si usó CreateRenderTarget para crear un recurso compartido, debe usar CreateRenderTarget para abrir ese recurso compartido, etc.
  • Al abrir un recurso compartido, debe especificar D3DPOOL_DEFAULT.
  • Los recursos bloqueables (texturas con D3DUSAGE_DYNAMIC, búferes de vértices y búferes de índice, por ejemplo) pueden experimentar un rendimiento deficiente cuando se comparten. Los rendertargets bloqueables no se compartirán en algún hardware.
  • Las referencias a un recurso compartido entre procesos deben tener las mismas dimensiones que el recurso original. Al pasar un identificador a través del proceso, incluya la información de dimensión para que la referencia se pueda crear de forma idéntica.
  • Las superficies compartidas entre procesos no proporcionan ningún mecanismo de sincronización. Es posible que los cambios de lectura y escritura en una superficie compartida no reflejen la vista del proceso de referencia de la superficie cuando se espera. Para proporcionar sincronización, use consultas de eventos o bloquee la textura.
  • Solo el proceso que crea inicialmente un recurso compartido puede bloquearlo (cualquier proceso que abra una referencia a ese recurso compartido no puede bloquearlo).
  • Si un recurso compartido está bloqueado, no hay ninguna validación para que otros procesos sepan si el recurso está disponible.

Conversión de sRGB antes de combinar

Ahora puede comprobar si el dispositivo puede convertir los datos de canalización en sRGB antes de combinar el búfer de fotogramas. Esto implica que el dispositivo convierte los valores de destino de representación de sRGB. Para ver si el hardware admite la conversión, compruebe este límite:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Este límite identifica el hardware que admite la conversión a sRGB antes de combinar. Esta funcionalidad es importante para la representación de alta calidad de los búferes de fotogramas fp16 en el administrador de ventanas de escritorio (DWM).

Mejoras de StretchRect

En versiones anteriores de DirectX, StretchRect tiene muchas restricciones para adaptarse a diferentes controladores (consulte IDirect3DDevice9::StretchRect). Windows Vista se basa en windows Device Driver Model (WDDM). Este nuevo modelo de controlador es mucho más sólido y permite a los controladores controlar casos especiales en el hardware.

En general, la única restricción restante es que el destino de representación debe haberse creado con el uso de destino de representación (D3DUSAGE_RENDERTARGET). Esta restricción se eleva si está realizando una copia simple (donde el origen y el dest son el mismo formato, el mismo tamaño y no hay subctángulos).

Creación de texturas en memoria del sistema

Las aplicaciones que necesitan más flexibilidad sobre el uso, la asignación y eliminación de la memoria del sistema ahora pueden crear texturas a partir de un puntero de memoria del sistema. Por ejemplo, una aplicación podría crear una textura de Direct3D a partir de un puntero de mapa de bits de memoria del sistema GDI.

Debe hacer dos cosas para crear una textura de este tipo:

  • Asigne suficiente memoria del sistema para contener la superficie de textura. El número mínimo de bytes es el ancho x alto x bytes por píxel.
  • Pase la dirección de un puntero a la superficie de memoria del sistema para el parámetro HANDLE* a IDirect3DDevice9::CreateTexture.

Este es el prototipo de función para IDirect3DDevice9::CreateTexture:

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

Una textura de memoria del sistema tiene las restricciones siguientes:

  • El tono de textura debe ser igual al ancho de la textura por el número de bytes por píxel.
  • Al usar formatos comprimidos (formatos DXT), la aplicación es responsable de asignar el tamaño correcto.
  • Solo se admiten texturas con un solo nivel de mapa MIP.
  • El valor pasado a CreateTexture para el argumento Pool debe ser D3DPOOL_SYSTEMMEM.
  • Esta API ajusta la memoria proporcionada en una textura. No desasigne esta memoria hasta que haya terminado con ella.