Skip to content

Commit 0c91dab

Browse files
committed
macos resolve renderer type
1 parent b4b7108 commit 0c91dab

7 files changed

Lines changed: 146 additions & 49 deletions

File tree

build.sh

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ list_presets_and_exit() {
8686
CONFIGURE_PRESET=""
8787
CLEAN=0
8888
TARGET_ANDROID=0
89-
CMAKE_ARGS=()
89+
declare -a CMAKE_ARGS=()
9090

9191
# Parse arguments
9292
while [[ $# -gt 0 ]]; do
@@ -127,9 +127,17 @@ if [ "$CLEAN" -eq 1 ]; then
127127
rm -rf "$PROJECT_ROOT/out/build/$CONFIGURE_PRESET"
128128
fi
129129

130-
log "Configuring preset: $CONFIGURE_PRESET with extra args: ${CMAKE_ARGS[*]}"
130+
if [ ${#CMAKE_ARGS[@]} -eq 0 ]; then
131+
log "Configuring preset: $CONFIGURE_PRESET"
132+
else
133+
log "Configuring preset: $CONFIGURE_PRESET with extra args: ${CMAKE_ARGS[*]}"
134+
fi
131135
config_start=$(date +%s)
132-
cmake --preset "$CONFIGURE_PRESET" "${CMAKE_ARGS[@]}"
136+
if [ ${#CMAKE_ARGS[@]} -eq 0 ]; then
137+
cmake --preset "$CONFIGURE_PRESET"
138+
else
139+
cmake --preset "$CONFIGURE_PRESET" "${CMAKE_ARGS[@]}"
140+
fi
133141
config_time=$(( $(date +%s) - config_start ))
134142

135143
# Derive build preset name from configure preset name
@@ -140,30 +148,36 @@ BUILD_PRESET="$CONFIGURE_PRESET"
140148
log "Building with preset: $BUILD_PRESET"
141149
build_start=$(date +%s)
142150
# Pass only build-specific args to the build command
143-
build_args=()
151+
declare -a build_args=()
144152
is_target_next=0
145-
for arg in "${CMAKE_ARGS[@]}"; do
146-
if [ $is_target_next -eq 1 ]; then
147-
build_args+=("$arg")
148-
is_target_next=0
149-
continue
150-
fi
151-
if [[ "$arg" == "--target" ]]; then
152-
build_args+=("$arg")
153-
is_target_next=1
154-
elif [[ "$arg" == --* ]]; then
155-
# Heuristic: pass common build tool arguments
156-
if [[ "$arg" == "--config" || "$arg" == "-j" || "$arg" == "--verbose" ]]; then
157-
build_args+=("$arg")
158-
# if the arg is like --config=Release
159-
if [[ "$arg" != *=* ]]; then
160-
is_target_next=1
161-
fi
153+
if [ ${#CMAKE_ARGS[@]} -gt 0 ]; then
154+
for arg in "${CMAKE_ARGS[@]}"; do
155+
if [ $is_target_next -eq 1 ]; then
156+
build_args+=("$arg")
157+
is_target_next=0
158+
continue
162159
fi
163-
fi
164-
done
160+
if [[ "$arg" == "--target" ]]; then
161+
build_args+=("$arg")
162+
is_target_next=1
163+
elif [[ "$arg" == --* ]]; then
164+
# Heuristic: pass common build tool arguments
165+
if [[ "$arg" == "--config" || "$arg" == "-j" || "$arg" == "--verbose" ]]; then
166+
build_args+=("$arg")
167+
# if the arg is like --config=Release
168+
if [[ "$arg" != *=* ]]; then
169+
is_target_next=1
170+
fi
171+
fi
172+
fi
173+
done
174+
fi
165175

166-
cmake --build --preset "$BUILD_PRESET" "${build_args[@]}"
176+
if [ ${#build_args[@]} -eq 0 ]; then
177+
cmake --build --preset "$BUILD_PRESET"
178+
else
179+
cmake --build --preset "$BUILD_PRESET" "${build_args[@]}"
180+
fi
167181
build_time=$(( $(date +%s) - build_start ))
168182

169183
TOTAL_TIME=$(( $(date +%s) - TOTAL_START ))
@@ -174,4 +188,4 @@ log " Preset: $CONFIGURE_PRESET"
174188
log " Configure: ${config_time}s"
175189
log " Build: ${build_time}s"
176190
log " Total: ${TOTAL_TIME}s"
177-
log "--------------------------------------------------"
191+
log "--------------------------------------------------"

src/Application/gkNextRenderer/gkNextRenderer.cpp

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void NextRendererGameInstance::BeforeSceneRebuild(std::vector<std::shared_ptr<As
106106
boxModelId_ = static_cast<uint32_t>(models.size() - 1);
107107

108108
matIds_.clear();
109-
109+
110110
MatPreparedForAdd.push_back({Assets::Material::Lambertian(glm::vec3(1,1,1))});
111111
materials.push_back(MatPreparedForAdd.back());matIds_.push_back(uint32_t(materials.size() - 1));
112112
MatPreparedForAdd.push_back({Assets::Material::Metallic(glm::vec3(0.5,0.5,0.5), 0.4f)});
@@ -132,6 +132,12 @@ void NextRendererGameInstance::OnPreConfigUI()
132132

133133
bool NextRendererGameInstance::OnRenderUI()
134134
{
135+
if (GOption->AgentValidation && !agentValidationCaptured_ && GetEngine().GetTotalFrames() >= 120)
136+
{
137+
RequestScreenshot(false, "agent_validation");
138+
agentValidationCaptured_ = true;
139+
}
140+
135141
if (isTakingScreenshot_)
136142
{
137143
return true;
@@ -188,6 +194,36 @@ void NextRendererGameInstance::OnInitUI()
188194
}
189195
}
190196

197+
void NextRendererGameInstance::RequestScreenshot(bool openFolder, const std::string& tag)
198+
{
199+
if (isTakingScreenshot_)
200+
{
201+
return;
202+
}
203+
204+
std::string folderPath = Utilities::FileHelper::GetPlatformFilePath("screenshots");
205+
Utilities::FileHelper::EnsureDirectoryExists(folderPath);
206+
207+
auto now = std::chrono::system_clock::now();
208+
std::time_t in_time_t = std::chrono::system_clock::to_time_t(now);
209+
std::tm* tm_ptr = std::localtime(&in_time_t);
210+
std::string timestamp = fmt::format("{:%Y-%m-%d_%H-%M-%S}", *tm_ptr);
211+
std::string suffix = tag.empty() ? "" : "_" + tag;
212+
std::string filename = (std::filesystem::path(folderPath) / (timestamp + suffix)).string();
213+
214+
isTakingScreenshot_ = true;
215+
216+
GetEngine().AddTimerTask(0.2, [this, filename, folderPath, openFolder]() {
217+
ScreenShot::SaveSwapChainToFile(&GetEngine().GetRenderer(), filename, 0, 0, 0, 0);
218+
if (openFolder)
219+
{
220+
NextRenderer::OSCommand(folderPath.c_str());
221+
}
222+
isTakingScreenshot_ = false;
223+
return true;
224+
});
225+
}
226+
191227
bool NextRendererGameInstance::OverrideRenderCamera(Assets::Camera& outRenderCamera) const
192228
{
193229
outRenderCamera.ModelView = modelViewController_.ModelView();
@@ -365,12 +401,51 @@ void NextRendererGameInstance::DrawSettings()
365401

366402
if( ImGui::CollapsingHeader(LOCTEXT("Renderer"), ImGuiTreeNodeFlags_DefaultOpen) )
367403
{
368-
std::vector<const char*> renderers {"PathTracing", "SoftTracing", "SoftModern", "VoxelTracing"};
404+
struct RendererOption
405+
{
406+
const char* label;
407+
Vulkan::ERendererType type;
408+
};
409+
const RendererOption kRendererOptions[] = {
410+
{"SoftTracing", Vulkan::ERT_ModernDeferred},
411+
{"SoftModern", Vulkan::ERT_LegacyDeferred},
412+
{"VoxelTracing", Vulkan::ERT_VoxelTracing},
413+
{"PathTracing", Vulkan::ERT_PathTracing},
414+
};
415+
const bool supportsRayTracing = GetEngine().GetRenderer().SupportsRayTracing();
416+
const int rendererOptionCount = supportsRayTracing
417+
? static_cast<int>(std::size(kRendererOptions))
418+
: static_cast<int>(std::size(kRendererOptions)) - 1;
419+
420+
int currentRendererIndex = 0;
421+
bool rendererFound = false;
422+
for (int index = 0; index < rendererOptionCount; ++index)
423+
{
424+
if (kRendererOptions[index].type == static_cast<Vulkan::ERendererType>(userSetting.RendererType))
425+
{
426+
currentRendererIndex = index;
427+
rendererFound = true;
428+
break;
429+
}
430+
}
431+
if (!rendererFound)
432+
{
433+
userSetting.RendererType = static_cast<int32_t>(kRendererOptions[0].type);
434+
}
369435

370436
ImGui::Text("%s", LOCTEXT("Renderer"));
371437

372438
ImGui::PushItemWidth(-1);
373-
ImGui::Combo("##RendererList", &userSetting.RendererType, renderers.data(), static_cast<int>(renderers.size()));
439+
auto renderersGetter = [](void* data, int index, const char** outText)
440+
{
441+
const auto* options = static_cast<const RendererOption*>(data);
442+
*outText = options[index].label;
443+
return true;
444+
};
445+
if (ImGui::Combo("##RendererList", &currentRendererIndex, renderersGetter, const_cast<RendererOption*>(kRendererOptions), rendererOptionCount))
446+
{
447+
userSetting.RendererType = static_cast<int32_t>(kRendererOptions[currentRendererIndex].type);
448+
}
374449
ImGui::PopItemWidth();
375450
ImGui::NewLine();
376451
}
@@ -645,23 +720,7 @@ void NextRendererGameInstance::DrawTitleBar()
645720
ImGui::SameLine();
646721
if (ImGui::Button(ICON_FA_CAMERA, ImVec2(TitlebarSize, TitlebarSize)))
647722
{
648-
std::string folderPath = Utilities::FileHelper::GetPlatformFilePath("screenshots");
649-
Utilities::FileHelper::EnsureDirectoryExists(folderPath);
650-
651-
auto now = std::chrono::system_clock::now();
652-
std::time_t in_time_t = std::chrono::system_clock::to_time_t(now);
653-
std::tm* tm_ptr = std::localtime(&in_time_t);
654-
std::string timestamp = fmt::format("{:%Y-%m-%d_%H-%M-%S}", *tm_ptr);
655-
std::string filename = (std::filesystem::path(folderPath) / timestamp).string();
656-
657-
isTakingScreenshot_ = true;
658-
659-
GetEngine().AddTimerTask(0.2, [this, filename, folderPath]() {
660-
ScreenShot::SaveSwapChainToFile(&GetEngine().GetRenderer(), filename, 0, 0, 0, 0);
661-
NextRenderer::OSCommand(folderPath.c_str());
662-
isTakingScreenshot_ = false;
663-
return true;
664-
});
723+
RequestScreenshot(true, "");
665724
}
666725
BUTTON_TOOLTIP(LOCTEXT("Take a Screenshot into the screenshots folder"))
667726
ImGui::SameLine();

src/Application/gkNextRenderer/gkNextRenderer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class NextRendererGameInstance : public NextGameInstanceBase
4141
private:
4242
void DrawSettings();
4343
void DrawTitleBar();
44+
void RequestScreenshot(bool openFolder, const std::string& tag);
4445
NextEngine* engine_;
4546

4647
ModelViewController modelViewController_;
@@ -51,4 +52,5 @@ class NextRendererGameInstance : public NextGameInstanceBase
5152
struct ImFont* bigFont_ {};
5253

5354
bool isTakingScreenshot_ = false;
55+
bool agentValidationCaptured_ = false;
5456
};

src/Options.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Options::Options(const int argc, const char* argv[])
3838
("hwquery", "Forcing hardware raytracing not supported.", cxxopts::value<bool>(HardwareQuery)->default_value("true"))
3939
("validation", "Force enable validation layers.", cxxopts::value<bool>(Validation)->default_value("false"))
4040
("fastexit", "Enable fast exit by skipping task wait.", cxxopts::value<bool>(FastExit)->default_value("true"))
41+
("agent-validation", "Enable agent validation actions (auto screenshot).", cxxopts::value<bool>(AgentValidation)->default_value("false"))
4142

4243
("test-gltf", "Run glTF robustness test from Khronos Sample Assets.", cxxopts::value<bool>(TestGltfRobustness)->default_value("false"))
4344
("test-gltf-filter", "Filter for glTF robustness test (partial name match).", cxxopts::value<std::string>(TestGltfFilter)->default_value(""))

src/Options.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class Options final
3434
bool HardwareQuery{};
3535
bool Validation{};
3636
bool FastExit{true};
37+
bool AgentValidation{};
3738
std::string locale{};
3839

3940
// Renderer options.
@@ -63,4 +64,4 @@ class Options final
6364
std::string TestGltfFilter{};
6465
};
6566

66-
extern Options* GOption;
67+
extern Options* GOption;

src/Rendering/VulkanBaseRenderer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ namespace Vulkan
9595
Assets::Scene& GetScene();
9696
void SetScene(std::shared_ptr<Assets::Scene> scene);
9797
virtual Assets::UniformBufferObject GetUniformBufferObject(const VkOffset2D offset, const VkExtent2D extent) const;
98+
bool SupportsRayTracing() const { return supportRayTracing_; }
9899

99100
int FrameCount() const {return frameCount_;}
100101

src/Runtime/Engine.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@
5151

5252
ENGINE_API Options* GOption = nullptr;
5353

54+
namespace
55+
{
56+
Vulkan::ERendererType ResolveRendererType(Vulkan::ERendererType requestedType, bool supportsRayTracing)
57+
{
58+
if (!supportsRayTracing && requestedType == Vulkan::ERT_PathTracing)
59+
{
60+
return Vulkan::ERT_ModernDeferred;
61+
}
62+
return requestedType;
63+
}
64+
}
65+
5466
namespace NextRenderer
5567
{
5668
std::string GetBuildVersion()
@@ -86,7 +98,7 @@ namespace NextRenderer
8698
renderer->RegisterLogicRenderer(type);
8799
}
88100

89-
auto requestedType = static_cast<Vulkan::ERendererType>(rendererType);
101+
auto requestedType = ResolveRendererType(static_cast<Vulkan::ERendererType>(rendererType), useRayTracingRenderer);
90102
if (std::find(supportedTypes.begin(), supportedTypes.end(), requestedType) == supportedTypes.end())
91103
{
92104
requestedType = *supportedTypes.begin();
@@ -216,6 +228,7 @@ void NextEngine::Start()
216228
#endif
217229

218230
renderer_.reset( NextRenderer::CreateRenderer(GOption->RendererType, window_.get(), static_cast<VkPresentModeKHR>(GOption->PresentMode), shouldEnableValidation) );
231+
userSettings_.RendererType = static_cast<int32_t>(renderer_->CurrentLogicRendererType());
219232

220233
renderer_->DelegateOnDeviceSet = [this]()->void{OnRendererDeviceSet();};
221234
renderer_->DelegateCreateSwapChain = [this]()->void{OnRendererCreateSwapChain();};
@@ -288,9 +301,15 @@ bool NextEngine::Tick(bool forcingDelta)
288301
std::cout << std::flush;
289302

290303
// Hot change renderer
291-
if(renderer_->CurrentLogicRendererType() != static_cast<Vulkan::ERendererType>(userSettings_.RendererType))
304+
auto requestedRendererType = ResolveRendererType(static_cast<Vulkan::ERendererType>(userSettings_.RendererType), renderer_->SupportsRayTracing());
305+
if (requestedRendererType != static_cast<Vulkan::ERendererType>(userSettings_.RendererType))
306+
{
307+
userSettings_.RendererType = static_cast<int32_t>(requestedRendererType);
308+
}
309+
310+
if (renderer_->CurrentLogicRendererType() != requestedRendererType)
292311
{
293-
renderer_->SwitchLogicRenderer(static_cast<Vulkan::ERendererType>(userSettings_.RendererType));
312+
renderer_->SwitchLogicRenderer(requestedRendererType);
294313
}
295314

296315
// delta time calc

0 commit comments

Comments
 (0)