blob: 607a24ffff6443c327bc75a2de6cd48cf68f14ce [file] [log] [blame]
// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// 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.
// Module Overview: Starboard Configuration module
//
// Provides a description of the current platform in lurid detail so that
// common code never needs to actually know what the current operating system
// and architecture are.
//
// It is both very pragmatic and canonical in that if any application code
// finds itself needing to make a platform decision, it should always define
// a Starboard Configuration feature instead. This implies the continued
// existence of very narrowly-defined configuration features, but it retains
// porting control in Starboard.
#ifndef STARBOARD_CONFIGURATION_H_
#define STARBOARD_CONFIGURATION_H_
#if !defined(STARBOARD)
#error "You must define STARBOARD in Starboard builds."
#endif
#define SB_TRUE 1
#define SB_FALSE 0
// --- Common Defines --------------------------------------------------------
// The minimum API version allowed by this version of the Starboard headers,
// inclusive.
#define SB_MINIMUM_API_VERSION 6
// The maximum API version allowed by this version of the Starboard headers,
// inclusive.
#define SB_MAXIMUM_API_VERSION 12
// The API version that is currently open for changes, and therefore is not
// stable or frozen. Production-oriented ports should avoid declaring that they
// implement the experimental Starboard API version.
#define SB_EXPERIMENTAL_API_VERSION 12
// The next API version to be frozen, but is still subject to emergency
// changes. It is reasonable to base a port on the Release Candidate API
// version, but be aware that small incompatible changes may still be made to
// it.
// The following will be uncommented when an API version is a release candidate.
#define SB_RELEASE_CANDIDATE_API_VERSION 11
// --- Experimental Feature Defines ------------------------------------------
// Note that experimental feature comments will be moved into
// starboard/CHANGELOG.md when released. Thus, you can find examples of the
// format your feature comments should take by checking that file.
// EXAMPLE:
// // Introduce new experimental feature.
// // Add a function, `SbMyNewFeature()` to `starboard/feature.h` which
// // exposes functionality for my new feature.
// #define SB_MY_EXPERIMENTAL_FEATURE_VERSION SB_EXPERIMENTAL_API_VERSION
// Add support for platform-based UI navigation.
// The system can be disabled by implementing the function
// `SbUiNavGetInterface()` to return `false`. Platform-based UI navigation
// allows the platform to receive feedback on where UI elements are located and
// also lets the platform control what is selected and what the scroll
// parameters are.
#define SB_UI_NAVIGATION_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the OpenGL, Blitter, and Skia renderers on all platforms.
// The system must implement `SbGetGlesInterface()` in `starboard/gles.h`
// or use the provided stub implementation, and must do the same for
// the blitter functions in `starboad/blitter.h`. The provided blitter stubs
// will return responses that denote failures. The system should implement
// `SbGetGlesInterface()` to return `nullptr` when OpenGL is not supported and
// implement `SbBlitterIsBlitterSupported()` to return false when blitter is
// not supported, as the stubs do.
#define SB_ALL_RENDERERS_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the captions API.
// The system must implement the captions functions in
// `starboard/accessibility.h` or use the provided stub implementations.
// System caption can be disabled by implementing the function
// `SbAccessibilityGetCaptionSettings(SbAccessibilityCaptionSettings*
// caption_settings)` to return false as the stub implementation does.
// This change also deprecates the SB_HAS_CAPTIONS flag.
#define SB_CAPTIONS_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require compilation with Ipv6.
// Cobalt must be able to determine at runtime if the system supportes Ipv6.
// Ipv6 can be disabled by defining SB_HAS_IPV6 to 0.
#define SB_IPV6_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the microphone API.
// The system must implement the microphone functions in
// `starboard/microphone.h` or use the provided stub functions.
// The microphone can be disabled by having `SbMicrophoneCreate()` return
// |kSbMicrophoneInvalid|.
// This change also deprecates the SB_HAS_MICROPHONE flag.
#define SB_MICROPHONE_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the memory mapping API.
// The system must implement the memory mapping functions in
// `starboard/memory.h` and `starboard/shared/dlmalloc.h` or use the provided
// stub implementations.
// This change also deprecates the SB_HAS_MMAP flag.
#define SB_MMAP_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the on screen keyboard API.
// The system must implement the on screen keyboard functions in
// `starboard/window.h` or use the provided stub implementations.
// The on screen keyboard can be disabled by implementing the function
// `SbWindowOnScreenKeyboardIsSupported()` to return false
// as the stub implementation does.
#define SB_ON_SCREEN_KEYBOARD_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require speech recognizer API.
// The system must implement the functions in `starboard/speech_recognizer.h`
// or use the provided stub implementations.
// The speech recognizer can be disabled by implementing the function
// `SbSpeechRecognizerIsSupported()` to return `false` as the stub
// implementation does.
#define SB_SPEECH_RECOGNIZER_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the speech synthesis API.
// The system must implement the speech synthesis function in
// `starboard/speech_synthesis.h` or use the provided stub implementations.
// Speech synthesis can be disabled by implementing the function
// `SbSpeechSynthesisIsSupported()` to return false as the stub
// implementation does.
#define SB_SPEECH_SYNTHESIS_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Require the time thread now API.
// The system must implement the time thread now functions in
// `starboard/time.h` or use the provided stub implementations.
// Time thread now can be disabled by implementing the function
// `SbTimeIsTimeThreadNowSupported()` to return false as the stub
// implementation does.
#define SB_TIME_THREAD_NOW_REQUIRED_VERSION SB_EXPERIMENTAL_API_VERSION
// Introduce the Starboard function SbFileAtomicReplace() to provide the ability
// to atomically replace the content of a file.
#define SB_FILE_ATOMIC_REPLACE_VERSION SB_EXPERIMENTAL_API_VERSION
// Introduces new system property kSbSystemPathStorageDirectory.
// Path to directory for permanent storage. Both read and write
// access are required.
#define SB_STORAGE_PATH_VERSION SB_EXPERIMENTAL_API_VERSION
// Deprecate the usage of SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER.
#define SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER_DEPRECATED_VERSION \
SB_EXPERIMENTAL_API_VERSION
// Introduce Starboard Application Binary Interface (SABI) files.
// SABI files are used to describe the configuration for targets such that two
// targets, built with the same SABI file and varying toolchains, have
// compatible Starboard APIs and ABIs.
//
// With this define, we have:
// 1) Moved architecture specific defines and configurations from
// configuration_public.h and *.gyp[i] files into SABI files.
// 2) Included the appropriate SABI file in each platform configuration.
// 3) Included the //starboard/sabi/sabi.gypi file in each platform
// configuration which consumes SABI file fields and defines a set of
// constants that are accessible when building.
// 4) Provided a set of tests that ensure the toolchain being used produces
// an executable or shared library that conforms to the included SABI
// file.
//
// For further information on what is provided by SABI files, or how these
// values are consumed, take a look at //starboard/sabi.
#define SB_SABI_FILE_VERSION SB_EXPERIMENTAL_API_VERSION
// Updates the API guarantees of SbMutexAcquireTry.
// SbMutexAcquireTry now has undefined behavior when it is invoked on a mutex
// that has already been locked by the calling thread. In addition, since
// SbMutexAcquireTry was used in SbMutexDestroy, SbMutexDestroy now has
// undefined behavior when invoked on a locked mutex.
#define SB_MUTEX_ACQUIRE_TRY_API_CHANGE_VERSION SB_EXPERIMENTAL_API_VERSION
// Migrate the Starboard configuration variables from macros to extern consts.
//
// The migration allows Cobalt to make platform level decisions at runtime
// instead of compile time which lets us create a more comprehensive Cobalt
// binary.
//
// This means Cobalt must remove all references to these macros that would not
// translate well to constants, i.e. in compile time references or initializing
// arrays. Therefore, we needed to change the functionality of the function
// `SbDirectoryGetNext` in "starboard/directory.h". Because we do not want to
// use variable length arrays, we pass in a c-string and length to the function
// to achieve the same result as before when passing in a `SbDirectoryEntry`.
//
// A platform will define the extern constants declared in
// "starboard/configuration_constants.h". The definitions are done in
// "starboard/<PLATFORM_PATH>/configuration_constants.cc".
//
// The exact mapping between macros and extern variables can be found in
// "starboard/shared/starboard/configuration_constants_compatibility_defines.h"
// though the naming scheme is very nearly the same: the old SB_FOO macro will
// always become the constant kSbFoo.
#define SB_FEATURE_RUNTIME_CONFIGS_VERSION SB_EXPERIMENTAL_API_VERSION
// --- Release Candidate Feature Defines -------------------------------------
// --- Common Detected Features ----------------------------------------------
#if defined(__GNUC__)
#define SB_IS_COMPILER_GCC 1
#elif defined(_MSC_VER)
#define SB_IS_COMPILER_MSVC 1
#endif
// --- Common Helper Macros --------------------------------------------------
// Determines a compile-time capability of the system.
#define SB_CAN(SB_FEATURE) \
((defined SB_CAN_##SB_FEATURE) && SB_CAN_##SB_FEATURE)
// Determines at compile-time whether this platform has a standard feature or
// header available.
#define SB_HAS(SB_FEATURE) \
((defined SB_HAS_##SB_FEATURE) && SB_HAS_##SB_FEATURE)
// Determines at compile-time an inherent aspect of this platform.
#define SB_IS(SB_FEATURE) ((defined SB_IS_##SB_FEATURE) && SB_IS_##SB_FEATURE)
// Determines at compile-time whether this platform has a quirk.
#define SB_HAS_QUIRK(SB_FEATURE) \
((defined SB_HAS_QUIRK_##SB_FEATURE) && SB_HAS_QUIRK_##SB_FEATURE)
// A constant expression that evaluates to the size_t size of a statically-sized
// array.
#define SB_ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
// A constant expression that evaluates to the int size of a statically-sized
// array.
#if defined(__cplusplus)
#define SB_ARRAY_SIZE_INT(array) static_cast<int>(SB_ARRAY_SIZE(array))
#else
#define SB_ARRAY_SIZE_INT(array) \
((int)(SB_ARRAY_SIZE(array))) // NOLINT(readability/casting)
#endif
// Will cause a compiler error with |msg| if |expr| is false. |msg| must be a
// valid identifier, and must be a unique type in the scope of the declaration.
#if defined(__cplusplus)
extern "C++" {
namespace starboard {
template <bool>
struct CompileAssert {};
} // namespace starboard
} // extern "C++"
#define SB_COMPILE_ASSERT(expr, msg) \
typedef ::starboard::CompileAssert<( \
bool(expr))> /* NOLINT(readability/casting) */ \
msg[bool(expr) ? 1 : -1] // NOLINT(readability/casting)
#else
#define SB_COMPILE_ASSERT(expr, msg) \
extern char _COMPILE_ASSERT_##msg[(expr) ? 1 : -1]
#endif
// Standard CPP trick to stringify an evaluated macro definition.
#define SB_STRINGIFY(x) SB_STRINGIFY2(x)
#define SB_STRINGIFY2(x) #x
// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define SB_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
void operator=(const TypeName&) = delete
// An enumeration of values for the SB_PREFERRED_RGBA_BYTE_ORDER configuration
// variable. Setting this up properly means avoiding slow color swizzles when
// passing pixel data from one library to another. Note that these definitions
// are in byte-order and so are endianness-independent.
#define SB_PREFERRED_RGBA_BYTE_ORDER_RGBA 1
#define SB_PREFERRED_RGBA_BYTE_ORDER_BGRA 2
#define SB_PREFERRED_RGBA_BYTE_ORDER_ARGB 3
// --- Platform Configuration ------------------------------------------------
// Include the platform-specific configuration. This macro is set by GYP in
// starboard_base_target.gypi and passed in on the command line for all targets
// and all configurations.
#include STARBOARD_CONFIGURATION_INCLUDE
#if SB_API_VERSION < SB_FEATURE_RUNTIME_CONFIGS_VERSION
// After SB_FEATURE_RUNTIME_CONFIGS_VERSION, we start to use runtime constants
// instead of macros for certain platform dependent configurations. This file
// substitutes configuration macros for the corresponding runtime constants so
// we don't reference these constants when they aren't defined.
#include "starboard/shared/starboard/configuration_constants_compatibility_defines.h"
#endif // SB_API_VERSION < SB_FEATURE_RUNTIME_CONFIGS_VERSION
// --- Overridable Helper Macros ---------------------------------------------
// The following macros can be overridden in STARBOARD_CONFIGURATION_INCLUDE
// Makes a pointer-typed parameter restricted so that the compiler can make
// certain optimizations because it knows the pointers are unique.
#if !defined(SB_RESTRICT)
#if defined(__cplusplus)
#if SB_IS(COMPILER_MSVC)
#define SB_RESTRICT __restrict
#elif SB_IS(COMPILER_GCC)
#define SB_RESTRICT __restrict__
#else // COMPILER
#define SB_RESTRICT
#endif // COMPILER
#else // __cplusplus
#define SB_RESTRICT __restrict
#endif // __cplusplus
#endif // SB_RESTRICT
// Tells the compiler a function is using a printf-style format string.
// |format_param| is the one-based index of the format string parameter;
// |dots_param| is the one-based index of the "..." parameter.
// For v*printf functions (which take a va_list), pass 0 for dots_param.
// (This is undocumented but matches what the system C headers do.)
// (Partially taken from base/compiler_specific.h)
#if !defined(SB_PRINTF_FORMAT)
#if SB_IS(COMPILER_GCC)
#define SB_PRINTF_FORMAT(format_param, dots_param) \
__attribute__((format(printf, format_param, dots_param)))
#else
#define SB_PRINTF_FORMAT(format_param, dots_param)
#endif
#endif // SB_PRINTF_FORMAT
// Trivially references a parameter that is otherwise unreferenced, preventing a
// compiler warning on some platforms.
#if !defined(SB_UNREFERENCED_PARAMETER)
#if SB_IS(COMPILER_MSVC)
#define SB_UNREFERENCED_PARAMETER(x) (x)
#else
#define SB_UNREFERENCED_PARAMETER(x) \
do { \
(void)(x); \
} while (0)
#endif
#endif // SB_UNREFERENCED_PARAMETER
// Causes the annotated (at the end) function to generate a warning if the
// result is not accessed.
#if !defined(SB_WARN_UNUSED_RESULT)
#if defined(COMPILER_GCC)
#define SB_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
#define SB_WARN_UNUSED_RESULT
#endif // COMPILER_GCC
#endif // SB_WARN_UNUSED_RESULT
// Declares a function as overriding a virtual function on compilers that
// support it.
#if !defined(SB_OVERRIDE)
#if defined(COMPILER_MSVC)
#define SB_OVERRIDE override
#elif defined(__clang__)
#define SB_OVERRIDE override
#else
#define SB_OVERRIDE
#endif
#endif // SB_OVERRIDE
// Declare numeric literals of signed 64-bit type.
#if !defined(SB_INT64_C)
#if defined(_MSC_VER)
#define SB_INT64_C(x) x##I64
#else // defined(_MSC_VER)
#define SB_INT64_C(x) x##LL
#endif // defined(_MSC_VER)
#endif // SB_INT64_C
// Declare numeric literals of unsigned 64-bit type.
#if !defined(SB_UINT64_C)
#if defined(_MSC_VER)
#define SB_UINT64_C(x) x##UI64
#else // defined(_MSC_VER)
#define SB_UINT64_C(x) x##ULL
#endif // defined(_MSC_VER)
#endif // SB_INT64_C
// Macro for hinting that an expression is likely to be true.
#if !defined(SB_LIKELY)
#if SB_IS(COMPILER_GCC)
#define SB_LIKELY(x) __builtin_expect(!!(x), 1)
#elif SB_IS(COMPILER_MSVC)
#define SB_LIKELY(x) (x)
#else
#define SB_LIKELY(x) (x)
#endif // SB_IS(COMPILER_MSVC)
#endif // !defined(SB_LIKELY)
// Macro for hinting that an expression is likely to be false.
#if !defined(SB_UNLIKELY)
#if SB_IS(COMPILER_GCC)
#define SB_UNLIKELY(x) __builtin_expect(!!(x), 0)
#elif SB_IS(COMPILER_MSVC)
#define SB_UNLIKELY(x) (x)
#else
#define SB_UNLIKELY(x) (x)
#endif // SB_IS(COMPILER_MSVC)
#endif // !defined(SB_UNLIKELY)
// SB_DEPRECATED(int Foo(int bar));
// Annotates the function as deprecated, which will trigger a compiler
// warning when referenced.
#if !defined(SB_DEPRECATED)
#if SB_IS(COMPILER_GCC)
#define SB_DEPRECATED(FUNC) FUNC __attribute__((deprecated))
#elif SB_IS(COMPILER_MSVC)
#define SB_DEPRECATED(FUNC) __declspec(deprecated) FUNC
#else
// Empty definition for other compilers.
#define SB_DEPRECATED(FUNC) FUNC
#endif
#endif // SB_DEPRECATED
// SB_DEPRECATED_EXTERNAL(...) annotates the function as deprecated for
// external clients, but not deprecated for starboard.
#if defined(STARBOARD_IMPLEMENTATION)
#define SB_DEPRECATED_EXTERNAL(FUNC) FUNC
#else
#define SB_DEPRECATED_EXTERNAL(FUNC) SB_DEPRECATED(FUNC)
#endif
// Macro to annotate a function as noreturn, which signals to the compiler
// that the function cannot return.
#if !defined(SB_NORETURN)
#if SB_IS(COMPILER_GCC)
#define SB_NORETURN __attribute__((__noreturn__))
#elif SB_IS(COMPILER_MSVC)
#define SB_NORETURN __declspec(noreturn)
#else
// Empty definition for other compilers.
#define SB_NORETURN
#endif
#endif // SB_NORETURN
// Specifies the alignment for a class, struct, union, enum, class/struct field,
// or stack variable.
#if !defined(SB_ALIGNAS)
#if SB_IS(COMPILER_GCC)
#define SB_ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
#elif SB_IS(COMPILER_MSVC)
#define SB_ALIGNAS(byte_alignment) __declspec(align(byte_alignment))
#else
// Fallback to the C++11 form.
#define SB_ALIGNAS(byte_alignment) alignas(byte_alignment)
#endif
#endif // !defined(SB_ALIGNAS)
// Returns the alignment reqiured for any instance of the type indicated by
// |type|.
#if !defined(SB_ALIGNOF)
#if SB_IS(COMPILER_GCC)
#define SB_ALIGNOF(type) __alignof__(type)
#elif SB_IS(COMPILER_MSVC)
#define SB_ALIGNOF(type) (sizeof(type) - sizeof(type) + __alignof(type))
#else
// Fallback to the C++11 form.
#define SB_ALIGNOF(type) alignof(type)
#endif
#endif // !defined(SB_ALIGNOF)
// --- Configuration Audits --------------------------------------------------
#if !defined(SB_API_VERSION)
#error "SB_API_VERSION was not defined by your platform."
#endif
#if SB_API_VERSION > SB_MAXIMUM_API_VERSION
#error "Your platform's SB_API_VERSION > SB_MAXIMUM_API_VERSION."
#endif
#if SB_API_VERSION < SB_MINIMUM_API_VERSION
#error "Your platform's SB_API_VERSION < SB_MINIMUM_API_VERSION."
#endif
#if !SB_IS(ARCH_ARM) && !SB_IS(ARCH_MIPS) && !SB_IS(ARCH_PPC) && \
!SB_IS(ARCH_X86)
#error "Your platform doesn't define a known architecture."
#endif
#if SB_IS(32_BIT) == SB_IS(64_BIT)
#error "Your platform must be exactly one of { 32-bit, 64-bit }."
#endif
#if SB_HAS(32_BIT_POINTERS) == SB_HAS(64_BIT_POINTERS)
#error "Your platform's pointer sizes must be either 32 bit or 64 bit."
#endif
#if SB_HAS(32_BIT_LONG) == SB_HAS(64_BIT_LONG)
#error "Your platform's long size must be either 32 bit or 64 bit."
#endif
#if SB_HAS(32_BIT_LONG)
SB_COMPILE_ASSERT(sizeof(long) == 4, // NOLINT(runtime/int)
SB_HAS_32_BIT_LONG_is_inconsistent_with_sizeof_long);
#endif
#if SB_HAS(64_BIT_LONG)
SB_COMPILE_ASSERT(sizeof(long) == 8, // NOLINT(runtime/int)
SB_HAS_64_BIT_LONG_is_inconsistent_with_sizeof_long);
#endif
#if !defined(SB_IS_BIG_ENDIAN)
#error "Your platform must define SB_IS_BIG_ENDIAN."
#endif
#if defined(SB_IS_LITTLE_ENDIAN)
#error "SB_IS_LITTLE_ENDIAN is set based on SB_IS_BIG_ENDIAN."
#endif
#if SB_IS(WCHAR_T_UTF16) == SB_IS(WCHAR_T_UTF32)
#error "You must define either SB_IS_WCHAR_T_UTF16 or SB_IS_WCHAR_T_UTF32."
#endif
#if defined(SB_IS_WCHAR_T_SIGNED) && defined(SB_IS_WCHAR_T_UNSIGNED)
#error "You can't define SB_IS_WCHAR_T_SIGNED and SB_IS_WCHAR_T_UNSIGNED."
#endif
#if !defined(SB_C_FORCE_INLINE)
#error "Your platform must define SB_C_FORCE_INLINE."
#endif
#if !defined(SB_C_INLINE)
#error "Your platform must define SB_C_INLINE."
#endif
#if !defined(SB_EXPORT_PLATFORM)
#error "Your platform must define SB_EXPORT_PLATFORM."
#endif
#if !defined(SB_IMPORT_PLATFORM)
#error "Your platform must define SB_IMPORT_PLATFORM."
#endif
#if SB_API_VERSION >= 11
#if !SB_HAS(STD_UNORDERED_HASH)
#if !defined(SB_HASH_MAP_INCLUDE)
#error \
"Your platform must define SB_HASH_MAP_INCLUDE or "\
"define SB_HAS_STD_UNORDERED_HASH 1."
#endif
#if !defined(SB_HASH_NAMESPACE)
#error \
"Your platform must define SB_HASH_NAMESPACE or "\
"define SB_HAS_STD_UNORDERED_HASH 1."
#endif
#if !defined(SB_HASH_SET_INCLUDE)
#error \
"Your platform must define SB_HASH_SET_INCLUDE or "\
"define SB_HAS_STD_UNORDERED_HASH 1."
#endif
#endif // !SB_HAS(STD_UNORDERED_HASH)
#else // SB_API_VERSION >= 11
#if !defined(SB_HASH_MAP_INCLUDE)
#error "Your platform must define SB_HASH_MAP_INCLUDE."
#endif
#if !defined(SB_HASH_NAMESPACE)
#error "Your platform must define SB_HASH_NAMESPACE."
#endif
#if !defined(SB_HASH_SET_INCLUDE)
#error "Your platform must define SB_HASH_SET_INCLUDE."
#endif
#endif // SB_API_VERSION >= 11
#if !defined(SB_FILE_MAX_NAME) || SB_FILE_MAX_NAME < 2
#error "Your platform must define SB_FILE_MAX_NAME > 1."
#endif
#if !defined(SB_FILE_MAX_PATH) || SB_FILE_MAX_PATH < 2
#error "Your platform must define SB_FILE_MAX_PATH > 1."
#endif
#if !defined(SB_FILE_SEP_CHAR)
#error "Your platform must define SB_FILE_SEP_CHAR."
#endif
#if !defined(SB_FILE_ALT_SEP_CHAR)
#error "Your platform must define SB_FILE_ALT_SEP_CHAR."
#endif
#if !defined(SB_PATH_SEP_CHAR)
#error "Your platform must define SB_PATH_SEP_CHAR."
#endif
#if !defined(SB_FILE_SEP_STRING)
#error "Your platform must define SB_FILE_SEP_STRING."
#endif
#if !defined(SB_FILE_ALT_SEP_STRING)
#error "Your platform must define SB_FILE_ALT_SEP_STRING."
#endif
#if !defined(SB_PATH_SEP_STRING)
#error "Your platform must define SB_PATH_SEP_STRING."
#endif
#if !defined(SB_MAX_THREADS)
#error "Your platform must define SB_MAX_THREADS."
#endif
#if !defined(SB_MAX_THREAD_LOCAL_KEYS)
#error "Your platform must define SB_MAX_THREAD_LOCAL_KEYS."
#endif
#if SB_API_VERSION >= SB_FEATURE_RUNTIME_CONFIGS_VERSION
#if defined(SB_MALLOC_ALIGNMENT)
#error \
"SB_MALLOC_ALIGNMENT should not be defined in Starboard " \
"versions 12 and later. Instead, define kSbMallocAlignment in " \
"starboard/<PLATFORM_PATH>/configuration_constants.cc."
#endif
#if defined(SB_MAX_THREAD_NAME_LENGTH)
#error \
"SB_MAX_THREAD_NAME_LENGTH should not be defined in Starboard " \
"versions 12 and later. Instead, define kSbMaxThreadNameLength in " \
"starboard/<PLATFORM_PATH>/configuration_constants.cc."
#endif
#else // SB_API_VERSION >= SB_FEATURE_RUNTIME_CONFIGS_VERSION
#if !defined(SB_MAX_THREAD_NAME_LENGTH)
#error "Your platform must define SB_MAX_THREAD_NAME_LENGTH."
#endif
#endif // SB_API_VERSION >= SB_FEATURE_RUNTIME_CONFIGS_VERSION
#if (SB_API_VERSION < 12 && !defined(SB_HAS_MICROPHONE))
#error \
"Your platform must define SB_HAS_MICROPHONE in API versions 11 or earlier."
#endif
#if SB_API_VERSION < SB_TIME_THREAD_NOW_REQUIRED_VERSION && \
!defined(SB_HAS_TIME_THREAD_NOW)
#error \
"Your platform must define SB_HAS_TIME_THREAD_NOW in API versions 3 to 11."
#endif
#if defined(SB_IS_PLAYER_COMPOSITED) || defined(SB_IS_PLAYER_PUNCHED_OUT) || \
defined(SB_IS_PLAYER_PRODUCING_TEXTURE)
#error "New versions of Starboard specify player output mode at runtime."
#endif
#if !defined(SB_HAS_THREAD_PRIORITY_SUPPORT)
#error "Your platform must define SB_HAS_THREAD_PRIORITY_SUPPORT."
#endif
#if !defined(SB_PREFERRED_RGBA_BYTE_ORDER)
// Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above
// as SB_PREFERRED_RGBA_BYTE_ORDER_*.
// If your platform uses GLES, you should set this to
// SB_PREFERRED_RGBA_BYTE_ORDER_RGBA.
#error "Your platform must define SB_PREFERRED_RGBA_BYTE_ORDER."
#endif
#if SB_PREFERRED_RGBA_BYTE_ORDER != SB_PREFERRED_RGBA_BYTE_ORDER_RGBA && \
SB_PREFERRED_RGBA_BYTE_ORDER != SB_PREFERRED_RGBA_BYTE_ORDER_BGRA && \
SB_PREFERRED_RGBA_BYTE_ORDER != SB_PREFERRED_RGBA_BYTE_ORDER_ARGB
#error "SB_PREFERRED_RGBA_BYTE_ORDER has been assigned an invalid value."
#endif
#if !defined(SB_HAS_BILINEAR_FILTERING_SUPPORT)
#error "Your platform must define SB_HAS_BILINEAR_FILTERING_SUPPORT."
#endif
#if !defined(SB_HAS_NV12_TEXTURE_SUPPORT)
#error "Your platform must define SB_HAS_NV12_TEXTURE_SUPPORT."
#endif
#if SB_API_VERSION >= SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER_DEPRECATED_VERSION
#if defined(SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER)
#error "SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER is deprecated."
#error "Use `CobaltExtensionGraphicsApi` instead."
#error "See [`CobaltExtensionGraphicsApi`](../extension/graphics.h)."
#endif
#else
#if !defined(SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER)
#error "Your platform must define SB_MUST_FREQUENTLY_FLIP_DISPLAY_BUFFER."
#endif
#endif
#if !defined(SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND)
#error \
"Your platform must define SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND."
#endif // !defined(SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND)
#if !defined(SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND)
#error \
"Your platform must define SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND."
#endif // !defined(SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND)
#if defined(SB_MEDIA_SOURCE_BUFFER_STREAM_AUDIO_MEMORY_LIMIT)
#error "SB_MEDIA_SOURCE_BUFFER_STREAM_AUDIO_MEMORY_LIMIT is deprecated."
#error "Use gyp variable |cobalt_media_buffer_non_video_budget| instead."
#endif // defined(SB_MEDIA_SOURCE_BUFFER_STREAM_AUDIO_MEMORY_LIMIT)
#if defined(SB_MEDIA_SOURCE_BUFFER_STREAM_VIDEO_MEMORY_LIMIT)
#error "SB_MEDIA_SOURCE_BUFFER_STREAM_VIDEO_MEMORY_LIMIT is deprecated."
#error "Use gyp variable |cobalt_media_buffer_video_budget_1080p| instead."
#error "Use gyp variable |cobalt_media_buffer_video_budget_4k| instead."
#endif // defined(SB_MEDIA_SOURCE_BUFFER_STREAM_VIDEO_MEMORY_LIMIT)
#if defined(SB_MEDIA_MAIN_BUFFER_BUDGET)
#error "SB_MEDIA_MAIN_BUFFER_BUDGET is deprecated."
#endif // defined(SB_MEDIA_MAIN_BUFFER_BUDGET)
#if defined(SB_MEDIA_GPU_BUFFER_BUDGET)
#error "SB_MEDIA_GPU_BUFFER_BUDGET is deprecated."
#endif // defined(SB_MEDIA_GPU_BUFFER_BUDGET)
#if SB_API_VERSION >= 11
#if defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
#if !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
#error \
"SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT is required in this API " \
"version."
#endif // !SB_HAS(MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
#else // defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
#define SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT 1
#endif // defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT)
#endif // SB_API_VERSION >= 11
#if SB_API_VERSION >= 10
#if defined(SB_HAS_DRM_SESSION_CLOSED)
#if !SB_HAS(DRM_SESSION_CLOSED)
#error "SB_HAS_DRM_SESSION_CLOSED is required in this API version."
#endif // !SB_HAS(DRM_SESSION_CLOSED)
#else // defined(SB_HAS_DRM_SESSION_CLOSED)
#define SB_HAS_DRM_SESSION_CLOSED 1
#endif // defined(SB_HAS_DRM_SESSION_CLOSED)
#endif // SB_API_VERSION >= 10
#if SB_API_VERSION < SB_SPEECH_RECOGNIZER_IS_REQUIRED && SB_API_VERSION >= 5
#if !defined(SB_HAS_SPEECH_RECOGNIZER)
#error "Your platform must define SB_HAS_SPEECH_RECOGNIZER."
#endif // !defined(SB_HAS_SPEECH_RECOGNIZER)
#endif // SB_API_VERSION < SB_SPEECH_RECOGNIZER_IS_REQUIRED && SB_API_VERSION
// >= 5
#if SB_API_VERSION < SB_ON_SCREEN_KEYBOARD_REQUIRED_VERSION && \
SB_API_VERSION >= 8
#if !defined(SB_HAS_ON_SCREEN_KEYBOARD)
#error "Your platform must define SB_HAS_ON_SCREEN_KEYBOARD."
#endif // !defined(SB_HAS_ON_SCREEN_KEYBOARD)
#endif // SB_API_VERSION < SB_ON_SCREEN_KEYBOARD_REQUIRED_VERSION &&
// SB_API_VERSION >= 8
#if SB_HAS(ON_SCREEN_KEYBOARD) && (SB_API_VERSION < 8)
#error "SB_HAS_ON_SCREEN_KEYBOARD not supported in this API version."
#endif
#if SB_HAS(CAPTIONS) && (SB_API_VERSION < 10)
#error "SB_HAS_CAPTIONS not supported in this API version."
#endif
#if SB_API_VERSION >= 10
#define SB_HAS_AUDIOLESS_VIDEO 1
#endif
#if SB_API_VERSION >= 10
#define SB_HAS_PLAYER_FILTER_TESTS 1
#endif
#if SB_API_VERSION >= 10
#define SB_HAS_PLAYER_ERROR_MESSAGE 1
#endif
#if SB_API_VERSION < 10
#if !SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
#define SB_HAS_QUIRK_SUPPORT_INT16_AUDIO_SAMPLES 1
#endif // !SB_HAS_QUIRK(SUPPORT_INT16_AUDIO_SAMPLES)
#endif // SB_API_VERSION < 10
#if SB_API_VERSION >= 10
#if !defined(SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING)
#error \
"Your platform must define SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING in API "\
"version 10 or later."
#endif // !defined(SB_HAS_ASYNC_AUDIO_FRAMES_REPORTING)
#endif // SB_API_VERSION >= 10
#if SB_API_VERSION >= 11
#if defined(SB_HAS_AC3_AUDIO)
#if !SB_HAS(AC3_AUDIO)
#error "SB_HAS_AC3_AUDIO is required in this API version."
#endif // !SB_HAS(AC3_AUDIO)
#else // defined(SB_HAS_AC3_AUDIO)
#define SB_HAS_AC3_AUDIO 1
#endif // defined(SB_HAS_AC3_AUDIO)
#endif // SB_API_VERSION >= 11
// --- Derived Configuration -------------------------------------------------
// Whether the current platform is little endian.
#if SB_IS(BIG_ENDIAN)
#define SB_IS_LITTLE_ENDIAN 0
#else
#define SB_IS_LITTLE_ENDIAN 1
#endif
// Whether the current platform has 64-bit atomic operations.
#if SB_IS(64_BIT)
#define SB_HAS_64_BIT_ATOMICS 1
#else
#define SB_HAS_64_BIT_ATOMICS 0
#endif
// Whether we use __PRETTY_FUNCTION__ or __FUNCTION__ for logging.
#if SB_IS(COMPILER_GCC)
#define SB_FUNCTION __PRETTY_FUNCTION__
#else
#define SB_FUNCTION __FUNCTION__
#endif
// --- Gyp Derived Configuration -----------------------------------------------
// Specifies whether this platform has a performant OpenGL ES 2 implementation,
// which allows client applications to use GL rendering paths. Derived from
// the gyp variable `gl_type` which indicates what kind of GL implementation
// is available.
#if !defined(SB_HAS_GLES2)
#define SB_HAS_GLES2 !SB_GYP_GL_TYPE_IS_NONE
#endif
// Specifies whether this platform has any kind of supported graphics system.
#if !defined(SB_HAS_GRAPHICS)
#if SB_HAS(GLES2) || SB_API_VERSION >= SB_ALL_RENDERERS_REQUIRED_VERSION || \
SB_HAS(BLITTER)
#define SB_HAS_GRAPHICS 1
#else
#define SB_HAS_GRAPHICS 0
#endif
#endif
// Deprecated feature macros
// These feature macros are deprecated in Starboard version 6 and later, and are
// no longer referenced by application code. They will be removed in a future
// version. Any Starboard implementation that supports Starboard version 6 or
// later should be modified to no longer depend on these macros, with the
// assumption that their values are always 1.
#if defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
#if !SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
#error \
"SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER is required for Starboard 6 " \
"or later."
#endif // !SB_HAS(AUDIO_SPECIFIC_CONFIG_AS_POINTER)
#else // defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
#define SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER 1
#endif // defined(SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER)
#if defined(SB_HAS_DRM_KEY_STATUSES)
#if !SB_HAS(DRM_KEY_STATUSES)
#error "SB_HAS_DRM_KEY_STATUSES is required for Starboard 6 or later."
#endif // !SB_HAS(DRM_KEY_STATUSES)
#else // defined(SB_HAS_DRM_KEY_STATUSES)
#define SB_HAS_DRM_KEY_STATUSES 1
#endif // defined(SB_HAS_DRM_KEY_STATUSES)
#endif // STARBOARD_CONFIGURATION_H_