From 34692ab826abc8f8faa61bdb2280b742424528f1 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 7 Dec 2013 15:14:29 -0500 Subject: Remove unnecessary Src/ folders --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 635 +++++++++++++++++++++ 1 file changed, 635 insertions(+) create mode 100644 Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp new file mode 100644 index 0000000000..d1782196fb --- /dev/null +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -0,0 +1,635 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "ProgramShaderCache.h" +#include "DriverDetails.h" +#include "MathUtil.h" +#include "StreamBuffer.h" +#include "Debugger.h" +#include "Statistics.h" +#include "ImageWrite.h" +#include "Render.h" +#include "PixelShaderManager.h" +#include "VertexShaderManager.h" + +namespace OGL +{ + +static const u32 UBO_LENGTH = 32*1024*1024; + +u32 ProgramShaderCache::s_ubo_buffer_size; +s32 ProgramShaderCache::s_ubo_align; + +static StreamBuffer *s_buffer; +static int num_failures = 0; + +LinearDiskCache g_program_disk_cache; +static GLuint CurrentProgram = 0; +ProgramShaderCache::PCache ProgramShaderCache::pshaders; +ProgramShaderCache::PCacheEntry* ProgramShaderCache::last_entry; +SHADERUID ProgramShaderCache::last_uid; +UidChecker ProgramShaderCache::pixel_uid_checker; +UidChecker ProgramShaderCache::vertex_uid_checker; + +static char s_glsl_header[1024] = ""; + + + +// Annoying sure, can be removed once we drop our UBO workaround + +const char *UniformNames[NUM_UNIFORMS] = +{ + // PIXEL SHADER UNIFORMS + I_COLORS, + I_KCOLORS, + I_ALPHA, + I_TEXDIMS, + I_ZBIAS , + I_INDTEXSCALE , + I_INDTEXMTX, + I_FOG, + I_PLIGHTS, + I_PMATERIALS, + // VERTEX SHADER UNIFORMS + I_POSNORMALMATRIX, + I_PROJECTION , + I_MATERIALS, + I_LIGHTS, + I_TEXMATRICES, + I_TRANSFORMMATRICES , + I_NORMALMATRICES , + I_POSTTRANSFORMMATRICES, + I_DEPTHPARAMS, +}; + +const static int PSVar_Loc[] = { + offsetof(PixelShaderConstants, colors)/16, + offsetof(PixelShaderConstants, kcolors)/16, + offsetof(PixelShaderConstants, alpha)/16, + offsetof(PixelShaderConstants, texdims)/16, + offsetof(PixelShaderConstants, zbias)/16, + offsetof(PixelShaderConstants, indtexscale)/16, + offsetof(PixelShaderConstants, indtexmtx)/16, + offsetof(PixelShaderConstants, fog)/16, + offsetof(PixelShaderConstants, plights)/16, + offsetof(PixelShaderConstants, pmaterials)/16, +}; + +const static int VSVar_Loc[] = { + offsetof(VertexShaderConstants, posnormalmatrix)/16, + offsetof(VertexShaderConstants, projection)/16, + offsetof(VertexShaderConstants, materials)/16, + offsetof(VertexShaderConstants, lights)/16, + offsetof(VertexShaderConstants, texmatrices)/16, + offsetof(VertexShaderConstants, transformmatrices)/16, + offsetof(VertexShaderConstants, normalmatrices)/16, + offsetof(VertexShaderConstants, posttransformmatrices)/16, + offsetof(VertexShaderConstants, depthparams)/16, +}; + +// End of UBO workaround + +void SHADER::SetProgramVariables() +{ + // glsl shader must be bind to set samplers + Bind(); + + // Bind UBO + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); + GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); + + if(PSBlock_id != -1) + glUniformBlockBinding(glprogid, PSBlock_id, 1); + if(VSBlock_id != -1) + glUniformBlockBinding(glprogid, VSBlock_id, 2); + } + + // UBO workaround + for (int a = 0; a < NUM_UNIFORMS; ++a) + { + UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); + UniformSize[a] = 0; + if(g_ActiveConfig.backend_info.bSupportsGLSLUBO) + break; + } + if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + int max_uniforms = 0; + char name[50]; + int size; + + glGetProgramiv(glprogid, GL_ACTIVE_UNIFORMS, &max_uniforms); + for(int i=0; iAlloc(s_ubo_buffer_size); + if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM)) + { + // This is just a hack to support our BUFFERDATA upload method + // as it's broken to uploaded in a splited way + static u8 *tmpbuffer = new u8[s_ubo_buffer_size]; + memcpy(tmpbuffer, &PixelShaderManager::constants, sizeof(PixelShaderConstants)); + memcpy(tmpbuffer+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants)); + size_t offset = s_buffer->Upload(tmpbuffer, s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, + s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, + s_buffer->getBuffer(), offset+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants)); + } + else + { + size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align)); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, + s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants)); + offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, + s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants)); + } + + PixelShaderManager::dirty = false; + VertexShaderManager::dirty = false; + + ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); + } + } + else + { + // UBO workaround + // this must be updated per shader switch, so also update it when it's not dirty + for (unsigned int a = 0; a < 10; ++a) + { + if(last_entry->shader.UniformSize[a] > 0) + glUniform4fv(last_entry->shader.UniformLocations[a], last_entry->shader.UniformSize[a], (float*) &PixelShaderManager::constants + 4*PSVar_Loc[a]); + } + for (unsigned int a = 0; a < 9; ++a) + { + if(last_entry->shader.UniformSize[a+10] > 0) + glUniform4fv(last_entry->shader.UniformLocations[a+10], last_entry->shader.UniformSize[a+10], (float*) &VertexShaderManager::constants + 4*VSVar_Loc[a]); + } + + ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); + } + +} + +GLuint ProgramShaderCache::GetCurrentProgram(void) +{ + return CurrentProgram; +} + +SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 components ) +{ + SHADERUID uid; + GetShaderId(&uid, dstAlphaMode, components); + + // Check if the shader is already set + if (last_entry) + { + if (uid == last_uid) + { + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); + last_entry->shader.Bind(); + return &last_entry->shader; + } + } + + last_uid = uid; + + // Check if shader is already in cache + PCache::iterator iter = pshaders.find(uid); + if (iter != pshaders.end()) + { + PCacheEntry *entry = &iter->second; + last_entry = entry; + + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); + last_entry->shader.Bind(); + return &last_entry->shader; + } + + // Make an entry in the table + PCacheEntry& newentry = pshaders[uid]; + last_entry = &newentry; + newentry.in_cache = 0; + + VertexShaderCode vcode; + PixelShaderCode pcode; + GenerateVertexShaderCode(vcode, components, API_OPENGL); + GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); + + if (g_ActiveConfig.bEnableShaderDebugging) + { + newentry.shader.strvprog = vcode.GetBuffer(); + newentry.shader.strpprog = pcode.GetBuffer(); + } + +#if defined(_DEBUG) || defined(DEBUGFAST) + if (g_ActiveConfig.iLog & CONF_SAVESHADERS) { + static int counter = 0; + char szTemp[MAX_PATH]; + sprintf(szTemp, "%svs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(szTemp, vcode.GetBuffer()); + sprintf(szTemp, "%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(szTemp, pcode.GetBuffer()); + } +#endif + + if (!CompileShader(newentry.shader, vcode.GetBuffer(), pcode.GetBuffer())) { + GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); + return NULL; + } + + INCSTAT(stats.numPixelShadersCreated); + SETSTAT(stats.numPixelShadersAlive, pshaders.size()); + GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); + + last_entry->shader.Bind(); + return &last_entry->shader; +} + +bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, const char* pcode ) +{ + GLuint vsid = CompileSingleShader(GL_VERTEX_SHADER, vcode); + GLuint psid = CompileSingleShader(GL_FRAGMENT_SHADER, pcode); + + if(!vsid || !psid) + { + glDeleteShader(vsid); + glDeleteShader(psid); + return false; + } + + GLuint pid = shader.glprogid = glCreateProgram();; + + glAttachShader(pid, vsid); + glAttachShader(pid, psid); + + if (g_ogl_config.bSupportsGLSLCache) + glProgramParameteri(pid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + + shader.SetProgramBindings(); + + glLinkProgram(pid); + + // original shaders aren't needed any more + glDeleteShader(vsid); + glDeleteShader(psid); + + GLint linkStatus; + glGetProgramiv(pid, GL_LINK_STATUS, &linkStatus); + GLsizei length = 0; + glGetProgramiv(pid, GL_INFO_LOG_LENGTH, &length); + if (linkStatus != GL_TRUE || (length > 1 && DEBUG_GLSL)) + { + GLsizei charsWritten; + GLchar* infoLog = new GLchar[length]; + glGetProgramInfoLog(pid, length, &charsWritten, infoLog); + ERROR_LOG(VIDEO, "Program info log:\n%s", infoLog); + char szTemp[MAX_PATH]; + sprintf(szTemp, "%sbad_p_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); + std::ofstream file; + OpenFStream(file, szTemp, std::ios_base::out); + file << s_glsl_header << vcode << s_glsl_header << pcode << infoLog; + file.close(); + + if(linkStatus != GL_TRUE) + PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", + szTemp, + g_ogl_config.gl_vendor, + g_ogl_config.gl_renderer, + g_ogl_config.gl_version, + infoLog); + + delete [] infoLog; + } + if (linkStatus != GL_TRUE) + { + // Compile failed + ERROR_LOG(VIDEO, "Program linking failed; see info log"); + + // Don't try to use this shader + glDeleteProgram(pid); + return false; + } + + shader.SetProgramVariables(); + + return true; +} + +GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) +{ + GLuint result = glCreateShader(type); + + const char *src[] = {s_glsl_header, code}; + + glShaderSource(result, 2, src, NULL); + glCompileShader(result); + GLint compileStatus; + glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus); + GLsizei length = 0; + glGetShaderiv(result, GL_INFO_LOG_LENGTH, &length); + + if (DriverDetails::HasBug(DriverDetails::BUG_BROKENINFOLOG)) + length = 1024; + + if (compileStatus != GL_TRUE || (length > 1 && DEBUG_GLSL)) + { + GLsizei charsWritten; + GLchar* infoLog = new GLchar[length]; + glGetShaderInfoLog(result, length, &charsWritten, infoLog); + ERROR_LOG(VIDEO, "%s Shader info log:\n%s", type==GL_VERTEX_SHADER ? "VS" : "PS", infoLog); + char szTemp[MAX_PATH]; + sprintf(szTemp, + "%sbad_%s_%04i.txt", + File::GetUserPath(D_DUMP_IDX).c_str(), + type==GL_VERTEX_SHADER ? "vs" : "ps", + num_failures++); + std::ofstream file; + OpenFStream(file, szTemp, std::ios_base::out); + file << s_glsl_header << code << infoLog; + file.close(); + + if(compileStatus != GL_TRUE) + PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", + type==GL_VERTEX_SHADER ? "vertex" : "pixel", + szTemp, + g_ogl_config.gl_vendor, + g_ogl_config.gl_renderer, + g_ogl_config.gl_version, + infoLog); + + delete[] infoLog; + } + if (compileStatus != GL_TRUE) + { + // Compile failed + ERROR_LOG(VIDEO, "Shader compilation failed; see info log"); + + // Don't try to use this shader + glDeleteShader(result); + return 0; + } + (void)GL_REPORT_ERROR(); + return result; +} + +void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 components) +{ + GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components); + GetVertexShaderUid(uid->vuid, components, API_OPENGL); + + if (g_ActiveConfig.bEnableShaderDebugging) + { + PixelShaderCode pcode; + GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); + pixel_uid_checker.AddToIndexAndCheck(pcode, uid->puid, "Pixel", "p"); + + VertexShaderCode vcode; + GenerateVertexShaderCode(vcode, components, API_OPENGL); + vertex_uid_checker.AddToIndexAndCheck(vcode, uid->vuid, "Vertex", "v"); + } +} + +ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram(void) +{ + return *last_entry; +} + +void ProgramShaderCache::Init(void) +{ + // We have to get the UBO alignment here because + // if we generate a buffer that isn't aligned + // then the UBO will fail. + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &s_ubo_align); + + s_ubo_buffer_size = ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align); + + // We multiply by *4*4 because we need to get down to basic machine units. + // So multiply by four to get how many floats we have from vec4s + // Then once more to get bytes + s_buffer = new StreamBuffer(GL_UNIFORM_BUFFER, UBO_LENGTH); + } + + // Read our shader cache, only if supported + if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) + { + GLint Supported; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); + if(!Supported) + { + ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So disable shader cache."); + g_ogl_config.bSupportsGLSLCache = false; + } + else + { + if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) + File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); + + char cache_filename[MAX_PATH]; + sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); + + ProgramShaderCacheInserter inserter; + g_program_disk_cache.OpenAndRead(cache_filename, inserter); + } + SETSTAT(stats.numPixelShadersAlive, pshaders.size()); + } + + CreateHeader(); + + CurrentProgram = 0; + last_entry = NULL; +} + +void ProgramShaderCache::Shutdown(void) +{ + // store all shaders in cache on disk + if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) + { + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); ++iter) + { + if(iter->second.in_cache) continue; + + GLint binary_size; + glGetProgramiv(iter->second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); + if(!binary_size) continue; + + u8 *data = new u8[binary_size+sizeof(GLenum)]; + u8 *binary = data + sizeof(GLenum); + GLenum *prog_format = (GLenum*)data; + glGetProgramBinary(iter->second.shader.glprogid, binary_size, NULL, prog_format, binary); + + g_program_disk_cache.Append(iter->first, data, binary_size+sizeof(GLenum)); + delete [] data; + } + + g_program_disk_cache.Sync(); + g_program_disk_cache.Close(); + } + + glUseProgram(0); + + PCache::iterator iter = pshaders.begin(); + for (; iter != pshaders.end(); ++iter) + iter->second.Destroy(); + pshaders.clear(); + + pixel_uid_checker.Invalidate(); + vertex_uid_checker.Invalidate(); + + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + { + delete s_buffer; + s_buffer = 0; + } +} + +void ProgramShaderCache::CreateHeader ( void ) +{ + GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; + snprintf(s_glsl_header, sizeof(s_glsl_header), + "%s\n" + "%s\n" // ubo + "%s\n" // early-z + + // Precision defines for GLSLES3 + "%s\n" + + "\n"// A few required defines and ones that will make our lives a lot easier + "#define ATTRIN in\n" + "#define ATTROUT out\n" + "#define VARYIN %s\n" + "#define VARYOUT %s\n" + + // Silly differences + "#define float2 vec2\n" + "#define float3 vec3\n" + "#define float4 vec4\n" + "#define int2 ivec2\n" + "#define int3 ivec3\n" + "#define int4 ivec4\n" + + // hlsl to glsl function translation + "#define frac fract\n" + "#define lerp mix\n" + + // Terrible hack, look at DriverDetails.h + "%s\n" + + , v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" + , g_ActiveConfig.backend_info.bSupportsGLSLUBO && v Date: Sun, 5 Jan 2014 09:52:26 +0100 Subject: OpenGL: drop UBO-workaround usage for efb2ram shaders It's just brainfuck to use this workaroung there. Just fetch the uniform location like all other util shaders. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index d1782196fb..f4e7dcb6a7 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -108,15 +108,14 @@ void SHADER::SetProgramVariables() } // UBO workaround - for (int a = 0; a < NUM_UNIFORMS; ++a) - { - UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); - UniformSize[a] = 0; - if(g_ActiveConfig.backend_info.bSupportsGLSLUBO) - break; - } if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) { + for (int a = 0; a < NUM_UNIFORMS; ++a) + { + UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); + UniformSize[a] = 0; + } + int max_uniforms = 0; char name[50]; int size; -- cgit v1.2.3 From c42f274e220e8987b996889a8e663bff302e7f8f Mon Sep 17 00:00:00 2001 From: degasus Date: Sun, 5 Jan 2014 10:38:45 +0100 Subject: OpenGL: use shader 420pack if available to staticly bind ubo location Bindung locations after compiling a shader stalls the driver. So if we manage not to bind anything after compilation, the lag would be reduced much. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index f4e7dcb6a7..e81c6d2d84 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -96,7 +96,7 @@ void SHADER::SetProgramVariables() Bind(); // Bind UBO - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (g_ActiveConfig.backend_info.bSupportsGLSLUBO && !g_ActiveConfig.backend_info.bSupportShadingLanguage420pack) { GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); @@ -135,7 +135,6 @@ void SHADER::SetProgramVariables() } } - // Bind Texture Sampler for (int a = 0; a <= 9; ++a) { @@ -569,6 +568,7 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" "%s\n" // ubo "%s\n" // early-z + "%s\n" // 420pack // Precision defines for GLSLES3 "%s\n" @@ -597,6 +597,7 @@ void ProgramShaderCache::CreateHeader ( void ) , v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" , g_ActiveConfig.backend_info.bSupportsGLSLUBO && v Date: Mon, 30 Dec 2013 07:22:50 -0600 Subject: [GLExtensions] Initial code drop for GLExtensions. This drops GLEW entirely from the codebase. This has been tested on Android and Linux+ATI. Of course untested on Windows and Apple. Also untested with Linux + EGL but should be fine there. There are most likely a couple of extensions I'm missing which would result in null pointer runs but not bad for the initial commit. Conflicts: CMakeLists.txt Externals/GLew/glew.vcxproj Externals/GLew/glew.vcxproj.filters Source/Core/VideoBackends/OGL/CMakeLists.txt Source/Core/VideoBackends/OGL/GLFunctions.cpp Source/Core/VideoBackends/OGL/GLFunctions.h Source/Core/VideoBackends/OGL/GLUtil.h Source/Core/VideoBackends/OGL/Render.cpp Source/VSProps/Base.props --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index e81c6d2d84..51b6e05063 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -156,10 +156,8 @@ void SHADER::SetProgramBindings() // So we do support extended blending // So we need to set a few more things here. // Bind our out locations -#ifndef USE_GLES3 glBindFragDataLocationIndexed(glprogid, 0, 0, "ocol0"); glBindFragDataLocationIndexed(glprogid, 0, 1, "ocol1"); -#endif } // Need to set some attribute locations glBindAttribLocation(glprogid, SHADER_POSITION_ATTRIB, "rawpos"); -- cgit v1.2.3 From be1fee6d7476459a4c1fa09e1cb5b42dc005da54 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 22 Jan 2014 18:02:55 +0100 Subject: OpenGL: change StreamBuffer in a streaming way This is a bit slower on map_and_* because of flushing and _very_ much slower on buffer(sub)?data because of a new memcpy. But this design allow us to decode directly into a gpu buffer, eg vertexloader will profit :) --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 36 ++++++++-------------- 1 file changed, 13 insertions(+), 23 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 51b6e05063..8f3a545261 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -193,29 +193,19 @@ void ProgramShaderCache::UploadConstants() { if(PixelShaderManager::dirty || VertexShaderManager::dirty) { - s_buffer->Alloc(s_ubo_buffer_size); - if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM)) - { - // This is just a hack to support our BUFFERDATA upload method - // as it's broken to uploaded in a splited way - static u8 *tmpbuffer = new u8[s_ubo_buffer_size]; - memcpy(tmpbuffer, &PixelShaderManager::constants, sizeof(PixelShaderConstants)); - memcpy(tmpbuffer+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants)); - size_t offset = s_buffer->Upload(tmpbuffer, s_ubo_buffer_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, - s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants)); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, - s_buffer->getBuffer(), offset+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants)); - } - else - { - size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align)); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, - s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants)); - offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align)); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, - s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants)); - } + u8* buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); + + memcpy(buffer, + &PixelShaderManager::constants, sizeof(PixelShaderConstants)); + + memcpy(buffer + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + &VertexShaderManager::constants, sizeof(VertexShaderConstants)); + + size_t offset = s_buffer->Unmap(s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, + sizeof(PixelShaderConstants)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + sizeof(VertexShaderConstants)); PixelShaderManager::dirty = false; VertexShaderManager::dirty = false; -- cgit v1.2.3 From 128fcdac26a9f7b6eb5174b88483c7ca023f210b Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 23 Jan 2014 00:47:49 +0100 Subject: OpenGL: refactor all of our StreamBuffers The old way was to use big switch/case statements based on a type of buffer. The new one is to use inheritance. This change prohibits us to change the buffer type while running, but I doubt we'll ever do so. Performance should also be a bit better. Also a nice cleanup. Added some comments about this different kind of buffers. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 8f3a545261..000398c787 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -193,18 +193,18 @@ void ProgramShaderCache::UploadConstants() { if(PixelShaderManager::dirty || VertexShaderManager::dirty) { - u8* buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); + auto buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); - memcpy(buffer, + memcpy(buffer.first, &PixelShaderManager::constants, sizeof(PixelShaderConstants)); - memcpy(buffer + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants)); - size_t offset = s_buffer->Unmap(s_ubo_buffer_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, + s_buffer->Unmap(s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->m_buffer, buffer.second, sizeof(PixelShaderConstants)); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants)); PixelShaderManager::dirty = false; @@ -471,7 +471,7 @@ void ProgramShaderCache::Init(void) // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - s_buffer = new StreamBuffer(GL_UNIFORM_BUFFER, UBO_LENGTH); + s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH); } // Read our shader cache, only if supported -- cgit v1.2.3 From 6089e4470ab2636c9c8d697905ee79135e33072f Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 30 Jan 2014 16:38:11 +0100 Subject: OGL: remove ubo workaround This was only keeped for some broken mesa versions. Meanwhile most used versions should be fixed for almost a year. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 157 +++------------------ 1 file changed, 23 insertions(+), 134 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 000398c787..6804417938 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -34,69 +34,13 @@ UidChecker ProgramShaderCache::vertex_uid_chec static char s_glsl_header[1024] = ""; - - -// Annoying sure, can be removed once we drop our UBO workaround - -const char *UniformNames[NUM_UNIFORMS] = -{ - // PIXEL SHADER UNIFORMS - I_COLORS, - I_KCOLORS, - I_ALPHA, - I_TEXDIMS, - I_ZBIAS , - I_INDTEXSCALE , - I_INDTEXMTX, - I_FOG, - I_PLIGHTS, - I_PMATERIALS, - // VERTEX SHADER UNIFORMS - I_POSNORMALMATRIX, - I_PROJECTION , - I_MATERIALS, - I_LIGHTS, - I_TEXMATRICES, - I_TRANSFORMMATRICES , - I_NORMALMATRICES , - I_POSTTRANSFORMMATRICES, - I_DEPTHPARAMS, -}; - -const static int PSVar_Loc[] = { - offsetof(PixelShaderConstants, colors)/16, - offsetof(PixelShaderConstants, kcolors)/16, - offsetof(PixelShaderConstants, alpha)/16, - offsetof(PixelShaderConstants, texdims)/16, - offsetof(PixelShaderConstants, zbias)/16, - offsetof(PixelShaderConstants, indtexscale)/16, - offsetof(PixelShaderConstants, indtexmtx)/16, - offsetof(PixelShaderConstants, fog)/16, - offsetof(PixelShaderConstants, plights)/16, - offsetof(PixelShaderConstants, pmaterials)/16, -}; - -const static int VSVar_Loc[] = { - offsetof(VertexShaderConstants, posnormalmatrix)/16, - offsetof(VertexShaderConstants, projection)/16, - offsetof(VertexShaderConstants, materials)/16, - offsetof(VertexShaderConstants, lights)/16, - offsetof(VertexShaderConstants, texmatrices)/16, - offsetof(VertexShaderConstants, transformmatrices)/16, - offsetof(VertexShaderConstants, normalmatrices)/16, - offsetof(VertexShaderConstants, posttransformmatrices)/16, - offsetof(VertexShaderConstants, depthparams)/16, -}; - -// End of UBO workaround - void SHADER::SetProgramVariables() { // glsl shader must be bind to set samplers Bind(); // Bind UBO - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO && !g_ActiveConfig.backend_info.bSupportShadingLanguage420pack) + if (!g_ActiveConfig.backend_info.bSupportShadingLanguage420pack) { GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); @@ -107,34 +51,6 @@ void SHADER::SetProgramVariables() glUniformBlockBinding(glprogid, VSBlock_id, 2); } - // UBO workaround - if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - for (int a = 0; a < NUM_UNIFORMS; ++a) - { - UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]); - UniformSize[a] = 0; - } - - int max_uniforms = 0; - char name[50]; - int size; - - glGetProgramiv(glprogid, GL_ACTIVE_UNIFORMS, &max_uniforms); - for(int i=0; iMap(s_ubo_buffer_size, s_ubo_align); + auto buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); - memcpy(buffer.first, - &PixelShaderManager::constants, sizeof(PixelShaderConstants)); + memcpy(buffer.first, + &PixelShaderManager::constants, sizeof(PixelShaderConstants)); - memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), - &VertexShaderManager::constants, sizeof(VertexShaderConstants)); + memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + &VertexShaderManager::constants, sizeof(VertexShaderConstants)); - s_buffer->Unmap(s_ubo_buffer_size); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->m_buffer, buffer.second, - sizeof(PixelShaderConstants)); - glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), - sizeof(VertexShaderConstants)); + s_buffer->Unmap(s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->m_buffer, buffer.second, + sizeof(PixelShaderConstants)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + sizeof(VertexShaderConstants)); - PixelShaderManager::dirty = false; - VertexShaderManager::dirty = false; - - ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); - } - } - else - { - // UBO workaround - // this must be updated per shader switch, so also update it when it's not dirty - for (unsigned int a = 0; a < 10; ++a) - { - if(last_entry->shader.UniformSize[a] > 0) - glUniform4fv(last_entry->shader.UniformLocations[a], last_entry->shader.UniformSize[a], (float*) &PixelShaderManager::constants + 4*PSVar_Loc[a]); - } - for (unsigned int a = 0; a < 9; ++a) - { - if(last_entry->shader.UniformSize[a+10] > 0) - glUniform4fv(last_entry->shader.UniformLocations[a+10], last_entry->shader.UniformSize[a+10], (float*) &VertexShaderManager::constants + 4*VSVar_Loc[a]); - } + PixelShaderManager::dirty = false; + VertexShaderManager::dirty = false; ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); } - } GLuint ProgramShaderCache::GetCurrentProgram(void) @@ -462,17 +357,14 @@ void ProgramShaderCache::Init(void) // We have to get the UBO alignment here because // if we generate a buffer that isn't aligned // then the UBO will fail. - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &s_ubo_align); + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &s_ubo_align); - s_ubo_buffer_size = ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align); + s_ubo_buffer_size = ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align); - // We multiply by *4*4 because we need to get down to basic machine units. - // So multiply by four to get how many floats we have from vec4s - // Then once more to get bytes - s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH); - } + // We multiply by *4*4 because we need to get down to basic machine units. + // So multiply by four to get how many floats we have from vec4s + // Then once more to get bytes + s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH); // Read our shader cache, only if supported if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) @@ -542,11 +434,8 @@ void ProgramShaderCache::Shutdown(void) pixel_uid_checker.Invalidate(); vertex_uid_checker.Invalidate(); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - delete s_buffer; - s_buffer = 0; - } + delete s_buffer; + s_buffer = 0; } void ProgramShaderCache::CreateHeader ( void ) @@ -583,7 +472,7 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" , v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" - , g_ActiveConfig.backend_info.bSupportsGLSLUBO && v Date: Mon, 17 Feb 2014 05:18:15 -0500 Subject: Convert all includes to relative paths. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 6804417938..a701158a6d 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -2,16 +2,18 @@ // Licensed under GPLv2 // Refer to the license.txt file included. -#include "ProgramShaderCache.h" -#include "DriverDetails.h" -#include "MathUtil.h" -#include "StreamBuffer.h" -#include "Debugger.h" -#include "Statistics.h" -#include "ImageWrite.h" -#include "Render.h" -#include "PixelShaderManager.h" -#include "VertexShaderManager.h" +#include "Common/MathUtil.h" + +#include "VideoBackends/OGL/ProgramShaderCache.h" +#include "VideoBackends/OGL/Render.h" +#include "VideoBackends/OGL/StreamBuffer.h" + +#include "VideoCommon/Debugger.h" +#include "VideoCommon/DriverDetails.h" +#include "VideoCommon/ImageWrite.h" +#include "VideoCommon/Statistics.h" +#include "VideoCommon/PixelShaderManager.h" +#include "VideoCommon/VertexShaderManager.h" namespace OGL { -- cgit v1.2.3 From 425f9dcd5155614e66fab635819ef12ee390dc7b Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Wed, 19 Feb 2014 12:14:09 +0100 Subject: Fix more header sorting issues in VideoBackends/ (now check-includes clean). --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index a701158a6d..79826860a7 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -11,8 +11,8 @@ #include "VideoCommon/Debugger.h" #include "VideoCommon/DriverDetails.h" #include "VideoCommon/ImageWrite.h" -#include "VideoCommon/Statistics.h" #include "VideoCommon/PixelShaderManager.h" +#include "VideoCommon/Statistics.h" #include "VideoCommon/VertexShaderManager.h" namespace OGL -- cgit v1.2.3 From aaaa5af0b23b25b1eab3cf37ea6f0cb70c125559 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 25 Feb 2014 15:52:22 +0100 Subject: remove (ATTR|VARY)(IN|OUT) macros --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 79826860a7..954755cb95 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -452,12 +452,6 @@ void ProgramShaderCache::CreateHeader ( void ) // Precision defines for GLSLES3 "%s\n" - "\n"// A few required defines and ones that will make our lives a lot easier - "#define ATTRIN in\n" - "#define ATTROUT out\n" - "#define VARYIN %s\n" - "#define VARYOUT %s\n" - // Silly differences "#define float2 vec2\n" "#define float3 vec3\n" @@ -472,6 +466,7 @@ void ProgramShaderCache::CreateHeader ( void ) // Terrible hack, look at DriverDetails.h "%s\n" + "%s\n" , v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" , v Date: Wed, 26 Feb 2014 12:48:52 +0100 Subject: comment fixes --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 954755cb95..0de9034f51 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -464,9 +464,9 @@ void ProgramShaderCache::CreateHeader ( void ) "#define frac fract\n" "#define lerp mix\n" - // Terrible hack, look at DriverDetails.h - "%s\n" - "%s\n" + // Terrible hacks, look at DriverDetails.h + "%s\n" // replace textureSize as constant + "%s\n" // wipe out all centroid usages , v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" , v Date: Mon, 3 Mar 2014 06:25:15 +0100 Subject: clang-modernize -loop-convert and some manual adjustments --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 26 +++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 0de9034f51..68c1e44399 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -404,21 +404,26 @@ void ProgramShaderCache::Shutdown(void) // store all shaders in cache on disk if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) { - PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); ++iter) + for (auto& entry : pshaders) { - if(iter->second.in_cache) continue; + if(entry.second.in_cache) + { + continue; + } GLint binary_size; - glGetProgramiv(iter->second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); - if(!binary_size) continue; + glGetProgramiv(entry.second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); + if(!binary_size) + { + continue; + } u8 *data = new u8[binary_size+sizeof(GLenum)]; u8 *binary = data + sizeof(GLenum); GLenum *prog_format = (GLenum*)data; - glGetProgramBinary(iter->second.shader.glprogid, binary_size, NULL, prog_format, binary); + glGetProgramBinary(entry.second.shader.glprogid, binary_size, NULL, prog_format, binary); - g_program_disk_cache.Append(iter->first, data, binary_size+sizeof(GLenum)); + g_program_disk_cache.Append(entry.first, data, binary_size+sizeof(GLenum)); delete [] data; } @@ -428,9 +433,10 @@ void ProgramShaderCache::Shutdown(void) glUseProgram(0); - PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); ++iter) - iter->second.Destroy(); + for (auto& entry : pshaders) + { + entry.second.Destroy(); + } pshaders.clear(); pixel_uid_checker.Invalidate(); -- cgit v1.2.3 From d802d392811be44d34ae9cd23f616db93e54c50f Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 9 Mar 2014 21:14:26 +0100 Subject: clang-modernize -use-nullptr and s/\bNULL\b/nullptr/g for *.cpp/h/mm files not compiled on my machine --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 68c1e44399..c4e150d7d0 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -194,7 +194,7 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen if (!CompileShader(newentry.shader, vcode.GetBuffer(), pcode.GetBuffer())) { GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); - return NULL; + return nullptr; } INCSTAT(stats.numPixelShadersCreated); @@ -281,7 +281,7 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) const char *src[] = {s_glsl_header, code}; - glShaderSource(result, 2, src, NULL); + glShaderSource(result, 2, src, nullptr); glCompileShader(result); GLint compileStatus; glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus); @@ -396,7 +396,7 @@ void ProgramShaderCache::Init(void) CreateHeader(); CurrentProgram = 0; - last_entry = NULL; + last_entry = nullptr; } void ProgramShaderCache::Shutdown(void) @@ -421,7 +421,7 @@ void ProgramShaderCache::Shutdown(void) u8 *data = new u8[binary_size+sizeof(GLenum)]; u8 *binary = data + sizeof(GLenum); GLenum *prog_format = (GLenum*)data; - glGetProgramBinary(entry.second.shader.glprogid, binary_size, NULL, prog_format, binary); + glGetProgramBinary(entry.second.shader.glprogid, binary_size, nullptr, prog_format, binary); g_program_disk_cache.Append(entry.first, data, binary_size+sizeof(GLenum)); delete [] data; @@ -443,7 +443,7 @@ void ProgramShaderCache::Shutdown(void) vertex_uid_checker.Invalidate(); delete s_buffer; - s_buffer = 0; + s_buffer = nullptr; } void ProgramShaderCache::CreateHeader ( void ) -- cgit v1.2.3 From 31cfc73a09a8685cbab20502b4bc132e98e2feb5 Mon Sep 17 00:00:00 2001 From: Matthew Parlane Date: Tue, 11 Mar 2014 00:30:55 +1300 Subject: Fixes spacing for "for", "while", "switch" and "if" Also moved && and || to ends of lines instead of start. Fixed misc vertical alignments and some { needed newlining. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index c4e150d7d0..8751ec35c4 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -47,9 +47,9 @@ void SHADER::SetProgramVariables() GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); - if(PSBlock_id != -1) + if (PSBlock_id != -1) glUniformBlockBinding(glprogid, PSBlock_id, 1); - if(VSBlock_id != -1) + if (VSBlock_id != -1) glUniformBlockBinding(glprogid, VSBlock_id, 2); } @@ -89,7 +89,7 @@ void SHADER::SetProgramBindings() glBindAttribLocation(glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); glBindAttribLocation(glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); - for(int i=0; i<8; i++) { + for (int i=0; i<8; i++) { char attrib_name[8]; snprintf(attrib_name, 8, "tex%d", i); glBindAttribLocation(glprogid, SHADER_TEXTURE0_ATTRIB+i, attrib_name); @@ -98,7 +98,7 @@ void SHADER::SetProgramBindings() void SHADER::Bind() { - if(CurrentProgram != glprogid) + if (CurrentProgram != glprogid) { glUseProgram(glprogid); CurrentProgram = glprogid; @@ -107,7 +107,7 @@ void SHADER::Bind() void ProgramShaderCache::UploadConstants() { - if(PixelShaderManager::dirty || VertexShaderManager::dirty) + if (PixelShaderManager::dirty || VertexShaderManager::dirty) { auto buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); @@ -210,7 +210,7 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons GLuint vsid = CompileSingleShader(GL_VERTEX_SHADER, vcode); GLuint psid = CompileSingleShader(GL_FRAGMENT_SHADER, pcode); - if(!vsid || !psid) + if (!vsid || !psid) { glDeleteShader(vsid); glDeleteShader(psid); @@ -250,7 +250,7 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons file << s_glsl_header << vcode << s_glsl_header << pcode << infoLog; file.close(); - if(linkStatus != GL_TRUE) + if (linkStatus != GL_TRUE) PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", szTemp, g_ogl_config.gl_vendor, @@ -308,7 +308,7 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) file << s_glsl_header << code << infoLog; file.close(); - if(compileStatus != GL_TRUE) + if (compileStatus != GL_TRUE) PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", type==GL_VERTEX_SHADER ? "vertex" : "pixel", szTemp, @@ -373,7 +373,7 @@ void ProgramShaderCache::Init(void) { GLint Supported; glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); - if(!Supported) + if (!Supported) { ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So disable shader cache."); g_ogl_config.bSupportsGLSLCache = false; @@ -406,14 +406,14 @@ void ProgramShaderCache::Shutdown(void) { for (auto& entry : pshaders) { - if(entry.second.in_cache) + if (entry.second.in_cache) { continue; } GLint binary_size; glGetProgramiv(entry.second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); - if(!binary_size) + if (!binary_size) { continue; } -- cgit v1.2.3 From a82675b7d581421fa80d5d5c53253cf1d5c1a26d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 12 Mar 2014 15:33:41 -0400 Subject: Kill off some usages of c_str. Also changes some function params, but this is ok. Some simplifications were also able to be made (ie. killing off strcmps with ==, etc). --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 8751ec35c4..5558b13a40 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -381,7 +381,7 @@ void ProgramShaderCache::Init(void) else { if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) - File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX).c_str()); + File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX)); char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), -- cgit v1.2.3 From 2af50f04c21a12e9516dba6c12f73af3f5b7834d Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Mon, 7 Oct 2013 00:52:34 +0200 Subject: OGL: Force highp for integers. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 8751ec35c4..085e79b8e5 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -457,6 +457,7 @@ void ProgramShaderCache::CreateHeader ( void ) // Precision defines for GLSLES3 "%s\n" + "%s\n" // Silly differences "#define float2 vec2\n" @@ -480,6 +481,7 @@ void ProgramShaderCache::CreateHeader ( void ) , g_ActiveConfig.backend_info.bSupportShadingLanguage420pack ? "#extension GL_ARB_shading_language_420pack : enable" : "" , v==GLSLES3 ? "precision highp float;" : "" + , v==GLSLES3 ? "precision highp int;" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENTEXTURESIZE) ? "#define textureSize(x, y) ivec2(1, 1)" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "#define centroid" : "" -- cgit v1.2.3 From fa77e1d2b6a7e9a730b3e8b6fb8d95b68bf2a55c Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Wed, 14 Aug 2013 15:06:47 +0200 Subject: PixelShaderGen: Use integer math for alpha testing. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 085e79b8e5..63fd6c69ea 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -463,6 +463,9 @@ void ProgramShaderCache::CreateHeader ( void ) "#define float2 vec2\n" "#define float3 vec3\n" "#define float4 vec4\n" + "#define uint2 uvec2\n" + "#define uint3 uvec3\n" + "#define uint4 uvec4\n" "#define int2 ivec2\n" "#define int3 ivec3\n" "#define int4 ivec4\n" -- cgit v1.2.3 From 3251d78f8934b500b4cbdf06f3fd62038cb2047d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 30 Mar 2014 13:58:05 -0500 Subject: Add initial support for GLSL ES 3.10. GLSL ES 3.10 adds implicit support for the binding layout qualifier that we use. Changes our GLSL version enums to bit values so we can check for both ES versions easily. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 34 ++++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 90c73bf6ea..7cf40eed34 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include + #include "Common/MathUtil.h" #include "VideoBackends/OGL/ProgramShaderCache.h" @@ -36,13 +38,33 @@ UidChecker ProgramShaderCache::vertex_uid_chec static char s_glsl_header[1024] = ""; +std::string GetGLSLVersionString() +{ + GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; + switch(v) + { + case GLSLES_300: + return "#version 300 es"; + case GLSLES_310: + return "#version 310 es"; + case GLSL_130: + return "#version 130"; + case GLSL_140: + return "#version 140"; + case GLSL_150: + return "#version 150"; + } + // Shouldn't ever hit this + return "#version ERROR"; +} + void SHADER::SetProgramVariables() { // glsl shader must be bind to set samplers Bind(); // Bind UBO - if (!g_ActiveConfig.backend_info.bSupportShadingLanguage420pack) + if (!g_ActiveConfig.backend_info.bSupportsBindingLayout) { GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); @@ -455,7 +477,7 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" // early-z "%s\n" // 420pack - // Precision defines for GLSLES3 + // Precision defines for GLSL ES "%s\n" "%s\n" @@ -478,13 +500,13 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" // replace textureSize as constant "%s\n" // wipe out all centroid usages - , v==GLSLES3 ? "#version 300 es" : v==GLSL_130 ? "#version 130" : v==GLSL_140 ? "#version 140" : "#version 150" + , GetGLSLVersionString().c_str() , v=GLSLES_300 ? "precision highp float;" : "" + , v>=GLSLES_300 ? "precision highp int;" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENTEXTURESIZE) ? "#define textureSize(x, y) ivec2(1, 1)" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "#define centroid" : "" -- cgit v1.2.3 From 2d8cfb89d777ac36d3dcca8976caa2f7804ab43c Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 24 Apr 2014 02:30:05 -0500 Subject: Changes posmtx vertex attribute to integer. This makes it so we don't need to do some dumb casting from float to integer in our shaders. Only tested in OpenGL, needs to be tested in D3D. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 7cf40eed34..90b86194e1 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -102,7 +102,7 @@ void SHADER::SetProgramBindings() // Need to set some attribute locations glBindAttribLocation(glprogid, SHADER_POSITION_ATTRIB, "rawpos"); - glBindAttribLocation(glprogid, SHADER_POSMTX_ATTRIB, "fposmtx"); + glBindAttribLocation(glprogid, SHADER_POSMTX_ATTRIB, "posmtx"); glBindAttribLocation(glprogid, SHADER_COLOR0_ATTRIB, "color0"); glBindAttribLocation(glprogid, SHADER_COLOR1_ATTRIB, "color1"); -- cgit v1.2.3 From c1b6fcc00baaf877401b9f70a24520c14d8c124b Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 1 May 2014 12:45:05 +0200 Subject: ogl: pixel format shader without resolving v2: Don't use std::to_string as this function is broken on android. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 90b86194e1..5f9028c021 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -476,6 +476,8 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" // ubo "%s\n" // early-z "%s\n" // 420pack + "%s\n" // msaa + "%s\n" // sample shading // Precision defines for GLSL ES "%s\n" @@ -504,6 +506,8 @@ void ProgramShaderCache::CreateHeader ( void ) , v=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From ce54c1e571a7f79c173dd8f949003255ba95670a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 3 Jun 2014 01:08:54 -0400 Subject: Kill off replaceable usages of s[n]printf. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 5f9028c021..b1499c791a 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -5,6 +5,7 @@ #include #include "Common/MathUtil.h" +#include "Common/StringUtil.h" #include "VideoBackends/OGL/ProgramShaderCache.h" #include "VideoBackends/OGL/Render.h" @@ -204,13 +205,14 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen } #if defined(_DEBUG) || defined(DEBUGFAST) - if (g_ActiveConfig.iLog & CONF_SAVESHADERS) { + if (g_ActiveConfig.iLog & CONF_SAVESHADERS) + { static int counter = 0; - char szTemp[MAX_PATH]; - sprintf(szTemp, "%svs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); - SaveData(szTemp, vcode.GetBuffer()); - sprintf(szTemp, "%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); - SaveData(szTemp, pcode.GetBuffer()); + std::string filename = StringFromFormat("%svs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(filename, vcode.GetBuffer()); + + filename = StringFromFormat("%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(filename, pcode.GetBuffer()); } #endif @@ -265,16 +267,16 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons GLchar* infoLog = new GLchar[length]; glGetProgramInfoLog(pid, length, &charsWritten, infoLog); ERROR_LOG(VIDEO, "Program info log:\n%s", infoLog); - char szTemp[MAX_PATH]; - sprintf(szTemp, "%sbad_p_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); + + std::string filename = StringFromFormat("%sbad_p_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); std::ofstream file; - OpenFStream(file, szTemp, std::ios_base::out); + OpenFStream(file, filename, std::ios_base::out); file << s_glsl_header << vcode << s_glsl_header << pcode << infoLog; file.close(); if (linkStatus != GL_TRUE) PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - szTemp, + filename.c_str(), g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, g_ogl_config.gl_version, @@ -319,21 +321,20 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) GLchar* infoLog = new GLchar[length]; glGetShaderInfoLog(result, length, &charsWritten, infoLog); ERROR_LOG(VIDEO, "%s Shader info log:\n%s", type==GL_VERTEX_SHADER ? "VS" : "PS", infoLog); - char szTemp[MAX_PATH]; - sprintf(szTemp, - "%sbad_%s_%04i.txt", + + std::string filename = StringFromFormat("%sbad_%s_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), type==GL_VERTEX_SHADER ? "vs" : "ps", num_failures++); std::ofstream file; - OpenFStream(file, szTemp, std::ios_base::out); + OpenFStream(file, filename, std::ios_base::out); file << s_glsl_header << code << infoLog; file.close(); if (compileStatus != GL_TRUE) PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", type==GL_VERTEX_SHADER ? "vertex" : "pixel", - szTemp, + filename.c_str(), g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, g_ogl_config.gl_version, @@ -405,8 +406,7 @@ void ProgramShaderCache::Init(void) if (!File::Exists(File::GetUserPath(D_SHADERCACHE_IDX))) File::CreateDir(File::GetUserPath(D_SHADERCACHE_IDX)); - char cache_filename[MAX_PATH]; - sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), + std::string cache_filename = StringFromFormat("%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); ProgramShaderCacheInserter inserter; -- cgit v1.2.3 From 7db5a4b22db6cc7cea987a38d1d8ce9b0a594394 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 2 Jun 2014 20:11:46 +0200 Subject: Statistics: Reformat stats string --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index b1499c791a..c4c8f7c888 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -123,6 +123,7 @@ void SHADER::Bind() { if (CurrentProgram != glprogid) { + INCSTAT(stats.thisFrame.numShaderChanges); glUseProgram(glprogid); CurrentProgram = glprogid; } -- cgit v1.2.3 From 22e1aa5bb4a159d6d66a321f978917614aa36331 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 8 Jul 2014 14:29:26 +0200 Subject: mark all local functions as static --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index c4c8f7c888..cafa560485 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -39,7 +39,7 @@ UidChecker ProgramShaderCache::vertex_uid_chec static char s_glsl_header[1024] = ""; -std::string GetGLSLVersionString() +static std::string GetGLSLVersionString() { GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; switch(v) -- cgit v1.2.3 From 6d3f249dcc746cc7845ef88ddb8ce3bcc9221aca Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 8 Jul 2014 15:58:25 +0200 Subject: mark all local variables as static --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index cafa560485..99f3ad5485 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -29,7 +29,7 @@ s32 ProgramShaderCache::s_ubo_align; static StreamBuffer *s_buffer; static int num_failures = 0; -LinearDiskCache g_program_disk_cache; +static LinearDiskCache g_program_disk_cache; static GLuint CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; ProgramShaderCache::PCacheEntry* ProgramShaderCache::last_entry; -- cgit v1.2.3 From bc9ef95643c73838800274be9afd691b542b9f1a Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 7 Jun 2014 00:29:21 -0500 Subject: Support Sampler binding in the shader. In the cases where we support the binding layout keyword, use it for more than binding UBO location. This changes it so it is supported for samplers as well. Instances when this is enabled is if a device supports GL_ARB_shading_language_420pack, or if it supports GLES 3.10. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 31 +++++++++++----------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 99f3ad5485..768663f56a 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -61,12 +61,12 @@ static std::string GetGLSLVersionString() void SHADER::SetProgramVariables() { - // glsl shader must be bind to set samplers - Bind(); - - // Bind UBO + // Bind UBO and texture samplers if (!g_ActiveConfig.backend_info.bSupportsBindingLayout) { + // glsl shader must be bind to set samplers if we don't support binding layout + Bind(); + GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); @@ -74,20 +74,19 @@ void SHADER::SetProgramVariables() glUniformBlockBinding(glprogid, PSBlock_id, 1); if (VSBlock_id != -1) glUniformBlockBinding(glprogid, VSBlock_id, 2); - } - // Bind Texture Sampler - for (int a = 0; a <= 9; ++a) - { - char name[8]; - snprintf(name, 8, "samp%d", a); + // Bind Texture Sampler + for (int a = 0; a <= 9; ++a) + { + char name[8]; + snprintf(name, 8, "samp%d", a); - // Still need to get sampler locations since we aren't binding them statically in the shaders - int loc = glGetUniformLocation(glprogid, name); - if (loc != -1) - glUniform1i(loc, a); + // Still need to get sampler locations since we aren't binding them statically in the shaders + int loc = glGetUniformLocation(glprogid, name); + if (loc != -1) + glUniform1i(loc, a); + } } - } void SHADER::SetProgramBindings() @@ -479,6 +478,7 @@ void ProgramShaderCache::CreateHeader ( void ) "%s\n" // 420pack "%s\n" // msaa "%s\n" // sample shading + "%s\n" // Sampler binding // Precision defines for GLSL ES "%s\n" @@ -509,6 +509,7 @@ void ProgramShaderCache::CreateHeader ( void ) , (g_ActiveConfig.backend_info.bSupportsBindingLayout && v < GLSLES_310) ? "#extension GL_ARB_shading_language_420pack : enable" : "" , (g_ogl_config.bSupportsMSAA && v < GLSL_150) ? "#extension GL_ARB_texture_multisample : enable" : "" , (g_ogl_config.bSupportSampleShading) ? "#extension GL_ARB_sample_shading : enable" : "" + , g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)" , v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From 960b54670ca3c2625eaaaee725e093b3f03251c5 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 15 Aug 2014 14:09:53 -0400 Subject: OGL: Fix brace and body placements Also got rid of void argument specifiers. These are a carryover from C. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 768663f56a..f5d6431f15 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -111,7 +111,8 @@ void SHADER::SetProgramBindings() glBindAttribLocation(glprogid, SHADER_NORM1_ATTRIB, "rawnorm1"); glBindAttribLocation(glprogid, SHADER_NORM2_ATTRIB, "rawnorm2"); - for (int i=0; i<8; i++) { + for (int i = 0; i < 8; i++) + { char attrib_name[8]; snprintf(attrib_name, 8, "tex%d", i); glBindAttribLocation(glprogid, SHADER_TEXTURE0_ATTRIB+i, attrib_name); @@ -153,7 +154,7 @@ void ProgramShaderCache::UploadConstants() } } -GLuint ProgramShaderCache::GetCurrentProgram(void) +GLuint ProgramShaderCache::GetCurrentProgram() { return CurrentProgram; } @@ -216,7 +217,8 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen } #endif - if (!CompileShader(newentry.shader, vcode.GetBuffer(), pcode.GetBuffer())) { + if (!CompileShader(newentry.shader, vcode.GetBuffer(), pcode.GetBuffer())) + { GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); return nullptr; } @@ -275,12 +277,14 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons file.close(); if (linkStatus != GL_TRUE) + { PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", filename.c_str(), g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, g_ogl_config.gl_version, infoLog); + } delete [] infoLog; } @@ -299,7 +303,7 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons return true; } -GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) +GLuint ProgramShaderCache::CompileSingleShader(GLuint type, const char* code) { GLuint result = glCreateShader(type); @@ -332,13 +336,15 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code ) file.close(); if (compileStatus != GL_TRUE) + { PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - type==GL_VERTEX_SHADER ? "vertex" : "pixel", + type == GL_VERTEX_SHADER ? "vertex" : "pixel", filename.c_str(), g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, g_ogl_config.gl_version, infoLog); + } delete[] infoLog; } @@ -372,12 +378,12 @@ void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, } } -ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram(void) +ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram() { return *last_entry; } -void ProgramShaderCache::Init(void) +void ProgramShaderCache::Init() { // We have to get the UBO alignment here because // if we generate a buffer that isn't aligned @@ -421,7 +427,7 @@ void ProgramShaderCache::Init(void) last_entry = nullptr; } -void ProgramShaderCache::Shutdown(void) +void ProgramShaderCache::Shutdown() { // store all shaders in cache on disk if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) @@ -468,7 +474,7 @@ void ProgramShaderCache::Shutdown(void) s_buffer = nullptr; } -void ProgramShaderCache::CreateHeader ( void ) +void ProgramShaderCache::CreateHeader() { GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; snprintf(s_glsl_header, sizeof(s_glsl_header), @@ -540,7 +546,9 @@ void ProgramShaderCache::ProgramShaderCacheInserter::Read ( const SHADERUID& key entry.shader.SetProgramVariables(); } else + { glDeleteProgram(entry.shader.glprogid); + } } -- cgit v1.2.3 From 32953fd968069a6714600aedad68d52d082e3309 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 15 Aug 2014 14:15:23 -0400 Subject: OGL: Clean up parameters for some functions. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index f5d6431f15..84e009a900 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -159,7 +159,7 @@ GLuint ProgramShaderCache::GetCurrentProgram() return CurrentProgram; } -SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 components ) +SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components) { SHADERUID uid; GetShaderId(&uid, dstAlphaMode, components); @@ -231,7 +231,7 @@ SHADER* ProgramShaderCache::SetShader ( DSTALPHA_MODE dstAlphaMode, u32 componen return &last_entry->shader; } -bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, const char* pcode ) +bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const char* pcode) { GLuint vsid = CompileSingleShader(GL_VERTEX_SHADER, vcode); GLuint psid = CompileSingleShader(GL_FRAGMENT_SHADER, pcode); @@ -526,7 +526,7 @@ void ProgramShaderCache::CreateHeader() } -void ProgramShaderCache::ProgramShaderCacheInserter::Read ( const SHADERUID& key, const u8* value, u32 value_size ) +void ProgramShaderCache::ProgramShaderCacheInserter::Read(const SHADERUID& key, const u8* value, u32 value_size) { const u8 *binary = value+sizeof(GLenum); GLenum *prog_format = (GLenum*)value; -- cgit v1.2.3 From c0f7cab3f5a593b613fc715265921cb390f319ce Mon Sep 17 00:00:00 2001 From: Rohit Nirmal Date: Wed, 10 Sep 2014 12:17:38 -0400 Subject: Remove extra semicolons at the ends of some lines. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 84e009a900..743fc6507c 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -243,7 +243,7 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const return false; } - GLuint pid = shader.glprogid = glCreateProgram();; + GLuint pid = shader.glprogid = glCreateProgram(); glAttachShader(pid, vsid); glAttachShader(pid, psid); -- cgit v1.2.3 From 49b94e52858e5869ea2872ed75810ba075cfa0eb Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 26 Oct 2014 04:53:22 -0400 Subject: OGL: Get rid of error macros --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 743fc6507c..1b0d8db5b8 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -357,7 +357,7 @@ GLuint ProgramShaderCache::CompileSingleShader(GLuint type, const char* code) glDeleteShader(result); return 0; } - (void)GL_REPORT_ERROR(); + return result; } -- cgit v1.2.3 From c211450b997effa6d91059fb0aaa564892297719 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 13 Nov 2014 23:26:49 +0100 Subject: OGL: implement bounding box support with ssbo This implemention tries to be as accurate as the old SW implemention, but it will remove the dependcy of our vertexloader on videosw. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 1b0d8db5b8..f25f9c90cf 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -485,6 +485,7 @@ void ProgramShaderCache::CreateHeader() "%s\n" // msaa "%s\n" // sample shading "%s\n" // Sampler binding + "%s\n" // storage buffer // Precision defines for GLSL ES "%s\n" @@ -516,6 +517,7 @@ void ProgramShaderCache::CreateHeader() , (g_ogl_config.bSupportsMSAA && v < GLSL_150) ? "#extension GL_ARB_texture_multisample : enable" : "" , (g_ogl_config.bSupportSampleShading) ? "#extension GL_ARB_sample_shading : enable" : "" , g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)" + , g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : "" , v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From b005f61a2e8e34e9de10183d1fe6f873f7dd9133 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 16 Oct 2014 18:52:32 +0200 Subject: Add geometry shader generator for stereo 3D. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 42 ++++++++++++++++++---- 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index f25f9c90cf..4efecef4aa 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -36,6 +36,7 @@ ProgramShaderCache::PCacheEntry* ProgramShaderCache::last_entry; SHADERUID ProgramShaderCache::last_uid; UidChecker ProgramShaderCache::pixel_uid_checker; UidChecker ProgramShaderCache::vertex_uid_checker; +UidChecker ProgramShaderCache::geometry_uid_checker; static char s_glsl_header[1024] = ""; @@ -196,13 +197,17 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components VertexShaderCode vcode; PixelShaderCode pcode; + ShaderCode gcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); + if (g_ActiveConfig.bStereo) + GenerateGeometryShaderCode(gcode, components, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) { newentry.shader.strvprog = vcode.GetBuffer(); newentry.shader.strpprog = pcode.GetBuffer(); + newentry.shader.strgprog = gcode.GetBuffer(); } #if defined(_DEBUG) || defined(DEBUGFAST) @@ -214,10 +219,16 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components filename = StringFromFormat("%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); SaveData(filename, pcode.GetBuffer()); + + if (g_ActiveConfig.bStereo) + { + filename = StringFromFormat("%sgs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); + SaveData(filename, gcode.GetBuffer()); + } } #endif - if (!CompileShader(newentry.shader, vcode.GetBuffer(), pcode.GetBuffer())) + if (!CompileShader(newentry.shader, vcode.GetBuffer(), pcode.GetBuffer(), gcode.GetBuffer())) { GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); return nullptr; @@ -231,15 +242,21 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components return &last_entry->shader; } -bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const char* pcode) +bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const char* pcode, const char* gcode) { GLuint vsid = CompileSingleShader(GL_VERTEX_SHADER, vcode); GLuint psid = CompileSingleShader(GL_FRAGMENT_SHADER, pcode); + // Optional geometry shader + GLuint gsid = 0; + if (gcode) + gsid = CompileSingleShader(GL_GEOMETRY_SHADER, gcode); + if (!vsid || !psid) { glDeleteShader(vsid); glDeleteShader(psid); + glDeleteShader(gsid); return false; } @@ -247,6 +264,7 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const glAttachShader(pid, vsid); glAttachShader(pid, psid); + glAttachShader(pid, gsid); if (g_ogl_config.bSupportsGLSLCache) glProgramParameteri(pid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); @@ -258,6 +276,7 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const // original shaders aren't needed any more glDeleteShader(vsid); glDeleteShader(psid); + glDeleteShader(gsid); GLint linkStatus; glGetProgramiv(pid, GL_LINK_STATUS, &linkStatus); @@ -273,7 +292,10 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const std::string filename = StringFromFormat("%sbad_p_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); std::ofstream file; OpenFStream(file, filename, std::ios_base::out); - file << s_glsl_header << vcode << s_glsl_header << pcode << infoLog; + file << s_glsl_header << vcode << s_glsl_header << pcode; + if (gcode) + file << s_glsl_header << gcode; + file << infoLog; file.close(); if (linkStatus != GL_TRUE) @@ -324,11 +346,11 @@ GLuint ProgramShaderCache::CompileSingleShader(GLuint type, const char* code) GLsizei charsWritten; GLchar* infoLog = new GLchar[length]; glGetShaderInfoLog(result, length, &charsWritten, infoLog); - ERROR_LOG(VIDEO, "%s Shader info log:\n%s", type==GL_VERTEX_SHADER ? "VS" : "PS", infoLog); + ERROR_LOG(VIDEO, "%s Shader info log:\n%s", type==GL_VERTEX_SHADER ? "VS" : type==GL_FRAGMENT_SHADER ? "PS" : "GS", infoLog); std::string filename = StringFromFormat("%sbad_%s_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), - type==GL_VERTEX_SHADER ? "vs" : "ps", + type==GL_VERTEX_SHADER ? "vs" : type==GL_FRAGMENT_SHADER ? "ps" : "gs", num_failures++); std::ofstream file; OpenFStream(file, filename, std::ios_base::out); @@ -338,7 +360,7 @@ GLuint ProgramShaderCache::CompileSingleShader(GLuint type, const char* code) if (compileStatus != GL_TRUE) { PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - type == GL_VERTEX_SHADER ? "vertex" : "pixel", + type == GL_VERTEX_SHADER ? "vertex" : type==GL_FRAGMENT_SHADER ? "pixel" : "geometry", filename.c_str(), g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, @@ -365,6 +387,8 @@ void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, { GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components); GetVertexShaderUid(uid->vuid, components, API_OPENGL); + if (g_ActiveConfig.bStereo) + GetGeometryShaderUid(uid->guid, components, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) { @@ -375,6 +399,10 @@ void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, VertexShaderCode vcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); vertex_uid_checker.AddToIndexAndCheck(vcode, uid->vuid, "Vertex", "v"); + + ShaderCode gcode; + GenerateGeometryShaderCode(gcode, components, API_OPENGL); + geometry_uid_checker.AddToIndexAndCheck(gcode, uid->guid, "Geometry", "g"); } } @@ -486,6 +514,7 @@ void ProgramShaderCache::CreateHeader() "%s\n" // sample shading "%s\n" // Sampler binding "%s\n" // storage buffer + "%s\n" // shader5 // Precision defines for GLSL ES "%s\n" @@ -518,6 +547,7 @@ void ProgramShaderCache::CreateHeader() , (g_ogl_config.bSupportSampleShading) ? "#extension GL_ARB_sample_shading : enable" : "" , g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)" , g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : "" + , (g_ogl_config.bSupportGSInvocation) ? "#extension GL_ARB_gpu_shader5 : enable" : "" , v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From d583720a59e51d75c7772d745fb541a5cf00e2b8 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 29 Oct 2014 14:51:12 +0100 Subject: GeometryShaderGen: Support stereoscopy on GPUs without support for instancing. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 4efecef4aa..de86dff177 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -547,7 +547,7 @@ void ProgramShaderCache::CreateHeader() , (g_ogl_config.bSupportSampleShading) ? "#extension GL_ARB_sample_shading : enable" : "" , g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)" , g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : "" - , (g_ogl_config.bSupportGSInvocation) ? "#extension GL_ARB_gpu_shader5 : enable" : "" + , g_ActiveConfig.backend_info.bSupportsGSInstancing ? "#extension GL_ARB_gpu_shader5 : enable" : "" , v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From f370cb386cccfa56e2ef677a55b27561c8217e7d Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 30 Oct 2014 14:24:23 +0100 Subject: ProgramShaderCache: Always generate a geometry shader UID, even if stereoscopy is disabled. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index de86dff177..f32fa7edca 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -220,7 +220,7 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components filename = StringFromFormat("%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); SaveData(filename, pcode.GetBuffer()); - if (g_ActiveConfig.bStereo) + if (gcode.GetBuffer() != nullptr) { filename = StringFromFormat("%sgs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++); SaveData(filename, gcode.GetBuffer()); @@ -387,8 +387,7 @@ void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, { GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components); GetVertexShaderUid(uid->vuid, components, API_OPENGL); - if (g_ActiveConfig.bStereo) - GetGeometryShaderUid(uid->guid, components, API_OPENGL); + GetGeometryShaderUid(uid->guid, components, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) { -- 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/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index f32fa7edca..69dbbac063 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -200,7 +200,7 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components ShaderCode gcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); - if (g_ActiveConfig.bStereo) + if (g_ActiveConfig.iStereoMode > 0) GenerateGeometryShaderCode(gcode, components, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) -- cgit v1.2.3 From aa57feb9a830e1e6b6b398615d05c27e56803be1 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 31 Oct 2014 16:51:37 +0100 Subject: ProgramShaderCache: Don't call glAttachShader if no geometry shader was compiled. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 69dbbac063..9bbdff6d2d 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -264,7 +264,8 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const glAttachShader(pid, vsid); glAttachShader(pid, psid); - glAttachShader(pid, gsid); + if (gsid) + glAttachShader(pid, gsid); if (g_ogl_config.bSupportsGLSLCache) glProgramParameteri(pid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); -- cgit v1.2.3 From 4d075c2efb4c1dda695cd8044b42cf7894b52e5a Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Tue, 4 Nov 2014 00:46:43 +0100 Subject: ProgramShaderCache: Abort shader compilation if geometry shader failed to compile. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 9bbdff6d2d..bf789f46a6 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -252,7 +252,7 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const if (gcode) gsid = CompileSingleShader(GL_GEOMETRY_SHADER, gcode); - if (!vsid || !psid) + if (!vsid || !psid || (gcode && !gsid)) { glDeleteShader(vsid); glDeleteShader(psid); -- cgit v1.2.3 From 38dfc970dfca3cf1d519fd16b2aeeba7b146ebe5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 29 Nov 2014 01:27:47 -0600 Subject: Fixes OpenGL ES rendering. sampler2DArray doesn't have a default precision, so we need to set it ourselves. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index bf789f46a6..0249ce3c95 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -519,6 +519,7 @@ void ProgramShaderCache::CreateHeader() // Precision defines for GLSL ES "%s\n" "%s\n" + "%s\n" // Silly differences "#define float2 vec2\n" @@ -551,6 +552,7 @@ void ProgramShaderCache::CreateHeader() , v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" + , v>=GLSLES_300 ? "precision highp sampler2DArray;" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENTEXTURESIZE) ? "#define textureSize(x, y) ivec2(1, 1)" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "#define centroid" : "" -- cgit v1.2.3 From ce7c52eca0bb54fc6b1085c329a6fd42faac3aee Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 7 Dec 2014 05:29:36 +0000 Subject: Enables stereo rendering with OpenGL ES 3.1 + AEP. If the host device supports GLES 3.1 and AEP we can have stereo rendering. Just need to make sure to grab the correct function pointer that GL_EXT_geometry_shader provides, and enable AEP in the shaders. We can't just check if AEP is in the extension list for support because Qualcomm has failed once more. With the Nexus 6 it reports support for AEP but doesn't support OpenGL ES 3.1, which is an impossible combination. From reports on their forum it seems that attempting to use any AEP things results in nothing happening, seems like a stub implementation. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 0249ce3c95..cb0ba569ba 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -505,6 +505,7 @@ void ProgramShaderCache::Shutdown() void ProgramShaderCache::CreateHeader() { GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; + snprintf(s_glsl_header, sizeof(s_glsl_header), "%s\n" "%s\n" // ubo @@ -515,6 +516,7 @@ void ProgramShaderCache::CreateHeader() "%s\n" // Sampler binding "%s\n" // storage buffer "%s\n" // shader5 + "%s\n" // AEP // Precision defines for GLSL ES "%s\n" @@ -549,6 +551,7 @@ void ProgramShaderCache::CreateHeader() , g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)" , g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : "" , g_ActiveConfig.backend_info.bSupportsGSInstancing ? "#extension GL_ARB_gpu_shader5 : enable" : "" + , g_ogl_config.bSupportsAEP ? "#extension GL_ANDROID_extension_pack_es31a : enable" : "" , v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From b030d290671c283020c405dfd9e8658935dcf1cf Mon Sep 17 00:00:00 2001 From: Rohit Nirmal Date: Tue, 2 Dec 2014 18:20:52 -0600 Subject: Silence some -Wswitch-default warnings. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 0249ce3c95..18c0f57d78 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -55,9 +55,10 @@ static std::string GetGLSLVersionString() return "#version 140"; case GLSL_150: return "#version 150"; + default: + // Shouldn't ever hit this + return "#version ERROR"; } - // Shouldn't ever hit this - return "#version ERROR"; } void SHADER::SetProgramVariables() -- cgit v1.2.3 From b406e4e1f2c696ba5f6bec04ea2e6a8cc03a02d1 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 14 Dec 2014 21:23:13 +0100 Subject: VideoCommon: Add a separate constants buffer for the geometry shader. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 439c4c9040..08b22e8071 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -13,6 +13,7 @@ #include "VideoCommon/Debugger.h" #include "VideoCommon/DriverDetails.h" +#include "VideoCommon/GeometryShaderManager.h" #include "VideoCommon/ImageWrite.h" #include "VideoCommon/PixelShaderManager.h" #include "VideoCommon/Statistics.h" @@ -71,11 +72,14 @@ void SHADER::SetProgramVariables() GLint PSBlock_id = glGetUniformBlockIndex(glprogid, "PSBlock"); GLint VSBlock_id = glGetUniformBlockIndex(glprogid, "VSBlock"); + GLint GSBlock_id = glGetUniformBlockIndex(glprogid, "GSBlock"); if (PSBlock_id != -1) glUniformBlockBinding(glprogid, PSBlock_id, 1); if (VSBlock_id != -1) glUniformBlockBinding(glprogid, VSBlock_id, 2); + if (GSBlock_id != -1) + glUniformBlockBinding(glprogid, GSBlock_id, 3); // Bind Texture Sampler for (int a = 0; a <= 9; ++a) @@ -133,7 +137,7 @@ void SHADER::Bind() void ProgramShaderCache::UploadConstants() { - if (PixelShaderManager::dirty || VertexShaderManager::dirty) + if (PixelShaderManager::dirty || VertexShaderManager::dirty || GeometryShaderManager::dirty) { auto buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); @@ -143,14 +147,20 @@ void ProgramShaderCache::UploadConstants() memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants)); + memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align), + &GeometryShaderManager::constants, sizeof(GeometryShaderConstants)); + s_buffer->Unmap(s_ubo_buffer_size); glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->m_buffer, buffer.second, sizeof(PixelShaderConstants)); glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants)); + glBindBufferRange(GL_UNIFORM_BUFFER, 3, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align), + sizeof(GeometryShaderConstants)); PixelShaderManager::dirty = false; VertexShaderManager::dirty = false; + GeometryShaderManager::dirty = false; ADDSTAT(stats.thisFrame.bytesUniformStreamed, s_ubo_buffer_size); } @@ -419,7 +429,7 @@ void ProgramShaderCache::Init() // then the UBO will fail. glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &s_ubo_align); - s_ubo_buffer_size = ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align); + s_ubo_buffer_size = ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align) + ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align) + ROUND_UP(sizeof(GeometryShaderConstants), s_ubo_align); // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s -- cgit v1.2.3 From aa4242fd9c807633f090baac2350f786a67ebe3d Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 14 Dec 2014 19:41:16 +0100 Subject: GeometryShaderGen: Pass the primitive type and always run the generator regardless of stereoscopy. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 08b22e8071..8a159ea9a6 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -171,10 +171,10 @@ GLuint ProgramShaderCache::GetCurrentProgram() return CurrentProgram; } -SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components) +SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components, u32 primitive_type) { SHADERUID uid; - GetShaderId(&uid, dstAlphaMode, components); + GetShaderId(&uid, dstAlphaMode, components, primitive_type); // Check if the shader is already set if (last_entry) @@ -211,8 +211,7 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components ShaderCode gcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); - if (g_ActiveConfig.iStereoMode > 0) - GenerateGeometryShaderCode(gcode, components, API_OPENGL); + GenerateGeometryShaderCode(gcode, primitive_type, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) { @@ -395,7 +394,7 @@ GLuint ProgramShaderCache::CompileSingleShader(GLuint type, const char* code) return result; } -void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 components) +void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 components, u32 primitive_type) { GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components); GetVertexShaderUid(uid->vuid, components, API_OPENGL); @@ -412,7 +411,7 @@ void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, vertex_uid_checker.AddToIndexAndCheck(vcode, uid->vuid, "Vertex", "v"); ShaderCode gcode; - GenerateGeometryShaderCode(gcode, components, API_OPENGL); + GenerateGeometryShaderCode(gcode, primitive_type, API_OPENGL); geometry_uid_checker.AddToIndexAndCheck(gcode, uid->guid, "Geometry", "g"); } } -- cgit v1.2.3 From 382e1c22db91d863b55d6223d4893cb629dab810 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sun, 14 Dec 2014 22:27:09 +0100 Subject: GeometryShaderGen: Support multiple primitive types. And make more stereoscopy code optional. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 8a159ea9a6..d2ec0d049b 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -398,7 +398,7 @@ void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, { GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components); GetVertexShaderUid(uid->vuid, components, API_OPENGL); - GetGeometryShaderUid(uid->guid, components, API_OPENGL); + GetGeometryShaderUid(uid->guid, primitive_type, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) { -- cgit v1.2.3 From bd6d22973381b43369670300a707e86084c040e0 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Tue, 16 Dec 2014 17:28:35 +0100 Subject: GeometryShader: Disable the geometry shader stage if it is a pass-through shader. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index d2ec0d049b..8f90aff28a 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -211,7 +211,8 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components ShaderCode gcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); - GenerateGeometryShaderCode(gcode, primitive_type, API_OPENGL); + if (!IsPassthroughGeometryShader(uid.guid)) + GenerateGeometryShaderCode(gcode, primitive_type, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) { -- cgit v1.2.3 From 7e8f96f0d3649f20483a639ac37f489737cba500 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 17 Dec 2014 00:26:03 +0100 Subject: OGL: Don't generate a geometry shader if the backend doesn't support it. This commit repurposes the bSupportsStereoscopy flag as the bSupportsGeometryShaders flag. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 8f90aff28a..14f5f94c82 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -211,7 +211,7 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components ShaderCode gcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); - if (!IsPassthroughGeometryShader(uid.guid)) + if (g_ActiveConfig.backend_info.bSupportsGeometryShaders && !IsPassthroughGeometryShader(uid.guid)) GenerateGeometryShaderCode(gcode, primitive_type, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) -- cgit v1.2.3 From 1b9fe70d7c0b567c7930297af296e765e91bc02b Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 19 Dec 2014 13:10:06 +0100 Subject: VideoCommon: Make IsPassthrough() a function of the ShaderUid. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 14f5f94c82..01c1d43035 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -211,7 +211,7 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components ShaderCode gcode; GenerateVertexShaderCode(vcode, components, API_OPENGL); GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components); - if (g_ActiveConfig.backend_info.bSupportsGeometryShaders && !IsPassthroughGeometryShader(uid.guid)) + if (g_ActiveConfig.backend_info.bSupportsGeometryShaders && !uid.guid.GetUidData()->IsPassthrough()) GenerateGeometryShaderCode(gcode, primitive_type, API_OPENGL); if (g_ActiveConfig.bEnableShaderDebugging) -- cgit v1.2.3 From ac7102918dfcee7127b39f981f2c8f475212879e Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 21 Feb 2015 00:12:27 +0100 Subject: OGL: support palette texture decoding --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 01c1d43035..e0f0eac72d 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -528,6 +528,7 @@ void ProgramShaderCache::CreateHeader() "%s\n" // storage buffer "%s\n" // shader5 "%s\n" // AEP + "%s\n" // texture buffer // Precision defines for GLSL ES "%s\n" @@ -563,6 +564,7 @@ void ProgramShaderCache::CreateHeader() , g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : "" , g_ActiveConfig.backend_info.bSupportsGSInstancing ? "#extension GL_ARB_gpu_shader5 : enable" : "" , g_ogl_config.bSupportsAEP ? "#extension GL_ANDROID_extension_pack_es31a : enable" : "" + , v=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp int;" : "" -- cgit v1.2.3 From 728081dad2223b4047cff359b1b414260060ee21 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Mon, 2 Mar 2015 14:59:18 +0100 Subject: ProgramShaderCache: Do plenty of error checking before writing shaders to the disk. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index e0f0eac72d..47a8151286 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -473,25 +473,33 @@ void ProgramShaderCache::Shutdown() { for (auto& entry : pshaders) { + // Clear any prior error code + glGetError(); + if (entry.second.in_cache) { continue; } - GLint binary_size; + GLint link_status = GL_FALSE, delete_status = GL_TRUE, binary_size = 0; + glGetProgramiv(entry.second.shader.glprogid, GL_LINK_STATUS, &link_status); + glGetProgramiv(entry.second.shader.glprogid, GL_DELETE_STATUS, &delete_status); glGetProgramiv(entry.second.shader.glprogid, GL_PROGRAM_BINARY_LENGTH, &binary_size); - if (!binary_size) + if (glGetError() != GL_NO_ERROR || link_status == GL_FALSE || delete_status == GL_TRUE || !binary_size) { continue; } - u8 *data = new u8[binary_size+sizeof(GLenum)]; - u8 *binary = data + sizeof(GLenum); - GLenum *prog_format = (GLenum*)data; + std::vector data(binary_size + sizeof(GLenum)); + u8* binary = &data[sizeof(GLenum)]; + GLenum* prog_format = (GLenum*)&data[0]; glGetProgramBinary(entry.second.shader.glprogid, binary_size, nullptr, prog_format, binary); + if (glGetError() != GL_NO_ERROR) + { + continue; + } - g_program_disk_cache.Append(entry.first, data, binary_size+sizeof(GLenum)); - delete [] data; + g_program_disk_cache.Append(entry.first, &data[0], binary_size + sizeof(GLenum)); } g_program_disk_cache.Sync(); -- cgit v1.2.3 From 3c5e99c777f8300b06e53ec3040446fb074473f5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Fri, 27 Feb 2015 19:38:51 -0600 Subject: Fix OpenGL ES 3.1 on non-Nvidia devices. We are declaring we require ARB_shader_image_load_store in the shader, this isn't an extension on GLES because it is part of the GLSL ES 3.1 spec. If we are running as GLES then just not put it in the shaders. --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index e0f0eac72d..01b0af3f45 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -516,6 +516,7 @@ void ProgramShaderCache::Shutdown() void ProgramShaderCache::CreateHeader() { GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; + bool is_glsles = v >= GLSLES_300; snprintf(s_glsl_header, sizeof(s_glsl_header), "%s\n" @@ -556,7 +557,7 @@ void ProgramShaderCache::CreateHeader() , GetGLSLVersionString().c_str() , v=GLSLES_300 ? "precision highp float;" : "" - , v>=GLSLES_300 ? "precision highp int;" : "" - , v>=GLSLES_300 ? "precision highp sampler2DArray;" : "" + , is_glsles ? "precision highp float;" : "" + , is_glsles ? "precision highp int;" : "" + , is_glsles ? "precision highp sampler2DArray;" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENTEXTURESIZE) ? "#define textureSize(x, y) ivec2(1, 1)" : "" , DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "#define centroid" : "" -- cgit v1.2.3 From cefcb0ace9d363b3679b4e93bcc9ec05f1e5f4f8 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Mon, 18 May 2015 01:08:10 +0200 Subject: Update license headers to GPLv2+ --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 1f48483cef..46af31d0b2 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -1,5 +1,5 @@ // Copyright 2013 Dolphin Emulator Project -// Licensed under GPLv2 +// Licensed under GPLv2+ // Refer to the license.txt file included. #include -- cgit v1.2.3 From 30ebb2459eb97ba544547183854775df8460b475 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 24 May 2015 06:55:12 +0200 Subject: Set copyright year to when a file was created --- Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 46af31d0b2..9bb0a72014 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -1,4 +1,4 @@ -// Copyright 2013 Dolphin Emulator Project +// Copyright 2011 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. -- cgit v1.2.3 From 95a2abc1ce6d0d9304f32725cdf784f2e3d7d1f3 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 15 Mar 2015 16:42:22 +0100 Subject: Use PanicAlertT instead of PanicAlert when appropriate I tried to change messages that contained instructions for users, while avoiding messages that are so technical that most users wouldn't understand them even if they were in the right language. --- .../Core/VideoBackends/OGL/ProgramShaderCache.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp') diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 9bb0a72014..4ff8bf28de 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -312,12 +312,10 @@ bool ProgramShaderCache::CompileShader(SHADER& shader, const char* vcode, const if (linkStatus != GL_TRUE) { - PanicAlert("Failed to link shaders!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - filename.c_str(), - g_ogl_config.gl_vendor, - g_ogl_config.gl_renderer, - g_ogl_config.gl_version, - infoLog); + PanicAlert("Failed to link shaders: %s\n" + "Debug info (%s, %s, %s):\n%s", + filename.c_str(), + g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, g_ogl_config.gl_version, infoLog); } delete [] infoLog; @@ -371,13 +369,11 @@ GLuint ProgramShaderCache::CompileSingleShader(GLuint type, const char* code) if (compileStatus != GL_TRUE) { - PanicAlert("Failed to compile %s shader!\nThis usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series.\n\nIf you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums.\n\nDebug info (%s, %s, %s):\n%s", - type == GL_VERTEX_SHADER ? "vertex" : type==GL_FRAGMENT_SHADER ? "pixel" : "geometry", - filename.c_str(), - g_ogl_config.gl_vendor, - g_ogl_config.gl_renderer, - g_ogl_config.gl_version, - infoLog); + PanicAlert("Failed to compile %s shader: %s\n" + "Debug info (%s, %s, %s):\n%s", + type == GL_VERTEX_SHADER ? "vertex" : type==GL_FRAGMENT_SHADER ? "pixel" : "geometry", + filename.c_str(), + g_ogl_config.gl_vendor, g_ogl_config.gl_renderer, g_ogl_config.gl_version, infoLog); } delete[] infoLog; -- cgit v1.2.3