mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-27 16:31:31 +00:00
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.
This commit is contained in:
parent
86626bbd72
commit
d5bac2f04f
@ -31,7 +31,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</window>
|
</window>
|
||||||
<window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="NSPanel">
|
<window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="NSPanel">
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" HUD="YES"/>
|
||||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||||
<rect key="contentRect" x="83" y="102" width="200" height="83"/>
|
<rect key="contentRect" x="83" y="102" width="200" height="83"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="1366" height="768"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="1366" height="768"/>
|
||||||
|
@ -77,7 +77,6 @@ CRT::CRT(unsigned int cycles_per_line, unsigned int common_output_divisor, unsig
|
|||||||
CRT::CRT(unsigned int cycles_per_line, unsigned int common_output_divisor, DisplayType displayType, unsigned int buffer_depth) : CRT(common_output_divisor)
|
CRT::CRT(unsigned int cycles_per_line, unsigned int common_output_divisor, DisplayType displayType, unsigned int buffer_depth) : CRT(common_output_divisor)
|
||||||
{
|
{
|
||||||
_openGL_output_builder = std::unique_ptr<OpenGLOutputBuilder>(new OpenGLOutputBuilder(buffer_depth));
|
_openGL_output_builder = std::unique_ptr<OpenGLOutputBuilder>(new OpenGLOutputBuilder(buffer_depth));
|
||||||
|
|
||||||
set_new_display_type(cycles_per_line, displayType);
|
set_new_display_type(cycles_per_line, displayType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,6 +237,9 @@ void CRT::advance_cycles(unsigned int number_of_cycles, unsigned int source_divi
|
|||||||
output_lateral(2) = 1;
|
output_lateral(2) = 1;
|
||||||
output_frame_id(0) = output_frame_id(1) = output_frame_id(2) = (uint8_t)_openGL_output_builder->get_current_field();
|
output_frame_id(0) = output_frame_id(1) = output_frame_id(2) = (uint8_t)_openGL_output_builder->get_current_field();
|
||||||
|
|
||||||
|
// printf("%d", _horizontal_flywheel->get_current_output_position());
|
||||||
|
// if(_is_writing_composite_run) printf("\n"); else printf(" -> ");
|
||||||
|
|
||||||
_openGL_output_builder->complete_output_run(3);
|
_openGL_output_builder->complete_output_run(3);
|
||||||
_is_writing_composite_run ^= true;
|
_is_writing_composite_run ^= true;
|
||||||
}
|
}
|
||||||
|
@ -176,6 +176,8 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
|||||||
|
|
||||||
// upload more source pixel data if any; we'll always resubmit the last line submitted last
|
// upload more source pixel data if any; we'll always resubmit the last line submitted last
|
||||||
// time as it may have had extra data appended to it
|
// time as it may have had extra data appended to it
|
||||||
|
glActiveTexture(GL_TEXTURE0 + first_supplied_buffer_texture_unit);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textureName);
|
||||||
if(_buffer_builder->_next_write_y_position < _buffer_builder->last_uploaded_line)
|
if(_buffer_builder->_next_write_y_position < _buffer_builder->last_uploaded_line)
|
||||||
{
|
{
|
||||||
glTexSubImage2D( GL_TEXTURE_2D, 0,
|
glTexSubImage2D( GL_TEXTURE_2D, 0,
|
||||||
@ -201,8 +203,7 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
|||||||
{
|
{
|
||||||
composite_input_shader_program->bind();
|
composite_input_shader_program->bind();
|
||||||
|
|
||||||
// compositeTexture->bind_framebuffer();
|
compositeTexture->bind_framebuffer();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
|
|
||||||
glBindVertexArray(source_vertex_array);
|
glBindVertexArray(source_vertex_array);
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
@ -230,7 +231,9 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
|||||||
}
|
}
|
||||||
|
|
||||||
// transfer to screen
|
// transfer to screen
|
||||||
// perform_output_stage(output_width, output_height, rgb_shader_program.get());
|
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
|
||||||
|
compositeTexture->bind_texture();
|
||||||
|
perform_output_stage(output_width, output_height, rgb_shader_program.get());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
perform_output_stage(output_width, output_height, rgb_shader_program.get());
|
perform_output_stage(output_width, output_height, rgb_shader_program.get());
|
||||||
@ -244,6 +247,7 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,16 +255,18 @@ void OpenGLOutputBuilder::perform_output_stage(unsigned int output_width, unsign
|
|||||||
{
|
{
|
||||||
if(shader)
|
if(shader)
|
||||||
{
|
{
|
||||||
shader->bind();
|
// definitively establish the viewport
|
||||||
|
|
||||||
// update uniforms
|
|
||||||
push_size_uniforms(output_width, output_height);
|
|
||||||
glViewport(0, 0, (GLsizei)output_width, (GLsizei)output_height);
|
glViewport(0, 0, (GLsizei)output_width, (GLsizei)output_height);
|
||||||
|
|
||||||
// Ensure we're back on the output framebuffer, drawing from the output array buffer
|
// Ensure we're back on the output framebuffer, drawing from the output array buffer
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
|
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
|
||||||
glBindVertexArray(output_vertex_array);
|
glBindVertexArray(output_vertex_array);
|
||||||
|
|
||||||
|
shader->bind();
|
||||||
|
|
||||||
|
// update uniforms
|
||||||
|
push_size_uniforms(output_width, output_height);
|
||||||
|
|
||||||
// clear the buffer
|
// clear the buffer
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
@ -426,7 +432,7 @@ char *OpenGLOutputBuilder::get_output_vertex_shader()
|
|||||||
"uniform vec2 positionConversion;"
|
"uniform vec2 positionConversion;"
|
||||||
"uniform vec2 scanNormal;"
|
"uniform vec2 scanNormal;"
|
||||||
|
|
||||||
"uniform usampler2D texID;"
|
"uniform sampler2D texID;"
|
||||||
// "uniform sampler2D shadowMaskTexID;"
|
// "uniform sampler2D shadowMaskTexID;"
|
||||||
|
|
||||||
// "const float shadowMaskMultiple = 600;"
|
// "const float shadowMaskMultiple = 600;"
|
||||||
@ -492,14 +498,18 @@ char *OpenGLOutputBuilder::get_output_fragment_shader(const char *sampling_funct
|
|||||||
|
|
||||||
"out vec4 fragColour;"
|
"out vec4 fragColour;"
|
||||||
|
|
||||||
"uniform usampler2D texID;"
|
// "uniform usampler2D texID;"
|
||||||
|
"uniform sampler2D texID;"
|
||||||
// "uniform sampler2D shadowMaskTexID;"
|
// "uniform sampler2D shadowMaskTexID;"
|
||||||
|
|
||||||
"\n%s\n"
|
"\n%s\n"
|
||||||
|
|
||||||
"void main(void)"
|
"void main(void)"
|
||||||
"{"
|
"{"
|
||||||
"fragColour = vec4(rgb_sample(texID, srcCoordinatesVarying, iSrcCoordinatesVarying), clamp(alpha, 0.0, 1.0)*sin(lateralVarying));" //
|
// "fragColour = vec4(srcCoordinatesVarying.rg, 0.0, 1.0);" //
|
||||||
|
"fragColour = texture(texID, srcCoordinatesVarying).rgba;" //
|
||||||
|
// "fragColour = vec4(srcCoordinatesVarying.y / 4.0, 0.0, 0.0, 1.0);"//texture(texID, srcCoordinatesVarying).rgba;" //
|
||||||
|
// "fragColour = vec4(rgb_sample(texID, srcCoordinatesVarying, iSrcCoordinatesVarying), clamp(alpha, 0.0, 1.0)*sin(lateralVarying));" //
|
||||||
"}"
|
"}"
|
||||||
, sampling_function);
|
, sampling_function);
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,22 @@ 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);
|
||||||
glLinkProgram(_shader_program);
|
glLinkProgram(_shader_program);
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
GLint didLink = 0;
|
||||||
|
glGetProgramiv(_shader_program, GL_LINK_STATUS, &didLink);
|
||||||
|
if(didLink == GL_FALSE)
|
||||||
|
{
|
||||||
|
GLint logLength;
|
||||||
|
glGetProgramiv(_shader_program, GL_INFO_LOG_LENGTH, &logLength);
|
||||||
|
if (logLength > 0) {
|
||||||
|
GLchar *log = (GLchar *)malloc((size_t)logLength);
|
||||||
|
glGetProgramInfoLog(_shader_program, logLength, &logLength, log);
|
||||||
|
printf("Link log:\n%s\n", log);
|
||||||
|
free(log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::~Shader()
|
Shader::~Shader()
|
||||||
|
@ -17,10 +17,9 @@ TextureTarget::TextureTarget(GLsizei width, GLsizei height) : _width(width), _he
|
|||||||
|
|
||||||
glGenTextures(1, &_texture);
|
glGenTextures(1, &_texture);
|
||||||
glBindTexture(GL_TEXTURE_2D, _texture);
|
glBindTexture(GL_TEXTURE_2D, _texture);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
uint8_t *emptySpace = new uint8_t[width*height*3];
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)width, (GLsizei)height, 0, GL_RGB, GL_UNSIGNED_BYTE, emptySpace);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
delete[] emptySpace;
|
|
||||||
|
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user