turnip: make debug_flags a global variable

Add tu_env as a global variable and add tu_env_init to initialize it.
Add TU_DEBUG macro to check debug flags.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20946>
This commit is contained in:
Chia-I Wu
2023-01-26 09:42:06 -08:00
committed by Marge Bot
parent 511c42ef4e
commit d7ef1331b5
15 changed files with 136 additions and 127 deletions

View File

@@ -3073,8 +3073,7 @@ tu_begin_load_store_cond_exec(struct tu_cmd_buffer *cmd,
{
tu_cond_exec_start(cs, CP_COND_REG_EXEC_0_MODE(PRED_TEST));
if (!unlikely(cmd->device->physical_device->instance->debug_flags &
TU_DEBUG_LOG_SKIP_GMEM_OPS))
if (!TU_DEBUG(LOG_SKIP_GMEM_OPS))
return;
uint64_t result_iova;
@@ -3096,8 +3095,7 @@ tu_end_load_store_cond_exec(struct tu_cmd_buffer *cmd,
{
tu_cond_exec_end(cs);
if (!unlikely(cmd->device->physical_device->instance->debug_flags &
TU_DEBUG_LOG_SKIP_GMEM_OPS))
if (!TU_DEBUG(LOG_SKIP_GMEM_OPS))
return;
uint64_t result_iova;
@@ -3294,7 +3292,7 @@ tu_attachment_store_unaligned(struct tu_cmd_buffer *cmd, uint32_t a)
const VkRect2D *render_area = &cmd->state.render_area;
/* Unaligned store is incredibly rare in CTS, we have to force it to test. */
if (unlikely(cmd->device->physical_device->instance->debug_flags & TU_DEBUG_UNALIGNED_STORE))
if (TU_DEBUG(UNALIGNED_STORE))
return true;
uint32_t x1 = render_area->offset.x;

View File

@@ -138,10 +138,10 @@ tu6_emit_flushes(struct tu_cmd_buffer *cmd_buffer,
enum tu_cmd_flush_bits flushes = cache->flush_bits;
cache->flush_bits = 0;
if (unlikely(cmd_buffer->device->physical_device->instance->debug_flags & TU_DEBUG_FLUSHALL))
if (TU_DEBUG(FLUSHALL))
flushes |= TU_CMD_FLAG_ALL_FLUSH | TU_CMD_FLAG_ALL_INVALIDATE;
if (unlikely(cmd_buffer->device->physical_device->instance->debug_flags & TU_DEBUG_SYNCDRAW))
if (TU_DEBUG(SYNCDRAW))
flushes |= TU_CMD_FLAG_WAIT_MEM_WRITES |
TU_CMD_FLAG_WAIT_FOR_IDLE |
TU_CMD_FLAG_WAIT_FOR_ME;
@@ -193,7 +193,7 @@ void
tu_emit_cache_flush_renderpass(struct tu_cmd_buffer *cmd_buffer)
{
if (!cmd_buffer->state.renderpass_cache.flush_bits &&
likely(!cmd_buffer->device->physical_device->instance->debug_flags))
likely(!tu_env.debug))
return;
tu6_emit_flushes(cmd_buffer, &cmd_buffer->draw_cs,
&cmd_buffer->state.renderpass_cache);
@@ -682,7 +682,7 @@ static bool
use_sysmem_rendering(struct tu_cmd_buffer *cmd,
struct tu_renderpass_result **autotune_result)
{
if (unlikely(cmd->device->physical_device->instance->debug_flags & TU_DEBUG_SYSMEM))
if (TU_DEBUG(SYSMEM))
return true;
/* can't fit attachments into gmem */
@@ -716,7 +716,7 @@ use_sysmem_rendering(struct tu_cmd_buffer *cmd,
!cmd->state.tiling->binning_possible)
return true;
if (unlikely(cmd->device->physical_device->instance->debug_flags & TU_DEBUG_GMEM))
if (TU_DEBUG(GMEM))
return false;
bool use_sysmem = tu_autotune_use_bypass(&cmd->device->autotune,
@@ -1847,7 +1847,7 @@ tu_BeginCommandBuffer(VkCommandBuffer commandBuffer,
vk_find_struct_const(pBeginInfo->pInheritanceInfo->pNext,
COMMAND_BUFFER_INHERITANCE_RENDERING_INFO);
if (unlikely(cmd_buffer->device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
rendering_info =
vk_get_command_buffer_inheritance_rendering_info(cmd_buffer->vk.level,
pBeginInfo);
@@ -4282,7 +4282,7 @@ tu_CmdBeginRenderPass2(VkCommandBuffer commandBuffer,
{
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
if (unlikely(cmd->device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
vk_common_CmdBeginRenderPass2(commandBuffer, pRenderPassBegin,
pSubpassBeginInfo);
return;
@@ -4405,7 +4405,7 @@ tu_CmdBeginRendering(VkCommandBuffer commandBuffer,
}
}
if (unlikely(cmd->device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
const VkRenderingSelfDependencyInfoMESA *self_dependency =
vk_find_struct_const(pRenderingInfo->pNext, RENDERING_SELF_DEPENDENCY_INFO_MESA);
if (self_dependency &&
@@ -4496,7 +4496,7 @@ tu_CmdNextSubpass2(VkCommandBuffer commandBuffer,
{
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
if (unlikely(cmd->device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
vk_common_CmdNextSubpass2(commandBuffer, pSubpassBeginInfo,
pSubpassEndInfo);
return;
@@ -5860,7 +5860,7 @@ tu_CmdEndRenderPass2(VkCommandBuffer commandBuffer,
{
TU_FROM_HANDLE(tu_cmd_buffer, cmd_buffer, commandBuffer);
if (unlikely(cmd_buffer->device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
vk_common_CmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
return;
}

View File

@@ -42,7 +42,7 @@ descriptor_size(struct tu_device *dev,
{
switch (type) {
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
if (unlikely(dev->instance->debug_flags & TU_DEBUG_DYNAMIC))
if (TU_DEBUG(DYNAMIC))
return A6XX_TEX_CONST_DWORDS * 4;
/* Input attachment doesn't use descriptor sets at all */
@@ -1186,7 +1186,7 @@ tu_GetDescriptorEXT(
break;
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
/* nothing in descriptor set - framebuffer state is used instead */
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
write_image_descriptor(pDescriptor, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
pDescriptorInfo->data.pInputAttachmentImage);
}
@@ -1347,7 +1347,7 @@ tu_update_descriptor_sets(const struct tu_device *device,
break;
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
/* nothing in descriptor set - framebuffer state is used instead */
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC))
if (TU_DEBUG(DYNAMIC))
write_image_descriptor(ptr, writeset->descriptorType, writeset->pImageInfo + j);
break;
default:
@@ -1676,7 +1676,7 @@ tu_update_descriptor_set_with_template(
break;
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
/* nothing in descriptor set - framebuffer state is used instead */
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC))
if (TU_DEBUG(DYNAMIC))
write_image_descriptor(ptr, templ->entry[i].descriptor_type, src);
break;
default:

View File

@@ -56,7 +56,7 @@ tu_device_get_cache_uuid(struct tu_physical_device *device, void *uuid)
* shader hash instead, since the compiler is only created with the logical
* device.
*/
uint64_t driver_flags = device->instance->debug_flags & TU_DEBUG_NOMULTIPOS;
uint64_t driver_flags = tu_env.debug & TU_DEBUG_NOMULTIPOS;
uint16_t family = fd_dev_gpu_id(&device->dev_id);
memset(uuid, 0, VK_UUID_SIZE);
@@ -145,7 +145,7 @@ get_device_extensions(const struct tu_physical_device *device,
.KHR_maintenance3 = true,
.KHR_maintenance4 = true,
.KHR_multiview = true,
.KHR_performance_query = device->instance->debug_flags & TU_DEBUG_PERFC,
.KHR_performance_query = TU_DEBUG(PERFC),
.KHR_pipeline_executable_properties = true,
.KHR_push_descriptor = true,
.KHR_relaxed_block_layout = true,
@@ -391,37 +391,6 @@ tu_destroy_physical_device(struct vk_physical_device *device)
vk_free(&device->instance->alloc, device);
}
static const struct debug_control tu_debug_options[] = {
{ "startup", TU_DEBUG_STARTUP },
{ "nir", TU_DEBUG_NIR },
{ "nobin", TU_DEBUG_NOBIN },
{ "sysmem", TU_DEBUG_SYSMEM },
{ "gmem", TU_DEBUG_GMEM },
{ "forcebin", TU_DEBUG_FORCEBIN },
{ "layout", TU_DEBUG_LAYOUT },
{ "noubwc", TU_DEBUG_NOUBWC },
{ "nomultipos", TU_DEBUG_NOMULTIPOS },
{ "nolrz", TU_DEBUG_NOLRZ },
{ "nolrzfc", TU_DEBUG_NOLRZFC },
{ "perf", TU_DEBUG_PERF },
{ "perfc", TU_DEBUG_PERFC },
{ "flushall", TU_DEBUG_FLUSHALL },
{ "syncdraw", TU_DEBUG_SYNCDRAW },
{ "rast_order", TU_DEBUG_RAST_ORDER },
{ "unaligned_store", TU_DEBUG_UNALIGNED_STORE },
{ "log_skip_gmem_ops", TU_DEBUG_LOG_SKIP_GMEM_OPS },
{ "dynamic", TU_DEBUG_DYNAMIC },
{ "bos", TU_DEBUG_BOS },
{ NULL, 0 }
};
const char *
tu_get_debug_option_name(int id)
{
assert(id < ARRAY_SIZE(tu_debug_options) - 1);
return tu_debug_options[id].string;
}
static const driOptionDescription tu_dri_options[] = {
DRI_CONF_SECTION_PERFORMANCE
DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
@@ -464,6 +433,8 @@ tu_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
struct tu_instance *instance;
VkResult result;
tu_env_init();
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO);
if (pAllocator == NULL)
@@ -498,18 +469,7 @@ tu_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
#endif
instance->vk.physical_devices.destroy = tu_destroy_physical_device;
instance->debug_flags =
parse_debug_string(os_get_option("TU_DEBUG"), tu_debug_options);
#ifdef DEBUG
/* Enable startup debugging by default on debug drivers. You almost always
* want to see your startup failures in that case, and it's hard to set
* this env var on android.
*/
instance->debug_flags |= TU_DEBUG_STARTUP;
#endif
if (instance->debug_flags & TU_DEBUG_STARTUP)
if (TU_DEBUG(STARTUP))
mesa_logi("Created an instance");
VG(VALGRIND_CREATE_MEMPOOL(instance, 0, false));
@@ -1501,8 +1461,7 @@ tu_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
A6XX_TEX_CONST_DWORDS * 4;
properties->robustStorageBufferDescriptorSize =
properties->storageBufferDescriptorSize;
properties->inputAttachmentDescriptorSize =
(pdevice->instance->debug_flags & TU_DEBUG_DYNAMIC) ?
properties->inputAttachmentDescriptorSize = TU_DEBUG(DYNAMIC) ?
A6XX_TEX_CONST_DWORDS * 4 : 0;
properties->maxSamplerDescriptorBufferRange = ~0ull;
@@ -2082,7 +2041,7 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice,
u_rwlock_init(&device->dma_bo_lock);
pthread_mutex_init(&device->submit_mutex, NULL);
if (device->instance->debug_flags & TU_DEBUG_BOS)
if (TU_DEBUG(BOS))
device->bo_sizes = _mesa_hash_table_create(NULL, _mesa_hash_string, _mesa_key_string_equal);
#ifndef TU_USE_KGSL
@@ -2922,7 +2881,7 @@ tu_CreateFramebuffer(VkDevice _device,
{
TU_FROM_HANDLE(tu_device, device, _device);
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC))
if (TU_DEBUG(DYNAMIC))
return vk_common_CreateFramebuffer(_device, pCreateInfo, pAllocator,
pFramebuffer);
@@ -2984,7 +2943,7 @@ tu_DestroyFramebuffer(VkDevice _device,
{
TU_FROM_HANDLE(tu_device, device, _device);
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
vk_common_DestroyFramebuffer(_device, _fb, pAllocator);
return;
}

View File

@@ -35,31 +35,6 @@
/* extra space in vsc draw/prim streams */
#define VSC_PAD 0x40
enum tu_debug_flags
{
TU_DEBUG_STARTUP = 1 << 0,
TU_DEBUG_NIR = 1 << 1,
TU_DEBUG_NOBIN = 1 << 3,
TU_DEBUG_SYSMEM = 1 << 4,
TU_DEBUG_FORCEBIN = 1 << 5,
TU_DEBUG_NOUBWC = 1 << 6,
TU_DEBUG_NOMULTIPOS = 1 << 7,
TU_DEBUG_NOLRZ = 1 << 8,
TU_DEBUG_PERFC = 1 << 9,
TU_DEBUG_FLUSHALL = 1 << 10,
TU_DEBUG_SYNCDRAW = 1 << 11,
/* bit 12 is available */
TU_DEBUG_GMEM = 1 << 13,
TU_DEBUG_RAST_ORDER = 1 << 14,
TU_DEBUG_UNALIGNED_STORE = 1 << 15,
TU_DEBUG_LAYOUT = 1 << 16,
TU_DEBUG_LOG_SKIP_GMEM_OPS = 1 << 17,
TU_DEBUG_PERF = 1 << 18,
TU_DEBUG_NOLRZFC = 1 << 19,
TU_DEBUG_DYNAMIC = 1 << 20,
TU_DEBUG_BOS = 1 << 21,
};
enum global_shader {
GLOBAL_SH_VS_BLIT,
GLOBAL_SH_VS_CLEAR,
@@ -148,8 +123,6 @@ struct tu_instance
struct driOptionCache dri_options;
struct driOptionCache available_dri_options;
enum tu_debug_flags debug_flags;
bool dont_care_as_load;
/* Conservative LRZ (default true) invalidates LRZ on draws with
@@ -439,9 +412,6 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(tu_sampler, base, VkSampler,
uint64_t
tu_get_system_heap_size(void);
const char *
tu_get_debug_option_name(int id);
VkResult
tu_physical_device_init(struct tu_physical_device *device,
struct tu_instance *instance);

View File

@@ -859,7 +859,7 @@ tu_physical_device_try_create(struct vk_instance *vk_instance,
drmFreeVersion(version);
if (instance->debug_flags & TU_DEBUG_STARTUP)
if (TU_DEBUG(STARTUP))
mesa_logi("Found compatible device '%s'.", path);
device->instance = instance;
@@ -1303,8 +1303,7 @@ tu_queue_submit(struct vk_queue *vk_queue, struct vk_queue_submit *submit)
submit->perf_pass_index : ~0;
struct tu_queue_submit submit_req;
if (unlikely(queue->device->physical_device->instance->debug_flags &
TU_DEBUG_LOG_SKIP_GMEM_OPS)) {
if (TU_DEBUG(LOG_SKIP_GMEM_OPS)) {
tu_dbg_log_gmem_load_store_skips(queue->device);
}

View File

@@ -510,7 +510,7 @@ tu_image_init(struct tu_device *device, struct tu_image *image,
/* expect UBWC enabled if we asked for it */
if (modifier == DRM_FORMAT_MOD_QCOM_COMPRESSED)
assert(ubwc_enabled);
else if (device->physical_device->instance->debug_flags & TU_DEBUG_NOUBWC)
else if (TU_DEBUG(NOUBWC))
ubwc_enabled = false;
/* Non-UBWC tiled R8G8 is probably buggy since media formats are always
@@ -574,7 +574,7 @@ tu_image_init(struct tu_device *device, struct tu_image *image,
return vk_error(device, VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
}
if (device->instance->debug_flags & TU_DEBUG_LAYOUT)
if (TU_DEBUG(LAYOUT))
fdl_dump_layout(layout);
/* fdl6_layout can't take explicit offset without explicit pitch
@@ -593,7 +593,7 @@ tu_image_init(struct tu_device *device, struct tu_image *image,
}
const struct util_format_description *desc = util_format_description(image->layout[0].format);
if (util_format_has_depth(desc) && !(device->instance->debug_flags & TU_DEBUG_NOLRZ))
if (util_format_has_depth(desc) && !TU_DEBUG(NOLRZ))
{
/* Depth plane is the first one */
struct fdl_layout *layout = &image->layout[0];
@@ -630,7 +630,7 @@ tu_image_init(struct tu_device *device, struct tu_image *image,
/* Fast-clear buffer cannot be larger than 512 bytes (HW limitation) */
bool has_lrz_fc = image->lrz_fc_size <= 512 &&
device->physical_device->info->a6xx.enable_lrz_fast_clear &&
!unlikely(device->physical_device->instance->debug_flags & TU_DEBUG_NOLRZFC);
!TU_DEBUG(NOLRZFC);
if (has_lrz_fc || device->physical_device->info->a6xx.has_lrz_dir_tracking) {
image->lrz_fc_offset = image->total_size;

View File

@@ -263,7 +263,7 @@ tu_enumerate_devices(struct vk_instance *vk_instance)
/* kgsl version check? */
if (instance->debug_flags & TU_DEBUG_STARTUP)
if (TU_DEBUG(STARTUP))
mesa_logi("Found compatible device '%s'.", path);
device->instance = instance;
@@ -377,8 +377,7 @@ tu_QueueSubmit2(VkQueue _queue,
TU_FROM_HANDLE(tu_syncobj, fence, _fence);
VkResult result = VK_SUCCESS;
if (unlikely(queue->device->physical_device->instance->debug_flags &
TU_DEBUG_LOG_SKIP_GMEM_OPS)) {
if (TU_DEBUG(LOG_SKIP_GMEM_OPS)) {
tu_dbg_log_gmem_load_store_skips(queue->device);
}

View File

@@ -111,8 +111,7 @@ tu_lrz_init_state(struct tu_cmd_buffer *cmd,
const struct tu_image_view *view)
{
if (!view->image->lrz_height) {
assert((cmd->device->instance->debug_flags & TU_DEBUG_NOLRZ) ||
!vk_format_has_depth(att->format));
assert(TU_DEBUG(NOLRZ) || !vk_format_has_depth(att->format));
return;
}
@@ -161,7 +160,7 @@ tu_lrz_init_secondary(struct tu_cmd_buffer *cmd,
if (!has_gpu_tracking)
return;
if (cmd->device->instance->debug_flags & TU_DEBUG_NOLRZ)
if (TU_DEBUG(NOLRZ))
return;
if (!vk_format_has_depth(att->format))
@@ -575,8 +574,7 @@ tu6_calculate_lrz_state(struct tu_cmd_buffer *cmd,
/* If depth test is disabled we shouldn't touch LRZ.
* Same if there is no depth attachment.
*/
if (a == VK_ATTACHMENT_UNUSED || !z_test_enable ||
(cmd->device->instance->debug_flags & TU_DEBUG_NOLRZ))
if (a == VK_ATTACHMENT_UNUSED || !z_test_enable || TU_DEBUG(NOLRZ))
return gras_lrz_cntl;
if (!cmd->state.lrz.gpu_dir_tracking && !cmd->state.attachments) {

View File

@@ -99,7 +99,7 @@ tu_nir_lower_multiview(nir_shader *nir, uint32_t mask, struct tu_device *dev)
/* In addition to the generic checks done by NIR, check that we don't
* overflow VPC with the extra copies of gl_Position.
*/
if (likely(!(dev->physical_device->instance->debug_flags & TU_DEBUG_NOMULTIPOS)) &&
if (!TU_DEBUG(NOMULTIPOS) &&
num_views <= max_views_for_multipos && num_outputs + (num_views - 1) <= 32 &&
nir_can_lower_multiview(nir)) {
/* It appears that the multiview mask is ignored when multi-position

View File

@@ -761,7 +761,7 @@ tu_CreateRenderPass2(VkDevice _device,
{
TU_FROM_HANDLE(tu_device, device, _device);
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC))
if (TU_DEBUG(DYNAMIC))
return vk_common_CreateRenderPass2(_device, pCreateInfo, pAllocator,
pRenderPass);
@@ -957,7 +957,7 @@ tu_DestroyRenderPass(VkDevice _device,
{
TU_FROM_HANDLE(tu_device, device, _device);
if (unlikely(device->instance->debug_flags & TU_DEBUG_DYNAMIC)) {
if (TU_DEBUG(DYNAMIC)) {
vk_common_DestroyRenderPass(_device, _pass, pAllocator);
return;
}

View File

@@ -4662,7 +4662,7 @@ tu_pipeline_builder_parse_rasterization_order(
bool raster_order_attachment_access =
pipeline->blend.raster_order_attachment_access ||
pipeline->ds.raster_order_attachment_access ||
unlikely(builder->device->physical_device->instance->debug_flags & TU_DEBUG_RAST_ORDER);
TU_DEBUG(RAST_ORDER);
/* VK_EXT_blend_operation_advanced would also require ordered access
* when implemented in the future.
@@ -4957,7 +4957,7 @@ tu_pipeline_builder_init_graphics(
const VkPipelineRenderingCreateInfo *rendering_info =
vk_find_struct_const(create_info->pNext, PIPELINE_RENDERING_CREATE_INFO);
if (unlikely(dev->instance->debug_flags & TU_DEBUG_DYNAMIC) && !rendering_info)
if (TU_DEBUG(DYNAMIC) && !rendering_info)
rendering_info = vk_get_pipeline_rendering_create_info(create_info);
/* Get multiview_mask, which is only used for shaders */

View File

@@ -90,7 +90,7 @@ tu_spirv_to_nir(struct tu_device *dev,
if (result != VK_SUCCESS)
return NULL;
if (unlikely(dev->physical_device->instance->debug_flags & TU_DEBUG_NIR)) {
if (TU_DEBUG(NIR)) {
fprintf(stderr, "translated nir:\n");
nir_print_shader(nir, stderr);
}
@@ -361,7 +361,7 @@ build_bindless(struct tu_device *dev, nir_builder *b,
/* input attachments use non bindless workaround */
if (bind_layout->type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT &&
likely(!(dev->instance->debug_flags & TU_DEBUG_DYNAMIC))) {
!TU_DEBUG(DYNAMIC)) {
const struct glsl_type *glsl_type = glsl_without_array(var->type);
uint32_t idx = var->data.index * 2;

View File

@@ -15,6 +15,57 @@
#include "tu_device.h"
#include "tu_pass.h"
static const struct debug_control tu_debug_options[] = {
{ "startup", TU_DEBUG_STARTUP },
{ "nir", TU_DEBUG_NIR },
{ "nobin", TU_DEBUG_NOBIN },
{ "sysmem", TU_DEBUG_SYSMEM },
{ "gmem", TU_DEBUG_GMEM },
{ "forcebin", TU_DEBUG_FORCEBIN },
{ "layout", TU_DEBUG_LAYOUT },
{ "noubwc", TU_DEBUG_NOUBWC },
{ "nomultipos", TU_DEBUG_NOMULTIPOS },
{ "nolrz", TU_DEBUG_NOLRZ },
{ "nolrzfc", TU_DEBUG_NOLRZFC },
{ "perf", TU_DEBUG_PERF },
{ "perfc", TU_DEBUG_PERFC },
{ "flushall", TU_DEBUG_FLUSHALL },
{ "syncdraw", TU_DEBUG_SYNCDRAW },
{ "rast_order", TU_DEBUG_RAST_ORDER },
{ "unaligned_store", TU_DEBUG_UNALIGNED_STORE },
{ "log_skip_gmem_ops", TU_DEBUG_LOG_SKIP_GMEM_OPS },
{ "dynamic", TU_DEBUG_DYNAMIC },
{ "bos", TU_DEBUG_BOS },
{ NULL, 0 }
};
struct tu_env tu_env;
static void
tu_env_init_once(void)
{
tu_env.debug = parse_debug_string(os_get_option("TU_DEBUG"),
tu_debug_options);
#ifdef DEBUG
/* Enable startup debugging by default on debug drivers. You almost always
* want to see your startup failures in that case, and it's hard to set
* this env var on android.
*/
tu_env.debug |= TU_DEBUG_STARTUP;
#endif
if (TU_DEBUG(STARTUP))
mesa_logi("TU_DEBUG=0x%x", tu_env.debug);
}
void
tu_env_init(void)
{
static once_flag once = ONCE_FLAG_INIT;
call_once(&once, tu_env_init_once);
}
void PRINTFLIKE(3, 4)
__tu_finishme(const char *file, int line, const char *format, ...)
{
@@ -126,7 +177,7 @@ tu_tiling_config_update_tile_layout(struct tu_framebuffer *fb,
if (!pass->gmem_pixels[gmem_layout])
return;
if (unlikely(dev->physical_device->instance->debug_flags & TU_DEBUG_FORCEBIN)) {
if (TU_DEBUG(FORCEBIN)) {
/* start with 2x2 tiles */
tiling->tile_count.width = 2;
tiling->tile_count.height = 2;
@@ -255,10 +306,9 @@ tu_tiling_config_update_binning(struct tu_tiling_config *tiling, const struct tu
if (tiling->binning_possible) {
tiling->binning = (tiling->tile_count.width * tiling->tile_count.height) > 2;
if (unlikely(device->physical_device->instance->debug_flags & TU_DEBUG_FORCEBIN))
if (TU_DEBUG(FORCEBIN))
tiling->binning = true;
if (unlikely(device->physical_device->instance->debug_flags &
TU_DEBUG_NOBIN))
if (TU_DEBUG(NOBIN))
tiling->binning = false;
} else {
tiling->binning = false;

View File

@@ -18,6 +18,42 @@
#include "vk_util.h"
#define TU_DEBUG(name) unlikely(tu_env.debug & TU_DEBUG_##name)
enum tu_debug_flags
{
TU_DEBUG_STARTUP = 1 << 0,
TU_DEBUG_NIR = 1 << 1,
TU_DEBUG_NOBIN = 1 << 3,
TU_DEBUG_SYSMEM = 1 << 4,
TU_DEBUG_FORCEBIN = 1 << 5,
TU_DEBUG_NOUBWC = 1 << 6,
TU_DEBUG_NOMULTIPOS = 1 << 7,
TU_DEBUG_NOLRZ = 1 << 8,
TU_DEBUG_PERFC = 1 << 9,
TU_DEBUG_FLUSHALL = 1 << 10,
TU_DEBUG_SYNCDRAW = 1 << 11,
/* bit 12 is available */
TU_DEBUG_GMEM = 1 << 13,
TU_DEBUG_RAST_ORDER = 1 << 14,
TU_DEBUG_UNALIGNED_STORE = 1 << 15,
TU_DEBUG_LAYOUT = 1 << 16,
TU_DEBUG_LOG_SKIP_GMEM_OPS = 1 << 17,
TU_DEBUG_PERF = 1 << 18,
TU_DEBUG_NOLRZFC = 1 << 19,
TU_DEBUG_DYNAMIC = 1 << 20,
TU_DEBUG_BOS = 1 << 21,
};
struct tu_env {
uint32_t debug;
};
extern struct tu_env tu_env;
void
tu_env_init(void);
/* Whenever we generate an error, pass it through this function. Useful for
* debugging, where we can break on it. Only call at error site, not when
* propagating errors. Might be useful to plug in a stack trace here.
@@ -37,7 +73,7 @@ __vk_startup_errorf(struct tu_instance *instance,
*/
#define vk_startup_errorf(instance, error, format, ...) \
__vk_startup_errorf(instance, error, \
instance->debug_flags & TU_DEBUG_STARTUP, \
TU_DEBUG(STARTUP), \
__FILE__, __LINE__, format, ##__VA_ARGS__)
void
@@ -391,7 +427,7 @@ void
tu_dbg_log_gmem_load_store_skips(struct tu_device *device);
#define perf_debug(device, fmt, ...) do { \
if (unlikely((device)->instance->debug_flags & TU_DEBUG_PERF)) \
if (TU_DEBUG(PERF)) \
mesa_log(MESA_LOG_WARN, (MESA_LOG_TAG), (fmt), ##__VA_ARGS__); \
} while(0)