/**
 * @file llprofiler_ategories.h
 * @brief Profiling categories to minimize Tracy memory usage when viewing captures.
 *
 * $LicenseInfo:firstyear=2022&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2022, Linden Research, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_PROFILER_CATEGORIES_H
#define LL_PROFILER_CATEGORIES_H

// A Tracy capture can quickly consume memory.  Use these defines to selectively turn on/off Tracy profiling for these categories.
// The biggest memory usage ones are:
//
//    LL_PROFILER_CATEGORY_ENABLE_DRAWPOOL
//    LL_PROFILER_CATEGORY_ENABLE_LLSD
//    LL_PROFILER_CATEGORY_ENABLE_MEMORY
//    LL_PROFILER_CATEGORY_ENABLE_SHADERS
//
// NOTE: You can still manually use:
//     LL_PROFILE_ZONE_SCOPED();
//     LL_PROFILE_ZONE_NAMED("name");
// but just be aware that those will ALWAYS show up in a Tracy capture
//  a) using more memory, and
//  b) adding visual clutter.
#define LL_PROFILER_CATEGORY_ENABLE_APP         1
#define LL_PROFILER_CATEGORY_ENABLE_AVATAR      1
#define LL_PROFILER_CATEGORY_ENABLE_DISPLAY     1
#define LL_PROFILER_CATEGORY_ENABLE_DRAWABLE    1
#define LL_PROFILER_CATEGORY_ENABLE_DRAWPOOL    1
#define LL_PROFILER_CATEGORY_ENABLE_ENVIRONMENT 1
#define LL_PROFILER_CATEGORY_ENABLE_FACE        1
#define LL_PROFILER_CATEGORY_ENABLE_INPUT       1
#define LL_PROFILER_CATEGORY_ENABLE_LLSD        0 // <FS:Beq/> Rationalise this silliness
#define LL_PROFILER_CATEGORY_ENABLE_LOGGING     1
#define LL_PROFILER_CATEGORY_ENABLE_MATERIAL    1
#define LL_PROFILER_CATEGORY_ENABLE_MEDIA       1
#define LL_PROFILER_CATEGORY_ENABLE_MEMORY      0 // <FS:Beq/> Rationalise this silliness
#define LL_PROFILER_CATEGORY_ENABLE_NETWORK     1
#define LL_PROFILER_CATEGORY_ENABLE_OCTREE      1
#define LL_PROFILER_CATEGORY_ENABLE_PIPELINE    1
#define LL_PROFILER_CATEGORY_ENABLE_SHADER      1
#define LL_PROFILER_CATEGORY_ENABLE_SPATIAL     1
#define LL_PROFILER_CATEGORY_ENABLE_STATS       1
#define LL_PROFILER_CATEGORY_ENABLE_STRING      1
#define LL_PROFILER_CATEGORY_ENABLE_TEXTURE     1
#define LL_PROFILER_CATEGORY_ENABLE_THREAD      0 // <FS:Beq/> Rationalise this silliness
#define LL_PROFILER_CATEGORY_ENABLE_UI          1
#define LL_PROFILER_CATEGORY_ENABLE_VIEWER      1
#define LL_PROFILER_CATEGORY_ENABLE_VERTEX      1
#define LL_PROFILER_CATEGORY_ENABLE_VOLUME      1
#define LL_PROFILER_CATEGORY_ENABLE_WIN32       0 // <FS:Beq/> Rationalise this silliness

#if LL_PROFILER_CATEGORY_ENABLE_APP
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_APP  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_APP LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_APP(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_APP
#endif

#if LL_PROFILER_CATEGORY_ENABLE_AVATAR
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_AVATAR  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_AVATAR(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
#endif

#if LL_PROFILER_CATEGORY_ENABLE_DISPLAY
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY
#endif

#if LL_PROFILER_CATEGORY_ENABLE_DRAWABLE
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWABLE  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWABLE(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
#endif

#if LL_PROFILER_CATEGORY_ENABLE_DRAWPOOL
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL
#endif

#if LL_PROFILER_CATEGORY_ENABLE_ENVIRONMENT
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_ENVIRONMENT  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_ENVIRONMENT LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_ENVIRONMENT(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_ENVIRONMENT
#endif

#if LL_PROFILER_CATEGORY_ENABLE_FACE
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_FACE  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_FACE(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE
#endif

// <FS:Beq> Additional scope category for input handlers
#if LL_PROFILER_CATEGORY_ENABLE_INPUT
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_INPUT  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_INPUT LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_INPUT(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_INPUT
#endif
// </FS:Beq>

#if LL_PROFILER_CATEGORY_ENABLE_LLSD
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_LLSD  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_LLSD(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD
#endif

#if LL_PROFILER_CATEGORY_ENABLE_LOGGING
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_LOGGING  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_LOGGING LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_LOGGING(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_LOGGING
#endif

#if LL_PROFILER_CATEGORY_ENABLE_MATERIAL
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_MATERIAL  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_MATERIAL LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_MATERIAL(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_MATERIAL
#endif

#if LL_PROFILER_CATEGORY_ENABLE_MEDIA
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_MEDIA  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_MEDIA(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA
#endif

#if LL_PROFILER_CATEGORY_ENABLE_MEMORY
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_MEMORY  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_MEMORY(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY
#endif

#if LL_PROFILER_CATEGORY_ENABLE_NETWORK
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK
#endif

#if LL_PROFILER_CATEGORY_ENABLE_OCTREE
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_OCTREE LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_OCTREE
#endif

#if LL_PROFILER_CATEGORY_ENABLE_PIPELINE
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE
#endif

#if LL_PROFILER_CATEGORY_ENABLE_SHADER
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_SHADER  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_SHADER(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER
#endif

#if LL_PROFILER_CATEGORY_ENABLE_SPATIAL
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_SPATIAL  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_SPATIAL(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL
#endif

#if LL_PROFILER_CATEGORY_ENABLE_STATS
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_STATS  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_STATS(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS
#endif

#if LL_PROFILER_CATEGORY_ENABLE_STRING
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_STRING  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_STRING LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_STRING(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_STRING
#endif

#if LL_PROFILER_CATEGORY_ENABLE_TEXTURE
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE
#endif

#if LL_PROFILER_CATEGORY_ENABLE_THREAD
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
#endif

#if LL_PROFILER_CATEGORY_ENABLE_UI
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_UI  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_UI LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_UI(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_UI
#endif

#if LL_PROFILER_CATEGORY_ENABLE_VERTEX
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX
#endif

#if LL_PROFILER_CATEGORY_ENABLE_VIEWER
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_VIEWER  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_VIEWER LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_VIEWER(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_VIEWER
#endif

#if LL_PROFILER_CATEGORY_ENABLE_VOLUME
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_VOLUME  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_VOLUME(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME
#endif

#if LL_PROFILER_CATEGORY_ENABLE_WIN32
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32  LL_PROFILE_ZONE_NAMED
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_WIN32 LL_PROFILE_ZONE_SCOPED
#else
    #define LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32(name)
    #define LL_PROFILE_ZONE_SCOPED_CATEGORY_WIN32
#endif

#endif // LL_PROFILER_CATEGORIES_H

