Work around unsuppressable GCC error.
GCC warns against bitfields not fitting the entire range of an enum
with a fixed underlying type of unsigned int, which gets promoted to
an error with -Werror and cannot be suppressed. However, GCC already
defaults to using unsigned int as the underlying type of an unscoped
enum without a fixed underlying type. So we can just omit it.
Bug chromium:697528
Change-Id: I8db8fef09e3397d4ec5ebe9f7c3c5e4ae9c0edff
Reviewed-on: https://swiftshader-review.googlesource.com/8928
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/Types.hpp b/src/Common/Types.hpp
index 5675ccb..cd08ed5 100644
--- a/src/Common/Types.hpp
+++ b/src/Common/Types.hpp
@@ -15,6 +15,18 @@
#ifndef sw_Types_hpp
#define sw_Types_hpp
+#include <limits>
+#include <type_traits>
+
+// GCC warns against bitfields not fitting the entire range of an enum with a fixed underlying type of unsigned int, which gets promoted to an error with -Werror and cannot be suppressed.
+// However, GCC already defaults to using unsigned int as the underlying type of an unscoped enum without a fixed underlying type. So we can just omit it.
+#if defined(__GNUC__) && !defined(__clang__)
+namespace {enum E {}; static_assert(!std::numeric_limits<std::underlying_type<E>::type>::is_signed, "expected unscoped enum whose underlying type is not fixed to be unsigned");}
+#define ENUM_UNDERLYING_TYPE_UNSIGNED_INT
+#else
+#define ENUM_UNDERLYING_TYPE_UNSIGNED_INT : unsigned int
+#endif
+
#if defined(_MSC_VER)
typedef signed __int8 int8_t;
typedef signed __int16 int16_t;
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp
index f1e59ba..2f363f9 100644
--- a/src/Renderer/Context.hpp
+++ b/src/Renderer/Context.hpp
@@ -20,6 +20,7 @@
#include "Stream.hpp"
#include "Point.hpp"
#include "Vertex.hpp"
+#include "Common/Types.hpp"
namespace sw
{
@@ -52,7 +53,7 @@
PositionT = 15
};
- enum DrawType : unsigned int
+ enum DrawType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
// These types must stay ordered by vertices per primitive. Also, if these basic types
// are modified, verify the value assigned to task->verticesPerPrimitive in Renderer.cpp
@@ -97,7 +98,7 @@
DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32
};
- enum FillMode : unsigned int
+ enum FillMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
FILL_SOLID,
FILL_WIREFRAME,
@@ -106,7 +107,7 @@
FILL_LAST = FILL_VERTEX
};
- enum ShadingMode : unsigned int
+ enum ShadingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
SHADING_FLAT,
SHADING_GOURAUD,
@@ -114,7 +115,7 @@
SHADING_LAST = SHADING_GOURAUD
};
- enum DepthCompareMode : unsigned int
+ enum DepthCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
DEPTH_ALWAYS,
DEPTH_NEVER,
@@ -128,7 +129,7 @@
DEPTH_LAST = DEPTH_GREATEREQUAL
};
- enum StencilCompareMode : unsigned int
+ enum StencilCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
STENCIL_ALWAYS,
STENCIL_NEVER,
@@ -142,7 +143,7 @@
STENCIL_LAST = STENCIL_GREATEREQUAL
};
- enum StencilOperation : unsigned int
+ enum StencilOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
OPERATION_KEEP,
OPERATION_ZERO,
@@ -156,7 +157,7 @@
OPERATION_LAST = OPERATION_DECR
};
- enum AlphaCompareMode : unsigned int
+ enum AlphaCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
ALPHA_ALWAYS,
ALPHA_NEVER,
@@ -170,7 +171,7 @@
ALPHA_LAST = ALPHA_GREATEREQUAL
};
- enum CullMode : unsigned int
+ enum CullMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
CULL_NONE,
CULL_CLOCKWISE,
@@ -179,7 +180,7 @@
CULL_LAST = CULL_COUNTERCLOCKWISE
};
- enum BlendFactor : unsigned int
+ enum BlendFactor ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
BLEND_ZERO,
BLEND_ONE,
@@ -200,7 +201,7 @@
BLEND_LAST = BLEND_INVCONSTANT
};
- enum BlendOperation : unsigned int
+ enum BlendOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
BLENDOP_ADD,
BLENDOP_SUB,
@@ -215,7 +216,7 @@
BLENDOP_LAST = BLENDOP_NULL
};
- enum LogicalOperation : unsigned int
+ enum LogicalOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
LOGICALOP_CLEAR,
LOGICALOP_SET,
@@ -237,7 +238,7 @@
LOGICALOP_LAST = LOGICALOP_OR_INVERTED
};
- enum MaterialSource : unsigned int
+ enum MaterialSource ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
MATERIAL_MATERIAL,
MATERIAL_COLOR1,
@@ -246,7 +247,7 @@
MATERIAL_LAST = MATERIAL_COLOR2
};
- enum FogMode : unsigned int
+ enum FogMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
FOG_NONE,
FOG_LINEAR,
@@ -256,7 +257,7 @@
FOG_LAST = FOG_EXP2
};
- enum TexGen : unsigned int
+ enum TexGen ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
TEXGEN_PASSTHRU,
TEXGEN_NORMAL,
@@ -268,7 +269,7 @@
TEXGEN_LAST = TEXGEN_NONE
};
- enum TransparencyAntialiasing : unsigned int
+ enum TransparencyAntialiasing ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
TRANSPARENCY_NONE,
TRANSPARENCY_ALPHA_TO_COVERAGE,
diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp
index 87c9d3f..4c4973d 100644
--- a/src/Renderer/Sampler.hpp
+++ b/src/Renderer/Sampler.hpp
@@ -17,6 +17,7 @@
#include "Main/Config.hpp"
#include "Renderer/Surface.hpp"
+#include "Common/Types.hpp"
namespace sw
{
@@ -63,7 +64,7 @@
SAMPLER_VERTEX
};
- enum TextureType : unsigned int
+ enum TextureType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
TEXTURE_NULL,
TEXTURE_2D,
@@ -74,7 +75,7 @@
TEXTURE_LAST = TEXTURE_2D_ARRAY
};
- enum FilterType : unsigned int
+ enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
FILTER_POINT,
FILTER_GATHER,
@@ -86,7 +87,7 @@
FILTER_LAST = FILTER_ANISOTROPIC
};
- enum MipmapType : unsigned int
+ enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
MIPMAP_NONE,
MIPMAP_POINT,
@@ -95,7 +96,7 @@
MIPMAP_LAST = MIPMAP_LINEAR
};
- enum AddressingMode : unsigned int
+ enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
ADDRESSING_WRAP,
ADDRESSING_CLAMP,
@@ -108,7 +109,7 @@
ADDRESSING_LAST = ADDRESSING_TEXELFETCH
};
- enum SwizzleType : unsigned int
+ enum SwizzleType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
SWIZZLE_RED,
SWIZZLE_GREEN,
diff --git a/src/Renderer/Stream.hpp b/src/Renderer/Stream.hpp
index 047cf75..88c0840 100644
--- a/src/Renderer/Stream.hpp
+++ b/src/Renderer/Stream.hpp
@@ -21,7 +21,7 @@
{
class Resource;
- enum StreamType : unsigned int
+ enum StreamType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
STREAMTYPE_COLOR, // 4 normalized unsigned bytes, ZYXW order
STREAMTYPE_UDEC3, // 3 unsigned 10-bit fields