DKWechatHelper/dkhelper/dkhelperDylib/QGVAPlayer/class/Utils/QGVAPMetalShaderFunctionLoader.m
DKJone 888af8954e [v1.0.7](https://github.com/DKWechatHelper/DKWechatHelper/releases/tag/1.0.7) / 2021-01-29
what's new
* 动态启动图
* 动态聊天背景
* 支持8.0.1
* 更新越狱包8.0.1
* 更新已注入助手的8.0.1未签名包
* 更新越狱源安装包
2021-01-29 16:35:34 +08:00

93 lines
3.0 KiB
Objective-C

// QGVAPMetalShaderFunctionLoader.m
// Tencent is pleased to support the open source community by making vap available.
//
// Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions and
// limitations under the License.
#import "QGVAPMetalShaderFunctionLoader.h"
#import "QGHWDMetalShaderSourceDefine.h"
#import "QGHWDShaderTypes.h"
#import "QGVAPLogger.h"
@interface QGVAPMetalShaderFunctionLoader () {
BOOL _alreadyLoadDefaultLibrary;
BOOL _alreadyLoadHWDLibrary;
}
@property (nonatomic, strong) id<MTLDevice> device;
@property (nonatomic, strong) id<MTLLibrary> defaultLibrary;
@property (nonatomic, strong) id<MTLLibrary> hwdLibrary;
@end
@implementation QGVAPMetalShaderFunctionLoader
- (instancetype)initWithDevice:(id<MTLDevice>)device {
if (self = [super init]) {
_device = device;
}
return self;
}
- (id<MTLFunction>)loadFunctionWithName:(NSString *)funcName {
id<MTLFunction> program = nil;
[self loadDefaultLibraryIfNeed];
program = [self.defaultLibrary newFunctionWithName:funcName];
//没有找到defaultLibrary文件 || defaultLibrary中不包含对应的fucntion
if (!program) {
[self loadHWDLibraryIfNeed];
program = [self.hwdLibrary newFunctionWithName:funcName];
}
return program;
}
- (void)loadDefaultLibraryIfNeed {
if (self.defaultLibrary || _alreadyLoadDefaultLibrary) {
return ;
}
NSBundle *bundle = [NSBundle bundleForClass:self.class];
NSString *metalLibPath = [bundle pathForResource:@"default" ofType:@"metallib"];
if (metalLibPath.length == 0) {
return ;
}
NSError *error = nil;
id<MTLLibrary> defaultLibrary = [self.device newLibraryWithFile:metalLibPath error:&error];
if (!defaultLibrary || error) {
VAP_Error(kQGVAPModuleCommon, @"loadDefaultLibrary error!:%@", error);
return ;
}
self.defaultLibrary = defaultLibrary;
_alreadyLoadDefaultLibrary = YES;
}
- (void)loadHWDLibraryIfNeed {
if (self.hwdLibrary || _alreadyLoadHWDLibrary) {
return ;
}
NSError *error = nil;
NSString *sourceString = [NSString stringWithFormat:@"%@%@%@", kQGHWDMetalShaderSourceImports, kQGHWDMetalShaderTypeDefines, kQGHWDMetalShaderSourceString];
id<MTLLibrary> hwdLibrary = [self.device newLibraryWithSource:sourceString options:nil error:&error];
if (!hwdLibrary || error) {
VAP_Error(kQGVAPModuleCommon, @"loadHWDLibrary error!:%@", error);
return ;
}
self.hwdLibrary = hwdLibrary;
_alreadyLoadHWDLibrary = YES;
}
@end