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= 310) || GLExtensions::Supports("GL_NV_primitive_restart")); g_Config.backend_info.bSupportsEarlyZ = GLExtensions::Supports("GL_ARB_shader_image_load_store"); @@ -520,14 +534,6 @@ Renderer::Renderer() if(g_ogl_config.max_samples < 1) g_ogl_config.max_samples = 1; - if(g_Config.backend_info.bSupportsGLSLUBO && DriverDetails::HasBug(DriverDetails::BUG_BROKENUBO)) - { - g_Config.backend_info.bSupportsGLSLUBO = false; - ERROR_LOG(VIDEO, "Buggy driver detected. Disable UBO"); - OSD::AddMessage("Major performance warning: Buggy GPU driver detected.", 20000); - OSD::AddMessage("Please either install the closed-source GPU driver or update your Mesa 3D version.", 20000); - } - UpdateActiveConfig(); OSD::AddMessage(StringFromFormat("Video Info: %s, %s, %s", @@ -535,9 +541,8 @@ Renderer::Renderer() g_ogl_config.gl_renderer, g_ogl_config.gl_version), 5000); - WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s%s", + WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s", g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ", - g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "" : "UniformBuffer ", g_ActiveConfig.backend_info.bSupportsPrimitiveRestart ? "" : "PrimitiveRestart ", g_ActiveConfig.backend_info.bSupportsEarlyZ ? "" : "EarlyZ ", g_ogl_config.bSupportsGLPinnedMemory ? "" : "PinnedMemory ", diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp index dba3874ec6..aed97e2ebd 100644 --- a/Source/Core/VideoBackends/OGL/VertexManager.cpp +++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp @@ -186,11 +186,6 @@ void VertexManager::vFlush() if (useDstAlpha && !dualSourcePossible) { ProgramShaderCache::SetShader(DSTALPHA_ALPHA_PASS,g_nativeVertexFmt->m_components); - if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO) - { - // Need to upload these again, if we don't support UBO - ProgramShaderCache::UploadConstants(); - } // only update alpha glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index 79d3a38835..eb9d79ed3d 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -283,23 +283,23 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T } out.Write("\n"); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (ApiType == API_OPENGL) out.Write("layout(std140%s) uniform PSBlock {\n", g_ActiveConfig.backend_info.bSupportShadingLanguage420pack ? ", binding = 1" : ""); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_COLORS, "float4", I_COLORS"[4]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_KCOLORS, "float4", I_KCOLORS"[4]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_ALPHA, "float4", I_ALPHA"[1]"); // TODO: Why is this an array...-.- - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_TEXDIMS, "float4", I_TEXDIMS"[8]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_ZBIAS, "float4", I_ZBIAS"[2]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_INDTEXSCALE, "float4", I_INDTEXSCALE"[2]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_INDTEXMTX, "float4", I_INDTEXMTX"[6]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_FOG, "float4", I_FOG"[3]"); + DeclareUniform(out, ApiType, C_COLORS, "float4", I_COLORS"[4]"); + DeclareUniform(out, ApiType, C_KCOLORS, "float4", I_KCOLORS"[4]"); + DeclareUniform(out, ApiType, C_ALPHA, "float4", I_ALPHA"[1]"); // TODO: Why is this an array...-.- + DeclareUniform(out, ApiType, C_TEXDIMS, "float4", I_TEXDIMS"[8]"); + DeclareUniform(out, ApiType, C_ZBIAS, "float4", I_ZBIAS"[2]"); + DeclareUniform(out, ApiType, C_INDTEXSCALE, "float4", I_INDTEXSCALE"[2]"); + DeclareUniform(out, ApiType, C_INDTEXMTX, "float4", I_INDTEXMTX"[6]"); + DeclareUniform(out, ApiType, C_FOG, "float4", I_FOG"[3]"); // For pixel lighting - TODO: Should only be defined when per pixel lighting is enabled! - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_PLIGHTS, "float4", I_PLIGHTS"[40]"); - DeclareUniform(out, ApiType, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_PMATERIALS, "float4", I_PMATERIALS"[4]"); + DeclareUniform(out, ApiType, C_PLIGHTS, "float4", I_PLIGHTS"[40]"); + DeclareUniform(out, ApiType, C_PMATERIALS, "float4", I_PMATERIALS"[4]"); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (ApiType == API_OPENGL) out.Write("};\n"); if (ApiType == API_OPENGL) diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index b56e9f29ff..96db35d7bd 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -174,18 +174,18 @@ static inline void WriteRegister(T& object, API_TYPE ApiType, const char *prefix } template -static inline void WriteLocation(T& object, API_TYPE ApiType, bool using_ubos) +static inline void WriteLocation(T& object, API_TYPE ApiType) { - if (using_ubos) + if (ApiType == API_OPENGL) return; object.Write("uniform "); } template -static inline void DeclareUniform(T& object, API_TYPE api_type, bool using_ubos, const u32 num, const char* type, const char* name) +static inline void DeclareUniform(T& object, API_TYPE api_type, const u32 num, const char* type, const char* name) { - WriteLocation(object, api_type, using_ubos); + WriteLocation(object, api_type); object.Write("%s %s ", type, name); WriteRegister(object, api_type, "c", num); object.Write(";\n"); diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp index b805b0459a..5d1855d8d9 100644 --- a/Source/Core/VideoCommon/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/VertexShaderGen.cpp @@ -83,20 +83,20 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ _assert_(bpmem.genMode.numcolchans == xfregs.numChan.numColorChans); // uniforms - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (api_type == API_OPENGL) out.Write("layout(std140%s) uniform VSBlock {\n", g_ActiveConfig.backend_info.bSupportShadingLanguage420pack ? ", binding = 2" : ""); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_POSNORMALMATRIX, "float4", I_POSNORMALMATRIX"[6]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_PROJECTION, "float4", I_PROJECTION"[4]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_MATERIALS, "float4", I_MATERIALS"[4]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_LIGHTS, "float4", I_LIGHTS"[40]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_TEXMATRICES, "float4", I_TEXMATRICES"[24]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_TRANSFORMMATRICES, "float4", I_TRANSFORMMATRICES"[64]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_NORMALMATRICES, "float4", I_NORMALMATRICES"[32]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_POSTTRANSFORMMATRICES, "float4", I_POSTTRANSFORMMATRICES"[64]"); - DeclareUniform(out, api_type, g_ActiveConfig.backend_info.bSupportsGLSLUBO, C_DEPTHPARAMS, "float4", I_DEPTHPARAMS); + DeclareUniform(out, api_type, C_POSNORMALMATRIX, "float4", I_POSNORMALMATRIX"[6]"); + DeclareUniform(out, api_type, C_PROJECTION, "float4", I_PROJECTION"[4]"); + DeclareUniform(out, api_type, C_MATERIALS, "float4", I_MATERIALS"[4]"); + DeclareUniform(out, api_type, C_LIGHTS, "float4", I_LIGHTS"[40]"); + DeclareUniform(out, api_type, C_TEXMATRICES, "float4", I_TEXMATRICES"[24]"); + DeclareUniform(out, api_type, C_TRANSFORMMATRICES, "float4", I_TRANSFORMMATRICES"[64]"); + DeclareUniform(out, api_type, C_NORMALMATRICES, "float4", I_NORMALMATRICES"[32]"); + DeclareUniform(out, api_type, C_POSTTRANSFORMMATRICES, "float4", I_POSTTRANSFORMMATRICES"[64]"); + DeclareUniform(out, api_type, C_DEPTHPARAMS, "float4", I_DEPTHPARAMS); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) + if (api_type == API_OPENGL) out.Write("};\n"); GenerateVSOutputStruct(out, api_type); diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 9de5aa5505..37c68786dd 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -215,7 +215,6 @@ void VideoConfig::VerifyValidity() if (!backend_info.bSupports3DVision) b3DVision = false; if (!backend_info.bSupportsFormatReinterpretation) bEFBEmulateFormatChanges = false; if (!backend_info.bSupportsPixelLighting) bEnablePixelLighting = false; - if (backend_info.APIType != API_OPENGL) backend_info.bSupportsGLSLUBO = false; } void VideoConfig::Save(const char *ini_file) diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index bbd1f6603e..08702e84ca 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -150,7 +150,6 @@ struct VideoConfig bool bSupportsPrimitiveRestart; bool bSupportsSeparateAlphaFunction; bool bSupportsOversizedViewports; - bool bSupportsGLSLUBO; // needed by PixelShaderGen, so must stay in VideoCommon bool bSupportsEarlyZ; // needed by PixelShaderGen, so must stay in VideoCommon bool bSupportShadingLanguage420pack; // needed by ShaderGen, so must stay in VideoCommon } backend_info;