1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-18 01:07:58 +00:00
Commit Graph

328 Commits

Author SHA1 Message Date
Thomas Harte
f6d58f1ce7 Played in the margins with image retention. 2016-04-26 22:14:12 -04:00
Thomas Harte
416c944f02 Experimental: let's try accumulating history directly in the framebuffer. 2016-04-26 21:41:39 -04:00
Thomas Harte
6c567d166a Fixed colour burst acceptance, switched to an integral single byte streaming of Atari colours. 2016-04-25 20:56:15 -04:00
Thomas Harte
9b64f64db7 Attempted to normalise some style decisions.` 2016-04-24 22:32:24 -04:00
Thomas Harte
884755c560 Ensured the GL context is available when switching Atari 2600 output, and that it locks the output. 2016-04-24 20:56:21 -04:00
Thomas Harte
2bd6566768 Oh, of course, I can use GL_CONSTANT_ALPHA so that new colours can be painted at alpha 1.0 while possibly saturating with old colours. 2016-04-24 20:47:24 -04:00
Thomas Harte
d221c712b0 Ensured GL context is active when destructing CRTOpenGL. 2016-04-24 20:34:25 -04:00
Thomas Harte
acab22d95a Removed any improper talk of YUV. Switched to (cos, -sin) formulation of the quadrature vector, which I now believe to be correct. 2016-04-24 20:27:03 -04:00
Thomas Harte
d393776677 Fixed an incorrect sign. 2016-04-24 19:29:30 -04:00
Thomas Harte
9b2b7a09eb Ensured that colour space changes take effect. 2016-04-24 19:16:23 -04:00
Thomas Harte
929cfc49cb Extended window for picking output frequency, attempted to consolidate CRT OpenGL timing uniforms for approprate resetting. 2016-04-24 18:58:31 -04:00
Thomas Harte
082003ed0a Reintroduced the CRT delegate and the 2600's automatic region switching. Albeit that the CRT itself doesn't adjust properly to new timings yet. 2016-04-24 18:36:22 -04:00
Thomas Harte
d0f9a6c2f5 Added a dump-the-input default RGB output shader. Which at least proves that the Atari 2600 is generally still working. 2016-04-24 17:35:25 -04:00
Thomas Harte
775fc270e6 Fixed bug whereby first frame drawn has random collection of data. 2016-04-24 07:00:22 -04:00
Thomas Harte
80a3169674 Started reviving the Atari 2600 emulation. Put new startup sequence into place. 2016-04-24 06:56:08 -04:00
Thomas Harte
bdaf4cee43 Switched to an in-framebuffer approach to phosphor decay, which might be acceptable now that every single pixel is being painted, re-emphasises luminance and stretched sampling period for the two FIR filters as well as decreasing the amount of signal that is retained, subjectively to improve output. 2016-04-24 06:16:41 -04:00
Thomas Harte
c123f3bf74 Fixed run extension, temporarily forced colour amplitude. 2016-04-23 14:16:49 -04:00
Thomas Harte
a4889074b8 Moved final colour space conversion out of the innermost loop. 2016-04-22 21:29:27 -04:00
Thomas Harte
8ff1f82008 Fixed accidental channel duplication. 2016-04-22 19:18:28 -04:00
Thomas Harte
95639f1189 Made attempt to introduce final filtering stage and output. 2016-04-22 19:15:59 -04:00
Thomas Harte
23311d633b Doubled phosphor life, added comment on required final stage fix for tomorrow. 2016-04-21 23:15:48 -04:00
Thomas Harte
59c07f7ddd This, at least, is an attempt to decode chrominance, as yet unfiltered, and not commuted to RGB (and possibly packed incorrectly). 2016-04-21 23:01:54 -04:00
Thomas Harte
cc7bf97a9c This now attempts to filter y. 2016-04-21 22:32:30 -04:00
Thomas Harte
e7ed1224a5 Introduced the second filtering stage, albeit that it presently does nothing whatsoever. 2016-04-21 21:32:36 -04:00
Thomas Harte
23ce032ba1 Started edging towards the necessary flexibility for the other two intermediate shaders. 2016-04-21 20:21:34 -04:00
Thomas Harte
4b9985626d Started commuting alpha to direction. The incoming amplitude is now honoured. 2016-04-21 19:53:41 -04:00
Thomas Harte
638b08302b The initial composite buffer is now genuinely a composite signal. 2016-04-21 19:37:32 -04:00
Thomas Harte
d9a9dffe63 Factored out wraparound buffer addressing where it's otherwise going to get really repetitive; need to look at using the same approach for the glTexSubImage2D step at least but that probably means properly encapsulating the buffer builder's state. 2016-04-20 21:05:32 -04:00
Thomas Harte
8232ed765e Eliminated use of zero-alpha runs to clear new lines in the intermediate buffer in favour of a scissored glClear. It's just an easier way to scale the current approach to three intermediate buffers. 2016-04-20 20:44:25 -04:00
Thomas Harte
e2da77fb8b Clarified constants, ensured monitor mode works from startup. 2016-04-19 22:53:39 -04:00
Thomas Harte
ef83595af3 Fixed: issue was (i) always thinking the entire source run buffer needed to be issued; and (ii) having fixed that, always thinking that the block that needs redrawing doesn't overflow the buffer. Fixed both. 'Television' mode is now working without explicit synchronisation (and with a lot less work). 2016-04-19 22:38:11 -04:00
Thomas Harte
3d7a3ce995 Eliminated some redundant texture binds. 2016-04-19 22:30:05 -04:00
Thomas Harte
145c0b3b71 Smoothed output device changes, killing some dead state. Added an explicit glFinish to suggest that the problem is synchronisation rather than any sort of data or shader error. 2016-04-19 22:21:26 -04:00
Thomas Harte
66f2c10c04 Resolved potential crash if tape requests are made without one inserted. Softened glFinish to glFlush, though I'm still not sure I should strictly need even that. 2016-04-19 21:00:48 -04:00
Thomas Harte
88e237b8de Standardised indentation and added one extra piece of documentation. 2016-04-19 20:53:55 -04:00
Thomas Harte
20aa9e291d Attempted to deal with the precision issues causing 'television' output currently to differ from 'monitor' output. Documented TextureTarget while I'm here. 2016-04-19 20:51:34 -04:00
Thomas Harte
6f52ed14d6 Trivially fixed. Appears to confirm an off-by-one error in the television implementation. Which would explain one of the visual phenomena — a repeating corrupted line. 2016-04-19 19:32:52 -04:00
Thomas Harte
b90a487a16 Attempted to enable both monitor and television output paths in the same codebase. The television route seems to be broken. Investigation required. 2016-04-19 19:30:50 -04:00
Thomas Harte
6c9bcfa637 Got rigorous on exceptions, started working towards having a working 'composite' shader at the same time as having a working RGB shader. 2016-04-19 08:05:43 -04:00
Thomas Harte
bcc784bda9 Introduced an interface for specifying attribute bindings, taking the opportunity to document the interface and introduce exceptions. 2016-04-19 07:23:15 -04:00
Thomas Harte
9d39c14752 Nothing of substance different; main current mystery: why do old frames recur and why does other jumpiness occur? Do I need some explicit synchronistion? 2016-04-18 22:18:03 -04:00
Thomas Harte
cf55a0c423 Fixed: composite output y is now incremented upon the start of retrace, that causing it to have different values at either edge of scans. 2016-04-18 21:49:45 -04:00
Thomas Harte
9580dde3ad Fixed left/right shuffling. Was simply failing to supply the integer version of coordinates. 2016-04-18 21:40:23 -04:00
Thomas Harte
d5bac2f04f Spotted error was in texture target all along. This now gets as far as showing something a lot like the correct display, but precision is way off. Way off. 2016-04-18 21:32:48 -04:00
Thomas Harte
bf29c8e2bf Fixed mismatch in television/monitor selection, ticked view for drawing concurrently, since it can, removed stray space. 2016-04-18 19:01:15 -04:00
Thomas Harte
5980f5e991 Number of taps can be specified explicitly if you desire. 2016-04-17 20:45:57 -04:00
Thomas Harte
499f7ace07 Re-enabled working video output for the Electron for the day and consolidated the rough metric I'm using to pick a number of taps for the audio filter. 2016-04-17 20:43:20 -04:00
Thomas Harte
9ede284eb6 Added blanking source runs, ensuring the rolling buffer is appropriately cleared. 2016-04-17 20:34:52 -04:00
Thomas Harte
43cae267f9 Shuffled further in an attempt to get as far as having static but incorrectly-interpreted pixel data on screen. It's not currently static. So work to do. 2016-04-17 18:08:05 -04:00
Thomas Harte
a8fbd82a3d Made an attempt at correctly mapping to eye coordinates. 2016-04-17 17:21:24 -04:00
Thomas Harte
ece51917fa Added first attempt at performing the first step of television output: mapping from source data to the first of the processing buffers. It's immediately obvious that my eye coordinates are off. 2016-04-17 17:17:59 -04:00
Thomas Harte
abce0ed3c4 Added setup of the source vertex array. 2016-04-17 16:17:23 -04:00
Thomas Harte
6ff9ffba6c Switching temporarily to an attempt to draw input runs as if RGB: shader compiles, fixed a race condition on out-of-bounds accesses for the source buffer. 2016-04-17 15:51:28 -04:00
Thomas Harte
104f44f27f Attempted to improve deinterlacing, gave the CRT full control over blend mode, switched back to 2000000Mhz audio. 2016-04-14 22:20:47 -04:00
Thomas Harte
323f1a24db Introduced blackout period solution to vertical sync confusing horizontal sync. Need to find out whether it's accurate. 2016-04-14 20:30:45 -04:00
Thomas Harte
6a17c2992d Introduced a compile-time configurable audio divider, set it arbitrarily to '8' for now. Discovered why my graphics aren't centred and added a TODO. 2016-04-13 22:31:59 -04:00
Thomas Harte
026ce0255f Source runs are now captured, and that buffer appropriately reset. 2016-04-13 22:20:13 -04:00
Thomas Harte
2ea02ed127 A source array buffer is also now created, mapped, unmapped, etc. 2016-04-13 22:14:18 -04:00
Thomas Harte
04d1b65c93 Reinstated texture target creation, cut them down to merely RGB. 2016-04-12 22:48:47 -04:00
Thomas Harte
4be8053ba9 Updated documentation. 2016-04-12 22:38:49 -04:00
Thomas Harte
4d889d9c7f Made an attempt slightly to simplify the fragment processor, at both ends. 2016-04-12 22:35:11 -04:00
Thomas Harte
fe8b0ebc7e Tidied up a little, mostly bumping things out of just-in-time creation that I can just do well in advance. 2016-04-12 22:31:13 -04:00
Thomas Harte
069ec2e889 In search of the cause of performance issues again, excised the per-pixel sin until it can be further evaluated. 2016-04-11 23:13:54 -04:00
Thomas Harte
d100c755b7 The final line runs on a diagonal. Leave room for that. 2016-04-11 23:13:14 -04:00
Thomas Harte
7276a06cc0 Added a helper to calculate a visible rect based on output timings, used it to scale the Electron output up to the full window size. 2016-04-11 21:47:23 -04:00
Thomas Harte
e45fe43801 Removed some dead caveman debugging. 2016-04-10 23:02:34 -04:00
Thomas Harte
bdb99ba92f Corrections back towards composite output: fixed misnamed constant, ensured the CRT doesn't write nonsense to the output buffer, ensured it grows three vertices at a time rather than six when desired. Net effect should be that the output stage is working again, with the input processing remaining to fill in. 2016-04-10 22:56:52 -04:00
Thomas Harte
8701366277 Switched horizontal sync detection back to differential, switched the Electron to an XOR-style sync output (believed to be accurate, but I need to check), fixed some latent issues around vertical sync detection. 2016-04-10 21:34:40 -04:00
Thomas Harte
fc5530b513 Realising I've managed to confuse input and output, started shift to 'source' for what 'input' was. 2016-04-10 15:58:43 -04:00
Thomas Harte
6dbd20ffde Expanded interface to rgb_sample to eliminate its need to make assumptions about globals, used expanded interface to compact Electron data to two pixels per byte. 2016-04-05 20:32:55 -04:00
Thomas Harte
c0cd1ed89e Made an attempt to consolidate timestamp bases to a single vector and hence to lump all geometry into one or two calls, with no repetitive setting of a uniform. I'm not sure the result is correct yet. 2016-04-04 21:57:27 -04:00
Thomas Harte
729fddea1c Switched to integer textures, likely to simplify for most use cases. 2016-04-04 19:39:01 -04:00
Thomas Harte
3ca58b2a57 Attemted further to diminish jumpiness. 2016-03-22 22:07:30 -04:00
Thomas Harte
8cd5d40e00 Made an attempt to reduce the amount of data heading to the GPU. 2016-03-22 21:16:32 -04:00
Thomas Harte
3038704977 Attempted to introduce a lowpass filter to the graphics output, reverted 6502 optimisations as seemingly not working. 2016-03-21 22:01:25 -04:00
Thomas Harte
197cf2a834 Commented out sync; it can probably be implicit. 2016-03-20 21:42:05 -04:00
Thomas Harte
9da7716c72 Attempted to simplify threading, thereby allowing machines to be constructed within a valid GL context, and started adding appropriate GL syncs. Which all oddly drops everything to a negligible FPS. Investigation will follow. 2016-03-19 22:46:17 -04:00
Thomas Harte
aa8a192c7e Simplified API down to their being a single texture with a specified depth. 2016-03-19 17:37:55 -04:00
Thomas Harte
4ac1f959e9 A shortcut here and a shortcut there; this allows me at least to determine whether use of a PBO gains anything. 2016-03-19 17:07:05 -04:00
Thomas Harte
5b37a651ac Made an attemp to deal with glUnmapBuffer(GL_ARRAY_BUFFER) == GL_FALSE. 2016-03-18 21:35:52 -04:00
Thomas Harte
0b1c9fb291 Ensured I don't interrupt triangle strips for the purpose of glDrawArrays. 2016-03-18 21:28:53 -04:00
Thomas Harte
620257e29e Switched to a client wait, as I try to figure out what's going on. 2016-03-18 21:21:35 -04:00
Thomas Harte
2e4af90e2d Resolved output errors. 2016-03-18 21:19:11 -04:00
Thomas Harte
10bc33464d I don't think this is quite correct, but it's better. 2016-03-18 21:14:06 -04:00
Thomas Harte
61e880de03 Keeping a buffer permanently bound is apparently illegal. So back to copying in on demand. Which I think still improves on synchronisation, but not much. 2016-03-18 21:11:09 -04:00
Thomas Harte
c8ecfb89d8 Some cleaning. 2016-03-16 22:52:33 -04:00
Thomas Harte
0d27d3bb7f As messy as it is, this use glMapBufferRange to avoid explicit buffer submits. 2016-03-16 22:29:22 -04:00
Thomas Harte
ca35a7e222 Ensured that a much greater input rate than output is handled correctly. 2016-03-16 20:38:17 -04:00
Thomas Harte
4cd0aa3416 Completed FIR filter based audio output. 2016-03-15 23:37:35 -04:00
Thomas Harte
726c98446a Fixed a couple of memory leaks, at least got as far as instantiating a filter. 2016-03-15 21:34:00 -04:00
Thomas Harte
67dffc89e0 Stripped unnecessary includes. 2016-03-13 13:25:34 -04:00
Thomas Harte
7255408313 Experimented with going back to horizontal sync on leading edge; not sure so (temporarily?) disabled. 2016-03-08 22:54:05 -05:00
Thomas Harte
68da673a95 Wrapped this up as explicitly only the Mac thing to do. 2016-03-08 22:53:29 -05:00
Thomas Harte
bf5747f83e Made an attempt to chop out all the stuff of building up the OpenGL data from the stuff of parsing input. 2016-03-08 22:40:23 -05:00
Thomas Harte
14b2927275 Made further attempts to tidy up; trying to demarcate between public interface and private. 2016-03-08 20:59:16 -05:00
Thomas Harte
c7976dd657 Started trying to clean up my Outputs namespace by moving stuff related to the CRT underneath a separate subnamespace. 2016-03-08 20:49:07 -05:00
Thomas Harte
bb09a5f58c The attribute locations don't really need to be stored. They can be transient. 2016-03-07 21:42:21 -05:00
Thomas Harte
6dfe877c43 Basic attempts to organise myself into shape for composite output continue. 2016-03-07 21:22:47 -05:00
Thomas Harte
1e5fe2b2c1 Made an attempt to reestablish the Atari 2600 output connection despite various changes (TODO: generalise that stuff), and to start creating the composite shader. 2016-03-07 21:04:04 -05:00
Thomas Harte
2de229152f Started sketching out shaders to do the first part of the composite conversion. 2016-03-07 19:21:04 -05:00
Thomas Harte
cd9c62acca Still stepping slowly towards a working composite mode, switched the RGB sampling function to returning a vec4, which may be of benefit to any machine with a brightness part of an RGB signal, and started edging towards at least having the correct GLSL programs ready for converting composite output. 2016-03-07 19:08:26 -05:00
Thomas Harte
3b6c9c15a1 Switching momentarily back to monitor mode, resolved why I was suddenly getting no output upon creating some texture targets. 2016-03-07 18:55:15 -05:00
Thomas Harte
eefd17ed4c Fixed sync response in composite scan output generation and stored texture coordinates. 2016-03-05 21:52:22 -05:00
Thomas Harte
6cddb4c9c8 Added a first attempt to generate output scans for composite mode. So this in theory completes the CPU side of composite operations. Though I'm sure problems will reveal themselves. 2016-03-05 21:18:28 -05:00
Thomas Harte
3f39803d32 Switched to triangle strips, to eliminate the need for any temporary storage for the composite output path. 2016-03-05 20:47:11 -05:00
Thomas Harte
23c223e2ed Started edging towards completing the CPU side of accumulating enough data for composite decoding. 2016-03-05 17:55:18 -05:00
Thomas Harte
5c8db71c64 Corrected some constants, ensured both machines (so far) are setting the output device. 2016-03-05 16:19:10 -05:00
Thomas Harte
70b6d51451 Ever more baby steps back towards composite decoding. 2016-03-05 14:36:12 -05:00
Thomas Harte
2f7626a5e0 Okay, this definitely definitely is supposed to be this way around. 2016-02-28 22:00:05 -05:00
Thomas Harte
3449120c24 Added a note to future self, put the scan edge generator back to the way round it was before. 2016-02-27 22:51:37 -05:00
Thomas Harte
7839d93344 With the provision of an extra hint to the CRT and, finally, the realisation about why my scans weren't exactly joining up, improved output precision. 2016-02-27 22:39:01 -05:00
Thomas Harte
1c6de7692d Made an attempt to fix tape output interrupts; offloaded raster width and placing conversion to the GPU. 2016-02-27 20:37:41 -05:00
Thomas Harte
db18c85423 Simplified the run builder rather; put a double check of Electron timing in place. 2016-02-25 22:01:42 -05:00
Thomas Harte
1eea28b692 Disabled some debugging parts, added some others, marked some things as inline. Ticking over. 2016-02-22 23:35:42 -05:00
Thomas Harte
4b28e7b974 Switched back to a single array and vertex buffer. 2016-02-21 22:54:55 -05:00
Thomas Harte
574985f9a2 Fixed interlaced timing; switched to a more robust detector for horizontal sync; eliminated some test logging. 2016-02-20 20:29:40 -05:00
Thomas Harte
00f414d757 Made an attempt to reintroduce interlacing and screen modes with gaps. Something's wrong with synchronisation though, so most likely I'm outputting a bad signal. 2016-02-20 17:32:51 -05:00
Thomas Harte
68992a62f9 Switched to a subtler to out-of-band syncs. 2016-02-20 00:16:07 -05:00
Thomas Harte
1954f7bcbd Got back to a stable image, at least when staying in a mode. Which is what I was trying to fix. Hmmm. 2016-02-19 23:41:09 -05:00
Thomas Harte
570d88a876 Added a simple metric for measuring surprise. Which will hopefully allow me to reimplement PAL/NTSC auto-selection for the Atari 2600. 2016-02-18 23:22:06 -05:00
Thomas Harte
ce3c098c28 Widened beam a little, moved to a linear approximation of age across scans, cut number of stored frames. 2016-02-16 21:48:09 -05:00
Thomas Harte
b261e86c62 Reintroduced lateral as a parameter in CRT drawing, to simulate a rounded raster. 2016-02-16 20:37:04 -05:00
Thomas Harte
a01f90ff3e Attempted a switch to the real PAL visible area and to something a bit like a real phosphor decay. 2016-02-14 21:57:23 -05:00
Thomas Harte
7580d192d5 Fixes: now setting correct frame time estimate, properly enabling the timestamp attribute, and ensuring that the Electron flushes screen work at least once per host frame update. 2016-02-14 19:28:02 -05:00
Thomas Harte
752db78431 No doubt still imperfect but killed the repeated whole texture uploads. 2016-02-13 23:55:02 -05:00
Thomas Harte
697e50c0cc Screen output is back, no matter how inefficiently. 2016-02-13 23:50:18 -05:00
Thomas Harte
d0b2d840da A minor fix to data queuing. Display still absent. 2016-02-13 20:57:41 -05:00
Thomas Harte
eeb0e134fd Started the transition towards a more natural collection of rolling buffers, with phosphor decay in mind. 2016-02-13 20:52:23 -05:00
Thomas Harte
fd2d5c78f8 Started trying to nudge towards the multistage approach to video decoding. 2016-02-12 22:31:05 -05:00
Thomas Harte
0a09762be6 Fixed output precision compared to the new approach of trusting the flywheel for position, and eliminated fixed-Acorn constants. Also re-enabled the faded previous frame, at least temporarily. 2016-02-12 19:53:49 -05:00
Thomas Harte
1d20a29d97 Made an attempt to switch to the flywheels for both vertical and horizontal sync, and to act more appropriately for out-of-bounds sync requests. Lots of tweaking to do, I fear. 2016-02-11 23:43:08 -05:00
Thomas Harte
c81891ec43 Minor tidying and at least acknowledged the new flywheel encapsulation. 2016-02-11 22:13:38 -05:00
Thomas Harte
a6574d1f96 Made an attempt to factor out and more clearly to document my implementation of flywheel synchronisation. 2016-02-11 22:12:12 -05:00
Thomas Harte
c66409421e Switched to generating an interlaced output, that apparently being correct. Enabled a poor man's version of phosphor persistence to smooth things out a little. It's not completely unconvincing. 2016-02-10 23:11:25 -05:00
Thomas Harte
b5bcadb8d3 Reinstated clipped CRT output, with more appropriate ownership of the decision. 2016-02-07 22:18:55 -05:00
Thomas Harte
3a689d14cc Added padding of supplied data to correct for any potential rounding errors when rendering. 2016-02-07 20:29:32 -05:00
Thomas Harte
3a9ea66f8b Filled in shader class. 2016-02-07 19:21:22 -05:00
Thomas Harte
4d0a218a57 Certainly at least seriously considering a separate holder for the "compile a shader" logic. Otherwise taking steps back towards PAL/NTSC decoding. 2016-02-07 17:32:38 -05:00
Thomas Harte
602327cd9d Sketched out a quick class for rendering to texture. 2016-02-07 15:42:02 -05:00
thomasharte
2cb12a7513 Allowed overly aggressive allocations to be cleared up after the fact. 2016-02-06 16:07:23 -05:00
Thomas Harte
bf348ccb96 Fixed clearing logic. 2016-02-05 22:47:12 -05:00
Thomas Harte
6ab425deda There is now a semi-reasonable amount of screen output again. 2016-02-05 21:35:39 -05:00
Thomas Harte
80e7e5e602 Updated to return old behaviour of drawing only upon changes. 2016-02-04 23:05:47 -05:00
Thomas Harte
8bc3f8046d This endeavours to move everything into the CRT class except the final version of shader building. 2016-02-04 22:57:46 -05:00
Thomas Harte
e0d51408e4 Onward with carrying this through to the bitter end, this at least results in all the appropriate knowledge and call-ins occuring at the CRT. 2016-02-04 22:28:50 -05:00
Thomas Harte
09e11469c3 Simplified further: eliminated delegate. Which means I can go frame-free internally to the CRT at some point, if I want. 2016-02-03 19:11:18 -05:00
Thomas Harte
19393390ac It's broken now, but this is what I now intend the full public interface of the CRT to be. 2016-02-02 22:41:33 -05:00
Thomas Harte
4554abb755 Made an attempt to be more rigorous in display generation on the Electron, to make sure I deal with mid-line changes to/from blank line mode. Even if it turns out that they generate pixels. 2016-01-29 21:14:13 -05:00
Thomas Harte
adc6838ba0 Continued slow migration of shader ownership to CRT. Attempted to start debugging the tape interface. 2016-01-27 21:35:57 -05:00
Thomas Harte
1819e7b9cc Started sketching out an appropriate interface to transfer responsibility for shaders to the CRT. 2016-01-23 19:06:32 -05:00