1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-11 04:28:58 +00:00

Attempted to enable both monitor and television output paths in the same codebase. The television route seems to be broken. Investigation required.

This commit is contained in:
Thomas Harte 2016-04-19 19:30:50 -04:00
parent 6c9bcfa637
commit b90a487a16
2 changed files with 31 additions and 38 deletions

View File

@ -36,7 +36,6 @@ static const GLenum formatForDepth(size_t depth)
} }
} }
using namespace Outputs::CRT; using namespace Outputs::CRT;
namespace { namespace {
@ -382,7 +381,8 @@ char *OpenGLOutputBuilder::get_input_fragment_shader()
// TODO: synthesise an RGB -> (selected colour space) shader // TODO: synthesise an RGB -> (selected colour space) shader
} }
return get_compound_shader( char *result;
asprintf(&result,
"#version 150\n" "#version 150\n"
"in vec2 inputPositionVarying;" "in vec2 inputPositionVarying;"
@ -401,19 +401,21 @@ char *OpenGLOutputBuilder::get_input_fragment_shader()
"fragColour = vec4(rgb_sample(texID, inputPositionVarying, iInputPositionVarying) * alphaVarying, 1.0);" // composite "fragColour = vec4(rgb_sample(texID, inputPositionVarying, iInputPositionVarying) * alphaVarying, 1.0);" // composite
"}" "}"
, composite_shader); , composite_shader);
return result;
} }
#pragma mark - Intermediate vertex shaders (i.e. from intermediate line layout to intermediate line layout) #pragma mark - Intermediate vertex shaders (i.e. from intermediate line layout to intermediate line layout)
#pragma mark - Output vertex shader #pragma mark - Output vertex shader
char *OpenGLOutputBuilder::get_output_vertex_shader() char *OpenGLOutputBuilder::get_output_vertex_shader(const char *header)
{ {
// the main job of the vertex shader is just to map from an input area of [0,1]x[0,1], with the origin in the // the main job of the vertex shader is just to map from an input area of [0,1]x[0,1], with the origin in the
// top left to OpenGL's [-1,1]x[-1,1] with the origin in the lower left, and to convert input data coordinates // top left to OpenGL's [-1,1]x[-1,1] with the origin in the lower left, and to convert input data coordinates
// from integral to floating point. // from integral to floating point.
return strdup( char *result;
asprintf(&result,
"#version 150\n" "#version 150\n"
"in vec2 position;" "in vec2 position;"
@ -433,7 +435,7 @@ char *OpenGLOutputBuilder::get_output_vertex_shader()
"uniform vec2 positionConversion;" "uniform vec2 positionConversion;"
"uniform vec2 scanNormal;" "uniform vec2 scanNormal;"
"uniform sampler2D texID;" "\n%s\n"
// "uniform sampler2D shadowMaskTexID;" // "uniform sampler2D shadowMaskTexID;"
// "const float shadowMaskMultiple = 600;" // "const float shadowMaskMultiple = 600;"
@ -456,7 +458,18 @@ char *OpenGLOutputBuilder::get_output_vertex_shader()
"vec2 floatingPosition = (position / positionConversion) + lateralAndTimestampBaseOffset.x * scanNormal;" "vec2 floatingPosition = (position / positionConversion) + lateralAndTimestampBaseOffset.x * scanNormal;"
"vec2 mappedPosition = (floatingPosition - boundsOrigin) / boundsSize;" "vec2 mappedPosition = (floatingPosition - boundsOrigin) / boundsSize;"
"gl_Position = vec4(mappedPosition.x * 2.0 - 1.0, 1.0 - mappedPosition.y * 2.0, 0.0, 1.0);" "gl_Position = vec4(mappedPosition.x * 2.0 - 1.0, 1.0 - mappedPosition.y * 2.0, 0.0, 1.0);"
"}"); "}", header);
return result;
}
char *OpenGLOutputBuilder::get_rgb_output_vertex_shader()
{
return get_output_vertex_shader("uniform usampler2D texID;");
}
char *OpenGLOutputBuilder::get_composite_output_vertex_shader()
{
return get_output_vertex_shader("uniform sampler2D texID;");
} }
#pragma mark - Output fragment shaders; RGB and from composite #pragma mark - Output fragment shaders; RGB and from composite
@ -473,7 +486,8 @@ char *OpenGLOutputBuilder::get_composite_output_fragment_shader()
char *OpenGLOutputBuilder::get_output_fragment_shader(const char *sampling_function, const char *header, const char *fragColour_function) char *OpenGLOutputBuilder::get_output_fragment_shader(const char *sampling_function, const char *header, const char *fragColour_function)
{ {
char *complete_header = get_compound_shader( char *result;
asprintf(&result,
"#version 150\n" "#version 150\n"
"in float lateralVarying;" "in float lateralVarying;"
@ -485,37 +499,17 @@ char *OpenGLOutputBuilder::get_output_fragment_shader(const char *sampling_funct
"out vec4 fragColour;" "out vec4 fragColour;"
// "uniform sampler2D shadowMaskTexID;", // "uniform sampler2D shadowMaskTexID;",
"%s\n%%s\n", "%s\n"
header); "%s\n"
char *complete_body = get_compound_shader(
"%%s\n"
"void main(void)" "void main(void)"
"{" "{"
"fragColour = vec4(%s, clamp(alpha, 0.0, 1.0)*sin(lateralVarying));" "fragColour = vec4(%s, clamp(alpha, 0.0, 1.0)*sin(lateralVarying));"
"}", "}",
fragColour_function); header, sampling_function, fragColour_function);
char *top = get_compound_shader(complete_header, sampling_function);
free(complete_header);
char *result = get_compound_shader(complete_body, top);
free(complete_body);
return result; return result;
} }
#pragma mark - Shader utilities
char *OpenGLOutputBuilder::get_compound_shader(const char *base, const char *insert)
{
if(!base || !insert) return nullptr;
size_t totalLength = strlen(base) + strlen(insert) + 1;
char *text = (char *)malloc(totalLength);
snprintf(text, totalLength, base, insert);
return text;
}
#pragma mark - Program compilation #pragma mark - Program compilation
void OpenGLOutputBuilder::prepare_composite_input_shader() void OpenGLOutputBuilder::prepare_composite_input_shader()
@ -604,9 +598,8 @@ void OpenGLOutputBuilder::prepare_source_vertex_array()
free(fragment_shader); free(fragment_shader);
}*/ }*/
std::unique_ptr<OpenGL::Shader> OpenGLOutputBuilder::prepare_output_shader(char *fragment_shader) std::unique_ptr<OpenGL::Shader> OpenGLOutputBuilder::prepare_output_shader(char *vertex_shader, char *fragment_shader)
{ {
char *vertex_shader = get_output_vertex_shader();
std::unique_ptr<OpenGL::Shader> shader_program; std::unique_ptr<OpenGL::Shader> shader_program;
if(vertex_shader && fragment_shader) if(vertex_shader && fragment_shader)
@ -652,12 +645,12 @@ std::unique_ptr<OpenGL::Shader> OpenGLOutputBuilder::prepare_output_shader(char
void OpenGLOutputBuilder::prepare_rgb_output_shader() void OpenGLOutputBuilder::prepare_rgb_output_shader()
{ {
rgb_shader_program = prepare_output_shader(get_rgb_output_fragment_shader()); rgb_shader_program = prepare_output_shader(get_rgb_output_vertex_shader(), get_rgb_output_fragment_shader());
} }
void OpenGLOutputBuilder::prepare_composite_output_shader() void OpenGLOutputBuilder::prepare_composite_output_shader()
{ {
composite_output_shader_program = prepare_output_shader(get_composite_output_fragment_shader()); composite_output_shader_program = prepare_output_shader(get_composite_output_vertex_shader(), get_composite_output_fragment_shader());
} }
void OpenGLOutputBuilder::prepare_output_vertex_array() void OpenGLOutputBuilder::prepare_output_vertex_array()

View File

@ -47,7 +47,7 @@ class OpenGLOutputBuilder {
// Methods used by the OpenGL code // Methods used by the OpenGL code
void prepare_rgb_output_shader(); void prepare_rgb_output_shader();
void prepare_composite_output_shader(); void prepare_composite_output_shader();
std::unique_ptr<OpenGL::Shader> prepare_output_shader(char *fragment_shader); std::unique_ptr<OpenGL::Shader> prepare_output_shader(char *vertex_shader, char *fragment_shader);
void prepare_composite_input_shader(); void prepare_composite_input_shader();
void prepare_output_vertex_array(); void prepare_output_vertex_array();
void prepare_source_vertex_array(); void prepare_source_vertex_array();
@ -63,7 +63,9 @@ class OpenGLOutputBuilder {
std::unique_ptr<CRTRunBuilder> _composite_src_runs; std::unique_ptr<CRTRunBuilder> _composite_src_runs;
uint16_t _composite_src_output_y; uint16_t _composite_src_output_y;
char *get_output_vertex_shader(); char *get_output_vertex_shader(const char *header);
char *get_rgb_output_vertex_shader();
char *get_composite_output_vertex_shader();
char *get_output_fragment_shader(const char *sampling_function, const char *header, const char *fragColour_function); char *get_output_fragment_shader(const char *sampling_function, const char *header, const char *fragColour_function);
char *get_rgb_output_fragment_shader(); char *get_rgb_output_fragment_shader();
@ -72,8 +74,6 @@ class OpenGLOutputBuilder {
char *get_input_vertex_shader(); char *get_input_vertex_shader();
char *get_input_fragment_shader(); char *get_input_fragment_shader();
char *get_compound_shader(const char *base, const char *insert);
std::unique_ptr<OpenGL::Shader> rgb_shader_program; std::unique_ptr<OpenGL::Shader> rgb_shader_program;
std::unique_ptr<OpenGL::Shader> composite_input_shader_program, composite_output_shader_program; std::unique_ptr<OpenGL::Shader> composite_input_shader_program, composite_output_shader_program;