You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
7.7 KiB
252 lines
7.7 KiB
/*
|
|
* Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* 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.
|
|
*
|
|
* SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
|
|
#ifndef NV_PROJECTBASE_INCLUDED
|
|
#define NV_PROJECTBASE_INCLUDED
|
|
|
|
#include <nvpwindow.hpp>
|
|
#include <string.h> // for memset
|
|
|
|
#include "parametertools.hpp"
|
|
#include "profiler.hpp"
|
|
|
|
|
|
namespace nvh {
|
|
|
|
/**
|
|
\class nvh::AppWindowProfiler
|
|
nvh::AppWindowProfiler provides an alternative utility wrapper class around NVPWindow.
|
|
It is useful to derive single-window applications from and is used by some
|
|
but not all nvpro-samples.
|
|
|
|
Further functionality is provided :
|
|
- built-in profiler/timer reporting to console
|
|
- command-line argument parsing as well as config file parsing using the ParameterTools
|
|
see AppWindowProfiler::setupParameters() for built-in commands
|
|
- benchmark/automation mode using ParameterTools
|
|
- screenshot creation
|
|
- logfile based on devicename (depends on context)
|
|
- optional context/swapchain interface
|
|
the derived classes nvvk/appwindowprofiler_vk and nvgl/appwindowprofiler_gl make use of this
|
|
*/
|
|
|
|
#define NV_PROFILE_BASE_SECTION(name) nvh::Profiler::Section _tempTimer(m_profiler, name)
|
|
#define NV_PROFILE_BASE_SPLIT() m_profiler.accumulationSplit()
|
|
|
|
class AppWindowProfiler : public NVPWindow
|
|
{
|
|
public:
|
|
class WindowState
|
|
{
|
|
public:
|
|
WindowState()
|
|
: m_mouseButtonFlags(0)
|
|
, m_mouseWheel(0)
|
|
{
|
|
memset(m_keyPressed, 0, sizeof(m_keyPressed));
|
|
memset(m_keyToggled, 0, sizeof(m_keyToggled));
|
|
}
|
|
|
|
int m_winSize[2];
|
|
int m_swapSize[2];
|
|
int m_mouseCurrent[2];
|
|
int m_mouseButtonFlags;
|
|
int m_mouseWheel;
|
|
|
|
bool m_keyPressed[KEY_LAST + 1];
|
|
bool m_keyToggled[KEY_LAST + 1];
|
|
|
|
bool onPress(int key) { return m_keyPressed[key] && m_keyToggled[key]; }
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
WindowState m_windowState;
|
|
nvh::Profiler m_profiler;
|
|
bool m_profilerPrint;
|
|
bool m_hadProfilerPrint;
|
|
bool m_timeInTitle;
|
|
|
|
ParameterList m_parameterList;
|
|
|
|
|
|
AppWindowProfiler(bool deprecated = true)
|
|
: m_profilerPrint(true)
|
|
, m_vsync(false)
|
|
, m_active(false)
|
|
, m_timeInTitle(true)
|
|
, m_hadScreenshot(false)
|
|
{
|
|
setupParameters();
|
|
}
|
|
|
|
// Sample Related
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// setup sample (this is executed after window/context creation)
|
|
virtual bool begin() { return false; }
|
|
// tear down sample (triggered by ESC/window close)
|
|
virtual void end() {}
|
|
// do primary logic/drawing etc. here
|
|
virtual void think(double time) {}
|
|
// react on swapchain resizes here
|
|
// may be different to winWidth/winHeight!
|
|
virtual void resize(int swapWidth, int swapHeight) {}
|
|
|
|
// return true to prevent m_window state updates
|
|
virtual bool mouse_pos(int x, int y) { return false; }
|
|
virtual bool mouse_button(int button, int action) { return false; }
|
|
virtual bool mouse_wheel(int wheel) { return false; }
|
|
virtual bool key_button(int button, int action, int modifier) { return false; }
|
|
virtual bool key_char(int button) { return false; }
|
|
|
|
virtual void parseConfig(int argc, const char** argv, const std::string& path)
|
|
{
|
|
// if you want to handle parameters not represented in
|
|
// m_parameterList then override this function accordingly.
|
|
m_parameterList.applyTokens(argc, argv, "-", path.c_str());
|
|
// This function is called before "begin" and provided with the commandline used in "run".
|
|
// It can also be called by the benchmarking system, and parseConfigFile.
|
|
}
|
|
virtual bool validateConfig()
|
|
{
|
|
// override if you want to test the state of app after parsing configs
|
|
// returning false terminates app
|
|
return true;
|
|
}
|
|
|
|
// additional special-purpose callbacks
|
|
|
|
virtual void postProfiling() {}
|
|
virtual void postEnd() {}
|
|
virtual void postBenchmarkAdvance() {}
|
|
virtual void postConfigPreContext(){};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// initial kickoff (typically called from main)
|
|
int run(const std::string& name, int argc, const char** argv, int width, int height, bool requireGLContext);
|
|
void leave();
|
|
|
|
void parseConfigFile(const char* filename);
|
|
|
|
// handles special strings (returns empty string if
|
|
// could not do the replacement properly)
|
|
// known specials:
|
|
// $DEVICE$
|
|
std::string specialStrings(const char* original);
|
|
|
|
void setVsync(bool state);
|
|
bool getVsync() const { return m_vsync; }
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Context Window (if desired, not mandatory )
|
|
//
|
|
// Used when deriving from this class for the purpose of providing 3D Api contexts
|
|
// nvvk/appwindowprofiler_vk or nvgl/appwindowprofiler_gl make use of this.
|
|
|
|
virtual void contextInit() {}
|
|
virtual void contextDeinit() {}
|
|
virtual void contextSync() {}
|
|
virtual const char* contextGetDeviceName() { return NULL; }
|
|
|
|
virtual void swapResize(int winWidth, int winHeight)
|
|
{
|
|
m_windowState.m_swapSize[0] = winWidth;
|
|
m_windowState.m_swapSize[1] = winHeight;
|
|
}
|
|
virtual void swapPrepare() {}
|
|
virtual void swapBuffers() {}
|
|
virtual void swapVsync(bool state) {}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// inherited from NVPWindow, don't use them directly, use the "Sample-related" ones
|
|
void onWindowClose() override;
|
|
void onWindowResize(int w, int h) override;
|
|
void onWindowRefresh() override {} // leave empty, we call redraw ourselves in think
|
|
void onMouseMotion(int x, int y) override;
|
|
void onMouseWheel(int delta) override;
|
|
void onMouseButton(MouseButton button, ButtonAction action, int mods, int x, int y) override;
|
|
void onKeyboard(KeyCode key, ButtonAction action, int mods, int x, int y) override;
|
|
void onKeyboardChar(unsigned char key, int mods, int x, int y) override;
|
|
|
|
private:
|
|
struct Benchmark
|
|
{
|
|
std::string filename;
|
|
std::string content;
|
|
nvh::ParameterSequence sequence;
|
|
uint32_t frameLength = 256;
|
|
uint32_t frame = 0;
|
|
};
|
|
|
|
struct Config
|
|
{
|
|
int32_t winpos[2];
|
|
int32_t winsize[2];
|
|
bool vsyncstate = true;
|
|
bool quickexit = false;
|
|
uint32_t intervalSeconds = 2;
|
|
uint32_t frameLimit = 0;
|
|
uint32_t timerLimit = 0;
|
|
std::string dumpatexitFilename;
|
|
std::string screenshotFilename;
|
|
std::string logFilename;
|
|
std::string configFilename;
|
|
uint32_t clearColor[3] = {127, 0, 0};
|
|
|
|
Config()
|
|
{
|
|
winpos[0] = 50;
|
|
winpos[1] = 50;
|
|
winsize[0] = 0;
|
|
winsize[1] = 0;
|
|
}
|
|
};
|
|
|
|
void parameterCallback(uint32_t param);
|
|
|
|
void setupParameters();
|
|
void exitScreenshot();
|
|
|
|
void initBenchmark();
|
|
void advanceBenchmark();
|
|
|
|
bool m_activeContext = false;
|
|
bool m_active = false;
|
|
bool m_vsync;
|
|
bool m_hadScreenshot;
|
|
Config m_config;
|
|
Benchmark m_benchmark;
|
|
|
|
uint32_t m_paramWinsize;
|
|
uint32_t m_paramVsync;
|
|
uint32_t m_paramScreenshot;
|
|
uint32_t m_paramLog;
|
|
uint32_t m_paramCfg;
|
|
uint32_t m_paramBat;
|
|
uint32_t m_paramClear;
|
|
};
|
|
} // namespace nvh
|
|
|
|
|
|
#endif
|
|
|