void ShaderCache::Shutdown() { Clear(); s_gs_disk_cache.Sync(); s_gs_disk_cache.Close(); s_ps_disk_cache.Sync(); s_ps_disk_cache.Close(); s_vs_disk_cache.Sync(); s_vs_disk_cache.Close(); }
void StateCache::Reload() { m_small_pso_map.clear(); s_pso_disk_cache.Sync(); s_pso_disk_cache.Close(); LoadFromDisk(); }
void VertexShaderCache::Reload() { g_async_compiler->WaitUntilCompletion(); g_async_compiler->RetrieveWorkItems(); g_vs_disk_cache.Sync(); g_vs_disk_cache.Close(); g_uber_vs_disk_cache.Sync(); g_uber_vs_disk_cache.Close(); Clear(); if (g_ActiveConfig.bShaderCache) LoadShaderCache(); if (g_ActiveConfig.CanPrecompileUberShaders()) QueueUberShaderCompiles(); }
void StateCache::Clear() { m_pso_map.clear(); m_small_pso_map.clear(); s_pso_disk_cache.Sync(); s_pso_disk_cache.Close(); }
void GeometryShaderCache::Reload() { g_gs_disk_cache.Sync(); g_gs_disk_cache.Close(); Clear(); if (g_ActiveConfig.bShaderCache) LoadShaderCache(); }
void VertexShaderCache::Shutdown() { g_async_compiler->StopWorkerThreads(); g_async_compiler->RetrieveWorkItems(); SAFE_RELEASE(vscbuf); SAFE_RELEASE(SimpleVertexShader); SAFE_RELEASE(ClearVertexShader); SAFE_RELEASE(SimpleLayout); SAFE_RELEASE(ClearLayout); Clear(); g_vs_disk_cache.Sync(); g_vs_disk_cache.Close(); g_uber_vs_disk_cache.Sync(); g_uber_vs_disk_cache.Close(); }
void GeometryShaderCache::Shutdown() { D3D::commandListMgr->DestroyResourceAfterCurrentCommandListExecuted(gscbuf12); ClearGeometryShaderBlob->Release(); CopyGeometryShaderBlob->Release(); Clear(); g_gs_disk_cache.Sync(); g_gs_disk_cache.Close(); }
void GeometryShaderCache::Shutdown() { SAFE_RELEASE(gscbuf); SAFE_RELEASE(ClearGeometryShader); SAFE_RELEASE(CopyGeometryShader); Clear(); g_gs_disk_cache.Sync(); g_gs_disk_cache.Close(); }
void ProgramShaderCache::Shutdown() { // store all shaders in cache on disk if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) { for (auto& entry : pshaders) { // Clear any prior error code glGetError(); if (entry.second.in_cache) { continue; } 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 (glGetError() != GL_NO_ERROR || link_status == GL_FALSE || delete_status == GL_TRUE || !binary_size) { continue; } std::vector<u8> 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[0], binary_size + sizeof(GLenum)); } g_program_disk_cache.Sync(); g_program_disk_cache.Close(); } glUseProgram(0); for (auto& entry : pshaders) { entry.second.Destroy(); } pshaders.clear(); pixel_uid_checker.Invalidate(); vertex_uid_checker.Invalidate(); delete s_buffer; s_buffer = nullptr; }
void ShaderCache::Shutdown() { if (s_compiler) { s_compiler->WaitForFinish(); } for (auto& iter : s_shader_blob_list) SAFE_RELEASE(iter); s_shader_blob_list.clear(); vs_bytecode_cache->Persist(); delete vs_bytecode_cache; vs_bytecode_cache = nullptr; gs_bytecode_cache->Persist(); delete gs_bytecode_cache; gs_bytecode_cache = nullptr; ts_bytecode_cache->Persist(); delete ts_bytecode_cache; ts_bytecode_cache = nullptr; ps_bytecode_cache->Persist(); delete ps_bytecode_cache; ps_bytecode_cache = nullptr; s_ds_disk_cache.Sync(); s_ds_disk_cache.Close(); s_hs_disk_cache.Sync(); s_hs_disk_cache.Close(); s_gs_disk_cache.Sync(); s_gs_disk_cache.Close(); s_ps_disk_cache.Sync(); s_ps_disk_cache.Close(); s_vs_disk_cache.Sync(); s_vs_disk_cache.Close(); }
void VertexShaderCache::Shutdown() { SAFE_RELEASE(vscbuf); SAFE_RELEASE(SimpleVertexShader); SAFE_RELEASE(ClearVertexShader); SAFE_RELEASE(SimpleLayout); SAFE_RELEASE(ClearLayout); Clear(); g_vs_disk_cache.Sync(); g_vs_disk_cache.Close(); }
void StateCache::Clear() { for (auto& it : m_pso_map) { SAFE_RELEASE(it.second); } m_pso_map.clear(); for (auto& it : m_small_pso_map) { SAFE_RELEASE(it.second); } m_small_pso_map.clear(); s_pso_disk_cache.Sync(); s_pso_disk_cache.Close(); }
void ProgramShaderCache::Shutdown() { // store all shaders in cache on disk if (g_ogl_config.bSupportsGLSLCache && !g_Config.bEnableShaderDebugging) { for (auto& entry : pshaders) { if (entry.second.in_cache) { continue; } GLint binary_size; 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(entry.second.shader.glprogid, binary_size, nullptr, prog_format, binary); g_program_disk_cache.Append(entry.first, data, binary_size+sizeof(GLenum)); delete [] data; } g_program_disk_cache.Sync(); g_program_disk_cache.Close(); } glUseProgram(0); for (auto& entry : pshaders) { entry.second.Destroy(); } pshaders.clear(); pixel_uid_checker.Invalidate(); vertex_uid_checker.Invalidate(); delete s_buffer; s_buffer = nullptr; }
void VertexShaderCache::Shutdown() { for (int i = 0; i < MAX_SSAA_SHADERS; i++) { if (SimpleVertexShader[i]) SimpleVertexShader[i]->Release(); SimpleVertexShader[i] = NULL; } if (ClearVertexShader) ClearVertexShader->Release(); ClearVertexShader = NULL; Clear(); g_vs_disk_cache.Sync(); g_vs_disk_cache.Close(); }
void ProgramShaderCache::Shutdown(void) { // store all shaders in cache on disk if (g_ogl_config.bSupportsGLSLCache) { 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; delete [] s_ubo_buffer; s_ubo_buffer = 0; } }
void PixelShaderCache::Shutdown() { SAFE_RELEASE(pscbuf); SAFE_RELEASE(s_ClearProgram); for (int i = 0; i < 2; ++i) { SAFE_RELEASE(s_ColorCopyProgram[i]); SAFE_RELEASE(s_ColorMatrixProgram[i]); SAFE_RELEASE(s_DepthMatrixProgram[i]); SAFE_RELEASE(s_rgba6_to_rgb8[i]); SAFE_RELEASE(s_rgb8_to_rgba6[i]); } Clear(); g_ps_disk_cache.Sync(); g_ps_disk_cache.Close(); }
bool VertexShaderCache::SetShader(u32 components) { VERTEXSHADERUID uid; GetVertexShaderId(&uid, components); if (uid == last_vertex_shader_uid && vshaders[uid].frameCount == frameCount) { GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); return (vshaders[uid].shader != NULL); } memcpy(&last_vertex_shader_uid, &uid, sizeof(VERTEXSHADERUID)); VSCache::iterator iter = vshaders.find(uid); if (iter != vshaders.end()) { iter->second.frameCount = frameCount; const VSCacheEntry &entry = iter->second; last_entry = &entry; if (entry.shader) D3D::SetVertexShader(entry.shader); GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); return (entry.shader != NULL); } const char *code = GenerateVertexShaderCode(components, API_D3D9); u8 *bytecode; int bytecodelen; if (!D3D::CompileVertexShader(code, (int)strlen(code), &bytecode, &bytecodelen)) { if (g_ActiveConfig.bShowShaderErrors) { PanicAlert("Failed to compile Vertex Shader:\n\n%s", code); } GFX_DEBUGGER_PAUSE_AT(NEXT_ERROR, true); return false; } g_vs_disk_cache.Append(uid, bytecode, bytecodelen); g_vs_disk_cache.Sync(); bool result = InsertByteCode(uid, bytecode, bytecodelen, true); delete [] bytecode; GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true); return result; }