diff --git a/OSBindings/Mac/Clock Signal/Atari2600.mm b/OSBindings/Mac/Clock Signal/Atari2600.mm index 1a51972fc..0c15866e9 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600.mm +++ b/OSBindings/Mac/Clock Signal/Atari2600.mm @@ -8,7 +8,31 @@ #import "Atari2600.h" #import "Atari2600.hpp" -#import +#import + +const char *vertexShader = + "#version 150\n" + "\n" + "in vec2 position;\n" + "\n" + "out vec4 colour;\n" + "\n" + "void main (void)\n" + "{\n" + "colour = vec4(position, 0.0, 1.0);\n" + "gl_Position = vec4(position, 0.0, 1.0);\n" + "}\n"; + +const char *fragmentShader = + "#version 150\n" + "\n" + "in vec4 colour;\n" + "out vec4 fragColour;\n" + "\n" + "void main(void)\n" + "{\n" + "fragColour = colour;\n" + "}\n"; @interface CSAtari2600 (Callbacks) - (void)crtDidEndFrame:(Outputs::CRTFrame *)frame; @@ -25,6 +49,11 @@ struct Atari2600CRTDelegate: public Outputs::CRT::CRTDelegate { dispatch_queue_t _serialDispatchQueue; Outputs::CRTFrame *_queuedFrame; + + GLuint _vertexShader, _fragmentShader; + GLuint _shaderProgram; + + GLuint _arrayBuffer, _vertexArray; } - (void)crtDidEndFrame:(Outputs::CRTFrame *)frame { @@ -41,12 +70,55 @@ struct Atari2600CRTDelegate: public Outputs::CRT::CRTDelegate { }); } +- (GLuint)compileShader:(const char *)source type:(GLenum)type +{ + GLuint shader = glCreateShader(type); + glShaderSource(shader, 1, &source, NULL); + glCompileShader(shader); + return shader; +} + - (void)draw { + if(!_shaderProgram) + { + _shaderProgram = glCreateProgram(); + _vertexShader = [self compileShader:vertexShader type:GL_VERTEX_SHADER]; + _fragmentShader = [self compileShader:fragmentShader type:GL_FRAGMENT_SHADER]; + + glAttachShader(_shaderProgram, _vertexShader); + glAttachShader(_shaderProgram, _fragmentShader); + glLinkProgram(_shaderProgram); + + glGenVertexArrays(1, &_vertexArray); + glBindVertexArray(_vertexArray); + glGenBuffers(1, &_arrayBuffer); + glBindBuffer(GL_ARRAY_BUFFER, _arrayBuffer); + + GLfloat vertices[] = { + 0.0f, 0.0f, + 0.5f, 0.0f, + 0.5f, 0.6f, + 0.0f, 0.5f + }; + + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + } + if(_queuedFrame) { glClearColor(1.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); + + glUseProgram(_shaderProgram); + + GLint position = glGetAttribLocation(_shaderProgram, "position"); + + glEnableVertexAttribArray(position); + glVertexAttribPointer(position, 2, GL_FLOAT, GL_FALSE, 0, (void *)0); + + glDrawArrays(GL_LINES, 0, 4); + /* printf("\n\n===\n\n"); int c = 0; for(int run = 0; run < _queuedFrame->number_of_runs; run++)