mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-25 18:30:21 +00:00
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.
This commit is contained in:
parent
280a2292ff
commit
f727582911
@ -228,7 +228,7 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
|
|||||||
BOOL hadFrame = _crtFrame ? YES : NO;
|
BOOL hadFrame = _crtFrame ? YES : NO;
|
||||||
_crtFrame = crtFrame;
|
_crtFrame = crtFrame;
|
||||||
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, _crtFrame->number_of_runs * kCRTSizeOfVertex * 6, _crtFrame->runs, GL_DYNAMIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(_crtFrame->number_of_vertices * _crtFrame->size_per_vertex), _crtFrame->vertices, GL_DYNAMIC_DRAW);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, _textureName);
|
glBindTexture(GL_TEXTURE_2D, _textureName);
|
||||||
if(_textureSize.width != _crtFrame->size.width || _textureSize.height != _crtFrame->size.height)
|
if(_textureSize.width != _crtFrame->size.width || _textureSize.height != _crtFrame->size.height)
|
||||||
@ -512,7 +512,7 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
|
|||||||
if (_crtFrame)
|
if (_crtFrame)
|
||||||
{
|
{
|
||||||
if(_textureSizeUniform >= 0) glUniform2f(_textureSizeUniform, _crtFrame->size.width, _crtFrame->size.height);
|
if(_textureSizeUniform >= 0) glUniform2f(_textureSizeUniform, _crtFrame->size.width, _crtFrame->size.height);
|
||||||
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)(_crtFrame->number_of_runs*6));
|
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)_crtFrame->number_of_vertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLFlushDrawable([[self openGLContext] CGLContextObj]);
|
CGLFlushDrawable([[self openGLContext] CGLContextObj]);
|
||||||
|
@ -15,6 +15,18 @@ using namespace Outputs;
|
|||||||
static const uint32_t kCRTFixedPointRange = 0xf7ffffff;
|
static const uint32_t kCRTFixedPointRange = 0xf7ffffff;
|
||||||
static const uint32_t kCRTFixedPointOffset = 0x04000000;
|
static const uint32_t kCRTFixedPointOffset = 0x04000000;
|
||||||
|
|
||||||
|
typedef uint16_t kCRTPositionType;
|
||||||
|
typedef uint16_t kCRTTexCoordType;
|
||||||
|
typedef uint8_t kCRTLateralType;
|
||||||
|
typedef uint8_t kCRTPhaseType;
|
||||||
|
|
||||||
|
//static const size_t kCRTVertexOffsetOfPosition = 0;
|
||||||
|
//static const size_t kCRTVertexOffsetOfTexCoord = 4;
|
||||||
|
//static const size_t kCRTVertexOffsetOfLateral = 8;
|
||||||
|
//static const size_t kCRTVertexOffsetOfPhase = 9;
|
||||||
|
//
|
||||||
|
//static const int kCRTSizeOfVertex = 10;
|
||||||
|
|
||||||
#define kRetraceXMask 0x01
|
#define kRetraceXMask 0x01
|
||||||
#define kRetraceYMask 0x02
|
#define kRetraceYMask 0x02
|
||||||
|
|
||||||
@ -394,6 +406,8 @@ CRTFrameBuilder::CRTFrameBuilder(uint16_t width, uint16_t height, unsigned int n
|
|||||||
frame.size.height = height;
|
frame.size.height = height;
|
||||||
frame.number_of_buffers = number_of_buffers;
|
frame.number_of_buffers = number_of_buffers;
|
||||||
frame.buffers = new CRTBuffer[number_of_buffers];
|
frame.buffers = new CRTBuffer[number_of_buffers];
|
||||||
|
frame.size_per_vertex = kCRTSizeOfVertex;
|
||||||
|
frame.geometry_mode = CRTGeometryModeTriangles;
|
||||||
|
|
||||||
for(int buffer = 0; buffer < number_of_buffers; buffer++)
|
for(int buffer = 0; buffer < number_of_buffers; buffer++)
|
||||||
{
|
{
|
||||||
@ -413,7 +427,7 @@ CRTFrameBuilder::~CRTFrameBuilder()
|
|||||||
|
|
||||||
void CRTFrameBuilder::reset()
|
void CRTFrameBuilder::reset()
|
||||||
{
|
{
|
||||||
frame.number_of_runs = 0;
|
frame.number_of_vertices = 0;
|
||||||
_next_write_x_position = _next_write_y_position = 0;
|
_next_write_x_position = _next_write_y_position = 0;
|
||||||
frame.dirty_size.width = 0;
|
frame.dirty_size.width = 0;
|
||||||
frame.dirty_size.height = 1;
|
frame.dirty_size.height = 1;
|
||||||
@ -421,22 +435,21 @@ void CRTFrameBuilder::reset()
|
|||||||
|
|
||||||
void CRTFrameBuilder::complete()
|
void CRTFrameBuilder::complete()
|
||||||
{
|
{
|
||||||
frame.runs = &_all_runs[0];
|
frame.vertices = &_all_runs[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *CRTFrameBuilder::get_next_run()
|
uint8_t *CRTFrameBuilder::get_next_run()
|
||||||
{
|
{
|
||||||
const size_t vertices_per_run = 6;
|
const size_t vertices_per_run = 6;
|
||||||
const size_t size_of_run = kCRTSizeOfVertex * vertices_per_run;
|
|
||||||
|
|
||||||
// get a run from the allocated list, allocating more if we're about to overrun
|
// get a run from the allocated list, allocating more if we're about to overrun
|
||||||
if(frame.number_of_runs * size_of_run >= _all_runs.size())
|
if((frame.number_of_vertices + vertices_per_run) * frame.size_per_vertex >= _all_runs.size())
|
||||||
{
|
{
|
||||||
_all_runs.resize(_all_runs.size() + size_of_run * 200);
|
_all_runs.resize(_all_runs.size() + frame.size_per_vertex * vertices_per_run * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *next_run = &_all_runs[frame.number_of_runs * size_of_run];
|
uint8_t *next_run = &_all_runs[frame.number_of_vertices * frame.size_per_vertex];
|
||||||
frame.number_of_runs++;
|
frame.number_of_vertices += vertices_per_run;
|
||||||
|
|
||||||
return next_run;
|
return next_run;
|
||||||
}
|
}
|
||||||
|
@ -22,21 +22,37 @@ typedef struct {
|
|||||||
uint16_t width, height;
|
uint16_t width, height;
|
||||||
} CRTSize;
|
} CRTSize;
|
||||||
|
|
||||||
typedef struct {
|
typedef enum {
|
||||||
CRTSize size, dirty_size;
|
CRTGeometryModeTriangles
|
||||||
|
} CRTGeometryMode;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/** The total size, in pixels, of the pixel buffer storage. Guaranteed to be a power of two. */
|
||||||
|
CRTSize size;
|
||||||
|
|
||||||
|
/** The portion of the pixel buffer that has been changed since the last time this set of buffers was provided. */
|
||||||
|
CRTSize dirty_size;
|
||||||
|
|
||||||
|
/** The number of individual buffers that adds up to the complete pixel buffer. */
|
||||||
unsigned int number_of_buffers;
|
unsigned int number_of_buffers;
|
||||||
|
|
||||||
|
/** A C array of those buffers. */
|
||||||
CRTBuffer *buffers;
|
CRTBuffer *buffers;
|
||||||
|
|
||||||
unsigned int number_of_runs;
|
/** The number of vertices that constitute the output. */
|
||||||
uint8_t *runs;
|
unsigned int number_of_vertices;
|
||||||
|
|
||||||
|
/** The type of output. */
|
||||||
|
CRTGeometryMode geometry_mode;
|
||||||
|
|
||||||
|
/** The size of each vertex in bytes. */
|
||||||
|
size_t size_per_vertex;
|
||||||
|
|
||||||
|
/** The vertex data. */
|
||||||
|
uint8_t *vertices;
|
||||||
} CRTFrame;
|
} CRTFrame;
|
||||||
|
|
||||||
typedef uint16_t kCRTPositionType;
|
// TODO: these should be private to whomever builds the shaders
|
||||||
typedef uint16_t kCRTTexCoordType;
|
|
||||||
typedef uint8_t kCRTLateralType;
|
|
||||||
typedef uint8_t kCRTPhaseType;
|
|
||||||
|
|
||||||
static const size_t kCRTVertexOffsetOfPosition = 0;
|
static const size_t kCRTVertexOffsetOfPosition = 0;
|
||||||
static const size_t kCRTVertexOffsetOfTexCoord = 4;
|
static const size_t kCRTVertexOffsetOfTexCoord = 4;
|
||||||
static const size_t kCRTVertexOffsetOfLateral = 8;
|
static const size_t kCRTVertexOffsetOfLateral = 8;
|
||||||
|
Loading…
Reference in New Issue
Block a user