From 6670cacddcc6aacc17181409457c575c6539cace Mon Sep 17 00:00:00 2001 From: degasus Date: Fri, 10 Oct 2014 00:06:29 +0200 Subject: use GL_TEXTURE_2D_ARRAY for most of our textures --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 40 ++++++++++++++------------ 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 5f14704cae..9102c3dd09 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -98,14 +98,14 @@ void TextureCache::TCacheEntry::Bind(unsigned int stage) s_ActiveTexture = stage; } - glBindTexture(GL_TEXTURE_2D, texture); + glBindTexture(GL_TEXTURE_2D_ARRAY, texture); s_Textures[stage] = texture; } } bool TextureCache::TCacheEntry::Save(const std::string& filename, unsigned int level) { - return SaveTexture(filename, GL_TEXTURE_2D, texture, virtual_width, virtual_height, level); + return SaveTexture(filename, GL_TEXTURE_2D_ARRAY, texture, virtual_width, virtual_height, level); } TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, @@ -172,8 +172,8 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width, entry.pcfmt = pcfmt; glActiveTexture(GL_TEXTURE0+9); - glBindTexture(GL_TEXTURE_2D, entry.texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex_levels - 1); + glBindTexture(GL_TEXTURE_2D_ARRAY, entry.texture); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, tex_levels - 1); entry.Load(width, height, expanded_width, 0); @@ -189,12 +189,12 @@ void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height, if (pcfmt != PC_TEX_FMT_DXT1) { glActiveTexture(GL_TEXTURE0+9); - glBindTexture(GL_TEXTURE_2D, texture); + glBindTexture(GL_TEXTURE_2D_ARRAY, texture); if (expanded_width != width) glPixelStorei(GL_UNPACK_ROW_LENGTH, expanded_width); - glTexImage2D(GL_TEXTURE_2D, level, gl_iformat, width, height, 0, gl_format, gl_type, temp); + glTexImage3D(GL_TEXTURE_2D_ARRAY, level, gl_iformat, width, height, 1, 0, gl_format, gl_type, temp); if (expanded_width != width) glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); @@ -213,21 +213,23 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture( { TCacheEntry *const entry = new TCacheEntry; glActiveTexture(GL_TEXTURE0+9); - glBindTexture(GL_TEXTURE_2D, entry->texture); + glBindTexture(GL_TEXTURE_2D_ARRAY, entry->texture); const GLenum gl_format = GL_RGBA, gl_iformat = GL_RGBA, gl_type = GL_UNSIGNED_BYTE; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(GL_TEXTURE_2D, 0, gl_iformat, scaled_tex_w, scaled_tex_h, 0, gl_format, gl_type, nullptr); - glBindTexture(GL_TEXTURE_2D, 0); + int layers = 1; + + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, layers, 0, gl_format, gl_type, nullptr); + glBindTexture(GL_TEXTURE_2D_ARRAY, 0); glGenFramebuffers(1, &entry->framebuffer); FramebufferManager::SetFramebuffer(entry->framebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, entry->texture, 0); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, entry->texture, 0); SetStage(); @@ -251,7 +253,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo FramebufferManager::SetFramebuffer(framebuffer); glActiveTexture(GL_TEXTURE0+9); - glBindTexture(GL_TEXTURE_2D, read_texture); + glBindTexture(GL_TEXTURE_2D_ARRAY, read_texture); glViewport(0, 0, virtual_width, virtual_height); @@ -309,7 +311,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo { static int count = 0; SaveTexture(StringFromFormat("%sefb_frame_%i.png", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(), - count++), GL_TEXTURE_2D, texture, virtual_width, virtual_height, 0); + count++), GL_TEXTURE_2D_ARRAY, texture, virtual_width, virtual_height, 0); } g_renderer->RestoreAPIState(); @@ -318,25 +320,25 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo TextureCache::TextureCache() { const char *pColorMatrixProg = - "SAMPLER_BINDING(9) uniform sampler2D samp9;\n" + "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 colmat[7];\n" "in vec2 uv0;\n" "out vec4 ocol0;\n" "\n" "void main(){\n" - " vec4 texcol = texture(samp9, uv0);\n" + " vec4 texcol = texture(samp9, vec3(uv0, 0.0));\n" " texcol = round(texcol * colmat[5]) * colmat[6];\n" " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n" "}\n"; const char *pDepthMatrixProg = - "SAMPLER_BINDING(9) uniform sampler2D samp9;\n" + "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 colmat[5];\n" "in vec2 uv0;\n" "out vec4 ocol0;\n" "\n" "void main(){\n" - " vec4 texcol = texture(samp9, uv0);\n" + " vec4 texcol = texture(samp9, vec3(uv0, 0.0));\n" // 255.99998474121 = 16777215/16777216*256 " float workspace = texcol.x * 255.99998474121;\n" @@ -364,12 +366,12 @@ TextureCache::TextureCache() const char *VProgram = "out vec2 uv0;\n" - "SAMPLER_BINDING(9) uniform sampler2D samp9;\n" + "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 copy_position;\n" // left, top, right, bottom "void main()\n" "{\n" " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" - " uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0));\n" + " uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" "}\n"; -- cgit v1.2.3 From 80616c6e9e8b0c5f622793221a2ad1f8fdc24084 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Mon, 27 Oct 2014 00:52:56 +0100 Subject: TextureCache: Implement layered framebuffer support. Stereoscopic EFB2Tex is now supported. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 40 +++++++++++++++++++------- 1 file changed, 29 insertions(+), 11 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 9102c3dd09..fbf3660ba0 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -222,9 +222,7 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture( glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0); - int layers = 1; - - glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, layers, 0, gl_format, gl_type, nullptr); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, FramebufferManager::GetEFBLayers(), 0, gl_format, gl_type, nullptr); glBindTexture(GL_TEXTURE_2D_ARRAY, 0); glGenFramebuffers(1, &entry->framebuffer); @@ -322,11 +320,11 @@ TextureCache::TextureCache() const char *pColorMatrixProg = "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 colmat[7];\n" - "in vec2 uv0;\n" + "in vec3 f_uv0;\n" "out vec4 ocol0;\n" "\n" "void main(){\n" - " vec4 texcol = texture(samp9, vec3(uv0, 0.0));\n" + " vec4 texcol = texture(samp9, f_uv0);\n" " texcol = round(texcol * colmat[5]) * colmat[6];\n" " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n" "}\n"; @@ -334,11 +332,11 @@ TextureCache::TextureCache() const char *pDepthMatrixProg = "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 colmat[5];\n" - "in vec2 uv0;\n" + "in vec3 f_uv0;\n" "out vec4 ocol0;\n" "\n" "void main(){\n" - " vec4 texcol = texture(samp9, vec3(uv0, 0.0));\n" + " vec4 texcol = texture(samp9, f_uv0);\n" // 255.99998474121 = 16777215/16777216*256 " float workspace = texcol.x * 255.99998474121;\n" @@ -365,18 +363,38 @@ TextureCache::TextureCache() "}\n"; const char *VProgram = - "out vec2 uv0;\n" + "out vec2 v_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 copy_position;\n" // left, top, right, bottom "void main()\n" "{\n" " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" - " uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" + " v_uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" "}\n"; - ProgramShaderCache::CompileShader(s_ColorMatrixProgram, VProgram, pColorMatrixProg); - ProgramShaderCache::CompileShader(s_DepthMatrixProgram, VProgram, pDepthMatrixProg); + const char *GProgram = + "layout(triangles) in;\n" + "layout(triangle_strip, max_vertices = 3) out;\n" + "in vec2 v_uv0[];\n" + "out vec3 f_uv0;\n" + "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" + "void main()\n" + "{\n" + " int layers = textureSize(samp9, 0).z;\n" + " for (int layer = 0; layer < layers; ++layer) {\n" + " for (int i = 0; i < gl_in.length(); ++i) {\n" + " f_uv0 = vec3(v_uv0[i], layer);\n" + " gl_Position = gl_in[i].gl_Position;\n" + " gl_Layer = layer;\n" + " EmitVertex();\n" + " }\n" + " EndPrimitive();\n" + " }\n" + "}\n"; + + ProgramShaderCache::CompileShader(s_ColorMatrixProgram, VProgram, pColorMatrixProg, GProgram); + ProgramShaderCache::CompileShader(s_DepthMatrixProgram, VProgram, pDepthMatrixProg, GProgram); s_ColorMatrixUniform = glGetUniformLocation(s_ColorMatrixProgram.glprogid, "colmat"); s_DepthMatrixUniform = glGetUniformLocation(s_DepthMatrixProgram.glprogid, "colmat"); -- cgit v1.2.3 From 5944d15021e39f2356f7fbe1b6a935426bc0bb8a Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Tue, 28 Oct 2014 14:47:13 +0100 Subject: TextureCache: Check the number of layers before reusing a texture. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index fbf3660ba0..dce92c19d7 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -222,7 +222,9 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture( glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0); - glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, FramebufferManager::GetEFBLayers(), 0, gl_format, gl_type, nullptr); + entry->num_layers = FramebufferManager::GetEFBLayers(); + + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, entry->num_layers, 0, gl_format, gl_type, nullptr); glBindTexture(GL_TEXTURE_2D_ARRAY, 0); glGenFramebuffers(1, &entry->framebuffer); -- cgit v1.2.3 From 4fe9ceeee276d2bec8cab86fdf8e5af5ed91cfc6 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Tue, 28 Oct 2014 18:50:09 +0100 Subject: TextureCache: Set proper vertex limit in geometry shader. Without instancing 6 vertices are output instead of 3. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index dce92c19d7..18e575109f 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -377,7 +377,7 @@ TextureCache::TextureCache() const char *GProgram = "layout(triangles) in;\n" - "layout(triangle_strip, max_vertices = 3) out;\n" + "layout(triangle_strip, max_vertices = 6) out;\n" "in vec2 v_uv0[];\n" "out vec3 f_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" -- cgit v1.2.3 From 0a72cf94cb7a206e07e5c69d69ec88057fa33e2b Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 29 Oct 2014 13:47:24 +0100 Subject: TextureCache: Ignore the geometry shader if stereoscopy is disabled. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 18e575109f..89de707280 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -364,7 +364,7 @@ TextureCache::TextureCache() " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n" "}\n"; - const char *VProgram = + const char *VProgram = (g_ActiveConfig.bStereo) ? "out vec2 v_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 copy_position;\n" // left, top, right, bottom @@ -373,9 +373,19 @@ TextureCache::TextureCache() " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" " v_uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" + "}\n" : + "out vec3 f_uv0;\n" + "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" + "uniform vec4 copy_position;\n" // left, top, right, bottom + "void main()\n" + "{\n" + " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" + " f_uv0.xy = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" + " f_uv0.z = 0;\n" + " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" "}\n"; - const char *GProgram = + const char *GProgram = (g_ActiveConfig.bStereo) ? "layout(triangles) in;\n" "layout(triangle_strip, max_vertices = 6) out;\n" "in vec2 v_uv0[];\n" @@ -393,7 +403,7 @@ TextureCache::TextureCache() " }\n" " EndPrimitive();\n" " }\n" - "}\n"; + "}\n" : nullptr; ProgramShaderCache::CompileShader(s_ColorMatrixProgram, VProgram, pColorMatrixProg, GProgram); ProgramShaderCache::CompileShader(s_DepthMatrixProgram, VProgram, pDepthMatrixProg, GProgram); -- cgit v1.2.3 From 9b22e151803ccfb757eb9319f1b32e3d1999f42e Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 30 Oct 2014 23:29:56 +0100 Subject: VideoConfigDiag: Add stereoscopy options group. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 89de707280..f58a71fc92 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -364,7 +364,7 @@ TextureCache::TextureCache() " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n" "}\n"; - const char *VProgram = (g_ActiveConfig.bStereo) ? + const char *VProgram = (g_ActiveConfig.iStereoMode > 0) ? "out vec2 v_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 copy_position;\n" // left, top, right, bottom @@ -385,7 +385,7 @@ TextureCache::TextureCache() " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" "}\n"; - const char *GProgram = (g_ActiveConfig.bStereo) ? + const char *GProgram = (g_ActiveConfig.iStereoMode > 0) ? "layout(triangles) in;\n" "layout(triangle_strip, max_vertices = 6) out;\n" "in vec2 v_uv0[];\n" -- cgit v1.2.3 From 2cb22909108246672e63ff947c678f4d8e80a33f Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 31 Oct 2014 17:29:41 +0100 Subject: TextureCache: Fix invalid cast. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index f58a71fc92..7fd59d5d43 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -380,8 +380,7 @@ TextureCache::TextureCache() "void main()\n" "{\n" " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" - " f_uv0.xy = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" - " f_uv0.z = 0;\n" + " f_uv0 = vec3(mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy), 0.0);\n" " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" "}\n"; -- cgit v1.2.3 From 081212b765754ae80b7a0774ec340c81a47c9199 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 31 Oct 2014 22:27:18 +0100 Subject: TextureCache: Force mono copies of the depth buffer. Fixes stereoscopic stencil shadows in some games. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 7fd59d5d43..3c2661b043 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -338,7 +338,7 @@ TextureCache::TextureCache() "out vec4 ocol0;\n" "\n" "void main(){\n" - " vec4 texcol = texture(samp9, f_uv0);\n" + " vec4 texcol = texture(samp9, vec3(f_uv0.xy, 0));\n" // 255.99998474121 = 16777215/16777216*256 " float workspace = texcol.x * 255.99998474121;\n" -- cgit v1.2.3 From ee76c03160b72731facbce135be26d7ef8cebba5 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Tue, 4 Nov 2014 00:53:14 +0100 Subject: TextureCache: Recompile EFB2Tex shaders when stereo 3D is toggled. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 44 ++++++++++++++++---------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 3c2661b043..547a527818 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -318,6 +318,32 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo } TextureCache::TextureCache() +{ + CompileShaders(); + + s_ActiveTexture = -1; + for (auto& gtex : s_Textures) + gtex = -1; +} + + +TextureCache::~TextureCache() +{ + DeleteShaders(); +} + +void TextureCache::DisableStage(unsigned int stage) +{ +} + +void TextureCache::SetStage() +{ + // -1 is the initial value as we don't know which texture should be bound + if (s_ActiveTexture != (u32)-1) + glActiveTexture(GL_TEXTURE0 + s_ActiveTexture); +} + +void TextureCache::CompileShaders() { const char *pColorMatrixProg = "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" @@ -414,28 +440,12 @@ TextureCache::TextureCache() s_ColorCopyPositionUniform = glGetUniformLocation(s_ColorMatrixProgram.glprogid, "copy_position"); s_DepthCopyPositionUniform = glGetUniformLocation(s_DepthMatrixProgram.glprogid, "copy_position"); - - s_ActiveTexture = -1; - for (auto& gtex : s_Textures) - gtex = -1; } - -TextureCache::~TextureCache() +void TextureCache::DeleteShaders() { s_ColorMatrixProgram.Destroy(); s_DepthMatrixProgram.Destroy(); } -void TextureCache::DisableStage(unsigned int stage) -{ -} - -void TextureCache::SetStage () -{ - // -1 is the initial value as we don't know which texture should be bound - if (s_ActiveTexture != (u32)-1) - glActiveTexture(GL_TEXTURE0 + s_ActiveTexture); -} - } -- cgit v1.2.3 From 8210b9c915816cf8f778db1b633f2327897af005 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 6 Nov 2014 11:41:39 +0100 Subject: TextureCache: Ensure that all render target textures have as many layers as the frame buffer. Also fixes a case where the D3D code path did not initialize num_layers leading to undefined behaviour. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 547a527818..a84da5dbb6 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -221,10 +221,7 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture( gl_type = GL_UNSIGNED_BYTE; glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0); - - entry->num_layers = FramebufferManager::GetEFBLayers(); - - glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, entry->num_layers, 0, gl_format, gl_type, nullptr); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, FramebufferManager::GetEFBLayers(), 0, gl_format, gl_type, nullptr); glBindTexture(GL_TEXTURE_2D_ARRAY, 0); glGenFramebuffers(1, &entry->framebuffer); -- cgit v1.2.3 From 0f63186371c4f0bcc784fa8506d18b9514075d29 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 8 Nov 2014 16:19:15 +0100 Subject: TextureCache: Add "Mono EFB Depth Copy" stereoscopy option. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 28 ++++++++++---------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index a84da5dbb6..f635cb5fe6 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -361,7 +361,7 @@ void TextureCache::CompileShaders() "out vec4 ocol0;\n" "\n" "void main(){\n" - " vec4 texcol = texture(samp9, vec3(f_uv0.xy, 0));\n" + " vec4 texcol = texture(samp9, vec3(f_uv0.xy, %s));\n" // 255.99998474121 = 16777215/16777216*256 " float workspace = texcol.x * 255.99998474121;\n" @@ -387,30 +387,21 @@ void TextureCache::CompileShaders() " ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n" "}\n"; - const char *VProgram = (g_ActiveConfig.iStereoMode > 0) ? - "out vec2 v_uv0;\n" + const char *VProgram = + "out vec3 %s_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "uniform vec4 copy_position;\n" // left, top, right, bottom "void main()\n" "{\n" " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" - " v_uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n" - " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" - "}\n" : - "out vec3 f_uv0;\n" - "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" - "uniform vec4 copy_position;\n" // left, top, right, bottom - "void main()\n" - "{\n" - " vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n" - " f_uv0 = vec3(mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy), 0.0);\n" + " %s_uv0 = vec3(mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy), 0.0);\n" " gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n" "}\n"; const char *GProgram = (g_ActiveConfig.iStereoMode > 0) ? "layout(triangles) in;\n" "layout(triangle_strip, max_vertices = 6) out;\n" - "in vec2 v_uv0[];\n" + "in vec3 v_uv0[];\n" "out vec3 f_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "void main()\n" @@ -418,7 +409,7 @@ void TextureCache::CompileShaders() " int layers = textureSize(samp9, 0).z;\n" " for (int layer = 0; layer < layers; ++layer) {\n" " for (int i = 0; i < gl_in.length(); ++i) {\n" - " f_uv0 = vec3(v_uv0[i], layer);\n" + " f_uv0 = vec3(v_uv0[i].xy, layer);\n" " gl_Position = gl_in[i].gl_Position;\n" " gl_Layer = layer;\n" " EmitVertex();\n" @@ -427,8 +418,11 @@ void TextureCache::CompileShaders() " }\n" "}\n" : nullptr; - ProgramShaderCache::CompileShader(s_ColorMatrixProgram, VProgram, pColorMatrixProg, GProgram); - ProgramShaderCache::CompileShader(s_DepthMatrixProgram, VProgram, pDepthMatrixProg, GProgram); + const char* prefix = (GProgram == nullptr) ? "f" : "v"; + const char* depth_layer = (g_ActiveConfig.bStereoMonoEFBDepth) ? "0" : "f_uv0.z"; + + ProgramShaderCache::CompileShader(s_ColorMatrixProgram, StringFromFormat(VProgram, prefix, prefix).c_str(), pColorMatrixProg, GProgram); + ProgramShaderCache::CompileShader(s_DepthMatrixProgram, StringFromFormat(VProgram, prefix, prefix).c_str(), StringFromFormat(pDepthMatrixProg, depth_layer).c_str(), GProgram); s_ColorMatrixUniform = glGetUniformLocation(s_ColorMatrixProgram.glprogid, "colmat"); s_DepthMatrixUniform = glGetUniformLocation(s_DepthMatrixProgram.glprogid, "colmat"); -- cgit v1.2.3 From 106df04e8e87939014fb6ac8dcb35bb5f952176f Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 16 Nov 2014 02:15:43 +0100 Subject: GeometryShaderGen: Declare the vertex array size. --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index f635cb5fe6..3fe9e2669e 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -401,7 +401,7 @@ void TextureCache::CompileShaders() const char *GProgram = (g_ActiveConfig.iStereoMode > 0) ? "layout(triangles) in;\n" "layout(triangle_strip, max_vertices = 6) out;\n" - "in vec3 v_uv0[];\n" + "in vec3 v_uv0[3];\n" "out vec3 f_uv0;\n" "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n" "void main()\n" -- cgit v1.2.3 From ed9f258b275b61f4ee154e19412efee34f2f8759 Mon Sep 17 00:00:00 2001 From: degasus Date: Sun, 16 Nov 2014 09:21:19 +0100 Subject: GeometryShader: Don't read from output variables --- Source/Core/VideoBackends/OGL/TextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp index 3fe9e2669e..66f633c6e3 100644 --- a/Source/Core/VideoBackends/OGL/TextureCache.cpp +++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp @@ -408,7 +408,7 @@ void TextureCache::CompileShaders() "{\n" " int layers = textureSize(samp9, 0).z;\n" " for (int layer = 0; layer < layers; ++layer) {\n" - " for (int i = 0; i < gl_in.length(); ++i) {\n" + " for (int i = 0; i < 3; ++i) {\n" " f_uv0 = vec3(v_uv0[i].xy, layer);\n" " gl_Position = gl_in[i].gl_Position;\n" " gl_Layer = layer;\n" -- cgit v1.2.3