| 206 | } |
| 207 | |
| 208 | void ShaderMapImpl::garbage_collect(uint64_t critical_frame) SKR_NOEXCEPT |
| 209 | { |
| 210 | // erase request when exit this scope |
| 211 | // SKR_DEFER({factory->mShaderTasks.erase(identifier);}); |
| 212 | for (auto it = mShaderMap.begin(); it != mShaderMap.end();) |
| 213 | { |
| 214 | auto status = skr_atomicu32_load_relaxed(&it->second->shader_status); |
| 215 | if (status == SKR_SHADER_MAP_SHADER_STATUS_INSTALLED) |
| 216 | { |
| 217 | mShaderTasks.erase(it->first); |
| 218 | } |
| 219 | |
| 220 | if (skr_atomicu32_load_relaxed(&it->second->rc) == 0 && |
| 221 | skr_atomicu64_load_relaxed(&it->second->frame) < critical_frame) |
| 222 | { |
| 223 | if (mShaderTasks.find(it->first) != mShaderTasks.end()) |
| 224 | { |
| 225 | // shader is still loading, skip & wait for it to finish |
| 226 | // TODO: cancel shader loading |
| 227 | ++it; |
| 228 | } |
| 229 | else |
| 230 | { |
| 231 | it = mShaderMap.erase(it); |
| 232 | } |
| 233 | } |
| 234 | else |
| 235 | { |
| 236 | ++it; |
| 237 | } |
| 238 | } |
| 239 | } |
| 240 | } // namespace skr |
| 241 | |
| 242 | skr_shader_map_id skr_shader_map_t::Create(const struct skr_shader_map_root_t* desc) SKR_NOEXCEPT |
no test coverage detected