diff options
| author | Anton Novoselov <[email protected]> | 2017-08-01 12:53:38 +0300 |
|---|---|---|
| committer | Anton Novoselov <[email protected]> | 2017-08-01 12:53:38 +0300 |
| commit | 236f03c0b9a4982328ed1201978f7f69d192d9b2 (patch) | |
| tree | e486f2fa39dba203563895541e92c60ed3e25759 /sdk/globals/source | |
| parent | Added screens to welcome page (diff) | |
| download | blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.tar.xz blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.zip | |
Blast 1.1 release (windows / linux)
see docs/release_notes.txt for details
Diffstat (limited to 'sdk/globals/source')
| -rw-r--r-- | sdk/globals/source/NvBlastGlobals.cpp | 190 | ||||
| -rw-r--r-- | sdk/globals/source/NvBlastProfiler.cpp | 96 | ||||
| -rw-r--r-- | sdk/globals/source/NvBlastProfilerInternal.h | 91 |
3 files changed, 377 insertions, 0 deletions
diff --git a/sdk/globals/source/NvBlastGlobals.cpp b/sdk/globals/source/NvBlastGlobals.cpp new file mode 100644 index 0000000..e56d43b --- /dev/null +++ b/sdk/globals/source/NvBlastGlobals.cpp @@ -0,0 +1,190 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2016-2017 NVIDIA Corporation. All rights reserved. + + +#include "NvBlastGlobals.h" +#include "NvBlastAssert.h" +#include <cstdlib> +#include <sstream> +#include <iostream> + +#if NV_WINDOWS_FAMILY +#include <windows.h> +#endif + +#if NV_WINDOWS_FAMILY || NV_LINUX_FAMILY +#include <malloc.h> +#endif + + +namespace Nv +{ +namespace Blast +{ + +#if NV_WINDOWS_FAMILY +// on win32 we only have 8-byte alignment guaranteed, but the CRT provides special aligned allocation fns +NV_FORCE_INLINE void* platformAlignedAlloc(size_t size) +{ + return _aligned_malloc(size, 16); +} + +NV_FORCE_INLINE void platformAlignedFree(void* ptr) +{ + _aligned_free(ptr); +} +#elif NV_LINUX_FAMILY +NV_FORCE_INLINE void* platformAlignedAlloc(size_t size) +{ + return ::memalign(16, size); +} + +NV_FORCE_INLINE void platformAlignedFree(void* ptr) +{ + ::free(ptr); +} +#elif NV_XBOXONE || NV_PS4 +// on these platforms we get 16-byte alignment by default +NV_FORCE_INLINE void* platformAlignedAlloc(size_t size) +{ + return ::malloc(size); +} + +NV_FORCE_INLINE void platformAlignedFree(void* ptr) +{ + ::free(ptr); +} +#else +NV_FORCE_INLINE void* platformAlignedAlloc(size_t size) +{ + const int A = 16; + unsigned char* mem = (unsigned char*)malloc(size + A); + const unsigned char offset = (unsigned char)((uintptr_t)A - (uintptr_t)mem % A - 1); + mem += offset; + *mem++ = offset; + return mem; +} + +NV_FORCE_INLINE void platformAlignedFree(void* ptr) +{ + if (ptr != nullptr) + { + unsigned char* mem = (unsigned char*)ptr; + const unsigned char offset = *--mem; + ::free(mem - offset); + } +} +#endif + +class DefaultAllocatorCallback : public AllocatorCallback +{ +public: + virtual void* allocate(size_t size, const char* typeName, const char* filename, int line) override + { + NV_UNUSED(typeName); + NV_UNUSED(filename); + NV_UNUSED(line); + return platformAlignedAlloc(size); + } + + virtual void deallocate(void* ptr) override + { + platformAlignedFree(ptr); + } +}; +DefaultAllocatorCallback g_defaultAllocatorCallback; + + +class DefaultErrorCallback : public ErrorCallback +{ + virtual void reportError(ErrorCode::Enum code, const char* msg, const char* file, int line) override + { +#if NV_DEBUG || NV_CHECKED + std::stringstream str; + str << "NvBlast "; + bool critical = false; + switch (code) + { + case ErrorCode::eNO_ERROR: str << "[Info]"; critical = false; break; + case ErrorCode::eDEBUG_INFO: str << "[Debug Info]"; critical = false; break; + case ErrorCode::eDEBUG_WARNING: str << "[Debug Warning]"; critical = false; break; + case ErrorCode::eINVALID_PARAMETER: str << "[Invalid Parameter]"; critical = true; break; + case ErrorCode::eINVALID_OPERATION: str << "[Invalid Operation]"; critical = true; break; + case ErrorCode::eOUT_OF_MEMORY: str << "[Out of] Memory"; critical = true; break; + case ErrorCode::eINTERNAL_ERROR: str << "[Internal Error]"; critical = true; break; + case ErrorCode::eABORT: str << "[Abort]"; critical = true; break; + case ErrorCode::ePERF_WARNING: str << "[Perf Warning]"; critical = false; break; + default: NVBLAST_ASSERT(false); + } + str << file << "(" << line << "): " << msg << "\n"; + + std::string message = str.str(); + std::cout << message; +#if NV_WINDOWS_FAMILY + OutputDebugStringA(message.c_str()); +#endif + NVBLAST_ASSERT_WITH_MESSAGE(!critical, message.c_str()); +#else + NV_UNUSED(code); + NV_UNUSED(msg); + NV_UNUSED(file); + NV_UNUSED(line); +#endif + } +}; +DefaultErrorCallback g_defaultErrorCallback; + + +AllocatorCallback* g_allocatorCallback = &g_defaultAllocatorCallback; +ErrorCallback* g_errorCallback = &g_defaultErrorCallback; + + +} // namespace Blast +} // namespace Nv + + +//////// Global API implementation //////// + +Nv::Blast::AllocatorCallback* NvBlastGlobalGetAllocatorCallback() +{ + return Nv::Blast::g_allocatorCallback; +} + +void NvBlastGlobalSetAllocatorCallback(Nv::Blast::AllocatorCallback* allocator) +{ + Nv::Blast::g_allocatorCallback = allocator ? allocator : &Nv::Blast::g_defaultAllocatorCallback; +} + +Nv::Blast::ErrorCallback* NvBlastGlobalGetErrorCallback() +{ + return Nv::Blast::g_errorCallback; +} + +void NvBlastGlobalSetErrorCallback(Nv::Blast::ErrorCallback* errorCallback) +{ + Nv::Blast::g_errorCallback = errorCallback ? errorCallback : &Nv::Blast::g_defaultErrorCallback; +} diff --git a/sdk/globals/source/NvBlastProfiler.cpp b/sdk/globals/source/NvBlastProfiler.cpp new file mode 100644 index 0000000..48d4b7b --- /dev/null +++ b/sdk/globals/source/NvBlastProfiler.cpp @@ -0,0 +1,96 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2016-2017 NVIDIA Corporation. All rights reserved. + + +#include "stdint.h" +#include "NvBlastProfilerInternal.h" + +#if NV_PROFILE || NV_CHECKED || NV_DEBUG + +namespace Nv +{ +namespace Blast +{ + +class EmptyProfilerCallback : public ProfilerCallback +{ + void zoneStart(const char*) {} + void zoneEnd() {} +}; +EmptyProfilerCallback g_EmptyCallback; + +ProfilerCallback* g_ProfilerCallback = &g_EmptyCallback; +ProfilerDetail::Level g_ProfilerDetail = ProfilerDetail::LOW; + +} // namespace Blast +} // namespace Nv + + +void NvBlastProfilerSetCallback(Nv::Blast::ProfilerCallback* pcb) +{ + Nv::Blast::g_ProfilerCallback = pcb != nullptr ? pcb : &Nv::Blast::g_EmptyCallback; +} + +Nv::Blast::ProfilerCallback* NvBlastProfilerGetCallback() +{ + return Nv::Blast::g_ProfilerCallback; +} + + +void NvBlastProfilerSetDetail(Nv::Blast::ProfilerDetail::Level level) +{ + Nv::Blast::g_ProfilerDetail = level; +} + +Nv::Blast::ProfilerDetail::Level NvBlastProfilerGetDetail() +{ + return Nv::Blast::g_ProfilerDetail; +} + + +void NvBlastProfilerBegin(const char* name, Nv::Blast::ProfilerDetail::Level level) +{ + if (level <= NvBlastProfilerGetDetail()) + { + NvBlastProfilerGetCallback()->zoneStart(name); + } +} + +void NvBlastProfilerEnd(const void* /*name*/, Nv::Blast::ProfilerDetail::Level level) +{ + if (level <= NvBlastProfilerGetDetail()) + { + NvBlastProfilerGetCallback()->zoneEnd(); + } +} + +#else + +void NvBlastProfilerSetCallback(Nv::Blast::ProfilerCallback*) {} +void NvBlastProfilerSetDetail(Nv::Blast::ProfilerDetail::Level) {} + +#endif // NV_PROFILE diff --git a/sdk/globals/source/NvBlastProfilerInternal.h b/sdk/globals/source/NvBlastProfilerInternal.h new file mode 100644 index 0000000..dd0cfbf --- /dev/null +++ b/sdk/globals/source/NvBlastProfilerInternal.h @@ -0,0 +1,91 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2016-2017 NVIDIA Corporation. All rights reserved. + + +#ifndef NVBLASTPROFILERINTERNAL_H +#define NVBLASTPROFILERINTERNAL_H + +#include "NvBlastPreprocessor.h" +#include "NvBlastProfiler.h" + +#if NV_PROFILE || NV_CHECKED || NV_DEBUG + +NVBLAST_API void NvBlastProfilerBegin(const char* name, Nv::Blast::ProfilerDetail::Level); +NVBLAST_API void NvBlastProfilerEnd(const void* name, Nv::Blast::ProfilerDetail::Level); + +Nv::Blast::ProfilerCallback* NvBlastProfilerGetCallback(); +Nv::Blast::ProfilerDetail::Level NvBlastProfilerGetDetail(); + + +namespace Nv +{ +namespace Blast +{ + + +class ProfileScope +{ +public: + ProfileScope(const char* name, ProfilerDetail::Level level) :m_name(name), m_level(level) + { + NvBlastProfilerBegin(m_name, m_level); + } + + ~ProfileScope() + { + NvBlastProfilerEnd(m_name, m_level); + } + +private: + const char* m_name; + ProfilerDetail::Level m_level; +}; + + +} // namespace Blast +} // namespace Nv + + +#define BLAST_PROFILE_PREFIX "Blast: " +#define BLAST_PROFILE_ZONE_BEGIN(name) NvBlastProfilerBegin(BLAST_PROFILE_PREFIX name, Nv::Blast::ProfilerDetail::HIGH) +#define BLAST_PROFILE_ZONE_END(name) NvBlastProfilerEnd(BLAST_PROFILE_PREFIX name, Nv::Blast::ProfilerDetail::HIGH) +#define BLAST_PROFILE_SCOPE(name, detail) Nv::Blast::ProfileScope NV_CONCAT(_scope,__LINE__) (BLAST_PROFILE_PREFIX name, detail) +#define BLAST_PROFILE_SCOPE_L(name) BLAST_PROFILE_SCOPE(name, Nv::Blast::ProfilerDetail::LOW) +#define BLAST_PROFILE_SCOPE_M(name) BLAST_PROFILE_SCOPE(name, Nv::Blast::ProfilerDetail::MEDIUM) +#define BLAST_PROFILE_SCOPE_H(name) BLAST_PROFILE_SCOPE(name, Nv::Blast::ProfilerDetail::HIGH) + +#else + +#define BLAST_PROFILE_ZONE_BEGIN(name) +#define BLAST_PROFILE_ZONE_END(name) +#define BLAST_PROFILE_SCOPE_L(name) +#define BLAST_PROFILE_SCOPE_M(name) +#define BLAST_PROFILE_SCOPE_H(name) + +#endif + +#endif |