mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-15 14:27:29 +00:00
Introduced an interface for specifying attribute bindings, taking the opportunity to document the interface and introduce exceptions.
This commit is contained in:
@@ -246,7 +246,6 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
|||||||
|
|
||||||
_input_texture_data = (uint8_t *)glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, _input_texture_array_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
|
_input_texture_data = (uint8_t *)glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, _input_texture_array_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
|
||||||
|
|
||||||
// printf("%04x\n", glGetError());
|
|
||||||
_output_mutex->unlock();
|
_output_mutex->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,7 +534,7 @@ void OpenGLOutputBuilder::prepare_composite_input_shader()
|
|||||||
char *fragment_shader = get_input_fragment_shader();
|
char *fragment_shader = get_input_fragment_shader();
|
||||||
if(vertex_shader && fragment_shader)
|
if(vertex_shader && fragment_shader)
|
||||||
{
|
{
|
||||||
composite_input_shader_program = std::unique_ptr<OpenGL::Shader>(new OpenGL::Shader(vertex_shader, fragment_shader));
|
composite_input_shader_program = std::unique_ptr<OpenGL::Shader>(new OpenGL::Shader(vertex_shader, fragment_shader, nullptr));
|
||||||
|
|
||||||
GLint texIDUniform = composite_input_shader_program->get_uniform_location("texID");
|
GLint texIDUniform = composite_input_shader_program->get_uniform_location("texID");
|
||||||
GLint phaseCyclesPerTickUniform = composite_input_shader_program->get_uniform_location("phaseCyclesPerTick");
|
GLint phaseCyclesPerTickUniform = composite_input_shader_program->get_uniform_location("phaseCyclesPerTick");
|
||||||
@@ -622,7 +621,7 @@ std::unique_ptr<OpenGL::Shader> OpenGLOutputBuilder::prepare_output_shader(char
|
|||||||
|
|
||||||
if(vertex_shader && fragment_shader)
|
if(vertex_shader && fragment_shader)
|
||||||
{
|
{
|
||||||
shader_program = std::unique_ptr<OpenGL::Shader>(new OpenGL::Shader(vertex_shader, fragment_shader));
|
shader_program = std::unique_ptr<OpenGL::Shader>(new OpenGL::Shader(vertex_shader, fragment_shader, nullptr));
|
||||||
shader_program->bind();
|
shader_program->bind();
|
||||||
|
|
||||||
windowSizeUniform = shader_program->get_uniform_location("windowSize");
|
windowSizeUniform = shader_program->get_uniform_location("windowSize");
|
||||||
|
@@ -38,7 +38,7 @@ GLuint Shader::compile_shader(const char *source, GLenum type)
|
|||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::Shader(const char *vertex_shader, const char *fragment_shader)
|
Shader::Shader(const char *vertex_shader, const char *fragment_shader, const AttributeBinding *attribute_bindings)
|
||||||
{
|
{
|
||||||
_shader_program = glCreateProgram();
|
_shader_program = glCreateProgram();
|
||||||
GLuint vertex = compile_shader(vertex_shader, GL_VERTEX_SHADER);
|
GLuint vertex = compile_shader(vertex_shader, GL_VERTEX_SHADER);
|
||||||
@@ -46,6 +46,16 @@ Shader::Shader(const char *vertex_shader, const char *fragment_shader)
|
|||||||
|
|
||||||
glAttachShader(_shader_program, vertex);
|
glAttachShader(_shader_program, vertex);
|
||||||
glAttachShader(_shader_program, fragment);
|
glAttachShader(_shader_program, fragment);
|
||||||
|
|
||||||
|
if(attribute_bindings)
|
||||||
|
{
|
||||||
|
while(attribute_bindings->name)
|
||||||
|
{
|
||||||
|
glBindAttribLocation(_shader_program, attribute_bindings->index, attribute_bindings->name);
|
||||||
|
attribute_bindings++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
glLinkProgram(_shader_program);
|
glLinkProgram(_shader_program);
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
@@ -76,12 +86,12 @@ void Shader::bind()
|
|||||||
glUseProgram(_shader_program);
|
glUseProgram(_shader_program);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLint Shader::get_attrib_location(const char *name)
|
GLint Shader::get_attrib_location(const GLchar *name)
|
||||||
{
|
{
|
||||||
return glGetAttribLocation(_shader_program, name);
|
return glGetAttribLocation(_shader_program, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLint Shader::get_uniform_location(const char *name)
|
GLint Shader::get_uniform_location(const GLchar *name)
|
||||||
{
|
{
|
||||||
return glGetUniformLocation(_shader_program, name);
|
return glGetUniformLocation(_shader_program, name);
|
||||||
}
|
}
|
||||||
|
@@ -14,12 +14,38 @@
|
|||||||
namespace OpenGL {
|
namespace OpenGL {
|
||||||
class Shader {
|
class Shader {
|
||||||
public:
|
public:
|
||||||
Shader(const char *vertex_shader, const char *fragment_shader);
|
struct AttributeBinding {
|
||||||
|
const GLchar *name;
|
||||||
|
GLuint index;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Constructs a shader, comprised of:
|
||||||
|
@param vertex_shader The vertex shader source code.
|
||||||
|
@param fragment_shader The fragment shader source code.
|
||||||
|
@param attribute_bindings Either @c nullptr or an array terminated by an entry with a @c nullptr-name of attribute bindings.
|
||||||
|
*/
|
||||||
|
Shader(const char *vertex_shader, const char *fragment_shader, const AttributeBinding *attribute_bindings);
|
||||||
~Shader();
|
~Shader();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Performs an @c glUseProgram to make this the active shader.
|
||||||
|
*/
|
||||||
void bind();
|
void bind();
|
||||||
GLint get_attrib_location(const char *name);
|
|
||||||
GLint get_uniform_location(const char *name);
|
/*!
|
||||||
|
Performs a @c glGetAttribLocation call.
|
||||||
|
@param name The name of the attribute to locate.
|
||||||
|
@returns The location of the requested attribute.
|
||||||
|
*/
|
||||||
|
GLint get_attrib_location(const GLchar *name);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Performs a @c glGetUniformLocation call.
|
||||||
|
@param name The name of the uniform to locate.
|
||||||
|
@returns The location of the requested uniform.
|
||||||
|
*/
|
||||||
|
GLint get_uniform_location(const GLchar *name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint compile_shader(const char *source, GLenum type);
|
GLuint compile_shader(const char *source, GLenum type);
|
||||||
|
Reference in New Issue
Block a user