Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
imjiangjun
pbrt-v4
提交
2590721d
P
pbrt-v4
项目概览
imjiangjun
/
pbrt-v4
12 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
pbrt-v4
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2590721d
编写于
7月 30, 2021
作者:
M
Matt Pharr
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Use RunAsync() for handling Import statements in the parser
上级
04701f03
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
20 addition
and
37 deletion
+20
-37
src/pbrt/parser.cpp
src/pbrt/parser.cpp
+20
-37
未找到文件。
src/pbrt/parser.cpp
浏览文件 @
2590721d
...
...
@@ -590,7 +590,7 @@ void parse(SceneRepresentation *scene, std::unique_ptr<Tokenizer> t) {
static
std
::
atomic
<
bool
>
warnedTransformBeginEndDeprecated
{
false
};
std
::
vector
<
std
::
pair
<
std
::
thread
,
ParsedScene
*>>
imports
;
std
::
vector
<
std
::
pair
<
Future
<
void
>
,
ParsedScene
*>>
imports
;
LOG_VERBOSE
(
"Started parsing %s"
,
std
::
string
(
t
->
loc
.
filename
.
begin
(),
t
->
loc
.
filename
.
end
()));
...
...
@@ -768,43 +768,26 @@ void parse(SceneRepresentation *scene, std::unique_ptr<Tokenizer> t) {
"definition block."
);
filename
=
ResolveFilename
(
filename
);
std
::
unique_ptr
<
Tokenizer
>
timport
=
Tokenizer
::
CreateFromFile
(
filename
,
parseError
);
if
(
timport
)
{
ParsedScene
*
importScene
=
parsedScene
->
CopyForImport
();
ParsedScene
*
importScene
=
parsedScene
->
CopyForImport
();
static
int
maxThreads
=
RunningThreads
();
if
(
maxThreads
==
1
)
{
if
(
RunningThreads
()
==
1
)
{
std
::
unique_ptr
<
Tokenizer
>
timport
=
Tokenizer
::
CreateFromFile
(
filename
,
parseError
);
if
(
timport
)
parse
(
importScene
,
std
::
move
(
timport
));
parsedScene
->
MergeImported
(
importScene
);
}
else
{
static
std
::
mutex
importThreadMutex
;
static
std
::
condition_variable
importThreadCV
;
static
int
nRunningImportThreads
=
0
;
std
::
unique_lock
<
std
::
mutex
>
lock
(
importThreadMutex
);
while
(
nRunningImportThreads
==
maxThreads
)
importThreadCV
.
wait
(
lock
);
++
nRunningImportThreads
;
lock
.
unlock
();
std
::
thread
importThread
(
[
filename
](
ParsedScene
*
scene
,
std
::
unique_ptr
<
Tokenizer
>
timport
)
{
Timer
timer
;
parse
(
scene
,
std
::
move
(
timport
));
LOG_VERBOSE
(
"Elapsed time to parse
\"
%s
\"
: %.2fs"
,
filename
,
timer
.
ElapsedSeconds
());
std
::
unique_lock
<
std
::
mutex
>
lock
(
importThreadMutex
);
--
nRunningImportThreads
;
importThreadCV
.
notify_all
();
lock
.
unlock
();
},
importScene
,
std
::
move
(
timport
));
imports
.
push_back
(
std
::
make_pair
(
std
::
move
(
importThread
),
importScene
));
}
parsedScene
->
MergeImported
(
importScene
);
}
else
{
auto
job
=
[
=
](
std
::
string
filename
)
{
Timer
timer
;
std
::
unique_ptr
<
Tokenizer
>
timport
=
Tokenizer
::
CreateFromFile
(
filename
,
parseError
);
if
(
timport
)
parse
(
importScene
,
std
::
move
(
timport
));
LOG_VERBOSE
(
"Elapsed time to parse
\"
%s
\"
: %.2fs"
,
filename
,
timer
.
ElapsedSeconds
());
};
Future
<
void
>
jobFinished
=
RunAsync
(
job
,
filename
);
imports
.
push_back
(
std
::
make_pair
(
std
::
move
(
jobFinished
),
importScene
));
}
}
}
else
if
(
tok
->
token
==
"Identity"
)
...
...
@@ -986,7 +969,7 @@ void parse(SceneRepresentation *scene, std::unique_ptr<Tokenizer> t) {
}
for
(
auto
&
import
:
imports
)
{
import
.
first
.
join
();
import
.
first
.
Wait
();
ParsedScene
*
parsedScene
=
dynamic_cast
<
ParsedScene
*>
(
scene
);
CHECK
(
parsedScene
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录