diff --git a/src/Cafe/CMakeLists.txt b/src/Cafe/CMakeLists.txt index 5de8a085..0df1e847 100644 --- a/src/Cafe/CMakeLists.txt +++ b/src/Cafe/CMakeLists.txt @@ -494,10 +494,8 @@ add_library(CemuCafe if (ENABLE_OPENGL) target_sources(CemuCafe PRIVATE - HW/Latte/Core/LatteDefaultShaders.cpp - HW/Latte/Core/LatteDefaultShaders.h - HW/Latte/Core/LatteShaderGL.cpp HW/Latte/Renderer/OpenGL/CachedFBOGL.h + HW/Latte/Renderer/OpenGL/LatteShaderGL.cpp HW/Latte/Renderer/OpenGL/LatteTextureGL.cpp HW/Latte/Renderer/OpenGL/LatteTextureGL.h HW/Latte/Renderer/OpenGL/LatteTextureViewGL.cpp diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp deleted file mode 100644 index 7c590dbb..00000000 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" -#include "Cafe/HW/Latte/Core/LatteShader.h" -#include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" -#include "util/helpers/StringBuf.h" - -LatteDefaultShader_t* _copyShader_depthToColor; -LatteDefaultShader_t* _copyShader_colorToDepth; - -void LatteDefaultShader_pixelCopyShader_generateVSBody(StringBuf* vs) -{ - vs->add("#version 420\r\n"); - vs->add("out vec2 passUV;\r\n"); - vs->add("uniform vec4 uf_vertexOffsets[4];\r\n"); - vs->add("\r\n"); - vs->add("void main(){\r\n"); - vs->add("int vID = gl_VertexID;\r\n"); - vs->add("passUV = uf_vertexOffsets[vID].zw;\r\n"); - vs->add("gl_Position = vec4(uf_vertexOffsets[vID].xy, 0.0, 1.0);\r\n"); - vs->add("}\r\n"); -} - -GLuint gxShaderDepr_compileRaw(StringBuf* strSourceVS, StringBuf* strSourceFS); -GLuint gxShaderDepr_compileRaw(const std::string& vertex_source, const std::string& fragment_source); - -LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor() -{ - if (_copyShader_depthToColor != 0) - return _copyShader_depthToColor; - catchOpenGLError(); - LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); - memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); - - StringBuf fCStr_vertexShader(1024 * 16); - LatteDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); - - StringBuf fCStr_defaultFragShader(1024 * 16); - fCStr_defaultFragShader.add("#version 420\r\n"); - fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); - fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); - fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); - fCStr_defaultFragShader.add("\r\n"); - fCStr_defaultFragShader.add("void main(){\r\n"); - fCStr_defaultFragShader.add("colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0);\r\n"); - fCStr_defaultFragShader.add("}\r\n"); - - defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); - catchOpenGLError(); - - defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); - defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); - - _copyShader_depthToColor = defaultShader; - catchOpenGLError(); - return defaultShader; -} - -LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_colorToDepth() -{ - if (_copyShader_colorToDepth != 0) - return _copyShader_colorToDepth; - catchOpenGLError(); - LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); - memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); - - StringBuf fCStr_vertexShader(1024 * 16); - LatteDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); - - StringBuf fCStr_defaultFragShader(1024 * 16); - fCStr_defaultFragShader.add("#version 420\r\n"); - fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); - fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); - fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); - fCStr_defaultFragShader.add("\r\n"); - fCStr_defaultFragShader.add("void main(){\r\n"); - fCStr_defaultFragShader.add("gl_FragDepth = texture(textureSrc, passUV).r;\r\n"); - fCStr_defaultFragShader.add("}\r\n"); - - - defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); - defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); - defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); - - _copyShader_colorToDepth = defaultShader; - catchOpenGLError(); - return defaultShader; -} \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h deleted file mode 100644 index 3776a3d2..00000000 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h +++ /dev/null @@ -1,13 +0,0 @@ - -typedef struct -{ - GLuint glProgamId; - struct - { - GLuint uniformLoc_textureSrc; - GLuint uniformLoc_vertexOffsets; - }copyShaderUniforms; -}LatteDefaultShader_t; - -LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor(); -LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_colorToDepth(); \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp b/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp index 45be6843..5e61e8df 100644 --- a/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp @@ -1,7 +1,6 @@ #include "Cafe/HW/Latte/Core/Latte.h" #include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" -#include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" #include "Cafe/HW/Latte/Core/LatteTexture.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/LatteShaderGL.cpp similarity index 100% rename from src/Cafe/HW/Latte/Core/LatteShaderGL.cpp rename to src/Cafe/HW/Latte/Renderer/OpenGL/LatteShaderGL.cpp diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp index d578b842..de1e1222 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp @@ -1,6 +1,7 @@ #include "Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h" #include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" #include "Cafe/HW/Latte/Renderer/OpenGL/CachedFBOGL.h" +#include "Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.h" #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureGL.h" #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h" @@ -8,7 +9,7 @@ #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteDraw.h" -#include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" +#include "util/helpers/StringBuf.h" void LatteDraw_resetAttributePointerCache(); @@ -66,9 +67,9 @@ void OpenGLRenderer::surfaceCopy_copySurfaceWithFormatConversion(LatteTexture* s if (destinationTexture->isDepth) renderstate_setAlwaysWriteDepth(); // bind format specific copy shader - LatteDefaultShader_t* copyShader = LatteDefaultShader_getPixelCopyShader_depthToColor(); + LatteGLDefaultShader_t* copyShader = LatteGLDefaultShader_getPixelCopyShader_depthToColor(); if (destinationTexture->isDepth) - copyShader = LatteDefaultShader_getPixelCopyShader_colorToDepth(); + copyShader = LatteGLDefaultShader_getPixelCopyShader_colorToDepth(); glUseProgram(copyShader->glProgamId); catchOpenGLError(); // setup uniforms @@ -113,4 +114,86 @@ void OpenGLRenderer::surfaceCopy_copySurfaceWithFormatConversion(LatteTexture* s LatteGPUState.repeatTextureInitialization = true; glUseProgram(0); +} + +LatteGLDefaultShader_t* _copyShader_depthToColor; +LatteGLDefaultShader_t* _copyShader_colorToDepth; + +void LatteGLDefaultShader_pixelCopyShader_generateVSBody(StringBuf* vs) +{ + vs->add("#version 420\r\n"); + vs->add("out vec2 passUV;\r\n"); + vs->add("uniform vec4 uf_vertexOffsets[4];\r\n"); + vs->add("\r\n"); + vs->add("void main(){\r\n"); + vs->add("int vID = gl_VertexID;\r\n"); + vs->add("passUV = uf_vertexOffsets[vID].zw;\r\n"); + vs->add("gl_Position = vec4(uf_vertexOffsets[vID].xy, 0.0, 1.0);\r\n"); + vs->add("}\r\n"); +} + +GLuint gxShaderDepr_compileRaw(StringBuf* strSourceVS, StringBuf* strSourceFS); +GLuint gxShaderDepr_compileRaw(const std::string& vertex_source, const std::string& fragment_source); + +LatteGLDefaultShader_t* LatteGLDefaultShader_getPixelCopyShader_depthToColor() +{ + if (_copyShader_depthToColor != 0) + return _copyShader_depthToColor; + catchOpenGLError(); + LatteGLDefaultShader_t* defaultShader = (LatteGLDefaultShader_t*)malloc(sizeof(LatteGLDefaultShader_t)); + memset(defaultShader, 0, sizeof(LatteGLDefaultShader_t)); + + StringBuf fCStr_vertexShader(1024 * 16); + LatteGLDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); + + StringBuf fCStr_defaultFragShader(1024 * 16); + fCStr_defaultFragShader.add("#version 420\r\n"); + fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); + fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); + fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); + fCStr_defaultFragShader.add("\r\n"); + fCStr_defaultFragShader.add("void main(){\r\n"); + fCStr_defaultFragShader.add("colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0);\r\n"); + fCStr_defaultFragShader.add("}\r\n"); + + defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); + catchOpenGLError(); + + defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); + defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); + + _copyShader_depthToColor = defaultShader; + catchOpenGLError(); + return defaultShader; +} + +LatteGLDefaultShader_t* LatteGLDefaultShader_getPixelCopyShader_colorToDepth() +{ + if (_copyShader_colorToDepth != 0) + return _copyShader_colorToDepth; + catchOpenGLError(); + LatteGLDefaultShader_t* defaultShader = (LatteGLDefaultShader_t*)malloc(sizeof(LatteGLDefaultShader_t)); + memset(defaultShader, 0, sizeof(LatteGLDefaultShader_t)); + + StringBuf fCStr_vertexShader(1024 * 16); + LatteGLDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); + + StringBuf fCStr_defaultFragShader(1024 * 16); + fCStr_defaultFragShader.add("#version 420\r\n"); + fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); + fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); + fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); + fCStr_defaultFragShader.add("\r\n"); + fCStr_defaultFragShader.add("void main(){\r\n"); + fCStr_defaultFragShader.add("gl_FragDepth = texture(textureSrc, passUV).r;\r\n"); + fCStr_defaultFragShader.add("}\r\n"); + + + defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); + defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); + defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); + + _copyShader_colorToDepth = defaultShader; + catchOpenGLError(); + return defaultShader; } \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.h b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.h new file mode 100644 index 00000000..3c6e4c25 --- /dev/null +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.h @@ -0,0 +1,14 @@ +#pragma once + +typedef struct +{ + GLuint glProgamId; + struct + { + GLuint uniformLoc_textureSrc; + GLuint uniformLoc_vertexOffsets; + }copyShaderUniforms; +}LatteGLDefaultShader_t; + +LatteGLDefaultShader_t* LatteGLDefaultShader_getPixelCopyShader_depthToColor(); +LatteGLDefaultShader_t* LatteGLDefaultShader_getPixelCopyShader_colorToDepth(); \ No newline at end of file