Compartir a través de


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 controladores de dispositivos 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 gráficas de DirectX en Windows Vista en una de estas secciones:

Cambios de 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.

Después de que se detiene un controlador, el objeto IDirect9Ex debe volver a crearse para reanudar la renderizació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án los subprocesos múltiples 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 ya sea como una textura por píxel o como la salida de destino de representación generada por ComposeRects o ColorFill. No hay límites independientes para el ancho y el alto de la superficie; una implementación debe admitir una superficie de tamaño único que sea de 2K píxeles de textura por 8K.

Una superficie de un bit tiene un bit por texel; por lo tanto, uno 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 solo bit con las siguientes API: ColorFill, UpdateSurface y UpdateTexture.

Cuando se lee una superficie de un solo bit, el tiempo de ejecución puede realizar el filtrado por muestra puntual o por convolución. El filtro de convolución es ajustable (vea SetConvolutionMonoKernel).

Hay algunas restricciones para las superficies de un solo bit:

  • No se soporta Mip-mapping
  • 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értices ni para el muestreo múltiple.

Lectura de búferes de profundidad/galería de símbolos

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 bloqueable, de solo profundidad o de solo galería de símbolos utilizando IDirect3DDevice9::CreateOffscreenPlainSurface. Use uno de los siguientes formatos:

  • 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 profundidad o galería de símbolos bloqueable recién creada. La transferencia se realiza mediante IDirect3DDevice9::UpdateSurface.

UpdateSurface producirá un error cuando ambas superficies tengan un formato LOCKABLE o ambas no sean bloqueables.

La transferencia de datos inexistentes provocará 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 todavía se aplican.

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 planas fuera de 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 el uso compartido, se puede compartir entre dispositivos dentro de un proceso o compartirse entre procesos.

Para habilitar los 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 revisiones anteriores de DirectX, este argumento ha sido parte de la firma del API, pero ha sido no utilizado y debe establecerse en NULL. A partir de Windows Vista, use pSharedHandle de las maneras siguientes:

  • 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 con un identificador sin inicializar a cualquier API de creación de recursos (consulte a continuación), siendo que 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 es 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, CreateOffscreenPlainSurfaceExy CreateRenderTargetEx.

Hay algunas restricciones para usar recursos compartidos. Estos incluyen:

  • La API que 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; y así sucesivamente.
  • 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 objetivos de renderizado bloqueables no se podrán compartir en algunos dispositivos.
  • Las referencias a un recurso compartido entre procesos deben tener las mismas dimensiones que el recurso original. Al pasar un identificador a través de procesos, incluya la información de dimensión para que la referencia se pueda crear de manera idéntica.
  • Las superficies compartidas entre procesos no proporcionan ningún mecanismo de sincronización. Es posible que las modificaciones de lectura/escritura en una superficie compartida no reflejen la perspectiva de un proceso de referencia sobre 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 mezclar

Ahora puede comprobar si el dispositivo puede convertir los datos de canalización a sRGB antes de la mezcla en el buffer de fotogramas. Esto implica que el dispositivo convierte los valores del objetivo de renderizado desde 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 el modelo de controlador de dispositivos Windows (WDDM). Este nuevo modelo de controlador es mucho más sólido y permite a los controladores controlar casos especiales en el hardware.

En términos generales, la única restricción restante es que el destino de representación debe haberse creado con uso de objetivo de representación (D3DUSAGE_RENDERTARGET). Esta restricción se levanta si realiza una copia simple (cuando el origen y el destino son del mismo formato, del mismo tamaño y no hay subrectá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 Direct3D a partir de un puntero de bitmap en la memoria del sistema GDI.

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

  • Asigne suficiente memoria del sistema para almacenar la superficie de la textura. El número mínimo de bytes es 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 paso de textura debe ser igual al ancho de la textura por el número de bytes por píxel.
  • Cuando se usan formatos comprimidos (formatos DXT), la aplicación es responsable de asignar el tamaño correcto.
  • Solo se soportan texturas con un único nivel de mipmap.
  • El valor pasado a CreateTexture para el argumento Pool debe ser D3DPOOL_SYSTEMMEM.
  • Esta API encapsula la memoria proporcionada en una textura. No libere esta memoria hasta que haya terminado con esta.