mesa/src/broadcom/common/v3d_debug.c
Iago Toral Quiroga b9f9474577 v3dv: implement double-buffer mode
Double buffer mode splits the tile buffer size in half so we can
start processing the next tile while the current one is being
stored to memory. This mode is available only if MSAA is not enabled
and can, in theory, improve performance by reducing tile store
overhead, however, it comes at the cost of reducing the tile size,
which also causes some overhead of its own.

Testing shows that this helps some cases (i.e the Vulkan Quake
ports) but hurts others (i.e. Unreal Engine 4), so for the time
being we don't enable this by default but we allow to enable it
selectively by using V3D_DEBUG.

Reviewed-by: Juan A. Suarez <jasuarez@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14551>
2022-01-14 10:57:26 +00:00

120 lines
4.6 KiB
C

/*
* Copyright 2003 VMware, Inc.
* Copyright © 2006 Intel Corporation
* Copyright © 2017 Broadcom
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
/**
* \file v3d_debug.c
*
* Support for the V3D_DEBUG environment variable, along with other
* miscellaneous debugging code.
*/
#include <stdlib.h>
#include "common/v3d_debug.h"
#include "util/macros.h"
#include "util/u_debug.h"
#include "c11/threads.h"
uint32_t V3D_DEBUG = 0;
static const struct debug_named_value debug_control[] = {
{ "cl", V3D_DEBUG_CL,
"Dump command list during creation" },
{ "cl_nobin", V3D_DEBUG_CL_NO_BIN,
"Dump command listduring creation, excluding binary resources" },
{ "clif", V3D_DEBUG_CLIF,
"Dump command list (CLIF format) during creation", },
{ "qpu", V3D_DEBUG_QPU,
"Dump generated QPU instructions" },
{ "vir", V3D_DEBUG_VIR,
"Dump VIR during program compile" },
{ "nir", V3D_DEBUG_NIR,
"Dump NIR during program compile" },
{ "tgsi", V3D_DEBUG_TGSI,
"Dump TGSI during program compile" },
{ "shaderdb", V3D_DEBUG_SHADERDB,
"Dump program compile information for shader-db analysis" },
{ "surface", V3D_DEBUG_SURFACE,
"Print resource layout information" },
{ "perf", V3D_DEBUG_PERF,
"Print during runtime performance-related events" },
{ "norast", V3D_DEBUG_NORAST,
"Skip actual hardware execution of commands" },
{ "fs", V3D_DEBUG_FS,
"Dump fragment shaders" },
{ "gs", V3D_DEBUG_GS,
"Dump geometry shaders" },
{ "vs", V3D_DEBUG_VS,
"Dump vertex shaders" },
{ "cs", V3D_DEBUG_CS,
"Dump computer shaders" },
{ "always_flush", V3D_DEBUG_ALWAYS_FLUSH,
"Flush after each draw call" },
{ "precompile", V3D_DEBUG_PRECOMPILE,
"Precompiles shader variant at shader state creation time" },
{ "ra", V3D_DEBUG_RA,
"Dump register allocation failures" },
{ "dump_spirv", V3D_DEBUG_DUMP_SPIRV,
"Dump SPIR-V code" },
{ "tmu32", V3D_DEBUG_TMU_32BIT,
"Force 32-bit precision on all TMU operations" },
/* This can lead to incorrect behavior for applications that do
* require full 32-bit precision, but can improve performance
* for those that don't.
*/
{ "tmu16", V3D_DEBUG_TMU_16BIT,
"Force 16-bit precision on all TMU operations" },
{ "noloopunroll", V3D_DEBUG_NO_LOOP_UNROLL,
"Disable loop unrolling" },
{ "db", V3D_DEBUG_DOUBLE_BUFFER,
"Enable double buffer for Tile Buffer when MSAA is disabled" },
{ NULL }
};
DEBUG_GET_ONCE_FLAGS_OPTION(v3d_debug, "V3D_DEBUG", debug_control, 0)
uint32_t
v3d_debug_flag_for_shader_stage(gl_shader_stage stage)
{
uint32_t flags[] = {
[MESA_SHADER_VERTEX] = V3D_DEBUG_VS,
[MESA_SHADER_TESS_CTRL] = 0,
[MESA_SHADER_TESS_EVAL] = 0,
[MESA_SHADER_GEOMETRY] = V3D_DEBUG_GS,
[MESA_SHADER_FRAGMENT] = V3D_DEBUG_FS,
[MESA_SHADER_COMPUTE] = V3D_DEBUG_CS,
};
STATIC_ASSERT(MESA_SHADER_STAGES == 6);
return flags[stage];
}
void
v3d_process_debug_variable(void)
{
V3D_DEBUG = debug_get_option_v3d_debug();
if (V3D_DEBUG & V3D_DEBUG_SHADERDB)
V3D_DEBUG |= V3D_DEBUG_NORAST;
}