Thomas Harte
|
0487b8c178
|
Definitively eliminated the additional y filtering step; if I'm going to work to ensure always four samples per colour cycle, I can put the channel separation coefficients directly into their shaders, cutting down on samples.
|
2017-01-07 16:02:33 -05:00 |
|
Thomas Harte
|
5740015f56
|
Temporarily disabled composite processing to show the pure stream. Fixed both automatic calculations of phase — per line and, at input, per pixel.
|
2017-01-07 12:38:00 -05:00 |
|
Thomas Harte
|
c84004bfa3
|
Fixed: colour_cycle_numerator_ doesn't need to be multiplied by the time multiplier because it'll get that for free from the calculation of next_run_length.
|
2017-01-06 21:36:19 -05:00 |
|
Thomas Harte
|
c746a3711f
|
Temporarily disabled my attempt to be clever with bilinear filtering when applying a lowpass filter. Will need to investigate.
|
2017-01-04 08:06:18 -05:00 |
|
Thomas Harte
|
aa7774a9a6
|
Experimental: up the chroma accuracy, just let the luma go straight through. Subject to figuring out how I'm still losing so much precision.
|
2017-01-03 22:41:34 -05:00 |
|
Thomas Harte
|
a836120945
|
Restored proper colour separation, but somewhere a massive hit in horizontal resolution is happening — much greater than one would expect from the sample size picked. So investigation to come.
|
2017-01-03 22:32:07 -05:00 |
|
Thomas Harte
|
7d60df9075
|
Added the option for both intermediate and output shaders to use only a portion of the input/output texture; made an attempt to pick an appropriate proportion in order to align signal sampling with the colour subcarrier.
|
2017-01-03 22:16:52 -05:00 |
|
Thomas Harte
|
f2b8b26bc4
|
Started throwing some comments into my shaders.
|
2017-01-03 21:16:38 -05:00 |
|
Thomas Harte
|
34d213dec4
|
Decreased Y resolution, again also hopefully temporarily.
|
2016-12-10 15:35:38 -05:00 |
|
Thomas Harte
|
81a102d951
|
Upped intermediate buffer size, at least temporarily, while I look for the source of the interference patterns I'm seeing.
|
2016-12-10 15:20:10 -05:00 |
|
Thomas Harte
|
0e71802b92
|
Reduced Oric video to single nibble constants. Removed attempt at asynchronous flush as no longer required.
|
2016-12-10 14:17:46 -05:00 |
|
Thomas Harte
|
a549fd1ecc
|
Introduced the ability simply to piggy-back off the CRT's natural phase for the colour burst, thereby eliminating a couple of redundant independent attempts in the Oric and Electron.
|
2016-12-10 13:42:34 -05:00 |
|
Thomas Harte
|
5216dda675
|
Added some brief extra exposition to the texture builder, cut all internal tex_x/y and source_divider stuff from the CRT.
|
2016-12-06 19:08:55 -05:00 |
|
Thomas Harte
|
33d52bb573
|
Ensured no over-moving.
|
2016-12-06 19:02:18 -05:00 |
|
Thomas Harte
|
4ff33254e1
|
Sought to shift locking back up to the CRT. And to be a bit more RAII-ish.
|
2016-12-06 18:48:30 -05:00 |
|
Thomas Harte
|
60f9ddfde8
|
Fixed start test and added incrementation of start locations.
|
2016-12-06 08:08:57 -05:00 |
|
Thomas Harte
|
f388ba11cc
|
Missed an initialisation. Fixed!
|
2016-12-06 07:26:23 -05:00 |
|
Thomas Harte
|
0fee8096c1
|
Made an attempt to shuffle the texture builder to a similar flush/submit pattern as the input builder. Don't care about thread safety yet, as it's obvious I'm going to need to move that back up to the CRT.
|
2016-12-06 07:24:07 -05:00 |
|
Thomas Harte
|
0edc043378
|
Started introducing an extra layer of indirection so as to be able to bind the texture builder to the same flush and submit patern as the array builder.
|
2016-12-03 20:47:19 -05:00 |
|
Thomas Harte
|
cb3c837e30
|
Simplified interface by baking in last-minute-only updates.
|
2016-12-03 18:19:12 -05:00 |
|
Thomas Harte
|
0220d33562
|
Resolved failure of initial state setting, which was causing tests sometimes to fail.
|
2016-12-03 16:42:10 -05:00 |
|
Thomas Harte
|
c5016a3eaa
|
Completed flight of 'Outputs' to postfix underscores.
|
2016-12-03 11:02:34 -05:00 |
|
Thomas Harte
|
7c85cb62e4
|
Moved underscores, removed indirections where they're not necessary, converted those names that were still looking very Objective-C and moved the GL fence variable into the private area, where it should always have been.
|
2016-11-21 12:14:52 +08:00 |
|
Thomas Harte
|
bc03e12dc5
|
Switched to suffix underscores.
|
2016-11-21 11:57:45 +08:00 |
|
Thomas Harte
|
340607e13e
|
Switched the flywheel to suffix underscores.
|
2016-11-21 11:48:31 +08:00 |
|
Thomas Harte
|
e1285028aa
|
Removed a redundant clear and some dead code.
|
2016-11-21 11:42:45 +08:00 |
|
Thomas Harte
|
7b38247ab3
|
Updated outdated comments.
|
2016-11-21 11:40:13 +08:00 |
|
Thomas Harte
|
d7d0ed378a
|
Only the final intermediate buffer needs clearing, on reflection.
|
2016-11-21 11:26:07 +08:00 |
|
Thomas Harte
|
c89345c639
|
Reduced buffer size.
|
2016-11-21 11:21:14 +08:00 |
|
Thomas Harte
|
32dbfe947d
|
With hindsight, the elimination of this might have been overzealous.
|
2016-11-20 10:53:35 +08:00 |
|
Thomas Harte
|
ef0367d4a4
|
Corrected typo.
|
2016-11-20 09:12:43 +08:00 |
|
Thomas Harte
|
5bc165960a
|
Completed refactoring.
|
2016-11-20 09:12:06 +08:00 |
|
Thomas Harte
|
fda90c5aef
|
Documented.
|
2016-11-20 09:11:24 +08:00 |
|
Thomas Harte
|
c2349ee3f4
|
This thing has clearly becoma a real class.
|
2016-11-19 20:12:40 +08:00 |
|
Thomas Harte
|
7857ef774f
|
Ensured resets genuinely kill outstanding data.
|
2016-11-19 20:09:38 +08:00 |
|
Thomas Harte
|
a4c7b00ecd
|
Fixed code that was causing the failing test.
|
2016-11-19 19:55:30 +08:00 |
|
Thomas Harte
|
f59537bce9
|
Added a testing hook, but as of yet no tests.
|
2016-11-17 14:06:16 +08:00 |
|
Thomas Harte
|
aca1fa0577
|
Returned some video output. Enough significantly to reduce my paranoia.
|
2016-11-17 13:37:53 +08:00 |
|
Thomas Harte
|
1f91d29434
|
Progressed to usage of an array builder and a texture builder up to the point of a successful build.
|
2016-11-17 12:26:04 +08:00 |
|
Thomas Harte
|
0f3b02edb7
|
Switched to postfix underscores and gave this class ownership of a texture builder and an array builder, though it presently uses neither.
|
2016-11-17 11:00:11 +08:00 |
|
Thomas Harte
|
57f0648742
|
Fleshed out first implementation of ArrayBuilder , albeit that I need to implement exhaustion properly, as soon as I think of a sensible way to handle synchronisation.
|
2016-11-17 10:39:30 +08:00 |
|
Thomas Harte
|
324a1de43d
|
Started pulling out array construction as a separate task.
|
2016-11-17 09:20:49 +08:00 |
|
Thomas Harte
|
c04a116a05
|
Fixed comment.
|
2016-11-16 23:14:56 +08:00 |
|
Thomas Harte
|
edeafd4d94
|
Wait, OpenGL textures go the other way.
|
2016-11-16 23:14:15 +08:00 |
|
Thomas Harte
|
6ac20e0066
|
Pushed responsibility for submitting texture contents up to the texture builder, simplifying the interface.
|
2016-11-16 23:13:06 +08:00 |
|
Thomas Harte
|
5c5e44874f
|
Even better: why include the 'Input' prefix when there's only one?
|
2016-11-16 22:57:17 +08:00 |
|
Thomas Harte
|
04b2688683
|
Attempted to reduce allocations.
|
2016-11-16 13:25:50 +08:00 |
|
Thomas Harte
|
c1a509910d
|
Documented this interface, albeit that the English could do with a second pass, and very sightly simplified inline with current usage.
|
2016-11-16 13:15:50 +08:00 |
|
Thomas Harte
|
4d0d5eb919
|
Renamed the 'input buffer builder' to the 'input texture builder' to be explicit about what sort of buffer, and killed the prefix since it's namespaced. Also switched to std::vector .
|
2016-11-16 12:31:32 +08:00 |
|
Thomas Harte
|
4ee4400801
|
Removed dead code.
|
2016-11-16 11:57:22 +08:00 |
|
Thomas Harte
|
6cb4950db4
|
Improved run-off area.
|
2016-11-16 11:53:15 +08:00 |
|
Thomas Harte
|
9ee11d7765
|
At the expense of API simplicity, at least for now, resolved the most glaring cause of dirty lines.
|
2016-11-16 11:34:05 +08:00 |
|
Thomas Harte
|
44d3fd6d5b
|
Fixed mistimed reset of the target output line. Now all that's left is occasional noise.
|
2016-11-16 11:22:12 +08:00 |
|
Thomas Harte
|
7a737e0790
|
Both pathways start with a buffer that clears to black. So no need to keep going on about it.
|
2016-11-16 11:12:08 +08:00 |
|
Thomas Harte
|
f63e849092
|
Sought completely to eliminate the outgoing concept of 'clearing zones'.
|
2016-11-16 11:10:34 +08:00 |
|
Thomas Harte
|
294adde344
|
Eliminated zoned clearing, in favour of a complete buffer clear on each load and attempted to reduce locking. But imperfectly.
|
2016-11-16 10:59:12 +08:00 |
|
Thomas Harte
|
ccedb6bea6
|
Introduced an intermediate buffer that collects lines before flushing them to the output buffer.
|
2016-11-16 10:49:18 +08:00 |
|
Thomas Harte
|
ba2adf8bb1
|
Normalised on std::vector rather than std::unique_ptr<uint8_t *> as (probably?) more idiomatic. Improved structure slightly. Introduced a container for line data, albeit one that isn't yet used.
|
2016-11-16 10:34:54 +08:00 |
|
Thomas Harte
|
9c550c594a
|
Moved audio work back into its own thread, but this time it queues up an all happens only upon a flush. Hopefully to resolve synchronisation cost concerns.
|
2016-11-09 21:17:50 -05:00 |
|
Thomas Harte
|
eccfdabeab
|
Temporarily disabled thread hop, until I can find a way to batch these things.
|
2016-11-03 22:52:02 -04:00 |
|
Thomas Harte
|
4258401384
|
Implemented flush , added a call to it from the filter speaker's destructor, to ensure no race conditions on accessing the various bits of instance state there and below.
|
2016-10-19 21:15:04 -04:00 |
|
Thomas Harte
|
c628b7c5c5
|
This is the real PAL frequency, I think.
|
2016-10-17 08:05:02 -04:00 |
|
Thomas Harte
|
1f857c619b
|
Fixed timing issues. Static box of frame achieved!
|
2016-10-12 21:42:36 -04:00 |
|
Thomas Harte
|
00e3ad9b04
|
Added a bit more ceiling for lowpass filtering on constrained machines.
|
2016-10-10 07:51:01 -04:00 |
|
Thomas Harte
|
e53455a936
|
Not having read the C++ synchronisation primitives before, this async task queue is probably incorrect. But nevertheless, let's have a quick go at employing it — in a hideously thread unsafe fashion — for audio generation. What can possibly go wrong?
|
2016-10-07 16:56:34 -04:00 |
|
Thomas Harte
|
dab3580111
|
Experimental: can I afford a lower sampling rate if there's a low-pass filter in effect?
|
2016-08-22 22:18:05 -04:00 |
|
Thomas Harte
|
1541273785
|
Moved responsibility for throwing in a low-pass filter up to the Vic, appropriately.
|
2016-08-21 18:13:31 -04:00 |
|
Thomas Harte
|
c783090980
|
It turns out that the Vic has a 1.6Khz low-pass filter. So added that.
|
2016-08-21 12:13:41 -04:00 |
|
Thomas Harte
|
fef316932f
|
Moved opening bracket appropriately.
|
2016-07-04 21:14:28 -04:00 |
|
Thomas Harte
|
8db44eed3e
|
Added a default implementation of Speaker::skip_samples .
|
2016-07-04 20:48:27 -04:00 |
|
Thomas Harte
|
2bc87ee095
|
Merge branch 'master' of github.com:TomHarte/CLK
|
2016-07-01 16:28:18 -04:00 |
|
Thomas Harte
|
eefd0c17b6
|
Actually, I guess that to fulfil the contract I can't silently decide not to draw if I'm being told I definitely need to draw.
|
2016-07-01 16:27:45 -04:00 |
|
Thomas Harte
|
ed8f4d0476
|
Added some minor additional bits of documentation.
|
2016-06-30 08:46:29 -04:00 |
|
Thomas Harte
|
4ac619f569
|
glClientWaitSync appears to be a busy wait, at least on my machine. But why wait indefinitely anyway?
|
2016-06-29 21:32:47 -04:00 |
|
Thomas Harte
|
ff53accca0
|
Demonstrated that issue is coloured borders, made a guess as to buffer exhaustion, upped limits as a temporary fix.
|
2016-06-29 21:16:34 -04:00 |
|
Thomas Harte
|
2bd71e7e9b
|
.reset is the more normal way to reassign a unique_ptr .
|
2016-06-23 20:52:44 -04:00 |
|
Thomas Harte
|
c18cc4c8f5
|
It appears the Vic's output is sine-ish, after all. Also adjusted centre of display, simultaneously adding some validation on that.
|
2016-06-14 07:29:35 -04:00 |
|
Thomas Harte
|
fcf4b14344
|
Extended to allow floating-point sampling rates. Which makes sense.
|
2016-06-13 19:30:41 -04:00 |
|
Thomas Harte
|
2992183aae
|
Switched to a lookup table for phase, temporarily in YUV colour space, probably. Working on it.
|
2016-06-12 14:39:17 -04:00 |
|
Thomas Harte
|
68a8851c52
|
Increased parallelism, allowing a simplification in the GL view.
|
2016-06-02 22:29:09 -04:00 |
|
Thomas Harte
|
1e0fcbbee8
|
Made a very basic stab at a couple of the tone generators, added straight-through path for the speaker when input rate exactly equals output rate.
|
2016-06-01 19:53:16 -04:00 |
|
Thomas Harte
|
5c4f35e13f
|
Finally started on generalising the C++ stuff so as to be able to be able to get a working audio binding on the OS-specific side without further repetition by factoring an appropriate protocol out from the Electron and sketching out the correct speaker class for the Atari. Added a method to ask it what a good output frequency would be.
|
2016-05-31 21:23:44 -04:00 |
|
Thomas Harte
|
4ad074fc78
|
Introduced a four-cycle delay between playfield fetch and display, curing Yar's Revenge. Also disabled barrel roll scanling colouring again. I really need to make my mind up on that.
|
2016-05-16 19:55:56 -04:00 |
|
Thomas Harte
|
9d92ad659f
|
Established the basic timing loop, albeit without clocking delays yet.
|
2016-05-16 08:01:29 -04:00 |
|
Thomas Harte
|
00a2b42080
|
Made thread-safe.
|
2016-05-15 15:19:52 -04:00 |
|
Thomas Harte
|
091516e3cb
|
The semantics might need better exposition but: fixed UniformXfv calls plus matrix calls, documented new semantics on all setters.
|
2016-05-15 14:59:59 -04:00 |
|
Thomas Harte
|
328fabcd10
|
Ensured values aren't dangling pointers.
|
2016-05-14 18:15:10 -04:00 |
|
Thomas Harte
|
492dc7ccbf
|
Made an attempt to queue uniform changes until the next call to bind . That's to allow usage from other threads.
|
2016-05-14 18:06:55 -04:00 |
|
Thomas Harte
|
30f335fa35
|
Switched pervasively to using the named slot uniform setters on Shader .
|
2016-05-13 22:08:32 -04:00 |
|
Thomas Harte
|
8d52765f40
|
Realised why new shaders weren't taking. Very negligibly decreased Atari drawing cost.
|
2016-05-12 22:22:24 -04:00 |
|
Thomas Harte
|
6d65bc9b3a
|
Permitted a wider error window on vertical sync, tidied things up a little and started trying to move towards full implementation of the OpenGL contract.
|
2016-05-11 22:11:01 -04:00 |
|
Thomas Harte
|
4b3c4082d2
|
These functions appear correctly to model the NTSC and PAL palettes; the CRT's attempt to switch function doesn't work properly yet though.
|
2016-05-11 21:07:18 -04:00 |
|
Thomas Harte
|
a8ce021136
|
Fixed comment.
|
2016-05-10 19:59:03 -04:00 |
|
Thomas Harte
|
0d2d6a452d
|
Fixed some dangling buffer management issues.
|
2016-05-10 19:55:34 -04:00 |
|
Thomas Harte
|
b6d2c8cb63
|
Switched to instaced drawing for source[/intermediate] runs too, reducing that data transfer footprint by 50%.
|
2016-05-10 19:50:12 -04:00 |
|
Thomas Harte
|
7369139f7e
|
Realised that phase time can fit inside a single byte, since it's always (well) within the first quarter of the line — and if it somehow weren't (?) then taking it modulo the frequency would do.
|
2016-05-10 19:14:57 -04:00 |
|
Thomas Harte
|
47ae402f7e
|
Introduced a shorthand for setting up array attributes.
|
2016-05-10 19:11:48 -04:00 |
|
Thomas Harte
|
257420b0f7
|
Fixed potential output error if buffer top were hit; clarified buffer size constants.
|
2016-05-10 19:04:03 -04:00 |
|
Thomas Harte
|
309313c470
|
Update CRTConstants.hpp
Lack of data duplication means this storage can be smaller.
|
2016-05-10 10:49:48 -04:00 |
|
Thomas Harte
|
1d0bcb416d
|
Dropped the size per output run back down to 8 bytes.
|
2016-05-10 07:47:47 -04:00 |
|
Thomas Harte
|
b0f0315f12
|
Fixed: this now implements 12-byte instancing for output runs.
|
2016-05-10 07:30:12 -04:00 |
|
Thomas Harte
|
86dab3a5d6
|
Quickest first attempt to switch to instancing for the output array. Texture coordinates seem to be off.
|
2016-05-10 07:23:47 -04:00 |
|
Thomas Harte
|
daec21d3d8
|
Found and fixed off-by-one error. Display should now be completely fixed.
|
2016-05-09 21:14:59 -04:00 |
|
Thomas Harte
|
59d766b325
|
Rationalised buffer sizes.
|
2016-05-09 19:17:03 -04:00 |
|
Thomas Harte
|
7e2bd78891
|
With an eye towards instancing, moved away from circular buffers.
|
2016-05-09 19:14:30 -04:00 |
|
Thomas Harte
|
ad734f341f
|
Attempted fully to perfect memove , albeit that it's not affecting either current machine.
|
2016-05-09 07:44:05 -04:00 |
|
Thomas Harte
|
8eb058064c
|
Fixed: ensured that the attempt to plot a misplaced write occurs correctly.
|
2016-05-09 07:42:26 -04:00 |
|
Thomas Harte
|
e6a7161e87
|
Made some minor corrections on the copyback of misplaced write data.
|
2016-05-09 07:39:57 -04:00 |
|
Thomas Harte
|
45af963b9a
|
Moved more of the circular logic inside getCircularRanges in order to eliminate one more potential source of error.
|
2016-05-09 07:34:37 -04:00 |
|
Thomas Harte
|
cec9ad0dc6
|
Switched to a more rational interface, ensured output_level will work when eventually needed, and that neither it nor output_data attempts a recursive lock.
|
2016-05-09 07:02:12 -04:00 |
|
Thomas Harte
|
a82fa31370
|
Switched back to broad locking for CRT updates. To eliminate one more thing.
|
2016-05-09 06:58:26 -04:00 |
|
Thomas Harte
|
47302de23a
|
Switched to simpler storage for _image .
|
2016-05-08 21:11:56 -04:00 |
|
Thomas Harte
|
1f02c5df88
|
Tidied up some further loose ends.
|
2016-05-08 20:58:18 -04:00 |
|
Thomas Harte
|
7b5982e455
|
Removed last mentions of 'lateral'.
|
2016-05-08 20:51:28 -04:00 |
|
Thomas Harte
|
986019f9f9
|
Fixed error that could lead to split output run vertex writes.
|
2016-05-08 20:30:59 -04:00 |
|
Thomas Harte
|
1a214a8308
|
Fence sync tied up. Remaining glitches are likely off-by-one-type errors but we'll see.
|
2016-05-08 19:45:36 -04:00 |
|
Thomas Harte
|
ef3b91d3aa
|
Made an attempt to get formal on synchronisation.
|
2016-05-08 19:42:33 -04:00 |
|
Thomas Harte
|
dd469fe83a
|
Switched back to normal frame drawing logic and cleaned up the circular range stuff a little, to make it clear that no errors lie there.
|
2016-05-08 18:50:30 -04:00 |
|
Thomas Harte
|
ccdbec3ffc
|
Corrected for potential lost lines.
|
2016-05-08 16:43:11 -04:00 |
|
Thomas Harte
|
a75259ce9f
|
Removed some dead caveman debugging statements.
|
2016-05-08 16:18:42 -04:00 |
|
Thomas Harte
|
9b2061be98
|
Actually, that should probably be 1/outputTextureSize, as the output range is -1 to +1.
|
2016-05-08 16:09:39 -04:00 |
|
Thomas Harte
|
9485ef2c8c
|
At last a genuine bug fixed: was nudging the wrong amount in intermediate shaders.
|
2016-05-08 16:07:36 -04:00 |
|
Thomas Harte
|
8e4ab37719
|
Things are back pretty much to where they were, but offset is eliminated as an input.
|
2016-05-07 18:37:18 -04:00 |
|
Thomas Harte
|
c73751b15a
|
Reverted deliberately broken segments to produce something mergeable.
|
2016-05-05 21:27:13 -04:00 |
|
Thomas Harte
|
a74f081aa9
|
Put lateral lookup table directly into the shader.
|
2016-05-05 21:21:27 -04:00 |
|
Thomas Harte
|
8284b272ad
|
Picked appropriate new-world values for various buffers.
|
2016-05-05 20:00:28 -04:00 |
|
Thomas Harte
|
284b310074
|
Attempted to implement end-of-buffer tests for all stages.
|
2016-05-05 19:52:05 -04:00 |
|
Thomas Harte
|
e9a9cfb09f
|
Fixed off-by-one error on texture upload.
|
2016-05-05 07:22:49 -04:00 |
|
Thomas Harte
|
f621cc8523
|
Withdrew the pixel unpack buffer in order to avoid the potential for a paused machine to be undrawable. The cost is at least an extra memcpy per frame; I'm letting the driver worry about the whole process for now.
|
2016-05-04 21:27:10 -04:00 |
|
Thomas Harte
|
2e7ac0e6db
|
With a lot of logging also currently ongoing, fixed circular ranges for clearing and when covering an entire buffer.
|
2016-05-04 21:08:38 -04:00 |
|
Thomas Harte
|
87df57195d
|
Started on an attempt not to treat the various buffers as free to loop within, starting with the input texture.
|
2016-05-04 07:39:45 -04:00 |
|
Thomas Harte
|
3684c6404f
|
Proven through deliberate inefficiency: the issues are (i) texture upload; and (ii) buffer wraparound.
|
2016-05-03 22:22:12 -04:00 |
|
Thomas Harte
|
759fbd89ca
|
Switched pixel unpack buffer back to explicit flushes.
|
2016-05-03 21:26:09 -04:00 |
|
Thomas Harte
|
2541711061
|
Made attempts (i) to flush buffers before unmapping them; and (ii) to bring texture uploads within the new orthodoxy.
|
2016-05-03 20:56:47 -04:00 |
|
Thomas Harte
|
fc1a67c157
|
Lateral is no longer written per vertex. It's a fixed list.
|
2016-05-03 18:45:55 -04:00 |
|
Thomas Harte
|
535d272039
|
Tweaks here, tweaks there.
|
2016-05-03 18:15:24 -04:00 |
|
Thomas Harte
|
6d5a1b33ee
|
Turned the colour up just a little, slightly lowered luminance signal strength.
|
2016-05-03 07:51:14 -04:00 |
|
Thomas Harte
|
31f1e6d5c0
|
Introduced a separate stage for luminance filtering.
|
2016-05-03 07:46:40 -04:00 |
|
Thomas Harte
|
29e7c96e4c
|
Brought monitor mode inside the pipeline and added an intermediate filter.
|
2016-05-02 21:05:58 -04:00 |
|
Thomas Harte
|
4a0e1dc789
|
Switched to explicit flushing of data.
|
2016-05-01 22:33:00 -04:00 |
|
Thomas Harte
|
c93bcf9f28
|
Discovered cause of clears: stale code. Tweaked persistence, again.
|
2016-05-01 22:28:33 -04:00 |
|
Thomas Harte
|
09ed8eb654
|
Quelle surprise, failure to find strikes again. Fixed.
|
2016-05-01 21:07:27 -04:00 |
|
Thomas Harte
|
1b6754c5f8
|
Shuffled code, realised I wasn't actually binding my shader.
|
2016-05-01 19:22:24 -04:00 |
|
Thomas Harte
|
69984b54e5
|
Fixed aspect ratio storage. Adjusted indentation slightly.
|
2016-05-01 16:49:44 -04:00 |
|
Thomas Harte
|
6982e945fb
|
Fixed those issues breaking GL state, I hope.
|
2016-05-01 16:17:52 -04:00 |
|
Thomas Harte
|
4ec4cceb84
|
Made a first attempt at adding draw-as-a-quad functionality to texture targets.
|
2016-05-01 13:52:35 -04:00 |
|
Thomas Harte
|
2616d748fe
|
Introduced bind-if-necessary/unbind semantics for shaders.
|
2016-05-01 11:07:49 -04:00 |
|
Thomas Harte
|
fe2abbd4ed
|
Minor adjustments to ensure sampling occurs as intended.
|
2016-04-30 20:48:09 -04:00 |
|
Thomas Harte
|
16ef09fc2b
|
Made an attempt intelligently to use bilinear filtering to increase filtering quality with the same number of samples.
|
2016-04-29 18:37:35 -04:00 |
|
Thomas Harte
|
501ab74eaf
|
Fixed time multiplier calculation.
|
2016-04-28 22:12:59 -04:00 |
|
Thomas Harte
|
23ea832f41
|
Increased brightness in television mode, added a clear if screen resolution changes.
|
2016-04-28 22:04:47 -04:00 |
|
Thomas Harte
|
3638414b37
|
Added additional comments.
|
2016-04-28 21:55:14 -04:00 |
|
Thomas Harte
|
e6c3b148ac
|
Switched wholeheartedly to the new shader.
|
2016-04-28 21:45:44 -04:00 |
|
Thomas Harte
|
8538b62ea2
|
Made an attempt to extract and consolidate the logic behind the intermediate shaders.
|
2016-04-28 21:04:59 -04:00 |
|
Thomas Harte
|
ef3647f6cf
|
Being bold: per-scan timing isn't coming back, I think, so started completely removing it.
|
2016-04-27 23:00:43 -04:00 |
|
Thomas Harte
|
87c778ebb7
|
Fixed code use of parameter name.
|
2016-04-27 22:58:53 -04:00 |
|
Thomas Harte
|
494ef6a324
|
Updated documentation, taking the opportunity to improve a parameter name.
|
2016-04-27 22:57:40 -04:00 |
|
Thomas Harte
|
7c20fce467
|
I guess NumberOfFields is done for.
|
2016-04-27 22:48:37 -04:00 |
|
Thomas Harte
|
8849dc3265
|
Finished consolidation into OutputShader. With its documentation yet to update.
|
2016-04-27 22:41:32 -04:00 |
|
Thomas Harte
|
496d979aca
|
Made a decision to clean up by creating per-shader classes. Well, more or less. First thing to be factored out: the output shader.
|
2016-04-27 22:29:54 -04:00 |
|
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 |
|
Thomas Harte
|
ace331d4b4
|
Got a bit higher level in CRT timing specification. Which internally allows it now to infer the colour clock frequency. Which will be helpful momentarily.
|
2016-01-23 18:53:20 -05:00 |
|
Thomas Harte
|
a9e26d7808
|
Introduced a scan's delay, as intended.
|
2016-01-23 17:49:25 -05:00 |
|
Thomas Harte
|
20cab08f8f
|
Added a two-slot buffer of scans and a comon dispatch mechanism.
|
2016-01-23 17:44:34 -05:00 |
|
Thomas Harte
|
0efe4b312c
|
Disabled my various bits of rate interchange debugging; improved test for when to call update_display due to a RAM write.
|
2016-01-21 22:16:52 -05:00 |
|
Thomas Harte
|
48ddd3c497
|
Set about documenting the CRT; while doing so decided to add an optional clock divider for input; having done so decided to try to exploit it with the Electron.
|
2016-01-21 21:17:47 -05:00 |
|
Thomas Harte
|
4c16d34063
|
Moved set_tape so that the inline definition of get_next_tape_pulse is visible to it. Also eliminated some dead typedefs.
|
2016-01-20 08:27:25 -05:00 |
|
Thomas Harte
|
f727582911
|
Started making first moves towards stripping CSCathodeRayView of its responsibilities. If that can be merely an OpenGL view that presents things, things will be a lot more portable.
|
2016-01-20 08:21:33 -05:00 |
|
Thomas Harte
|
e65cd4cf06
|
Some data is marginally reaching the CPU from the tape.
|
2016-01-19 22:05:34 -05:00 |
|
Thomas Harte
|
ddcc34740b
|
Added lots of debugging output while I attempt to locate the source of audio scratchiness, also simplified manner of dealing with wraparound within the AudioQueue wrapper.
|
2016-01-18 13:50:19 -06:00 |
|
Thomas Harte
|
b58e59e2bb
|
Fixed: now outputting the requested output rate, rather than massively overproducing at the input rate.
|
2016-01-14 23:12:40 -05:00 |
|
Thomas Harte
|
383b2be4c6
|
Fixed one off-by-one error.
|
2016-01-14 21:33:27 -05:00 |
|
Thomas Harte
|
8bd04a6be4
|
Switched model for filter subclasses. Implemented test square[-ish] wave to check for obvious stream errors. None is clear.
|
2016-01-14 21:27:02 -05:00 |
|
Thomas Harte
|
38ffcaa262
|
Here, at last, is _some_ audio output, at least.
|
2016-01-14 20:33:22 -05:00 |
|
Thomas Harte
|
afde8dac49
|
Closed the loop such that audio manages to bubble up into Objective-C.
|
2016-01-13 22:38:59 -05:00 |
|
Thomas Harte
|
439d452e23
|
Resolved some errors.
|
2016-01-13 22:11:33 -05:00 |
|
Thomas Harte
|
49e89a4bcb
|
I'm not yet completely convinced by my approach to time basing, but it'll probably do? If so then this more or less gets me ready for a point-sampled filtering.
|
2016-01-13 22:02:39 -05:00 |
|
Thomas Harte
|
d9a7ef9e46
|
Edging towards audio output; the speaker is given appropriate input and output rates, and then updated with current divider and enabled/disabled status.
|
2016-01-13 21:03:43 -05:00 |
|
Thomas Harte
|
84ba4e2900
|
Tidied a little, started working towards supporting speaker output.
|
2016-01-12 22:19:56 -05:00 |
|
Thomas Harte
|
3437781abd
|
Started sketching out an interface for sound generation. Which made me realise that the CRT in CRTDelegate was redundant, since C++ has namespaces.
|
2016-01-12 16:54:09 -05:00 |
|
Thomas Harte
|
82aa6d074a
|
'type' is out, at least for the time being.
|
2015-09-05 20:25:30 -04:00 |
|
Thomas Harte
|
3c3c4d2f7c
|
Enlarged drawing range a little.
|
2015-08-19 21:35:26 -04:00 |
|
Thomas Harte
|
28fad66272
|
Okay, so I had those constants transposed. What a klutz I've been!
|
2015-08-19 09:09:00 -04:00 |
|
Thomas Harte
|
f74d9ee373
|
Copied in quote. So that I can stop looking it up.
|
2015-08-18 22:36:32 -04:00 |
|
Thomas Harte
|
a62c7f5c56
|
At last! Discovered CRT scanning bug; was always moving by the full proposed run length along the scan, not the time until the next event. Using this, have implemented proper vertical sync at last (I think). Have disabled scanline banding too, as now everything meets up it's more helpful to be able to see with clarity.
|
2015-08-18 22:22:47 -04:00 |
|
Thomas Harte
|
88d5064737
|
Not that it makes a lot of difference, there being no names to mangle, but moved the closing #ifdef __cplusplus to the idiomatic place.
|
2015-08-18 20:33:59 -04:00 |
|
Thomas Harte
|
902795d61c
|
Switched vertical sync detection method, at least for now. They never happen automatically (I need to fix that) and just always take effect if detected in the lower half of the display. PAL/NTSC is determined just by looking at the refresh rate.
|
2015-08-18 00:17:03 -04:00 |
|
Thomas Harte
|
083b678785
|
Quickie: observed that the initial position is one scanline dirty, not zero. Also switched to a size_t on the write pointer, size_t being the correct C size for into-memory offsets.
|
2015-08-17 00:25:32 -04:00 |
|
Thomas Harte
|
cde9bb7ebc
|
Put common shift step into a macro.
|
2015-08-16 16:12:20 -04:00 |
|
Thomas Harte
|
a693c081f8
|
Switched on the appropriate compiler warnings re: signed comparisons and implicit conversions. Fixed all less-than-explicit calls.
|
2015-08-16 16:08:29 -04:00 |
|
Thomas Harte
|
b440fed323
|
Fixed a couple of incorrect references to horizontal constants or calculations where the intention is to use vertical.
|
2015-08-13 18:29:07 +01:00 |
|
Thomas Harte
|
59c872ada6
|
Attempted to reintroduce suitably noted emergency flyback. To re-enable auto-selection of PAL.
|
2015-08-13 14:55:53 +01:00 |
|
Thomas Harte
|
aebf636528
|
Ensured the PIA timer resumes its normal tick rate after being read; fixed those spaces that had crept in where tabs should be.
|
2015-08-10 16:55:16 +01:00 |
|
Thomas Harte
|
fd36f13baf
|
The cathode ray view no longer hard codes the frame size. So that's one less coupling. Doubled pixel output size to give sufficient sampling detail to capture the NTSC colour clock (ummm, hopefully).
|
2015-08-05 21:45:47 -04:00 |
|
Thomas Harte
|
67e82c713f
|
Broke assumption that every item in a vertex description is a short, specifically turning lateral into a byte. Which buys me a byte for phase, if that's sufficient.
|
2015-08-05 21:12:33 -04:00 |
|
Thomas Harte
|
5644b3a1cc
|
Fixed scanline sizing and fill issues, as well as shortening vsync to the correct Atari length.
|
2015-08-05 20:55:27 -04:00 |
|
Thomas Harte
|
265d1d5b24
|
Merge branch 'EdgeTriggeredVSync'
|
2015-08-05 20:30:02 -04:00 |
|
Thomas Harte
|
84d1c2e47d
|
Fixed end of sync time calculation and ensured the pretend capacitor is emptied by the decision to retrace and doesn't refill during retrace.
|
2015-08-05 20:29:20 -04:00 |
|
Thomas Harte
|
04c2640b15
|
Made a quick attempt to allow vsync triggers only on the raising edge of a sync signal. Will need to investigate more thoroughly.
|
2015-08-03 08:42:05 -04:00 |
|
Thomas Harte
|
5313b48ebd
|
I'm ashamed to admit, I: played with numbers until enough things looked stable such that I can investigate other things. Discovery: my PAL autodetection was way off. Fixed, hopefully.
|
2015-08-02 20:32:18 -04:00 |
|
Thomas Harte
|
55017b78a5
|
Made an attempt to unify my variable storage (and, technically, to get beam size correct across the frame).
|
2015-08-02 19:30:45 -04:00 |
|
Thomas Harte
|
6e52e5df1c
|
Full separate 'lateral' usage is go. Also probably at some point I need to throw in a phase property, which this new flexibility will help with.
|
2015-08-02 14:32:29 -04:00 |
|
Thomas Harte
|
3ab6585789
|
Started making the format of data included in a CRTFrame less a matter of variously hard-coded magic constants. Which will allow me to separate the idea of an internal lateral position from the direct texture coordinate, avoiding precision sampling errors at the top and bottom.
|
2015-08-02 14:25:21 -04:00 |
|
Thomas Harte
|
be421587ad
|
Eliminated the vertical retrace counter; vertical retrace ends when the beam gets back to the top.
|
2015-08-02 13:48:35 -04:00 |
|
Thomas Harte
|
de4f2bf5dd
|
Maybe the 10 lines resource I saw meant 10 lines including charge time?
|
2015-07-31 19:00:40 -04:00 |
|
Thomas Harte
|
5f1d76e855
|
Can't seem to find any documentation: assumed horizontal sync is generated during vertical.
|
2015-07-31 18:49:02 -04:00 |
|
Thomas Harte
|
c1a12ad4df
|
Fix to make sure end of vertical sync is always correctly spotted as an event, rather than just happening off the books. So I can now watch Joust roll to its heart's content.
|
2015-07-31 18:15:59 -04:00 |
|
Thomas Harte
|
9c91f1a2eb
|
Added an attempt at NTSC/PAL autodetection, based on number of missed vertical syncs.
|
2015-07-31 18:04:33 -04:00 |
|
Thomas Harte
|
a5d66e9dd6
|
Factored out a few more constants, started trying to ensure there's enough slack and the mechanisms in place for the CathodeRayView to hold onto two frames if it desires, for potential phosphor simulation, switched once again to additive blending — much more like a real CRT — and added a sine function across the width of spans per my understanding of how an electron gun actually fires.
Why do all this when overall timing is still so far off? It helps me more easily see how overall timing is so far off.
|
2015-07-31 17:47:10 -04:00 |
|
Thomas Harte
|
6ad3fbbaf2
|
Slowed flywheel adjustments a little, the better to highlight phase errors for the time being.
|
2015-07-30 23:00:54 -04:00 |
|
Thomas Harte
|
cfe758daa0
|
A tweak here, a tweak there, to help with debugging.
|
2015-07-30 21:29:40 -04:00 |
|
Thomas Harte
|
20c2d98b9a
|
Converted remaining spaces to real tabs.
|
2015-07-30 20:51:32 -04:00 |
|
Thomas Harte
|
1fa7a77793
|
Continuing in my attempts to figure out the complete absence of graphics from some games: there are 262 lines on an NTSC screen, not 256. Also ensured that the CRT has a little spare range at the edges so that its generated triangles don't wrap around just because of integer overflow.
|
2015-07-30 20:07:20 -04:00 |
|
Thomas Harte
|
98efae2536
|
Reintroduced emergency vertical sync — so that output occurs even when the emulation isn't catching syncs properly — and switched some spaces to tabs.
|
2015-07-30 17:16:49 -04:00 |
|
Thomas Harte
|
596d34190c
|
Fixed: write pointer is calculated only after write x and y are known. This is probably the memory handling problem?
|
2015-07-28 08:15:54 -04:00 |
|
Thomas Harte
|
1f229ee6f7
|
More tweaks to provide a stable image, at least for the time being.
|
2015-07-27 20:18:25 -04:00 |
|
Thomas Harte
|
01109d441b
|
Made an attempt at NTSC colours. Hard coded in RGB, not composite. Short cuts, tsk.
|
2015-07-27 19:04:03 -04:00 |
|
Thomas Harte
|
31e9a53a44
|
Removed some debugging code.
|
2015-07-27 16:43:51 -04:00 |
|
Thomas Harte
|
caffe56a2d
|
Slightly expanded width of cathode ray gun, decided to figure out exactly how to deal with off-by-one lengths and precision at a later date, ensured that failure to catch vertical sync doesn't cause out-of-bounds buffer access on the hard-coded, assumed large enough, 512x512 data textures.
|
2015-07-27 00:28:47 -04:00 |
|
Thomas Harte
|
65bb31d55b
|
With around about a thousand issues, not the least of which being sometimes unsafe memory accesses, I've at last got pixels on screen.
|
2015-07-26 23:50:43 -04:00 |
|
Thomas Harte
|
e53fbcf9ea
|
Reshuffled to make the OpenGL view explicitly a conduit for CRT-style output, and to give it responsibility for frame drawing. Which is still an awkward thread hop for the time being, but I've yet to read up on the advocated approach to multithreading with an NSOpenGLView; it looked like special provisions were available.
|
2015-07-26 15:13:46 -04:00 |
|
Thomas Harte
|
dd428c5d4d
|
Slightly relaxed time it takes to recognise vertical sync; considered what to do about reviving proper vertical sync but then gave up.
|
2015-07-24 23:56:25 -04:00 |
|
Thomas Harte
|
cea2580000
|
Upped internal precision a little.
|
2015-07-24 23:36:44 -04:00 |
|
Thomas Harte
|
ecb2898bd5
|
The overall architecture of who has responsibility for what is now very askew but: the CRT now outputs a tightly packed short buffer, with the probable OpenGL destination in mind. So it's now all fixed arithmetic internally. CRTFrame is reduced to a plain C struct with the intention that the OpenGL view will take responsibility for it and stop doing the back-and-forth sprint on getting buffer data. The Atari 2600 now outputs explicit blanks rather than level blacks for its border, so that it's easier visually to debug the CRT in its form as far as it has currently progressed: to drawing lines where the cathode ray gun would run while outputting pixel. I note that I'm still not quite getting vertical sync right yet — I'm just accepting it anywhere in teh frame — but that should be an easy fix.
|
2015-07-24 23:29:45 -04:00 |
|
Thomas Harte
|
d72287a776
|
Looked up normal retrace time (it's a lot less than 16µs and 26 scanlines — more like 7 and 10) and that the visible portion of a line is defined to start about 12 µs after the start of hsync, put the first two numbers into my CRT to make that more accurate, then derived a newer guess about what the Atari 2600 does for each of its 228 cycles. The text version of a frame is now looking pretty good. So it's probably time to hit OpenGL and the OS X side of things. Though I'll have a quick look to find out whether I can learn the exact real Atari 2600 timings before moving on.
|
2015-07-23 19:24:25 -04:00 |
|
Thomas Harte
|
33c06baffa
|
Explicitly separated vertical and horizontal sync event tracking, so as explicitly to be able to handle a coincidental simultaneous occurrence of both. Also for clarity.
|
2015-07-23 18:53:18 -04:00 |
|
Thomas Harte
|
5203f31bf4
|
Reintroduced a console examination of the output runs being received after fixing a failure to complete or restart frames over in the CRT; weirdly it seems that sync is being obeyed but raster position is off. So work to do.
|
2015-07-22 20:45:10 -04:00 |
|
Thomas Harte
|
065050115f
|
Made an attempt to switch to a triple-buffering scheme for CRT outputs, with an eye towards asynchronicity.
|
2015-07-22 20:33:20 -04:00 |
|
Thomas Harte
|
b503e13380
|
Fix one: vertical scan speed was failing to allow for the number of cycles in a line.
|
2015-07-22 18:56:35 -04:00 |
|
Thomas Harte
|
963cb2f6fb
|
Attempted to switch to slightly more meaningful names within the CRT and implemented a delegate to investigate output. Working on it.
|
2015-07-22 18:15:18 -04:00 |
|
Thomas Harte
|
908c171d2d
|
Commented the heck out of this thing, to put my thoughts in order if nothing else.
|
2015-07-21 16:37:39 -04:00 |
|
Thomas Harte
|
a1a1b15d18
|
Made a quick attempt to accumulate a list of detected output runs. Which means finally having to specify normal frame height. I'm already at too many magic formulae though, so this will need proper revision when I'm next awake. Definitely my horizontal position advancement is way off.
|
2015-07-20 23:18:56 -04:00 |
|
Thomas Harte
|
4fa315ab4d
|
This looks a lot closer to correct. The loss of horizontal sync during vertical sync is odd but the two should be fully decoupled in here. I'll have to check. Probably I've got something wrong. There are approximate sinusoidals when re-establishing sync, so that's promising as to the flywheel.
|
2015-07-20 21:58:32 -04:00 |
|
Thomas Harte
|
4695295dd1
|
Made complete attempt at sync discrimination. But I seem somehow to be locking such that horizontal sync is in the middle of the line. Obviously my flywheel is at fault somehow.
|
2015-07-20 21:43:00 -04:00 |
|
Thomas Harte
|
4e4c082a05
|
Made some minor attempt at proper sync response. I think I've gone way off piste and overcomplicated it.
|
2015-07-19 23:43:22 -04:00 |
|
Thomas Harte
|
4a1e9fe2a8
|
Rephrased the CRT as owning an arbitrary number of buffers and vending storage space for pixel output. That much better maps to potential implementations of this thing in GLSL, with ES 2.0's limitations kept in mind.
|
2015-07-19 21:21:34 -04:00 |
|
Thomas Harte
|
7df5025eef
|
Started sketching out the delegate interface that will allow a branch from the CRT into whatever native display system is used by a particular platform.
|
2015-07-19 18:32:42 -04:00 |
|
Thomas Harte
|
6f78ecdc9c
|
Made first genuine attempt at outputting a meaningful CRT stream. Which shows some significant errors. So work to do.
|
2015-07-19 16:48:14 -04:00 |
|
Thomas Harte
|
2d0f861474
|
Incoming: a 'CRT' class, to receive information intended for a cathode ray tube. To decode sync, etc.
|
2015-07-19 13:36:27 -04:00 |
|