How does OpenGL work at the lowest level

I understand how to write OpenGL/DirectX programs, and I know the maths and the conceptual stuff behind it, but I'm curious how the GPU-CPU communication works on a low level.

Say I've got an OpenGL program written in C that displays a triangle and rotates the camera by 45 degrees. When I compile this program, will it be turned into a series of ioctl-calls, and the gpu driver then sends the appropriate commands to the gpu, where all the logic of rotating the triangle and setting the appropriate pixels in the appropriate color is wired in? Or will the program be compiled into a "gpu program" which is loaded onto the gpu and computes the rotation etc.? Or something completely different?

Edit: A few days later I found this article series, which basically answers the question:http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/

share | improve this question
 
something completely different –  Jarrod Roberson  Jun 19 '11 at 0:50
 
OpenGL specification state that commands are sent in a client/server mode. The specification is too broad to determine a specific tecnology used by OpenGL implementations. –  Luca  Jun 19 '11 at 18:21
feedback

closed as not a real question by Julio GorgéJarrod Roberson,talonmiesRichardGraviton Jun 20 '11 at 12:32

It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, see the FAQ.


4 Answers


up vote 10 down vote accepted

When I compile this program, will it be turned into a series of ioctl-calls, and the gpu driver then sends the appropriate commands to the gpu, where all the logic of rotating the triangle and setting the appropriate pixels in the appropriate color is wired in? Or will the program be compiled into a "gpu program" which is loaded onto the gpu and computes the rotation etc.?

You're not far off. Your program calls the installable client driver (which is not really a driver, it's a userspace shared library). That will use ioctl or a similar mechanism to pass data to the kernel driver.

For the next part, it depends on the hardware. Older video cards had what is called a "fixed-function pipeline". There were dedicated memory spaces in the video card for matrices, and dedicated hardware for texture lookup, blending, etc. The video card would load the right data and flags for each of these units and then set up DMA to transfer your vertex data (position, color, texture coordinates, etc).

Newer hardware has processor cores ("shaders") inside the video card, which differ from your CPU in that they each run much slower, but there are many more of them working in parallel. For these video cards, the driver prepares program binaries to run on the GPU shaders.

share | improve this answer


This question is almost impossible to answer because OpenGL by itself is just a front end API, and as long as an implementations adheres to the specification and the outcome conforms to this it can be done any way you like.

The question may have been: How does an OpenGL driver work on the lowest level. Now this is again impossible to answer in general, as a driver is closely tied to some piece of hardware, which may again do things however the developer designed it.

So the question should have been: "How does it look on average behind the scenes of OpenGL and the graphics system?". Let's look at this from the bottom up:

  1. At the lowest level there's some graphics device. Nowadays these are GPUs which provide a set of registers controlling their operation (which registers exactly is device dependent) have some program memory for shaders, bulk memory for input data (vertices, textures, etc.) and an I/O channel to the rest of the system over which it recieves/sends data and command streams.

  2. The graphics driver keeps track of the GPUs state and all the resources application programs that make use of the GPU. Also it is responsible for conversion or any other processing the data sent by applications (convert textures into the pixelformat supported by the GPU, compile shaders in the machine code of the GPU). Furthermore it provides some abstract, driver dependent interface to application programs.

  3. Then there's the driver dependent OpenGL client library/driver. On Windows this gets loaded by proxy through opengl32.dll, on Unix systems this resides in two places:

    • X11 GLX module and driver dependent GLX driver
    • and /usr/lib/libGL.so may contain some driver dependent stuff for direct rendering

    On MacOS X this happens to be the "OpenGL Framework".

    It is this part that translates OpenGL calls how you do it into calls to the driver specific functions in the part of the driver described in (2).

  4. Finally the actual OpenGL API library, opengl32.dll in Windows, and on Unix /usr/lib/libGL.so; this mostly just passes down the commands to the OpenGL implementation proper.

How the actual communication happens can not be generalized:

In Unix the 3<->4 connection may happen either over Sockets (yes, it may, and does go over network if you want to) or through Shared Memory. In Windows the interface library and the driver client are both loaded into the process address space, so that's no so much communication but simple function calls and variable/pointer passing. In MacOS X this is similar to Windows, only that there's no separation between OpenGL interface and driver client (that's the reason why MacOS X is so slow to keep up with new OpenGL versions, it always requires a full operating system upgrade to deliver the new framework).

Communication betwen 3<->2 may go through ioctl, read/write, or through mapping some memory into process address space and configuring the MMU to trigger some driver code whenever changes to that memory are done. This is quite similar on any operating system since you always have to cross the kernel/userland boundary: Ultimately you go through some syscall.

Communication between system and GPU happen through the periphial bus and the access methods it defines, so PCI, AGP, PCI-E, etc, which work through Port-I/O, Memory Mapped I/O, DMA, IRQs.

share | improve this answer
 
Was this post useful to you?      

Your program is not compiled for any particular GPU; it is just dynamically linked against a library that will implement OpenGL. The actual implementation might involve sending OpenGL commands to the GPU, running software fallbacks, compiling shaders and sending them to the GPU, or even using shader fallbacks to OpenGL commands. The graphics landscape is fairly complicated. Thankfully linking insulates you from most of the drivers' complexity, leaving driver implementers free to use whatever techniques they see fit.

share | improve this answer
 
feedback

C/C++ compilers/linkers do exactly one thing: they convert text files into a series of machine-specific opcodes that are run on the CPU. OpenGL and Direct3D are just C/C++ APIs; they cannot magically convert your C/C++ compiler/linker into a compiler/linker for the GPU.

Every line of C/C++ code you write will be executed on the CPU. Calls to OpenGL/Direct3D will call into C/C++ libraries, static or dynamic as the case may be.

The only place when a "gpu program" would come into play is if your code explicitly creates shaders. That is, if you make the API calls into OpenGL/D3D that cause the compiling and linking of shaders. To do this, you (at runtime, not C/C++ compile-time) either generate or load strings that represent shaders in some shader language. You then shove them through the shader compiler, and get back an object in that API that represents that shader. You then apply one or more shaders to a particular rendering command. Each of these steps happen explicitly at the direction of your C/C++ code, which as previously stated runs on the CPU.

Many shader languages use C/C++-like syntax. But that doesn't make them equivalent to C/C++.

share | improve this answer
 
I've been learning opengl as of late and have been wonder why I see all these "shader programs" in code I look at written as litteral strings. Like you said, they are compiled at run time. I saw some examples in some android opengl es code. Then I saw some code for iphone too. Apparently the iPhone has four vector processors that are able to do floating point math much faster than the iPhone's CPU can -- so you can write the ASM as literal strings to get compiled at run time to use those processors instead of the main cpu.–  eggie5  Jun 19 '11 at 1:02
1  
Most of the "fixed function pipeline" is now implemented by a default set of shader programs. You don't need to explicitly request a shader to get one. –  Ben Voigt  Jun 19 '11 at 1:56
1  
@Ben Voigt: True, but if nobody told you, you wouldn't be able to tell the difference. –  Nicol Bolas  Jun 19 '11 at 2:54
1  
Which might be a sensible attitude to take, if this question weren't about the hidden details. –  Ben Voigt  Jun 19 '11 at 4:17
feedback

Not the answer you're looking for? Browse other questions tagged 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值