diff --git a/AerofoilSDL/AerofoilSDL.vcxproj b/AerofoilSDL/AerofoilSDL.vcxproj index afee054..38f189d 100644 --- a/AerofoilSDL/AerofoilSDL.vcxproj +++ b/AerofoilSDL/AerofoilSDL.vcxproj @@ -96,6 +96,7 @@ + diff --git a/AerofoilSDL/AerofoilSDL.vcxproj.filters b/AerofoilSDL/AerofoilSDL.vcxproj.filters index 9947e3d..7fde39b 100644 --- a/AerofoilSDL/AerofoilSDL.vcxproj.filters +++ b/AerofoilSDL/AerofoilSDL.vcxproj.filters @@ -63,6 +63,9 @@ Source Files + + Source Files\ShaderCode + diff --git a/AerofoilSDL/Android.mk b/AerofoilSDL/Android.mk index e0e53d7..e9f4211 100644 --- a/AerofoilSDL/Android.mk +++ b/AerofoilSDL/Android.mk @@ -21,6 +21,7 @@ LOCAL_SRC_FILES := \ GpDisplayDriver_SDL_GL2.cpp \ GpFiber_SDL.cpp \ GpFiberStarter_SDL.cpp \ + ShaderCode/CopyQuadP.cpp \ ShaderCode/DrawQuadPaletteP.cpp \ ShaderCode/DrawQuadV.cpp \ ShaderCode/ScaleQuadP.cpp diff --git a/AerofoilSDL/GpDisplayDriver_SDL_GL2.cpp b/AerofoilSDL/GpDisplayDriver_SDL_GL2.cpp index fbd4dd3..f4ae7b4 100644 --- a/AerofoilSDL/GpDisplayDriver_SDL_GL2.cpp +++ b/AerofoilSDL/GpDisplayDriver_SDL_GL2.cpp @@ -4,8 +4,6 @@ #include "GpComPtr.h" #include "GpFiber_SDL.h" #include "GpDisplayDriverProperties.h" -//#include "GpSystemServices_Win32.h" -//#include "GpWindows.h" // TODO: Remove #include "GpVOSEvent.h" #include "GpRingBuffer.h" #include "HostSystemServices.h" @@ -121,6 +119,7 @@ namespace GpBinarizedShaders extern const char *g_drawQuad15BitICCPF_GL2; extern const char *g_drawQuad15BitICCPNF_GL2; + extern const char *g_copyQuadP_GL2; extern const char *g_scaleQuadP_GL2; } @@ -797,7 +796,7 @@ private: bool Link(GpDisplayDriver_SDL_GL2 *driver, const GpGLShader *vertexShader, const GpGLShader *pixelShader); }; - struct ScaleQuadProgram + struct BlitQuadProgram { GpComPtr m_program; GLint m_vertexNDCOriginAndDimensionsLocation; @@ -810,7 +809,8 @@ private: bool Link(GpDisplayDriver_SDL_GL2 *driver, const GpGLShader *vertexShader, const GpGLShader *pixelShader); }; - ScaleQuadProgram m_scaleQuadProgram; + BlitQuadProgram m_scaleQuadProgram; + BlitQuadProgram m_copyQuadProgram; DrawQuadProgram m_drawQuadPaletteNoFlickerProgram; DrawQuadProgram m_drawQuadPaletteFlickerProgram; @@ -994,11 +994,11 @@ bool GpDisplayDriverSurface_GL2::Init() { m_gl->BindTexture(GL_TEXTURE_2D, m_texture->GetID()); m_gl->PixelStorei(GL_UNPACK_ALIGNMENT, 1); + m_gl->TexImage2D(GL_TEXTURE_2D, 0, ResolveGLInternalFormat(), m_paddedTextureWidth, m_height, 0, ResolveGLFormat(), ResolveGLType(), nullptr); m_gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); m_gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); m_gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); m_gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - m_gl->TexImage2D(GL_TEXTURE_2D, 0, ResolveGLInternalFormat(), m_paddedTextureWidth, m_height, 0, ResolveGLFormat(), ResolveGLType(), nullptr); m_gl->BindTexture(GL_TEXTURE_2D, 0); return true; @@ -2219,6 +2219,7 @@ bool GpDisplayDriver_SDL_GL2::InitResources(uint32_t virtualWidth, uint32_t virt //m_drawQuadRGBICCPixelShader = CreateShader(GpBinarizedShaders::g_drawQuadRGBICCP_GL2); //m_drawQuad15BitICCPixelShader = CreateShader(GpBinarizedShaders::g_drawQuad15BitICCP_GL2); GpComPtr> scaleQuadPixelShader = CreateShader(GpBinarizedShaders::g_scaleQuadP_GL2); + GpComPtr> copyQuadPixelShader = CreateShader(GpBinarizedShaders::g_copyQuadP_GL2); if (!m_drawQuadPaletteFlickerProgram.Link(this, drawQuadVertexShader, drawQuadPaletteFlickerPixelShader) || !m_drawQuadPaletteNoFlickerProgram.Link(this, drawQuadVertexShader, drawQuadPaletteFlickerPixelShader) @@ -2228,7 +2229,8 @@ bool GpDisplayDriver_SDL_GL2::InitResources(uint32_t virtualWidth, uint32_t virt || !m_drawQuadPaletteICCNoFlickerProgram.Link(this, drawQuadVertexShader, drawQuadPaletteICCNFPixelShader) //|| !m_drawQuadRGBICCProgram.Link(this, drawQuadVertexShader, drawQuadRGBICCPixelShader) //|| !m_drawQuad15BitICCProgram.Link(this, drawQuadVertexShader, drawQuad15BitICCPixelShader) - || !m_scaleQuadProgram.Link(this, drawQuadVertexShader, scaleQuadPixelShader)) + || !m_scaleQuadProgram.Link(this, drawQuadVertexShader, scaleQuadPixelShader) + || !m_copyQuadProgram.Link(this, drawQuadVertexShader, copyQuadPixelShader)) return false; @@ -2253,11 +2255,11 @@ bool GpDisplayDriver_SDL_GL2::InitResources(uint32_t virtualWidth, uint32_t virt m_gl.BindTexture(GL_TEXTURE_2D, m_paletteTexture->GetID()); m_gl.PixelStorei(GL_UNPACK_ALIGNMENT, 1); + m_gl.TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, initialDataBytes); m_gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); m_gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); m_gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); m_gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - m_gl.TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, initialDataBytes); m_gl.BindTexture(GL_TEXTURE_2D, 0); } @@ -2456,6 +2458,10 @@ void GpDisplayDriver_SDL_GL2::ScaleVirtualScreen() m_gl.Viewport(0, 0, m_windowWidthPhysical, m_windowHeightPhysical); + const bool isIntegralScale = (m_pixelScaleX == floor(m_pixelScaleX) && m_pixelScaleY == floor(m_pixelScaleY)); + + const BlitQuadProgram &program = isIntegralScale ? m_copyQuadProgram : m_scaleQuadProgram; + { const float twoDivWidth = 2.0f / static_cast(m_windowWidthPhysical); const float twoDivHeight = 2.0f / static_cast(m_windowHeightPhysical); @@ -2466,8 +2472,8 @@ void GpDisplayDriver_SDL_GL2::ScaleVirtualScreen() float ndcOriginsAndDimensions[4] = { - twoDivWidth - 1.0f, - twoDivHeight - 1.0f, + -1.0f, + -1.0f, fWidth * twoDivWidth, fHeight * twoDivHeight }; @@ -2480,9 +2486,9 @@ void GpDisplayDriver_SDL_GL2::ScaleVirtualScreen() 1.f }; - m_gl.UseProgram(m_scaleQuadProgram.m_program->GetID()); - m_gl.Uniform4fv(m_scaleQuadProgram.m_vertexNDCOriginAndDimensionsLocation, 1, reinterpret_cast(ndcOriginsAndDimensions)); - m_gl.Uniform4fv(m_scaleQuadProgram.m_vertexSurfaceDimensionsLocation, 1, reinterpret_cast(surfaceDimensions_TextureRegion)); + m_gl.UseProgram(program.m_program->GetID()); + m_gl.Uniform4fv(program.m_vertexNDCOriginAndDimensionsLocation, 1, reinterpret_cast(ndcOriginsAndDimensions)); + m_gl.Uniform4fv(program.m_vertexSurfaceDimensionsLocation, 1, reinterpret_cast(surfaceDimensions_TextureRegion)); float dxdy_dimensions[4] = { @@ -2492,10 +2498,10 @@ void GpDisplayDriver_SDL_GL2::ScaleVirtualScreen() static_cast(m_windowHeightVirtual) }; - m_gl.Uniform4fv(m_scaleQuadProgram.m_pixelDXDYDimensionsLocation, 1, reinterpret_cast(dxdy_dimensions)); + m_gl.Uniform4fv(program.m_pixelDXDYDimensionsLocation, 1, reinterpret_cast(dxdy_dimensions)); } - GLint attribLocations[] = { m_scaleQuadProgram.m_vertexPosUVLocation }; + GLint attribLocations[] = { program.m_vertexPosUVLocation }; m_quadVertexArray->Activate(attribLocations); @@ -2561,7 +2567,7 @@ bool GpDisplayDriver_SDL_GL2::DrawQuadProgram::Link(GpDisplayDriver_SDL_GL2 *dri return true; } -bool GpDisplayDriver_SDL_GL2::ScaleQuadProgram::Link(GpDisplayDriver_SDL_GL2 *driver, const GpGLShader *vertexShader, const GpGLShader *pixelShader) +bool GpDisplayDriver_SDL_GL2::BlitQuadProgram::Link(GpDisplayDriver_SDL_GL2 *driver, const GpGLShader *vertexShader, const GpGLShader *pixelShader) { m_program = GpGLProgram::Create(driver); if (!m_program) diff --git a/AerofoilSDL/ShaderCode/CopyQuadP.cpp b/AerofoilSDL/ShaderCode/CopyQuadP.cpp new file mode 100644 index 0000000..5b50205 --- /dev/null +++ b/AerofoilSDL/ShaderCode/CopyQuadP.cpp @@ -0,0 +1,21 @@ +#include "Functions.h" + +#define GP_GL_SHADER_CODE_COPYQUADP_GLSL "uniform sampler2D surfaceTexture;\n"\ +"varying vec4 texCoord;\n"\ +"\n"\ +"uniform vec4 dxdy_dimensions;\n"\ +"\n"\ +"vec3 SamplePixel(vec2 coord)\n"\ +"{\n"\ +" return texture2D(surfaceTexture, (coord + vec2(0.5, 0.5)) / dxdy_dimensions.zw).rgb;\n"\ +"}\n"\ +"\n"\ +"void main()\n"\ +"{\n"\ +" gl_FragColor = vec4(LinearToSRGB(texture2D(surfaceTexture, texCoord.xy).rgb), 1.0);\n"\ +"}\n" + +namespace GpBinarizedShaders +{ + const char *g_copyQuadP_GL2 = GP_GL_SHADER_CODE_PRECISION_PREFIX GP_GL_SHADER_CODE_FUNCTIONS_H GP_GL_SHADER_CODE_COPYQUADP_GLSL; +}