Currently merging miniz v1.15 into my in-progress zip64 branch which is being used/tested in the Linux OpenGL debugger engine project I've been working on. The left pane is v1.15, right is the new version with zip64.
Fun times. The new version still needs to be C-ified in a few places. I'm actually liking the purity of C for some strange reason, it's amazing how fast it compiles vs. C++. I'm so used to glacially slow compiles that when I used TCC (Tiny C Compiler) again it appeared to complete so fast that I thought it had silently crashed.
Co-owner of Binomial LLC, working on GPU texture interchange. Open source developer, graphics programmer, former video game developer. Worked previously at SpaceX (Starlink), Valve, Ensemble Studios (Microsoft), DICE Canada.
Sunday, October 13, 2013
miniz.c: Finally added zip64 support, other fixes/improvements incoming
I finally needed Zip64 support for the Linux OpenGL debugger I've been working on at work. GL traces and state snapshots can be huge (~4-10GB of data for 3-4 minute game runs is not uncommon), and can consist of tons of binary "blob" files for VB's/IB's/shaders/etc. I looked at some other C archive libraries (libzip, minizip, etc.) but they where either ugly/huge messes with a zillion C/H files, or they didn't fully abstract their file I/O, or they didn't support in-memory archives for both reading/writing, or their licenses sucked, or they weren't thread safe (!), or I just didn't trust them, etc.
So screw it, I'll bite the bullet and do this myself. It's certainly possible I missed a really good library out there. I prefer C for this kind of stuff because most C++ libs I find in the wild use features I can't live with for various reasons, such as C++ exceptions, stl, heavy use of heap memory, Boost, or have tons of other lib dependencies, etc.
The original ancient zip file format was OK and kinda elegant for what is was, and the code to parse and write the original headers was nice and easy. But once you add zip64 it becomes an ugly mess full of conditionals, and copying zip header/archive data from one zip to another can be a big pain because you can't just blindly copy the zip64 extended data fields from the source to destination zip. (You've got to kill the old one from the extended data block and add a new one, etc.) Zip64 is now "done", and I've been running a bunch of automated testing on the new code paths, but I'm worried I've bit off more than I can chew given the very limited time I have to work on this feature for the debugger.
I've also renamed a lot of the zip "reader" API's so they can be used in both reading and writing mode. There's no reason why you can't locate files in the central directory, or get file stats while writing, for example, because the entire zip central directory is kept in memory during writing.
I've added full error codes to all zip archive handling functions. You can get the last error, clear the last error, peek at the last error, etc. I went through the entire thing and made sure the errors are set appropriately, so now you can get more info than just MZ_FALSE when something goes wrong. This change alone took several hours.
In zip64 mode I only support a total of UINT_MAX (2^32-1) files in the central dir, and central dirs are limited to a total of UINT_MAX bytes. These are huge increases from the previous limits, so this should be fine. I'm not writing a hard disk backup utility here after all, so I'm not going to support archives that big right now.
Bugwise, the only major bug I'm worried about in the current public release (miniz.c v1.14) that really worries me is the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag (Issue #11 on the Google Code Issue tracker). I doubt anybody really used this flag, so I'm not worried about that, but a few internal API's used it to speed up loading a little and they could fail. It's bad enough that I'm going to patch v1.14 to fix this tonight.
Also, it's definitely time to split up miniz.c into at least two source files. One for Deflate/Inflate/zlib API emulation/crc32/etc. The other file will be for ZIP archive handling and be (of course) optional.
I'll also try to merge in all the fixes/improvements people have either placed on github, on miniz's Google code bug tracker, or have sent to me privately, if time permits.
Let me know if you are dying to try this version out and I can send you a private copy for testing.
So screw it, I'll bite the bullet and do this myself. It's certainly possible I missed a really good library out there. I prefer C for this kind of stuff because most C++ libs I find in the wild use features I can't live with for various reasons, such as C++ exceptions, stl, heavy use of heap memory, Boost, or have tons of other lib dependencies, etc.
The original ancient zip file format was OK and kinda elegant for what is was, and the code to parse and write the original headers was nice and easy. But once you add zip64 it becomes an ugly mess full of conditionals, and copying zip header/archive data from one zip to another can be a big pain because you can't just blindly copy the zip64 extended data fields from the source to destination zip. (You've got to kill the old one from the extended data block and add a new one, etc.) Zip64 is now "done", and I've been running a bunch of automated testing on the new code paths, but I'm worried I've bit off more than I can chew given the very limited time I have to work on this feature for the debugger.
I've also renamed a lot of the zip "reader" API's so they can be used in both reading and writing mode. There's no reason why you can't locate files in the central directory, or get file stats while writing, for example, because the entire zip central directory is kept in memory during writing.
I've added full error codes to all zip archive handling functions. You can get the last error, clear the last error, peek at the last error, etc. I went through the entire thing and made sure the errors are set appropriately, so now you can get more info than just MZ_FALSE when something goes wrong. This change alone took several hours.
In zip64 mode I only support a total of UINT_MAX (2^32-1) files in the central dir, and central dirs are limited to a total of UINT_MAX bytes. These are huge increases from the previous limits, so this should be fine. I'm not writing a hard disk backup utility here after all, so I'm not going to support archives that big right now.
Bugwise, the only major bug I'm worried about in the current public release (miniz.c v1.14) that really worries me is the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag (Issue #11 on the Google Code Issue tracker). I doubt anybody really used this flag, so I'm not worried about that, but a few internal API's used it to speed up loading a little and they could fail. It's bad enough that I'm going to patch v1.14 to fix this tonight.
Also, it's definitely time to split up miniz.c into at least two source files. One for Deflate/Inflate/zlib API emulation/crc32/etc. The other file will be for ZIP archive handling and be (of course) optional.
I'll also try to merge in all the fixes/improvements people have either placed on github, on miniz's Google code bug tracker, or have sent to me privately, if time permits.
Let me know if you are dying to try this version out and I can send you a private copy for testing.
Friday, August 23, 2013
LZHAM2 notes
I've been thinking in the background about LZHAM2 again. (LZHAM is a lossless codec I released a while back on Google code, which I'm now calling LZHAM1.) For LZHAM2 I'm aiming for much higher and more consistent decompression throughput, and more control over the various decompression rate vs. ratio tradeoffs that are fixed in stone right now. Here are all of my notes, put here mostly so I don't forget them. (I first sent them to Michael Crogan who's interested in this stuff but realized they where probably more useful here.)
- LZHAM1's decompressor can be greatly slowed down from having to rebuild Huffman decode tables too much, especially on nearly uncompressible files (because all the updates are spread around to way too many tables, so the decompressor gets stuck in a ditch constantly updating tables). The codec needs to be way smarter about when tables are updated.
Here's the big hammer approach to this: Support offloading Huffman table construction onto a pool of 1 or more worker threads. This is kinda tricky because the compressor must delay using updated Huffman tables for a while, because of the newly introduced latency of when the decompressor can switch to the new table. Determining how much latency to actually use will be an interesting problem (maybe make it adjustable/overridable by the user).
Worst case scenario, if the main thread needs to switch to an updated table that's not available yet it can not wait and just immediately compute the table itself (obviously wasting some CPU, but who cares because most apps rarely if ever use all available CPU's anyway).
Consider sending a tiny signalling message to the decompressor that indicates when the table must be updated.
Pretty much every modern mobile/desktop/etc. platform supports multiple HW threads, so LZHAM2 should be able to get a bunch of Huffman table updates for "free" if I can make this work well enough.
- SIMD-ify Huffman and/or arithmetic decompression. I'm on the fence about this, but the symbol decompression rate improvements I've heard from others experimenting in this domain are remarkable.
- Really try hard to optimize the Huffman decode table generator. SIMD it, whatever, it's way more important than I thought.
- Really try hard to optimize the Huffman decode table generator. SIMD it, whatever, it's way more important than I thought.
- LZHAM1 uses a simple approach to trigger the resetting of the Huffman table update rate: when the overall compression ratio has a big drop in the last few blocks it can reset the update rates of all the tables. There's a bunch of lag in the current implementation (all the way up at the block level) because the compressor's design is limited to a single pass (streaming) approach, and I didn't want to go back and re-code a whole block during a reset. Try an alternative that uses either more buffering or multiple passes.
- LZHAM1 uses too many Huffman tables, and is sloppy about its higher order contexts (the order-1 contexts are typically just the upper X bits of the previous byte, etc.) There's got to be a smarter way of dealing with this other than just lopping off low order bits. I went too far on using tons of tables and more contexts in order to match LZMA's ratio on large files. The codec needs to be more configurable so it can use less contexts for faster decompression.
- Do a thorough analysis on a wide range of file types and (importantly) file sizes. I just didn't spend much time concentrating on LZHAM1's small file size performance because I thought large solid files would be the more important real-world use case.
- I did a high quality integration of LZHAM directly into 7zip (both the command line tool and the 7z Windows archiver app) for testing, which helped me shake out a few of the remaining higher level API bugs. I didn't release this publicly however, but I did release the API fixes that came from this work. This was a super useful thing to do.
- Charles Bloom made several concise suggestions on how to improve LZHAM on his blog when he compared the codec vs. several others. Some of these suggestions are in the reply section, I need to save them.
- Finally get LZHAM's compressor into Telemetry and figure out how to better thread it. The current approach is really basic and just forks & joins on every block.
- Cloud compression is very interesting from an optimization perspective. I've been limiting myself to 1 machine with X threads and plain streaming compression (with minimal buffering) only. These are some important axes to explore. I used ~200 machines (with 4-12 compile threads on each box) to compile and optimize Portal 2's vertex/pixel shaders, imagine the parsing levels and compression options you can try out on hundreds of machines.
- Switch to cmake and Linux as my primary dev platform. I no longer use Windows as my primary dev platform. Linux is clearly the path forward and Windows is now that thing I port to.
Various things I tried that didn't make it into LZHAM1:
- In the early days I spent quite a bit of time experimenting with Deflate or LZX-style static Huffman tables vs. the dynamic stuff used in LZHAM1. I delta coded the code lengths vs. the previous block's code lengths into the output stream (I think I first saw Bloom do this in his early LZ research codecs). At the time I found the practical constraints on the # of Huffman tables, the # of symbols, etc. this placed on the design seemed too restricting. I hit a wall and couldn't compete against LZMA this way. I think there's still plenty of room to optimize the dynamic table rebuild approach which is why I keep pushing it.
- Match finding using suffix arrays and largest common prefix (LCP) tables
Got it working using the best algorithms I could find back around '07 and then again in '10, but my implementation had perf/memory scaling issues with larger dictionaries. Adding new data into the dictionary (and "sliding out" old data) was extremely expensive because the tables had to be rebuilt. LZMA's matching algorithm was easier to implement and a known thing so I went with that.
- I have a working branch of LZHAM that uses ROLZ (reduced offset LZ). It has a nicely improved ratio, but the sheer complexity of this beast (not to mention the lower decompression throughput due to updating the ROLZ tables) was just too much for me to handle as a side project so I put the whole experiment on ice.
- Early versions of LZHAM1's parser supported favoring matches that it thought would likely be in the decompressor's L2 cache. (It actually had a whole data structure that modeled a basic L2 cache that was used to bias the symbol prices.) This seemed like an important optimization for console CPU's, but I never measured any real benefit on the PC so I removed it and moved on.
Misc:
- I keep wondering why Google continues to invest in Deflate with Zopfli, etc. when it's clearly ancient stuff (Deflate was introduced 20 years ago). A new open codec that strikes the right balance somewhere in the spectrum between Deflate/LZX/LZMA/LZHAM/etc. would be super useful to a lot of people, and they have the clout and talent to do it. They should have enough data points from existing codecs and internal experience due to Zopfli to have confidence in building a new codec.
An effort like this would make a huge impact across the entire web stack. The gain would be relatively massive compared to the tiny improvements Zopfli's been able to achieve (~5% for 100x increase in cost means it's time to move on).
If the new codec is made zlib API compatible (like I do in LZHAM and miniz), which is easy, then dropping it into existing codebases would be fairly straightforward.
An effort like this would make a huge impact across the entire web stack. The gain would be relatively massive compared to the tiny improvements Zopfli's been able to achieve (~5% for 100x increase in cost means it's time to move on).
If the new codec is made zlib API compatible (like I do in LZHAM and miniz), which is easy, then dropping it into existing codebases would be fairly straightforward.
- Someone needs to write a universal preprocessing/long range match library that properly supports streaming and is trivial to add in front of other codecs. I've been treating preprocessing as a totally separate axes vs. compression, assuming somebody would eventually solve this problem.
It could support various executable formats (dwarf, exe, etc.), xml, json, html, jpeg, mp3, wav, png, raw images, deflate, etc. All the best archivers already do this and the research has been done, but AFAIK it's not available as a single robust library.
It could support various executable formats (dwarf, exe, etc.), xml, json, html, jpeg, mp3, wav, png, raw images, deflate, etc. All the best archivers already do this and the research has been done, but AFAIK it's not available as a single robust library.
- The decompressor can be viewed as a virtual CPU with a very limited but tightly compressed instruction set. I've been wondering what tricks from the CPU world could be effectively applied to LZ. I wonder if there are more useful instructions other than "here's a literal" or "copy X bytes from the dictionary using this offset".
With good parsing it's easy to add more node types to the parse graph. Right now I'm adding only literals (which are coded in various ways depending on previous state), and various matches and truncated versions of these matches.
With good parsing it's easy to add more node types to the parse graph. Right now I'm adding only literals (which are coded in various ways depending on previous state), and various matches and truncated versions of these matches.
- There are some deep/fundamental inefficiencies in the entire class of LZMA/LZHAM/etc. style algorithms. Bloom has covered this topic well on his blog, and I also realized this while working on LZHAM. For example, when a match ends, the decompressor has some knowledge from the dictionary about what the next character(s) are likely *not* to be. This knowledge can be used to exclude some dictionary strings in future matches. (However, the parser sometimes purposely truncates matches so it's possible for a match's follower byte to actually match the input but not be used.) There's code space inefficiency all over the place that seems like a big opportunity, but exploiting it seems hard to do efficiently.
Sunday, November 25, 2012
Released crunch v1.04
I finally checked in all the modified "crunch" code that's been sitting on my hard drive for months. The most significant changes are related to adding support for the .KTX file format, and basic support for the ETC1 block compression format supported by many Android devices. (I say "basic" because only vanilla block by block compression is supported in ETC1 mode.) I also finally added a simple makefile for Linux.
I don't plan on spending any more time with ETC1 right now, because PVRTC seems far more important. ETC1 is a pure block format so it was fairly easy and fun to get working.
I also added miniz and my JPEG codec into crnlib, so crunch can now read progressive JPEG's and write .PNG files.
I regression tested this release in .CRN and RDO DXTc (clustered DXTc) mode under Linux/Windows, so I'm pretty confident I didn't break the core functionality. I made a bunch of higher level changes (which are difficult/tricky to fully test) however, so here's hoping I didn't break things too much.
I don't plan on spending any more time with ETC1 right now, because PVRTC seems far more important. ETC1 is a pure block format so it was fairly easy and fun to get working.
I also added miniz and my JPEG codec into crnlib, so crunch can now read progressive JPEG's and write .PNG files.
I regression tested this release in .CRN and RDO DXTc (clustered DXTc) mode under Linux/Windows, so I'm pretty confident I didn't break the core functionality. I made a bunch of higher level changes (which are difficult/tricky to fully test) however, so here's hoping I didn't break things too much.
Thursday, August 9, 2012
Left 4 Dead 2 Linux at SIGGRAPH 2012
I did a presentation at the OpenGL BoF at SIGGRAPH 2012 last night, here's a page with a good summary and a couple pics:
http://www.forceflow.be/2012/08/09/valve-left-4-dead-2-on-linux-talk-at-siggraph-opengl-anniversary/
The slides (currently in low quality PDF format – we’re working on getting this fixed) are here:
http://www.khronos.org/developers/library/2012-siggraph-opengl-bof
The batch trace videos shown at the talk are located on this YouTube channel:
http://www.youtube.com/user/sulphuric99
We actually only had time to show 1 video at the talk (the combined one containing each separate trace video as a separate column in a single video). This channel contains all 3 traces and the combined video.
http://www.forceflow.be/2012/08/09/valve-left-4-dead-2-on-linux-talk-at-siggraph-opengl-anniversary/
The slides (currently in low quality PDF format – we’re working on getting this fixed) are here:
http://www.khronos.org/developers/library/2012-siggraph-opengl-bof
The batch trace videos shown at the talk are located on this YouTube channel:
http://www.youtube.com/user/sulphuric99
We actually only had time to show 1 video at the talk (the combined one containing each separate trace video as a separate column in a single video). This channel contains all 3 traces and the combined video.
Putting together a presentation like this was a surprising amount of work, and there was a bunch of last minute stress configuring the Linux laptop and the projector to play nice. Also, we somehow temporarily lost audio on the laptop while testing before the event (which of course never happened while testing at home/work). Thanks to a driver developer from NVidia, and Mike Sartain from Valve, for quickly figuring out the problem and saving the day.
Saturday, July 28, 2012
More on Crunch vs. US Patent #20110115806
Doug has updated his blog -- he's now granting the open source community immunity from his patent (#20110115806, "High-Compression Texture Mapping"):
http://dougrogers.blogspot.com/2012/07/high-compression-rate-texture-mapping.html
Here's a screenshot of this URL in its current state (as of 7/28/12 2:46 PM PST):
http://dougrogers.blogspot.com/2012/07/high-compression-rate-texture-mapping.html
Here's a screenshot of this URL in its current state (as of 7/28/12 2:46 PM PST):
There are several unresolved issues (for starters, how long will this immunity last once this patent is sold?), but this is a move in the right direction.
Thursday, July 26, 2012
"Crunch" Open Source Texture Compression Library vs. US Patent #20110115806
I'm the author of crunch, a nifty open source DXTc compression library with two unique features:
- R/D optimized DXTc compression: DXTc is generally very lossy, but other DXTc compressors just optimize for maximum achievable quality. crunch allows the developer to purposely trade off quality for relatively large gains in the compressibility of the resulting DXTc data. This mode is cool because the client application doesn't need to be changed at all to benefit (as long as it losslessly compresses the DXTc bits somehow).
- Transcodable file format: crunch can output mipmapped texture data to a custom format (with the .CRN extension) designed to be quickly transcodable directly to DXTc with no intermediate recompression step. The entire transcoder is contained in a single, large C++ header file. From a quality per bit perspective, .CRN performs more or less the same as R/D optimized DXTc followed by LZMA (sometimes a little better, sometimes worse). Speedwise, the transcode step is very fast (much faster than LZMA for example).
History of Crunch
I created this library in 2009, in my year off between working at the late Ensemble Studios and starting a full time position at Valve in August '09. I had a prototype version working good enough to compete against JPEG+real-time DXTc by mid 2009. I sent the crunch command line tool and library to several people and companies in the game industry (Matt Pritchard at Valve, John Brooks at Blue Shift Inc., and Colt McAnlis who was at Blizzard at the time). Matt Pritchard at Valve actually experimented with an early version of crunch on Half Life 2 texture assets around this time, which was a pretty cool validation that I had something interesting.
I made an attempt at exploring commercial licensing opportunities with Blue Shift acting as a distributor. They had some moderate success with technology licensing/distribution in the past (in the PS1/PS2/Xbox1 era), so it seemed like it was worth a try. But the reality is, commercialization of a library like this is a very, very hard thing to do. Honestly, neither Blue Shift or I really had the time, energy, or focus to devote to things like proper documentation, optimization, API design/simplification, and porting the library to enough platforms to actually make a compelling enough product. Game companies weren't interested in what we had to offer, so I basically put crunch on the back burner and moved to the Seattle area to start a new job at Valve in late '09.
After helping ship Portal 2 and DoTA 2, I took a few months off in late 2011 to decompress and finally push crunch out the door to Google Code. I spent a lot of time ruthlessly simplifying the API down to a few dead simple function calls. I probably went through 4-5 versions of the library, each version getting smaller, more focused, and easier to use. Colt McAnlis (now at Google) and I retested the whole thing on tens of thousands of game textures, photos, and sprites. I finally publicly released it with a ZLIB license on Dec. 27, 2011.
Crunch vs. US Patent #20110115806
Unfortunately, unbeknownst to me I was stepping into a virtual patent minefield by the act of releasing crunch to the world. Just as the library was starting to gain traction with game, WebGL, and open source developers, I received my first ever "Patent Violation Notice" by email from Doug Rogers on July 20th:
I immediately let Doug know that crunch is just an open source library, and that I've not made any money from crunch in any way (no donations, consulting, licensing, etc.) I've actually spent a large amount of my own time (and indirectly, money) developing this library. Since starting at Valve I've learned a ton of things about optimizing for value and focusing on customer's actual needs. I realized that there was much more value to be gained by releasing this code with a very permissive license (ZLIB), and then engaging and learning from the developer community to determine what they really wanted and thought was valuable. (And amusingly, what I thought the community wanted in a library for DXTc texture compression/transcoding, and what they told me they actually wanted, where two very different things.)
Anyway, I know of Doug from his excellent NVDXT texture compression tool he wrote while at NVidia. I used this library while creating the fully deferred renderer for the Xbox 1 launch title "Shrek". Doug's library and tool was basically the gold standard in DXTc compression for many years. I've spoken with Doug, and I don't think his intentions where bad or negative in any way. I'm not a big fan of software patents, but for better or worse they are the "coin of the realm" in the technology world. I'm no expert on patents, but I think Doug was trying to defend his patent from perceived infringement (a kind of "use it or loose it" situation) before releasing a product of his own.
At this point, I've discussed with Doug several possibilities. A few of them involve us jointly commercializing crunch and his code as a single product. However, I feel at this point that crunch is already open source, and I would be doing a disservice to the open source community by re-licensing the library with any sort of commercial terms or a different (less permissive) license. If anything, I'm going to change the license to be even more permissive, or maybe even slap the unlicense on it. I think my email to him earlier today describes the current situation pretty well:
Hi Doug, Thanks, but after considering all this stuff, I honestly think that it's best if I don't get involved in any commercialization activities. I was really interested in this before I started at Valve (and I attempted to use Blue Shift, Inc. as a distributor with console/PC devs in 2009 with little success). But I've now got a job that demands so much of my time and energy that it doesn't make much sense for me to put any more effort into this library. (And if you look closely at the dates, I've barely been able to release any updates to it since the initial release.) I would rather keep pushing the state of the art forward in my spare time, and I'm cool with just having my name associated with these efforts. Basically - I've already got a demanding day job, and I would rather not turn something that is a fun hobby (with possibly indirect career benefits) into another job.
I don't want to slow down you or others with attempting to commercialize this stuff, and I don't want companies or individuals to not be able to benefit from it. I think crunch has demonstrated what is possible, to enough of the right people, that there's a small but growing market out there for the right solutions. crunch's license is ZLIB, which is already very permissive, and I'm open to changing the license to something else (MIT/BSD, even unlicense.org) if that helps move things forward. I already have a bunch of my open source compression code (miniz, LZHAM, jpeg-compressor) used by several companies (like Epic Megagames, Valve, and Crytek), so this doesn't seem fundamentally any different to me. All that I ask is for some credits somewhere, but even that isn't required. If you go to Siggraph, I can explain how the library is put together, and most parts are pretty easy to modify.
On the technical side, I don't know a whole lot about your product, but it may be exactly what Google's WebGL team needs right now. Is your output data easy to transcode to DXTc, and further compressible with gzip? I ask because .CRN is not any of these things (the CRN transcoder is large and complex, so it's not the best fit for use in Javascript/WebGL applications).
What the WebGL guys really need is:
- A format that is quick and super easy to transcode to DXTc (in C or Javascript)
- Total transcoder code size must be very small (because it needs to be transmitted with the webpage each time it's loaded)
- A format that is very compressible using specifically gzip (because gzip is supported by the browsers)
- Ideally, something that is roughly competitive against JPEG+real-time DXTc, or only 10-20% worse file size for the same PSNR.
- PVRTC support (DXTc+PVRTC will cover all the mobile platforms that matter)
.CRN isn't really the best fit (it was originally designed for PS3/X360 console games, not WebGL). There's a Google dev who has been trying to modify crnlib so it supports "raw" files, but I don't think he's made much progress. And crunch's RD optimized DXTc mode+gzip is ~30% larger than .CRN for the same PSNR, so it's not a compelling enough solution. (You really need LZMA or LZHAM for this option to be competitive, which isn't available in the browser, and cross compiling these libraries is not practical or compelling) If you want, I can introduce you by email or in person to the devs at Google who have been working on this stuff.
Last I heard, the SOE guys are using crunch's RD optimized DXTc mode for Planetside 2, because the ratio gain from .CRN doesn't justify the extra complexity (and potential patent risk) of transcoding. However, now that they are aware of what's actually possible, if there was a commercial solution available I would bet they would go for it. Let me know if you would like to talk to these guys.
Next Steps
At this point, I would really like to move forward with my life and put crunch (and S3TC/DXTc!) in the past. I strongly feel that video card vendors should get together and create a new set of GPU-friendly, open texture compression formats that are relatively easy to compress/decompress, very well defined, with easy to use open source libraries, and are also quickly and efficiently transcodable (in C, Python, Javascript, etc.). I don't think any of the existing texture compression formats (PVRTC, S3TC/DXTc, ETC, the new DX11 formats, etc.) are good solutions to the actual problems developers are facing today (more on this later).Siggraph
It so happens that Brandon Jones, a WebGL and Javascript developer, is going to be demonstrating crunch (transcoding in Javascript of all things!) at the WebGL BoF (Birds of a Feather) event at Siggraph:
Brandon Jones: Crunch/DXT/Rage demo
http://www.khronos.org/news/events/siggraph-los-angeles-2012
Wednesday, August 8, 4:00 PM – 5:00 PM, JW Marriott Los Angeles at LA Live, Gold Ballroom Salon 3
Brandon Jones: Crunch/DXT/Rage demo
http://www.khronos.org/news/events/siggraph-los-angeles-2012
Wednesday, August 8, 4:00 PM – 5:00 PM, JW Marriott Los Angeles at LA Live, Gold Ballroom Salon 3
Also, I'll be at the later OpenGL BoF event at Siggraph to give a short presentation on Left 4 Dead 2 Linux:
Left 4 Dead 2 Linux: From 6 to 300 FPS in OpenGL– Rich Geldreich (Valve)
Wednesday, August 8, 6:00 PM – 7:00 PM, JW Marriott Los Angeles at LA Live, Gold Ballroom Salon 3
Subscribe to:
Posts (Atom)


