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>
120 lines
4.6 KiB
C
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;
|
|
}
|