2011-06-15 10 views
8

Estoy tratando de comprender mejor cómo funcionan las GPU, y estoy confundido acerca de cómo manejaron API de alto nivel como Direct3D u OpenGL. Es muy común ver tarjetas gráficas publicitarias que admiten la aceleración de hardware Direct3D y OpenGL. ¿Esto significa que manejan las instrucciones de Direct3D y OpenGL directamente en el hardware? No he podido encontrar pruebas claras de esto, o que se hayan compilado en una representación de conjunto que la GPU puede manejar. Si hay tal conversión, ¿quién hace eso? La biblioteca de software (Direct3D/OpenGL), el controlador o la GPU en sí. En esa misma línea, ¿dónde está definida la canalización de gráficos? en el hardware gpu, el controlador o la biblioteca de software? Esto me confunde especialmente con la idea de las tuberías programables.¿Cómo se manejan las instrucciones Direct3D y OpenGL en una tarjeta gráfica?

¿Existe un buen recurso en el que pueda encontrar información sobre estos detalles?

Respuesta

9

Has hecho una pregunta muy amplia y complicada. En realidad, usted ha pedido varias preguntas amplias y complicadas.

El software que tiene la administración final sobre el funcionamiento de cualquier hardware se denomina "controlador" del hardware. Naturalmente, para el hardware de gráficos, esto se llama el "controlador de gráficos". Como todos los controladores, el controlador de gráficos es efectivamente una parte instalable del sistema operativo; el sistema operativo es lo que permite que el controlador de gráficos haga su trabajo y hable con el hardware. Los dos trabajan de la mano.

Existen efectivamente dos tipos de llamadas D3D u OpenGL (hasta ahora conocidas como "la API"): las que hablan con el controlador y las que no. Cada llamada que realmente atrae algo necesita (eventualmente) hablar con el controlador, pero las llamadas que configuran llamadas de dibujo posteriores pueden almacenar datos localmente.

Cuando realiza una llamada de dibujo, la API realiza algunas comprobaciones para asegurarse de que usted, como usuario, haya realizado una llamada de representación válida. Si es así, la API tiene algunas opciones en cuanto a qué hacer. Resulta que hablar directamente con el controlador lleva mucho tiempo, independientemente de la cantidad de comandos que le dé cuando comience a hablar. Por lo tanto, lo que sucede a menudo es que la API almacena su llamada de representación y la devuelve inmediatamente. Luego, posiblemente en otro hilo, puede ver cuántas llamadas de representación se han almacenado. Si hay "suficiente", los reenviará al conductor. Esto se llama "clasificación".

El trabajo del conductor es tomar estas llamadas que se han reenviado y convertirlas en cosas que la GPU hará.

En esa misma línea, ¿dónde se define la canalización de gráficos? en el hardware gpu, el controlador o la biblioteca de software?

Esa es en realidad una pregunta bastante difícil en estos días, y cada vez es más complicado cada generación de hardware.

En los viejos tiempos, la construcción de la tubería de gráficos estaba rígidamente controlada por el hardware de la GPU. En estos días, esto es menos cierto, aunque hay algo de control de hardware. En hardware moderno (capaz de OpenGL 3.0 o Direct3D10 o superior), teóricamente sería posible, si tuviera acceso directo al controlador de gráficos, diseñar una API que utilizara una versión algo alterada de la interconexión de gráficos. Por lo tanto, las API dictan gran parte de cómo se ve la ruta de gráficos.

Cada etapa en la tubería de renderizado toma ciertos valores de la (s) etapa (s) preciosa (s) como entrada y genera una cierta cantidad de valores como salida. Una etapa es "programable" si el mecanismo para generar las salidas de las entradas implica la ejecución de un programa suministrado por el usuario, llamado "sombreador". Entonces, no hay tal cosa como una tubería programable (aún); solo etapas programables de una tubería fija.

+1

Muchas gracias. Soy muy consciente de cuán amplia era mi pregunta ... Lo siento, pero gracias por tomarse el tiempo para darme una respuesta tan buena. Aclara muchas cosas Si lo hice bien, la API valida las llamadas, las agrupa y eventualmente llama al controlador a través de una llamada al sistema enviando las llamadas acumuladas. ¿Estas llamadas que llegan al controlador se parecen más al ensamblaje, a los comandos direct3d/opengl de alto nivel o a ninguno de los dos? – cloudraven

+0

Un controlador es solo una .dll u otra forma de biblioteca que carga el sistema operativo. Es solo código regular, y recibe llamadas de función como el código normal. Lo que las estructuras de datos que se pasan al controlador parecen depender de la implementación (cambia incluso para los controladores en el mismo sistema operativo) y, en última instancia, irrelevante para cualquiera que no esté realmente escribiendo un controlador. –

+1

Lo siento, llegué tan tarde, pero una pregunta de seguimiento: ¿cómo sabe la API (OpenGL o DirectX) cómo hablar con los diferentes controladores? ¿Hay controladores Nvidia, controladores AMD/ATI y muchas versiones de cada controlador? Una aplicación vincula contra una versión establecida de, p. OpenGL, entonces, si actualizo mi controlador, ¿cómo sabe la versión anterior de OpenGL cómo hablar con mi controlador?¿Cómo funciona la coordinación entre el controlador y OpenGL? – pomeroy

7

No hay instrucciones D3D ni OGL. Direct3D u OpenGL llamarán al controlador de gráficos y realizarán lo que sea necesario para que esto suceda. Esto no es completamente verdadero de los sombreadores, que tienen un bytecode uniforme en el nivel API (D3D/OGL), y en este caso, la API proporciona un compilador, pero esos, hasta donde yo sé, todavía se transforman en Formas dependientes del hardware antes de ser ejecutado. Por supuesto, Direct3D y OpenGL también incluyen componentes de modo de usuario para mejorar el rendimiento o proporcionar una mejor interfaz; por ejemplo, realizarán llamadas por lotes al kernel para reducir los cambios de contexto.

La realidad de la fabricación de GPU es que Microsoft y nVidia/ATi se reúnen y piensan sobre lo que quieren y lo que es factible de implementar, y elaboran una especificación grupal, ya que la realidad es que nada de esto funcionaría si los principales proveedores de hardware y software no cooperaron. Nadie comprará una GPU que no admita DirectX, y nadie comprará Windows donde ninguna GPU implemente DirectX. Por supuesto, "nadie" es relativo, pero sería una gran pérdida para todos los interesados, y por supuesto, si tienes un juego creado solo para la API D3D10, entonces el controlador compatible con D3D10 es imprescindible para ejecutar el juego. - Incrementando efectivamente el valor del producto al aumentar el rango de software que puede ejecutar, que es un punto de venta. Esto significa que la diferencia semántica entre ser definido por el proveedor de hardware o proveedor de software es mínimo, de manera realista, especialmente porque las únicas dos API de renderización 3D reales en la PC, OpenGL y Direct3D, siguen modelos muy similares para la canalización gráfica, en la medida de Lo sé.

Sin embargo, con las nuevas GPU programables, podría argumentar que la tubería gráfica realmente no existe, un dispositivo DX11 se puede utilizar para cualquier canalización de gráficos que pueda concebir, si tiene la paciencia para programarlo.

En última instancia, la GPU está protegida por una fuerte abstracción de nivel de controlador. Implementa una interfaz estilo C, y todo lo que está permitido o es necesario en esa implementación. Todo después de eso está completamente definido por la implementación.

Puede consultar la documentación de MSDN para escribiendo un controlador de gráficos. Lo he visto, pero no tengo un enlace a mano, y describe las interfaces a las que debe adherirse y otras cosas.

+0

Eso tiene mucho sentido. Mirar cómo deberían escribir los conductores debería dar una respuesta muy exacta a todas mis preguntas. Lo comprobaré – cloudraven

Cuestiones relacionadas