Remove stray printfs.

SwiftShader shouldn't print anything to stdout in Release builds.

Also refactor UNIMPLEMENTED macro to be able to take a formatted string
with arguments.

Bug b/73656151

Change-Id: Ibadbfba3371324ba1bd608bd51bdac5e5923a20e
Reviewed-on: https://swiftshader-review.googlesource.com/21108
Reviewed-by: Merck Hung <merckhung@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Common/Configurator.cpp b/src/Common/Configurator.cpp
index 445305c..ead1d28 100644
--- a/src/Common/Configurator.cpp
+++ b/src/Common/Configurator.cpp
@@ -66,7 +66,7 @@
 
 				if(!isprint(line[0]))
 				{
-					printf("Failing on char %d\n", line[0]);
+				//	printf("Failing on char %d\n", line[0]);
 					file.close();
 					return false;
 				}
diff --git a/src/Common/Debug.cpp b/src/Common/Debug.cpp
index c3a1921..acf469e 100644
--- a/src/Common/Debug.cpp
+++ b/src/Common/Debug.cpp
@@ -17,6 +17,8 @@
 #include <stdio.h>
 #include <stdarg.h>
 
+namespace sw
+{
 void trace(const char *format, ...)
 {
 	if(false)
@@ -34,3 +36,4 @@
 		}
 	}
 }
+}
diff --git a/src/Common/Debug.hpp b/src/Common/Debug.hpp
index 436854c..5033bc5 100644
--- a/src/Common/Debug.hpp
+++ b/src/Common/Debug.hpp
@@ -25,25 +25,34 @@
 #undef min
 #undef max
 
+namespace sw
+{
 void trace(const char *format, ...);
+inline void trace() {}
+}
 
 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-	#define TRACE(format, ...) trace("[0x%0.8X]%s(" format ")\n", this, __FUNCTION__, ##__VA_ARGS__)
+	#define TRACE(format, ...) sw::trace("[0x%0.8X]%s(" format ")\n", this, __FUNCTION__, ##__VA_ARGS__)
 #else
 	#define TRACE(...) ((void)0)
 #endif
 
 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-	#define UNIMPLEMENTED() {trace("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); ASSERT(false);}
+	#define UNIMPLEMENTED(...) do { \
+		sw::trace("\t! Unimplemented: %s(%d): ", __FUNCTION__, __LINE__); \
+		sw::trace(##__VA_ARGS__); \
+		sw::trace("\n"); \
+		ASSERT(false); \
+	} while(0)
 #else
-	#define UNIMPLEMENTED() ((void)0)
+	#define UNIMPLEMENTED(...) ((void)0)
 #endif
 
 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-	#define ASSERT(expression) {if(!(expression)) trace("\t! Assert failed in %s(%d): " #expression "\n", __FUNCTION__, __LINE__); assert(expression);}
+	#define ASSERT(expression) {if(!(expression)) sw::trace("\t! Assert failed in %s(%d): " #expression "\n", __FUNCTION__, __LINE__); assert(expression);}
 #else
 	#define ASSERT assert
 #endif
 
-#endif   // __ANDROID__
+#endif   // !__ANDROID__
 #endif   // Debug_hpp
diff --git a/src/Common/DebugAndroid.hpp b/src/Common/DebugAndroid.hpp
index 6dfb61d..f5ce468 100644
--- a/src/Common/DebugAndroid.hpp
+++ b/src/Common/DebugAndroid.hpp
@@ -66,7 +66,8 @@
 		AndroidEnterDebugger();											\
 	} while(0)
 
-#define UNIMPLEMENTED() do {						\
+// TODO: Handle __VA_ARGS__ (can be empty)
+#define UNIMPLEMENTED(...) do {						\
 		ALOGE("badness: unimplemented: %s %s:%d",	\
 			  __FUNCTION__, __FILE__, __LINE__);	\
 		AndroidEnterDebugger();						\
diff --git a/src/OpenGL/common/debug.cpp b/src/OpenGL/common/debug.cpp
index 3ef2885..9303260 100644
--- a/src/OpenGL/common/debug.cpp
+++ b/src/OpenGL/common/debug.cpp
@@ -34,7 +34,7 @@
 #else
 	static void output(const char *format, va_list vararg)
 	{
-		if(false)
+		if(true)
 		{
 			static FILE* file = nullptr;
 			if(!file)
@@ -45,6 +45,7 @@
 			if(file)
 			{
 				vfprintf(file, format, vararg);
+				fflush(file);
 			}
 		}
 	}
diff --git a/src/OpenGL/common/debug.h b/src/OpenGL/common/debug.h
index a5653b7..d44d8d7 100644
--- a/src/OpenGL/common/debug.h
+++ b/src/OpenGL/common/debug.h
@@ -29,8 +29,9 @@
 
 namespace es
 {
-	// Outputs text to the debugging log
-	void trace(const char *format, ...);
+// Outputs text to the debugging log
+void trace(const char *format, ...);
+inline void trace() {}
 }
 
 // A macro to output a trace of a function call and its arguments to the debugging log
@@ -69,12 +70,14 @@
 // A macro to indicate unimplemented functionality
 #undef UNIMPLEMENTED
 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-#define UNIMPLEMENTED() do { \
-	FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); \
+#define UNIMPLEMENTED(...) do { \
+	es::trace("\t! Unimplemented: %s(%d): ", __FUNCTION__, __LINE__); \
+	es::trace(##__VA_ARGS__); \
+	es::trace("\n"); \
 	assert(false); \
 	} while(0)
 #else
-	#define UNIMPLEMENTED() FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__)
+	#define UNIMPLEMENTED(...) FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__)
 #endif
 
 // A macro for code which is not expected to be reached under valid assumptions
diff --git a/src/OpenGL/compiler/debug.cpp b/src/OpenGL/compiler/debug.cpp
index 61943a3..6517346 100644
--- a/src/OpenGL/compiler/debug.cpp
+++ b/src/OpenGL/compiler/debug.cpp
@@ -23,7 +23,7 @@
 #include "ParseHelper.h"
 
 #ifdef TRACE_ENABLED
-extern "C" {
+namespace sh {
 void Trace(const char *format, ...) {
 	if (!format) return;
 
@@ -39,6 +39,6 @@
 		parseContext->trace(buf);
 	}
 }
-}  // extern "C"
+}  // namespace sh
 #endif  // TRACE_ENABLED
 
diff --git a/src/OpenGL/compiler/debug.h b/src/OpenGL/compiler/debug.h
index 77798ef..f9f92d5 100644
--- a/src/OpenGL/compiler/debug.h
+++ b/src/OpenGL/compiler/debug.h
@@ -30,42 +30,37 @@
 #endif  // _DEBUG
 
 // Outputs text to the debug log
+namespace sh {
 #ifdef TRACE_ENABLED
-
-#ifdef  __cplusplus
-extern "C" {
-#endif  // __cplusplus
 void Trace(const char* format, ...);
-#ifdef  __cplusplus
+#else
+inline void Trace(const char* format, ...) {}
+#endif
+inline void Trace() {}
 }
-#endif  // __cplusplus
-
-#else   // TRACE_ENABLED
-
-#define Trace(...) ((void)0)
-
-#endif  // TRACE_ENABLED
 
 // A macro asserting a condition and outputting failures to the debug log
 #undef ASSERT
 #define ASSERT(expression) do { \
 	if(!(expression)) \
-		Trace("Assert failed: %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \
+		sh::Trace("Assert failed: %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \
 	assert(expression); \
 } while(0)
 
 #undef UNIMPLEMENTED
-#define UNIMPLEMENTED() do { \
-	Trace("Unimplemented invoked: %s(%d)\n", __FUNCTION__, __LINE__); \
+#define UNIMPLEMENTED(...) do { \
+	sh::Trace("Unimplemented invoked: %s(%d): ", __FUNCTION__, __LINE__); \
+	sh::Trace(##__VA_ARGS__); \
+	sh::Trace("\n"); \
 	assert(false); \
 } while(0)
 
 #undef UNREACHABLE
 #define UNREACHABLE(value) do { \
-	Trace("Unreachable reached: %s(%d). %s: %d\n", __FUNCTION__, __LINE__, #value, value); \
+	sh::Trace("Unreachable reached: %s(%d). %s: %d\n", __FUNCTION__, __LINE__, #value, value); \
 	assert(false); \
 } while(0)
 
-#endif   // __ANDROID__
+#endif   // !__ANDROID__
 #endif   // COMPILER_DEBUG_H_
 
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 541b116..d8a4a8f 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -962,8 +962,7 @@
 			}
 			else
 			{
-				printf("internalformat = %x, colorbufferFormat = %X\n", internalformat, colorbufferFormat);
-				UNIMPLEMENTED();
+				UNIMPLEMENTED("internalformat = %x, colorbufferFormat = %X", internalformat, colorbufferFormat);
 
 				return error(GL_INVALID_OPERATION);
 			}
diff --git a/src/Vulkan/VkDebug.hpp b/src/Vulkan/VkDebug.hpp
index c436b3e..4210ee5 100644
--- a/src/Vulkan/VkDebug.hpp
+++ b/src/Vulkan/VkDebug.hpp
@@ -28,6 +28,7 @@
 {
 // Outputs text to the debugging log
 void trace(const char *format, ...);
+inline void trace() {}
 }
 
 // A macro to output a trace of a function call and its arguments to the debugging log
@@ -66,8 +67,10 @@
 // A macro to indicate unimplemented functionality
 #undef UNIMPLEMENTED
 #if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-#define UNIMPLEMENTED() do { \
-	FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); \
+#define UNIMPLEMENTED(...) do { \
+	vk::trace("\t! Unimplemented: %s(%d): ", __FUNCTION__, __LINE__); \
+	vk::trace(##__VA_ARGS__); \
+	vk::trace("\n"); \
 	assert(false); \
 	} while(0)
 #else