Tuesday, 11 June 2013

OpenGL in OS X 10.9

Apple announced details of OS X 10.9 "Mavericks" today. For anyone who writes cross-platform graphics software, one of the biggest bits of news was that it will finally support OpenGL 4. Specifically:

OS X 10.9 will support the OpenGL 4.1 Core Profile

This info comes from their release notes. I haven't been able to find any info about supported extensions yet.

While welcome, the news is still a bit disappointing. OpenGL 4.1 is now a 3 year old standard, so I'd hoped for something a bit more recent. I believe the Intel HD4000 and HD5000 chips used the MacBook Air & Pro only support up to OpenGL 4.1, so I guess that played a part in the decision.

 OS X will be still be the lowest common denominator for OpenGL, relative to Windows and Linux; but at least the denominator is not quite as low any more!

Thursday, 18 April 2013

Iterating faster

Today I spent a few minutes writing a Makefile. I think they may turn out to be some of the most effective minutes I've ever spent.

At work we build using SCons. When I change a single source file, rebuilding takes between 50 and 65 seconds. That's more than long enough to lose my focus and get distracted, so to stay productive I have to work in larger batches. I code in longer bursts and recompile less often, so that the ratio of productive time to down time stays up; unfortunately that also means fewer opportunities to test my changes.

That's not ideal, but it's manageable much of the time. Not at the moment though. Right now I'm developing an algorithm where I need to be able to quickly try out different approaches for each of the steps. In this situation I really want to see the effect of each change in isolation, so I can't batch up my coding. All of a sudden those 50 second build times are a real problem.

I spent a little while looking into ways to speed SCons up and managed to get the rebuild time down to around 45 seconds. Still nowhere near fast enough.

Fortunately I'm working in a very self-contained part of our code-base, so I could limit the amount of files I had to consider. Re-running SCons with verbose output turned on gave me the exact command being used to compile each of them, so I saved those to a shell script. Rebuild time with this shell script was down to about 15 seconds: a huge improvement, but still not quite quick enough. This script was recompiling every file each time I ran it though - surely I could do something a bit smarter than that...?

Enter make. It knows how to check for changed files & I've used it enough that I can put together a Makefile pretty quickly. Factoring out the commands from the shell script into rules and adding enough dependency information to be useful, I had it set up in a couple of minutes. The result: most rebuilds are now around 3 seconds. Perfect.

So now, not only am I saving almost a whole minute of wasted time with each rebuild, I've all but removed the chance to get distracted and also opened the door on a more effective way of working. I can make small changes and rebuild to see the effect of each in isolation. I can develop my algorithm a lot faster now, because I can iterate faster; and that's why I think they'll be some of the most effective minutes I've ever spent.

Tuesday, 22 January 2013

OpenGL ES and occlusion queries

This is a follow-up to my earlier post "WebGL doesn't have query objects".

Since I wrote that post, the situation has changed a bit. It's still true to say that WebGL doesn't have query objects, but the underlying reason - that OpenGL ES doesn't - is no longer true.

For OpenGL ES 2.0, there's an extension which provides basic query functionality: EXT_occlusion_query_boolean (which seems to have been based on ARB_occlusion_query2 from regular OpenGL). For OpenGL ES 3.0, the functionality from that extension appears to have been adopted into the standard. The extension provides two query types, both of which set a boolean value to indicate whether any pixels passed the depth and stencil tests.

While this is progress, unfortunately it's still not sufficient to implement the pixel accurate collision detection method I described in an earlier post. For that purpose it's not enough to know whether any pixels passed the tests; you want to know whether all the pixels passed the tests (or, equivalently, whether any failed).

The extension which introduced occlusion queries to regular OpenGL, ARB_occlusion_query, has a discussion of why they chose to expose integer counts rather than booleans. It argues that a simple boolean is not enough for many useful and interesting applications; and for obvious reasons, I agree! So it's a shame that OpenGL ES has chosen to go with the more limited form - especially since it's likely that WebGL will follow that choice.

Thursday, 17 January 2013

A handy little script for QtCreator users

If you use QtCreator for what it calls "generic projects" I've written a little script which might be useful for you:

https://github.com/vilya/newfiles

This script will rescan your project directories to see whether any files & include directories have been added or removed and update the QtCreator project files accordingly - something QtCreator isn't yet able to do for itself. It has a few extra features too, such as whitelisting or blacklisting paths using shell-style wildcards.

See the README file at the link above for more details.