bool Shader::generateInstances() { for (int i = 0; i < m_instances.size(); ++i) { LUMIX_DELETE(m_allocator, m_instances[i]); } m_instances.clear(); uint32 count = 1 << m_combintions.m_define_count; auto* binary_manager = m_resource_manager.get(ResourceManager::SHADER_BINARY); char basename[MAX_PATH_LENGTH]; PathUtils::getBasename(basename, sizeof(basename), getPath().c_str()); for (uint32 mask = 0; mask < count; ++mask) { ShaderInstance* instance = LUMIX_NEW(m_allocator, ShaderInstance)(*this); m_instances.push(instance); instance->m_define_mask = getDefineMaskFromDense(mask); for (int pass_idx = 0; pass_idx < m_combintions.m_pass_count; ++pass_idx) { const char* pass = m_combintions.m_passes[pass_idx]; char path[MAX_PATH_LENGTH]; copyString(path, "shaders/compiled/"); catString(path, basename); catString(path, "_"); catString(path, pass); char mask_str[10]; int actual_mask = mask & m_combintions.m_vs_local_mask[pass_idx]; toCString(actual_mask, mask_str, sizeof(mask_str)); catString(path, mask_str); catString(path, "_vs.shb"); Path vs_path(path); auto* vs_binary = static_cast<ShaderBinary*>(binary_manager->load(vs_path)); addDependency(*vs_binary); instance->m_binaries[pass_idx * 2] = vs_binary; copyString(path, "shaders/compiled/"); catString(path, basename); catString(path, "_"); catString(path, pass); actual_mask = mask & m_combintions.m_fs_local_mask[pass_idx]; toCString(actual_mask, mask_str, sizeof(mask_str)); catString(path, mask_str); catString(path, "_fs.shb"); Path fs_path(path); auto* fs_binary = static_cast<ShaderBinary*>(binary_manager->load(fs_path)); addDependency(*fs_binary); instance->m_binaries[pass_idx * 2 + 1] = fs_binary; } } return true; }
bool Shader::generateInstances() { bool is_opengl = getRenderer().isOpenGL(); for (int i = 0; i < m_instances.size(); ++i) { LUMIX_DELETE(m_allocator, m_instances[i]); } m_instances.clear(); uint32 count = 1 << m_combintions.define_count; auto* binary_manager = m_resource_manager.get(SHADER_BINARY_HASH); char basename[MAX_PATH_LENGTH]; PathUtils::getBasename(basename, sizeof(basename), getPath().c_str()); for (uint32 mask = 0; mask < count; ++mask) { ShaderInstance* instance = LUMIX_NEW(m_allocator, ShaderInstance)(*this); m_instances.push(instance); instance->define_mask = getDefineMaskFromDense(*this, mask); m_all_defines_mask |= instance->define_mask; for (int pass_idx = 0; pass_idx < m_combintions.pass_count; ++pass_idx) { const char* pass = m_combintions.passes[pass_idx]; StaticString<MAX_PATH_LENGTH> path("shaders/compiled", is_opengl ? "_gl/" : "/"); int actual_mask = mask & m_combintions.vs_local_mask[pass_idx]; path << basename << "_" << pass << actual_mask << "_vs.shb"; Path vs_path(path); auto* vs_binary = static_cast<ShaderBinary*>(binary_manager->load(vs_path)); addDependency(*vs_binary); instance->binaries[pass_idx * 2] = vs_binary; path.data[0] = '\0'; actual_mask = mask & m_combintions.fs_local_mask[pass_idx]; path << "shaders/compiled" << (is_opengl ? "_gl/" : "/") << basename; path << "_" << pass << actual_mask << "_fs.shb"; Path fs_path(path); auto* fs_binary = static_cast<ShaderBinary*>(binary_manager->load(fs_path)); addDependency(*fs_binary); instance->binaries[pass_idx * 2 + 1] = fs_binary; } } return true; }