Log instead of warn of unsupported extensions

Currently we produce a warning every time an unsupported extension is
used. The original bug (b/139528538) called for logging these structs
silently unless a debugger's attached.

So I've replaced all of our warnings for unsupported structs with
calls to LOG_TRAP. This is an update to TRACE_ASSERT. LOG_TRAP will
never emit to the debug log, instead it will only print to a file if
writing to files is enabled for logv.

Bug: b/148415347
Change-Id: Ib4ad2b20b3dffce4fac597c891b2f5ee23e032c4
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/41348
Tested-by: Sean Risser <srisser@google.com>
Presubmit-Ready: Sean Risser <srisser@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/System/Debug.cpp b/src/System/Debug.cpp
index 8be91a1..1b91e14 100644
--- a/src/System/Debug.cpp
+++ b/src/System/Debug.cpp
@@ -98,11 +98,13 @@
 
 enum class Level
 {
+	Verbose,
 	Debug,
 	Info,
 	Warn,
 	Error,
 	Fatal,
+	Disabled,
 };
 
 #ifdef __ANDROID__
@@ -125,6 +127,8 @@
 		case Level::Fatal:
 			__android_log_write(ANDROID_LOG_FATAL, "SwiftShader", msg);
 			break;
+		default:
+			break;
 	}
 }
 #else
@@ -141,32 +145,32 @@
 		case Level::Fatal:
 			fprintf(stderr, "%s", msg);
 			break;
+		default:
+			break;
 	}
 }
 #endif
 
 void logv(Level level, const char *format, va_list args)
 {
-	if(static_cast<int>(level) < static_cast<int>(Level::SWIFTSHADER_LOGGING_LEVEL))
+	if(static_cast<int>(level) >= static_cast<int>(Level::SWIFTSHADER_LOGGING_LEVEL))
 	{
-		return;
-	}
-
 #ifndef SWIFTSHADER_DISABLE_TRACE
-	char buffer[2048];
-	vsnprintf(buffer, sizeof(buffer), format, args);
+		char buffer[2048];
+		vsnprintf(buffer, sizeof(buffer), format, args);
 
 #	if defined(__ANDROID__)
-	logv_android(level, buffer);
+		logv_android(level, buffer);
 #	elif defined(_WIN32)
-	logv_std(level, buffer);
-	::OutputDebugString(buffer);
+		logv_std(level, buffer);
+		::OutputDebugString(buffer);
 #	else
-	logv_std(level, buffer);
+		logv_std(level, buffer);
 #	endif
+	}
 
-	const bool traceToFile = false;
-	if(traceToFile)
+	const Level traceToFileLevel = Level::Disabled;
+	if(static_cast<int>(level) >= static_cast<int>(traceToFileLevel))
 	{
 		FILE *file = fopen(TRACE_OUTPUT_FILE, "a");
 
@@ -210,8 +214,10 @@
 	::abort();
 }
 
-void trace_assert(const char *format, ...)
+void log_trap(const char *format, ...)
 {
+	// If enabled, log_assert will log all messages, and otherwise ignore them
+	// unless a debugger is attached.
 	static std::atomic<bool> asserted = { false };
 	if(IsUnderDebugger() && !asserted.exchange(true))
 	{
@@ -227,7 +233,7 @@
 	{
 		va_list vararg;
 		va_start(vararg, format);
-		logv(Level::Fatal, format, vararg);
+		logv(Level::Verbose, format, vararg);
 		va_end(vararg);
 	}
 }
diff --git a/src/System/Debug.hpp b/src/System/Debug.hpp
index 85ea4a4..6556326 100644
--- a/src/System/Debug.hpp
+++ b/src/System/Debug.hpp
@@ -47,8 +47,8 @@
 // Outputs the message to the debugging log and stderr, and calls abort().
 void abort(const char *format, ...) CHECK_PRINTF_ARGS;
 
-// Outputs text to the debugging log, and asserts once if a debugger is attached.
-void trace_assert(const char *format, ...) CHECK_PRINTF_ARGS;
+// Outputs text to the debugging log, and traps once if a debugger is attached.
+void log_trap(const char *format, ...) CHECK_PRINTF_ARGS;
 
 }  // namespace sw
 
@@ -59,7 +59,7 @@
 #	define TRACE_ASSERT(message, ...) (void(0))
 #else
 #	define TRACE(message, ...) sw::trace("%s:%d TRACE: " message "\n", __FILE__, __LINE__, ##__VA_ARGS__)
-#	define TRACE_ASSERT(message, ...) sw::trace_assert("%s:%d %s TRACE_ASSERT: " message "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
+#	define LOG_TRAP(message, ...) sw::log_trap("%s:%d %s TRACE_ASSERT: " message "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
 #endif
 
 // A macro to print a warning message to the debugging log and stderr to denote
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 937f482..c583748 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -243,7 +243,7 @@
 			}
 			break;
 			default:
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
 				break;
 		}
 
@@ -392,7 +392,7 @@
 				//  Vulkan structures in this Specification."
 				break;
 			default:
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(createInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(createInfo->sType).c_str());
 				break;
 		}
 	}
@@ -752,7 +752,7 @@
 			break;
 			default:
 				// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
 				break;
 		}
 
@@ -782,7 +782,7 @@
 		auto extInfo = reinterpret_cast<VkBaseInStructure const *>(queueCreateInfo.pNext);
 		while(extInfo)
 		{
-			WARN("pCreateInfo->pQueueCreateInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType).c_str());
+			LOG_TRAP("pCreateInfo->pQueueCreateInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType).c_str());
 			extInfo = extInfo->pNext;
 		}
 
@@ -968,7 +968,7 @@
 				break;
 			}
 			default:
-				WARN("pAllocateInfo->pNext sType = %s", vk::Stringify(allocationInfo->sType).c_str());
+				LOG_TRAP("pAllocateInfo->pNext sType = %s", vk::Stringify(allocationInfo->sType).c_str());
 				break;
 		}
 
@@ -1209,7 +1209,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -1352,7 +1352,7 @@
 	while(extInfo)
 	{
 		// Vulkan 1.2: "pNext must be NULL"
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -1406,7 +1406,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pCreateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -1443,7 +1443,7 @@
 				// Do nothing. Should be handled by vk::Buffer::Create().
 				break;
 			default:
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 				break;
 		}
 		nextInfo = nextInfo->pNext;
@@ -1474,7 +1474,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pCreateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -1529,7 +1529,7 @@
 				break;
 			default:
 				// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
 				break;
 		}
 
@@ -1633,7 +1633,7 @@
 			}
 			break;
 			default:
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
 				break;
 		}
 
@@ -1665,7 +1665,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -1694,7 +1694,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pCreateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -1811,7 +1811,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -1850,7 +1850,7 @@
 			}
 			break;
 			default:
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
 				break;
 		}
 
@@ -1883,7 +1883,7 @@
 				ASSERT(!vk::Cast(device)->hasExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME));
 				break;
 			default:
-				WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
+				LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
 				break;
 		}
 
@@ -1909,7 +1909,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pCreateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -1946,7 +1946,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pAllocateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pAllocateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pAllocateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -1984,7 +1984,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -2055,7 +2055,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -2086,7 +2086,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pAllocateInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pAllocateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pAllocateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -2109,7 +2109,7 @@
 	auto *nextInfo = reinterpret_cast<const VkBaseInStructure *>(pBeginInfo->pNext);
 	while(nextInfo)
 	{
-		WARN("pBeginInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
+		LOG_TRAP("pBeginInfo->pNext sType = %s", vk::Stringify(nextInfo->sType).c_str());
 		nextInfo = nextInfo->pNext;
 	}
 
@@ -2467,7 +2467,7 @@
 				// SwiftShader only has a single physical device, so this extension does nothing in this case.
 				break;
 			default:
-				WARN("pRenderPassBegin->pNext sType = %s", vk::Stringify(renderPassBeginInfo->sType).c_str());
+				LOG_TRAP("pRenderPassBegin->pNext sType = %s", vk::Stringify(renderPassBeginInfo->sType).c_str());
 				break;
 		}
 
@@ -2540,7 +2540,7 @@
 		auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pBindInfos[i].pNext);
 		while(extInfo)
 		{
-			WARN("pBindInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType).c_str());
+			LOG_TRAP("pBindInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType).c_str());
 			extInfo = extInfo->pNext;
 		}
 
@@ -2598,7 +2598,7 @@
 #endif
 
 				default:
-					WARN("pBindInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType).c_str());
+					LOG_TRAP("pBindInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType).c_str());
 					break;
 			}
 			extInfo = extInfo->pNext;
@@ -2650,7 +2650,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -2666,7 +2666,7 @@
 			}
 			break;
 			default:
-				WARN("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
+				LOG_TRAP("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
 				break;
 		}
 
@@ -2684,7 +2684,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -2700,7 +2700,7 @@
 			}
 			break;
 			default:
-				WARN("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
+				LOG_TRAP("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
 				break;
 		}
 
@@ -2718,14 +2718,14 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
 	auto extensionRequirements = reinterpret_cast<VkBaseInStructure const *>(pSparseMemoryRequirements->pNext);
 	while(extensionRequirements)
 	{
-		WARN("pSparseMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
+		LOG_TRAP("pSparseMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
 		extensionRequirements = extensionRequirements->pNext;
 	}
 
@@ -2820,7 +2820,7 @@
 				                             sizeof(deviceExtensionProperties) / sizeof(deviceExtensionProperties[0])));
 				break;
 			default:
-				WARN("pFeatures->pNext sType = %s", vk::Stringify(extensionFeatures->sType).c_str());
+				LOG_TRAP("pFeatures->pNext sType = %s", vk::Stringify(extensionFeatures->sType).c_str());
 				break;
 		}
 
@@ -2918,7 +2918,7 @@
 			break;
 			default:
 				// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
-				WARN("pProperties->pNext sType = %s", vk::Stringify(extensionProperties->sType).c_str());
+				LOG_TRAP("pProperties->pNext sType = %s", vk::Stringify(extensionProperties->sType).c_str());
 				break;
 		}
 
@@ -2936,7 +2936,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pFormatProperties->pNext);
 	while(extInfo)
 	{
-		WARN("pFormatProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pFormatProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -2983,7 +2983,7 @@
 			}
 			break;
 			default:
-				WARN("pImageFormatInfo->pNext sType = %s", vk::Stringify(extensionFormatInfo->sType).c_str());
+				LOG_TRAP("pImageFormatInfo->pNext sType = %s", vk::Stringify(extensionFormatInfo->sType).c_str());
 				break;
 		}
 
@@ -3016,7 +3016,7 @@
 			}
 			break;
 			default:
-				WARN("pImageFormatProperties->pNext sType = %s", vk::Stringify(extensionProperties->sType).c_str());
+				LOG_TRAP("pImageFormatProperties->pNext sType = %s", vk::Stringify(extensionProperties->sType).c_str());
 				break;
 		}
 
@@ -3042,7 +3042,7 @@
 		auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pQueueFamilyProperties->pNext);
 		while(extInfo)
 		{
-			WARN("pQueueFamilyProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+			LOG_TRAP("pQueueFamilyProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 			extInfo = extInfo->pNext;
 		}
 	}
@@ -3064,7 +3064,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pMemoryProperties->pNext);
 	while(extInfo)
 	{
-		WARN("pMemoryProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pMemoryProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -3081,7 +3081,7 @@
 		auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pProperties->pNext);
 		while(extInfo)
 		{
-			WARN("pProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+			LOG_TRAP("pProperties->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 			extInfo = extInfo->pNext;
 		}
 	}
@@ -3112,7 +3112,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pQueueInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pQueueInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pQueueInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -3137,7 +3137,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pCreateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}
 
@@ -3171,7 +3171,7 @@
 	auto extInfo = reinterpret_cast<VkBaseInStructure const *>(pCreateInfo->pNext);
 	while(extInfo)
 	{
-		WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
+		LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType).c_str());
 		extInfo = extInfo->pNext;
 	}