diff --git a/filament/backend/CMakeLists.txt b/filament/backend/CMakeLists.txt index 76ff5c5ab2..ef6b271346 100644 --- a/filament/backend/CMakeLists.txt +++ b/filament/backend/CMakeLists.txt @@ -27,6 +27,7 @@ set(SRCS src/Driver.cpp src/Handle.cpp src/HandleAllocator.cpp + src/ostream.cpp src/noop/NoopDriver.cpp src/noop/PlatformNoop.cpp src/Platform.cpp diff --git a/filament/backend/include/backend/BufferDescriptor.h b/filament/backend/include/backend/BufferDescriptor.h index 50912fb9d3..4bcaa1c273 100644 --- a/filament/backend/include/backend/BufferDescriptor.h +++ b/filament/backend/include/backend/BufferDescriptor.h @@ -20,12 +20,12 @@ #define TNT_FILAMENT_BACKEND_BUFFERDESCRIPTOR_H #include +#include #include #include -namespace filament { -namespace backend { +namespace filament::backend { /** * A CPU memory-buffer descriptor, typically used to transfer data from the CPU to the GPU. @@ -126,7 +126,10 @@ private: void* user = nullptr; }; -} // namespace backend -} // namespace filament +} // namespace filament::backend + +#if !defined(NDEBUG) +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::BufferDescriptor& b); +#endif #endif // TNT_FILAMENT_BACKEND_BUFFERDESCRIPTOR_H diff --git a/filament/backend/include/backend/DriverEnums.h b/filament/backend/include/backend/DriverEnums.h index d816da2887..16b40e4892 100644 --- a/filament/backend/include/backend/DriverEnums.h +++ b/filament/backend/include/backend/DriverEnums.h @@ -24,6 +24,8 @@ #include +#include + #include #include // FIXME: STL headers are not allowed in public headers @@ -926,4 +928,36 @@ template<> struct utils::EnableBitMaskOperators struct utils::EnableBitMaskOperators : public std::true_type {}; + +#if !defined(NDEBUG) +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::BufferUsage usage); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::CullingMode mode); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ElementType type); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PixelDataFormat format); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PixelDataType type); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::Precision precision); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PrimitiveType type); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TargetBufferFlags f); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerCompareFunc func); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerCompareMode mode); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerFormat format); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerMagFilter filter); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerMinFilter filter); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerParams params); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerType type); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerWrapMode wrap); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ShaderModel model); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureCubemapFace face); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureFormat format); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureUsage usage); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::BufferObjectBinding binding); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureSwizzle swizzle); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::AttributeArray& type); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::FaceOffsets& type); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PolygonOffset& po); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::RasterState& rs); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::RenderPassParams& b); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::Viewport& v); +#endif + #endif // TNT_FILAMENT_BACKEND_DRIVERENUMS_H diff --git a/filament/backend/include/backend/PipelineState.h b/filament/backend/include/backend/PipelineState.h index 3f7c0fd718..6238988e3c 100644 --- a/filament/backend/include/backend/PipelineState.h +++ b/filament/backend/include/backend/PipelineState.h @@ -24,8 +24,7 @@ #include -namespace filament { -namespace backend { +namespace filament::backend { //! \privatesection @@ -39,8 +38,10 @@ struct PipelineState { }; }; +} // namespace filament::backend -} // namespace backend -} // namespace filament +#if !defined(NDEBUG) +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PipelineState& ps); +#endif #endif //TNT_FILAMENT_BACKEND_PIPELINESTATE_H diff --git a/filament/backend/include/backend/PixelBufferDescriptor.h b/filament/backend/include/backend/PixelBufferDescriptor.h index c6ff7d0560..30aef51d5d 100644 --- a/filament/backend/include/backend/PixelBufferDescriptor.h +++ b/filament/backend/include/backend/PixelBufferDescriptor.h @@ -213,4 +213,8 @@ public: } // namespace backend } // namespace filament +#if !defined(NDEBUG) +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PixelBufferDescriptor& b); +#endif + #endif // TNT_FILAMENT_BACKEND_PIXELBUFFERDESCRIPTOR_H diff --git a/filament/backend/include/backend/TargetBufferInfo.h b/filament/backend/include/backend/TargetBufferInfo.h index 2994441f44..c43df55160 100644 --- a/filament/backend/include/backend/TargetBufferInfo.h +++ b/filament/backend/include/backend/TargetBufferInfo.h @@ -104,4 +104,9 @@ public: } // namespace backend } // namespace filament +#if !defined(NDEBUG) +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::TargetBufferInfo& tbi); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::MRT& mrt); +#endif + #endif //TNT_FILAMENT_BACKEND_TARGETBUFFERINFO_H diff --git a/filament/backend/include/private/backend/Driver.h b/filament/backend/include/private/backend/Driver.h index 88012a4fbd..8b6841d55d 100644 --- a/filament/backend/include/private/backend/Driver.h +++ b/filament/backend/include/private/backend/Driver.h @@ -18,6 +18,7 @@ #define TNT_FILAMENT_BACKEND_PRIVATE_DRIVER_H #include +#include #include #include #include @@ -28,8 +29,6 @@ #include "private/backend/Program.h" #include "private/backend/SamplerGroup.h" -#include - #include #include @@ -104,43 +103,4 @@ public: } // namespace backend } // namespace filament -#if !defined(NDEBUG) - -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::BufferUsage usage); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::CullingMode mode); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ElementType type); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PixelDataFormat format); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PixelDataType type); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::Precision precision); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PrimitiveType type); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TargetBufferFlags f); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerCompareFunc func); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerCompareMode mode); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerFormat format); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerMagFilter filter); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerMinFilter filter); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerParams params); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerType type); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::SamplerWrapMode wrap); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ShaderModel model); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureCubemapFace face); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureFormat format); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureUsage usage); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::BufferObjectBinding binding); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureSwizzle swizzle); - -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::AttributeArray& type); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::FaceOffsets& type); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PolygonOffset& po); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PipelineState& ps); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::RasterState& rs); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::TargetBufferInfo& tbi); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::BufferDescriptor& b); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PixelBufferDescriptor& b); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::RenderPassParams& b); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::Viewport& v); -utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::MRT& mrt); - -#endif - #endif // TNT_FILAMENT_BACKEND_PRIVATE_DRIVER_H diff --git a/filament/backend/src/CommandStream.cpp b/filament/backend/src/CommandStream.cpp index 2621e6d496..b3ba67c37d 100644 --- a/filament/backend/src/CommandStream.cpp +++ b/filament/backend/src/CommandStream.cpp @@ -154,488 +154,3 @@ void CustomCommand::execute(Driver&, CommandBase* base, intptr_t* next) noexcept } // namespace backend } // namespace filament - - -// ------------------------------------------------------------------------------------------------ -// Stream operators for all types in DriverEnums.h -// (These must live outside of the filament namespace) -// ------------------------------------------------------------------------------------------------ - -using namespace filament; -using namespace backend; - -#if !defined(NDEBUG) && (DEBUG_COMMAND_STREAM != false) - -#define CASE(ENUM, VALUE) \ - case ENUM::VALUE: { \ - out << #VALUE; \ - break; \ - } - -io::ostream& operator<<(io::ostream& out, ShaderModel model) { - switch (model) { - CASE(ShaderModel, UNKNOWN) - CASE(ShaderModel, GL_ES_30) - CASE(ShaderModel, GL_CORE_41) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, PrimitiveType type) { - switch (type) { - CASE(PrimitiveType, TRIANGLES) - CASE(PrimitiveType, LINES) - CASE(PrimitiveType, POINTS) - CASE(PrimitiveType, NONE) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, ElementType type) { - switch (type) { - CASE(ElementType, BYTE) - CASE(ElementType, BYTE2) - CASE(ElementType, BYTE3) - CASE(ElementType, BYTE4) - CASE(ElementType, UBYTE) - CASE(ElementType, UBYTE2) - CASE(ElementType, UBYTE3) - CASE(ElementType, UBYTE4) - CASE(ElementType, SHORT) - CASE(ElementType, SHORT2) - CASE(ElementType, SHORT3) - CASE(ElementType, SHORT4) - CASE(ElementType, USHORT) - CASE(ElementType, USHORT2) - CASE(ElementType, USHORT3) - CASE(ElementType, USHORT4) - CASE(ElementType, INT) - CASE(ElementType, UINT) - CASE(ElementType, FLOAT) - CASE(ElementType, FLOAT2) - CASE(ElementType, FLOAT3) - CASE(ElementType, FLOAT4) - CASE(ElementType, HALF) - CASE(ElementType, HALF2) - CASE(ElementType, HALF3) - CASE(ElementType, HALF4) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, BufferUsage usage) { - switch (usage) { - CASE(BufferUsage, STATIC) - CASE(BufferUsage, DYNAMIC) - CASE(BufferUsage, STREAM) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, CullingMode mode) { - switch (mode) { - CASE(CullingMode, NONE) - CASE(CullingMode, FRONT) - CASE(CullingMode, BACK) - CASE(CullingMode, FRONT_AND_BACK) - } - return out; -} - - -io::ostream& operator<<(io::ostream& out, SamplerType type) { - switch (type) { - CASE(SamplerType, SAMPLER_2D) - CASE(SamplerType, SAMPLER_2D_ARRAY) - CASE(SamplerType, SAMPLER_3D) - CASE(SamplerType, SAMPLER_CUBEMAP) - CASE(SamplerType, SAMPLER_EXTERNAL) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerFormat type) { - switch (type) { - CASE(SamplerFormat, INT) - CASE(SamplerFormat, UINT) - CASE(SamplerFormat, FLOAT) - CASE(SamplerFormat, SHADOW) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, Precision precision) { - switch (precision) { - CASE(Precision, LOW) - CASE(Precision, MEDIUM) - CASE(Precision, HIGH) - CASE(Precision, DEFAULT) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, PixelDataFormat format) { - switch (format) { - CASE(PixelDataFormat, R) - CASE(PixelDataFormat, R_INTEGER) - CASE(PixelDataFormat, RG) - CASE(PixelDataFormat, RG_INTEGER) - CASE(PixelDataFormat, RGB) - CASE(PixelDataFormat, RGB_INTEGER) - CASE(PixelDataFormat, RGBA) - CASE(PixelDataFormat, RGBA_INTEGER) - CASE(PixelDataFormat, DEPTH_COMPONENT) - CASE(PixelDataFormat, DEPTH_STENCIL) - CASE(PixelDataFormat, ALPHA) - CASE(PixelDataFormat, UNUSED) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, PixelDataType format) { - switch (format) { - CASE(PixelDataType, UBYTE) - CASE(PixelDataType, BYTE) - CASE(PixelDataType, USHORT) - CASE(PixelDataType, SHORT) - CASE(PixelDataType, UINT) - CASE(PixelDataType, INT) - CASE(PixelDataType, HALF) - CASE(PixelDataType, FLOAT) - CASE(PixelDataType, COMPRESSED) - CASE(PixelDataType, UINT_10F_11F_11F_REV) - CASE(PixelDataType, USHORT_565) - CASE(PixelDataType, UINT_2_10_10_10_REV) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, TextureFormat format) { - switch (format) { - CASE(TextureFormat, R8) - CASE(TextureFormat, R8_SNORM) - CASE(TextureFormat, R16F) - CASE(TextureFormat, R32F) - CASE(TextureFormat, R8UI) - CASE(TextureFormat, R8I) - CASE(TextureFormat, STENCIL8) - CASE(TextureFormat, R16UI) - CASE(TextureFormat, R16I) - CASE(TextureFormat, R32UI) - CASE(TextureFormat, R32I) - CASE(TextureFormat, RG8) - CASE(TextureFormat, RG8_SNORM) - CASE(TextureFormat, RG16F) - CASE(TextureFormat, RG32F) - CASE(TextureFormat, RG8UI) - CASE(TextureFormat, RG8I) - CASE(TextureFormat, RG16UI) - CASE(TextureFormat, RG16I) - CASE(TextureFormat, RG32UI) - CASE(TextureFormat, RG32I) - CASE(TextureFormat, RGB8) - CASE(TextureFormat, SRGB8) - CASE(TextureFormat, RGB565) - CASE(TextureFormat, RGB8_SNORM) - CASE(TextureFormat, R11F_G11F_B10F) - CASE(TextureFormat, RGB9_E5) - CASE(TextureFormat, RGB16F) - CASE(TextureFormat, RGB32F) - CASE(TextureFormat, RGB8UI) - CASE(TextureFormat, RGB8I) - CASE(TextureFormat, RGB16UI) - CASE(TextureFormat, RGB16I) - CASE(TextureFormat, RGB32UI) - CASE(TextureFormat, RGB32I) - CASE(TextureFormat, RGBA8) - CASE(TextureFormat, SRGB8_A8) - CASE(TextureFormat, RGBA8_SNORM) - CASE(TextureFormat, RGB5_A1) - CASE(TextureFormat, RGBA4) - CASE(TextureFormat, RGB10_A2) - CASE(TextureFormat, RGBA16F) - CASE(TextureFormat, RGBA32F) - CASE(TextureFormat, RGBA8UI) - CASE(TextureFormat, RGBA8I) - CASE(TextureFormat, RGBA16UI) - CASE(TextureFormat, RGBA16I) - CASE(TextureFormat, RGBA32UI) - CASE(TextureFormat, RGBA32I) - CASE(TextureFormat, DEPTH16) - CASE(TextureFormat, DEPTH24) - CASE(TextureFormat, DEPTH32F) - CASE(TextureFormat, DEPTH24_STENCIL8) - CASE(TextureFormat, DEPTH32F_STENCIL8) - // compressed formats... - CASE(TextureFormat, EAC_R11) - CASE(TextureFormat, EAC_R11_SIGNED) - CASE(TextureFormat, EAC_RG11) - CASE(TextureFormat, EAC_RG11_SIGNED) - CASE(TextureFormat, ETC2_RGB8) - CASE(TextureFormat, ETC2_SRGB8) - CASE(TextureFormat, ETC2_RGB8_A1) - CASE(TextureFormat, ETC2_SRGB8_A1) - CASE(TextureFormat, ETC2_EAC_RGBA8) - CASE(TextureFormat, ETC2_EAC_SRGBA8) - CASE(TextureFormat, DXT1_RGB) - CASE(TextureFormat, DXT1_SRGB) - CASE(TextureFormat, DXT1_RGBA) - CASE(TextureFormat, DXT1_SRGBA) - CASE(TextureFormat, DXT3_RGBA) - CASE(TextureFormat, DXT3_SRGBA) - CASE(TextureFormat, DXT5_RGBA) - CASE(TextureFormat, DXT5_SRGBA) - CASE(TextureFormat, UNUSED) - CASE(TextureFormat, RGBA_ASTC_4x4) - CASE(TextureFormat, RGBA_ASTC_5x4) - CASE(TextureFormat, RGBA_ASTC_5x5) - CASE(TextureFormat, RGBA_ASTC_6x5) - CASE(TextureFormat, RGBA_ASTC_6x6) - CASE(TextureFormat, RGBA_ASTC_8x5) - CASE(TextureFormat, RGBA_ASTC_8x6) - CASE(TextureFormat, RGBA_ASTC_8x8) - CASE(TextureFormat, RGBA_ASTC_10x5) - CASE(TextureFormat, RGBA_ASTC_10x6) - CASE(TextureFormat, RGBA_ASTC_10x8) - CASE(TextureFormat, RGBA_ASTC_10x10) - CASE(TextureFormat, RGBA_ASTC_12x10) - CASE(TextureFormat, RGBA_ASTC_12x12) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_4x4) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_5x4) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_5x5) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_6x5) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_6x6) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_8x5) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_8x6) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_8x8) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x5) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x6) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x8) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x10) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_12x10) - CASE(TextureFormat, SRGB8_ALPHA8_ASTC_12x12) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, TextureUsage usage) { - switch (usage) { - CASE(TextureUsage, NONE) - CASE(TextureUsage, DEFAULT) - CASE(TextureUsage, COLOR_ATTACHMENT) - CASE(TextureUsage, DEPTH_ATTACHMENT) - CASE(TextureUsage, STENCIL_ATTACHMENT) - CASE(TextureUsage, UPLOADABLE) - CASE(TextureUsage, SAMPLEABLE) - CASE(TextureUsage, SUBPASS_INPUT) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, TextureCubemapFace face) { - switch (face) { - CASE(TextureCubemapFace, NEGATIVE_X) - CASE(TextureCubemapFace, POSITIVE_X) - CASE(TextureCubemapFace, NEGATIVE_Y) - CASE(TextureCubemapFace, POSITIVE_Y) - CASE(TextureCubemapFace, NEGATIVE_Z) - CASE(TextureCubemapFace, POSITIVE_Z) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerWrapMode wrap) { - switch (wrap) { - CASE(SamplerWrapMode, REPEAT) - CASE(SamplerWrapMode, CLAMP_TO_EDGE) - CASE(SamplerWrapMode, MIRRORED_REPEAT) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerMinFilter filter) { - switch (filter) { - CASE(SamplerMinFilter, NEAREST) - CASE(SamplerMinFilter, LINEAR) - CASE(SamplerMinFilter, NEAREST_MIPMAP_NEAREST) - CASE(SamplerMinFilter, LINEAR_MIPMAP_NEAREST) - CASE(SamplerMinFilter, NEAREST_MIPMAP_LINEAR) - CASE(SamplerMinFilter, LINEAR_MIPMAP_LINEAR) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerMagFilter filter) { - switch (filter) { - CASE(SamplerMagFilter, NEAREST) - CASE(SamplerMagFilter, LINEAR) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerCompareMode mode) { - switch (mode) { - CASE(SamplerCompareMode, NONE) - CASE(SamplerCompareMode, COMPARE_TO_TEXTURE) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerCompareFunc func) { - switch (func) { - CASE(SamplerCompareFunc, LE) - CASE(SamplerCompareFunc, GE) - CASE(SamplerCompareFunc, L) - CASE(SamplerCompareFunc, G) - CASE(SamplerCompareFunc, E) - CASE(SamplerCompareFunc, NE) - CASE(SamplerCompareFunc, A) - CASE(SamplerCompareFunc, N) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, BufferObjectBinding binding) { - switch (binding) { - CASE(BufferObjectBinding, VERTEX) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, TextureSwizzle swizzle) { - switch (swizzle) { - CASE(TextureSwizzle, SUBSTITUTE_ZERO) - CASE(TextureSwizzle, SUBSTITUTE_ONE) - CASE(TextureSwizzle, CHANNEL_0) - CASE(TextureSwizzle, CHANNEL_1) - CASE(TextureSwizzle, CHANNEL_2) - CASE(TextureSwizzle, CHANNEL_3) - } - return out; -} - -io::ostream& operator<<(io::ostream& out, SamplerParams params) { - out << "SamplerParams{ " - << params.filterMin << ", " - << params.filterMag << ", " - << params.wrapS << ", " - << params.wrapT << ", " - << params.wrapR << ", " - << (1u << params.anisotropyLog2) << ", " - << params.compareMode << ", " - << params.compareFunc - << " }"; - return out; -} - -io::ostream& operator<<(io::ostream& out, const AttributeArray& type) { - return out << "AttributeArray[" << type.max_size() << "]{}"; -} - -io::ostream& operator<<(io::ostream& out, const FaceOffsets& type) { - return out << "FaceOffsets{" - << type[0] << ", " - << type[1] << ", " - << type[2] << ", " - << type[3] << ", " - << type[4] << ", " - << type[5] << "}"; -} - -io::ostream& operator<<(io::ostream& out, const RasterState& rs) { - // TODO: implement decoding of enums - return out << "RasterState{" - << rs.culling << ", " - << uint8_t(rs.blendEquationRGB) << ", " - << uint8_t(rs.blendEquationAlpha) << ", " - << uint8_t(rs.blendFunctionSrcRGB) << ", " - << uint8_t(rs.blendFunctionSrcAlpha) << ", " - << uint8_t(rs.blendFunctionDstRGB) << ", " - << uint8_t(rs.blendFunctionDstAlpha) << "}"; -} - -io::ostream& operator<<(io::ostream& out, const TargetBufferInfo& tbi) { - return out << "TargetBufferInfo{" - << "h=" << tbi.handle << ", " - << "level=" << tbi.level << ", " - << "face=" << tbi.face << "}"; -} - -io::ostream& operator<<(io::ostream& out, const PolygonOffset& po) { - return out << "PolygonOffset{" - << "slope=" << po.slope << ", " - << "constant=" << po.constant << "}"; -} - -io::ostream& operator<<(io::ostream& out, const PipelineState& ps) { - return out << "PipelineState{" - << "program=" << ps.program << ", " - << "rasterState=" << ps.rasterState << ", " - << "polygonOffset=" << ps.polygonOffset << "}"; -} - -UTILS_PRIVATE -io::ostream& operator<<(io::ostream& out, BufferDescriptor const& b) { - out << "BufferDescriptor { buffer=" << b.buffer - << ", size=" << b.size - << ", callback=" << b.getCallback() - << ", user=" << b.getUser() << " }"; - return out; -} - -UTILS_PRIVATE -io::ostream& operator<<(io::ostream& out, PixelBufferDescriptor const& b) { - BufferDescriptor const& base = static_cast(b); - out << "PixelBufferDescriptor { " << base - << ", left=" << b.left - << ", top=" << b.top - << ", stride=" << b.stride - << ", format=" << b.format - << ", type=" << b.type - << ", alignment=" << b.alignment << " }"; - return out; -} - -UTILS_PRIVATE -io::ostream& operator<<(io::ostream& out, filament::backend::Viewport const& viewport) { - out << "Viewport{" - << ", left=" << viewport.left - << ", bottom=" << viewport.bottom - << ", width=" << viewport.width - << ", height=" << viewport.height << "}"; - return out; -} - -UTILS_PRIVATE -io::ostream& operator<<(io::ostream& out, TargetBufferFlags flags) { - // TODO: implement decoding of enum - out << uint8_t(flags); - return out; -} - -UTILS_PRIVATE -io::ostream& operator<<(io::ostream& out, RenderPassParams const& params) { - out << "RenderPassParams{" - << "clear=" << params.flags.clear - << ", discardStart=" << params.flags.discardStart - << ", discardEnd=" << params.flags.discardEnd - << ", left=" << params.viewport.left - << ", bottom=" << params.viewport.bottom - << ", width=" << params.viewport.width - << ", height=" << params.viewport.height - << ", clearColor=" << params.clearColor - << ", clearDepth=" << params.clearDepth - << ", clearStencil=" << params.clearStencil << "}"; - return out; -} - -UTILS_PRIVATE -io::ostream& operator<<(io::ostream& out, MRT const& mrt) { - // TODO: implement decoding of enum - out << "MRT{...}"; - return out; -} - -#undef CASE - -#endif // !NDEBUG diff --git a/filament/backend/src/ostream.cpp b/filament/backend/src/ostream.cpp new file mode 100644 index 0000000000..d9eed6106f --- /dev/null +++ b/filament/backend/src/ostream.cpp @@ -0,0 +1,500 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include + +using namespace filament; +using namespace backend; +using namespace utils; + +// ------------------------------------------------------------------------------------------------ +// Stream operators for all types in DriverEnums.h +// (These must live outside of the filament namespace) +// ------------------------------------------------------------------------------------------------ + +#if !defined(NDEBUG) + +#define CASE(ENUM, VALUE) \ + case ENUM::VALUE: { \ + out << #VALUE; \ + break; \ +} + +io::ostream& operator<<(io::ostream& out, ShaderModel model) { + switch (model) { + CASE(ShaderModel, UNKNOWN) + CASE(ShaderModel, GL_ES_30) + CASE(ShaderModel, GL_CORE_41) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, PrimitiveType type) { + switch (type) { + CASE(PrimitiveType, TRIANGLES) + CASE(PrimitiveType, LINES) + CASE(PrimitiveType, POINTS) + CASE(PrimitiveType, NONE) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, ElementType type) { + switch (type) { + CASE(ElementType, BYTE) + CASE(ElementType, BYTE2) + CASE(ElementType, BYTE3) + CASE(ElementType, BYTE4) + CASE(ElementType, UBYTE) + CASE(ElementType, UBYTE2) + CASE(ElementType, UBYTE3) + CASE(ElementType, UBYTE4) + CASE(ElementType, SHORT) + CASE(ElementType, SHORT2) + CASE(ElementType, SHORT3) + CASE(ElementType, SHORT4) + CASE(ElementType, USHORT) + CASE(ElementType, USHORT2) + CASE(ElementType, USHORT3) + CASE(ElementType, USHORT4) + CASE(ElementType, INT) + CASE(ElementType, UINT) + CASE(ElementType, FLOAT) + CASE(ElementType, FLOAT2) + CASE(ElementType, FLOAT3) + CASE(ElementType, FLOAT4) + CASE(ElementType, HALF) + CASE(ElementType, HALF2) + CASE(ElementType, HALF3) + CASE(ElementType, HALF4) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, BufferUsage usage) { + switch (usage) { + CASE(BufferUsage, STATIC) + CASE(BufferUsage, DYNAMIC) + CASE(BufferUsage, STREAM) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, CullingMode mode) { + switch (mode) { + CASE(CullingMode, NONE) + CASE(CullingMode, FRONT) + CASE(CullingMode, BACK) + CASE(CullingMode, FRONT_AND_BACK) + } + return out; +} + + +io::ostream& operator<<(io::ostream& out, SamplerType type) { + switch (type) { + CASE(SamplerType, SAMPLER_2D) + CASE(SamplerType, SAMPLER_2D_ARRAY) + CASE(SamplerType, SAMPLER_3D) + CASE(SamplerType, SAMPLER_CUBEMAP) + CASE(SamplerType, SAMPLER_EXTERNAL) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerFormat type) { + switch (type) { + CASE(SamplerFormat, INT) + CASE(SamplerFormat, UINT) + CASE(SamplerFormat, FLOAT) + CASE(SamplerFormat, SHADOW) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, Precision precision) { + switch (precision) { + CASE(Precision, LOW) + CASE(Precision, MEDIUM) + CASE(Precision, HIGH) + CASE(Precision, DEFAULT) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, PixelDataFormat format) { + switch (format) { + CASE(PixelDataFormat, R) + CASE(PixelDataFormat, R_INTEGER) + CASE(PixelDataFormat, RG) + CASE(PixelDataFormat, RG_INTEGER) + CASE(PixelDataFormat, RGB) + CASE(PixelDataFormat, RGB_INTEGER) + CASE(PixelDataFormat, RGBA) + CASE(PixelDataFormat, RGBA_INTEGER) + CASE(PixelDataFormat, DEPTH_COMPONENT) + CASE(PixelDataFormat, DEPTH_STENCIL) + CASE(PixelDataFormat, ALPHA) + CASE(PixelDataFormat, UNUSED) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, PixelDataType format) { + switch (format) { + CASE(PixelDataType, UBYTE) + CASE(PixelDataType, BYTE) + CASE(PixelDataType, USHORT) + CASE(PixelDataType, SHORT) + CASE(PixelDataType, UINT) + CASE(PixelDataType, INT) + CASE(PixelDataType, HALF) + CASE(PixelDataType, FLOAT) + CASE(PixelDataType, COMPRESSED) + CASE(PixelDataType, UINT_10F_11F_11F_REV) + CASE(PixelDataType, USHORT_565) + CASE(PixelDataType, UINT_2_10_10_10_REV) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, TextureFormat format) { + switch (format) { + CASE(TextureFormat, R8) + CASE(TextureFormat, R8_SNORM) + CASE(TextureFormat, R16F) + CASE(TextureFormat, R32F) + CASE(TextureFormat, R8UI) + CASE(TextureFormat, R8I) + CASE(TextureFormat, STENCIL8) + CASE(TextureFormat, R16UI) + CASE(TextureFormat, R16I) + CASE(TextureFormat, R32UI) + CASE(TextureFormat, R32I) + CASE(TextureFormat, RG8) + CASE(TextureFormat, RG8_SNORM) + CASE(TextureFormat, RG16F) + CASE(TextureFormat, RG32F) + CASE(TextureFormat, RG8UI) + CASE(TextureFormat, RG8I) + CASE(TextureFormat, RG16UI) + CASE(TextureFormat, RG16I) + CASE(TextureFormat, RG32UI) + CASE(TextureFormat, RG32I) + CASE(TextureFormat, RGB8) + CASE(TextureFormat, SRGB8) + CASE(TextureFormat, RGB565) + CASE(TextureFormat, RGB8_SNORM) + CASE(TextureFormat, R11F_G11F_B10F) + CASE(TextureFormat, RGB9_E5) + CASE(TextureFormat, RGB16F) + CASE(TextureFormat, RGB32F) + CASE(TextureFormat, RGB8UI) + CASE(TextureFormat, RGB8I) + CASE(TextureFormat, RGB16UI) + CASE(TextureFormat, RGB16I) + CASE(TextureFormat, RGB32UI) + CASE(TextureFormat, RGB32I) + CASE(TextureFormat, RGBA8) + CASE(TextureFormat, SRGB8_A8) + CASE(TextureFormat, RGBA8_SNORM) + CASE(TextureFormat, RGB5_A1) + CASE(TextureFormat, RGBA4) + CASE(TextureFormat, RGB10_A2) + CASE(TextureFormat, RGBA16F) + CASE(TextureFormat, RGBA32F) + CASE(TextureFormat, RGBA8UI) + CASE(TextureFormat, RGBA8I) + CASE(TextureFormat, RGBA16UI) + CASE(TextureFormat, RGBA16I) + CASE(TextureFormat, RGBA32UI) + CASE(TextureFormat, RGBA32I) + CASE(TextureFormat, DEPTH16) + CASE(TextureFormat, DEPTH24) + CASE(TextureFormat, DEPTH32F) + CASE(TextureFormat, DEPTH24_STENCIL8) + CASE(TextureFormat, DEPTH32F_STENCIL8) + // compressed formats... + CASE(TextureFormat, EAC_R11) + CASE(TextureFormat, EAC_R11_SIGNED) + CASE(TextureFormat, EAC_RG11) + CASE(TextureFormat, EAC_RG11_SIGNED) + CASE(TextureFormat, ETC2_RGB8) + CASE(TextureFormat, ETC2_SRGB8) + CASE(TextureFormat, ETC2_RGB8_A1) + CASE(TextureFormat, ETC2_SRGB8_A1) + CASE(TextureFormat, ETC2_EAC_RGBA8) + CASE(TextureFormat, ETC2_EAC_SRGBA8) + CASE(TextureFormat, DXT1_RGB) + CASE(TextureFormat, DXT1_SRGB) + CASE(TextureFormat, DXT1_RGBA) + CASE(TextureFormat, DXT1_SRGBA) + CASE(TextureFormat, DXT3_RGBA) + CASE(TextureFormat, DXT3_SRGBA) + CASE(TextureFormat, DXT5_RGBA) + CASE(TextureFormat, DXT5_SRGBA) + CASE(TextureFormat, UNUSED) + CASE(TextureFormat, RGBA_ASTC_4x4) + CASE(TextureFormat, RGBA_ASTC_5x4) + CASE(TextureFormat, RGBA_ASTC_5x5) + CASE(TextureFormat, RGBA_ASTC_6x5) + CASE(TextureFormat, RGBA_ASTC_6x6) + CASE(TextureFormat, RGBA_ASTC_8x5) + CASE(TextureFormat, RGBA_ASTC_8x6) + CASE(TextureFormat, RGBA_ASTC_8x8) + CASE(TextureFormat, RGBA_ASTC_10x5) + CASE(TextureFormat, RGBA_ASTC_10x6) + CASE(TextureFormat, RGBA_ASTC_10x8) + CASE(TextureFormat, RGBA_ASTC_10x10) + CASE(TextureFormat, RGBA_ASTC_12x10) + CASE(TextureFormat, RGBA_ASTC_12x12) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_4x4) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_5x4) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_5x5) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_6x5) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_6x6) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_8x5) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_8x6) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_8x8) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x5) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x6) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x8) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x10) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_12x10) + CASE(TextureFormat, SRGB8_ALPHA8_ASTC_12x12) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, TextureUsage usage) { + switch (usage) { + CASE(TextureUsage, NONE) + CASE(TextureUsage, DEFAULT) + CASE(TextureUsage, COLOR_ATTACHMENT) + CASE(TextureUsage, DEPTH_ATTACHMENT) + CASE(TextureUsage, STENCIL_ATTACHMENT) + CASE(TextureUsage, UPLOADABLE) + CASE(TextureUsage, SAMPLEABLE) + CASE(TextureUsage, SUBPASS_INPUT) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, TextureCubemapFace face) { + switch (face) { + CASE(TextureCubemapFace, NEGATIVE_X) + CASE(TextureCubemapFace, POSITIVE_X) + CASE(TextureCubemapFace, NEGATIVE_Y) + CASE(TextureCubemapFace, POSITIVE_Y) + CASE(TextureCubemapFace, NEGATIVE_Z) + CASE(TextureCubemapFace, POSITIVE_Z) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerWrapMode wrap) { + switch (wrap) { + CASE(SamplerWrapMode, REPEAT) + CASE(SamplerWrapMode, CLAMP_TO_EDGE) + CASE(SamplerWrapMode, MIRRORED_REPEAT) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerMinFilter filter) { + switch (filter) { + CASE(SamplerMinFilter, NEAREST) + CASE(SamplerMinFilter, LINEAR) + CASE(SamplerMinFilter, NEAREST_MIPMAP_NEAREST) + CASE(SamplerMinFilter, LINEAR_MIPMAP_NEAREST) + CASE(SamplerMinFilter, NEAREST_MIPMAP_LINEAR) + CASE(SamplerMinFilter, LINEAR_MIPMAP_LINEAR) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerMagFilter filter) { + switch (filter) { + CASE(SamplerMagFilter, NEAREST) + CASE(SamplerMagFilter, LINEAR) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerCompareMode mode) { + switch (mode) { + CASE(SamplerCompareMode, NONE) + CASE(SamplerCompareMode, COMPARE_TO_TEXTURE) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerCompareFunc func) { + switch (func) { + CASE(SamplerCompareFunc, LE) + CASE(SamplerCompareFunc, GE) + CASE(SamplerCompareFunc, L) + CASE(SamplerCompareFunc, G) + CASE(SamplerCompareFunc, E) + CASE(SamplerCompareFunc, NE) + CASE(SamplerCompareFunc, A) + CASE(SamplerCompareFunc, N) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, BufferObjectBinding binding) { + switch (binding) { + CASE(BufferObjectBinding, VERTEX) + CASE(BufferObjectBinding, UNIFORM) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, TextureSwizzle swizzle) { + switch (swizzle) { + CASE(TextureSwizzle, SUBSTITUTE_ZERO) + CASE(TextureSwizzle, SUBSTITUTE_ONE) + CASE(TextureSwizzle, CHANNEL_0) + CASE(TextureSwizzle, CHANNEL_1) + CASE(TextureSwizzle, CHANNEL_2) + CASE(TextureSwizzle, CHANNEL_3) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, SamplerParams params) { + out << "SamplerParams{ " + << params.filterMin << ", " + << params.filterMag << ", " + << params.wrapS << ", " + << params.wrapT << ", " + << params.wrapR << ", " + << (1u << params.anisotropyLog2) << ", " + << params.compareMode << ", " + << params.compareFunc + << " }"; + return out; +} + +io::ostream& operator<<(io::ostream& out, const AttributeArray& type) { + return out << "AttributeArray[" << type.max_size() << "]{}"; +} + +io::ostream& operator<<(io::ostream& out, const FaceOffsets& type) { + return out << "FaceOffsets{" + << type[0] << ", " + << type[1] << ", " + << type[2] << ", " + << type[3] << ", " + << type[4] << ", " + << type[5] << "}"; +} + +io::ostream& operator<<(io::ostream& out, const RasterState& rs) { + // TODO: implement decoding of enums + return out << "RasterState{" + << rs.culling << ", " + << uint8_t(rs.blendEquationRGB) << ", " + << uint8_t(rs.blendEquationAlpha) << ", " + << uint8_t(rs.blendFunctionSrcRGB) << ", " + << uint8_t(rs.blendFunctionSrcAlpha) << ", " + << uint8_t(rs.blendFunctionDstRGB) << ", " + << uint8_t(rs.blendFunctionDstAlpha) << "}"; +} + +io::ostream& operator<<(io::ostream& out, const TargetBufferInfo& tbi) { + return out << "TargetBufferInfo{" + << "h=" << tbi.handle + << ", level=" << tbi.level + << ", face=" << tbi.face << "}"; +} + +io::ostream& operator<<(io::ostream& out, const PolygonOffset& po) { + return out << "PolygonOffset{" + << "slope=" << po.slope + << ", constant=" << po.constant << "}"; +} + +io::ostream& operator<<(io::ostream& out, const PipelineState& ps) { + return out << "PipelineState{" + << "program=" << ps.program + << ", rasterState=" << ps.rasterState + << ", polygonOffset=" << ps.polygonOffset << "}"; +} + +io::ostream& operator<<(io::ostream& out, BufferDescriptor const& b) { + return out << "BufferDescriptor{ buffer=" << b.buffer + << ", size=" << b.size + << ", callback=" << b.getCallback() + << ", user=" << b.getUser() << " }"; +} + +io::ostream& operator<<(io::ostream& out, PixelBufferDescriptor const& b) { + BufferDescriptor const& base = static_cast(b); + return out << "PixelBufferDescriptor{ " << base + << "left=" << b.left + << ", top=" << b.top + << ", stride=" << b.stride + << ", format=" << b.format + << ", type=" << b.type + << ", alignment=" << b.alignment << " }"; +} + +io::ostream& operator<<(io::ostream& out, filament::backend::Viewport const& viewport) { + return out << "Viewport{" + << "left=" << viewport.left + << ", bottom=" << viewport.bottom + << ", width=" << viewport.width + << ", height=" << viewport.height << "}"; +} + +io::ostream& operator<<(io::ostream& out, TargetBufferFlags flags) { + // TODO: implement decoding of enum + out << uint8_t(flags); + return out; +} + +io::ostream& operator<<(io::ostream& out, RenderPassParams const& params) { + out << "RenderPassParams{" + << "clear=" << params.flags.clear + << ", discardStart=" << params.flags.discardStart + << ", discardEnd=" << params.flags.discardEnd + << ", left=" << params.viewport.left + << ", bottom=" << params.viewport.bottom + << ", width=" << params.viewport.width + << ", height=" << params.viewport.height + << ", clearColor=" << params.clearColor + << ", clearDepth=" << params.clearDepth + << ", clearStencil=" << params.clearStencil << "}"; + return out; +} + +io::ostream& operator<<(io::ostream& out, MRT const& mrt) { + // TODO: implement decoding of enum + out << "MRT{...}"; + return out; +} + +#undef CASE + +#endif // !NDEBUG