diff options
Diffstat (limited to 'dom/canvas/WebGLQueueParamTraits.h')
-rw-r--r-- | dom/canvas/WebGLQueueParamTraits.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/dom/canvas/WebGLQueueParamTraits.h b/dom/canvas/WebGLQueueParamTraits.h new file mode 100644 index 0000000000..3c130c4da6 --- /dev/null +++ b/dom/canvas/WebGLQueueParamTraits.h @@ -0,0 +1,309 @@ + +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef WEBGLQUEUEPARAMTRAITS_H_ +#define WEBGLQUEUEPARAMTRAITS_H_ + +#include <type_traits> + +#include "ipc/EnumSerializer.h" +#include "TexUnpackBlob.h" +#include "WebGLContext.h" +#include "WebGLTypes.h" + +namespace mozilla { +namespace webgl { +template <typename T> +struct QueueParamTraits; + +// - + +#define USE_TIED_FIELDS(T) \ + template <> \ + struct QueueParamTraits<T> : QueueParamTraits_TiedFields<T> {}; + +// - + +USE_TIED_FIELDS(layers::RemoteTextureId) +USE_TIED_FIELDS(layers::RemoteTextureOwnerId) +USE_TIED_FIELDS(WebGLContextOptions) +USE_TIED_FIELDS(webgl::PixelUnpackStateWebgl) +USE_TIED_FIELDS(webgl::SwapChainOptions) +USE_TIED_FIELDS(webgl::ReadPixelsDesc) +USE_TIED_FIELDS(webgl::VertAttribPointerDesc) +USE_TIED_FIELDS(webgl::PackingInfo) +USE_TIED_FIELDS(webgl::TypedQuad) +USE_TIED_FIELDS(webgl::PixelPackingState) +USE_TIED_FIELDS(FloatOrInt) + +} // namespace webgl +template <> +inline auto TiedFields<gfx::IntSize>(gfx::IntSize& a) { + return std::tie(a.width, a.height); +} +namespace webgl { +USE_TIED_FIELDS(gfx::IntSize) + +// - + +#undef USE_TIED_FIELDS + +// - + +template <class T> +struct QueueParamTraits<avec2<T>> : QueueParamTraits_TiedFields<avec2<T>> {}; + +template <class T> +struct QueueParamTraits<avec3<T>> : QueueParamTraits_TiedFields<avec3<T>> {}; + +// --------------------------------------------------------------------- +// Enums! + +inline constexpr bool IsEnumCase(const dom::WebGLPowerPreference raw) { + switch (raw) { + case dom::WebGLPowerPreference::Default: + case dom::WebGLPowerPreference::Low_power: + case dom::WebGLPowerPreference::High_performance: + return true; + case dom::WebGLPowerPreference::EndGuard_: + break; + } + return false; +} + +inline constexpr bool IsEnumCase(const dom::PredefinedColorSpace raw) { + switch (raw) { + case dom::PredefinedColorSpace::Srgb: + case dom::PredefinedColorSpace::Display_p3: + return true; + case dom::PredefinedColorSpace::EndGuard_: + break; + } + return false; +} + +inline constexpr bool IsEnumCase(const webgl::AttribBaseType raw) { + switch (raw) { + case webgl::AttribBaseType::Boolean: + case webgl::AttribBaseType::Float: + case webgl::AttribBaseType::Int: + case webgl::AttribBaseType::Uint: + return true; + } + return false; +} + +static_assert(IsEnumCase(dom::WebGLPowerPreference(2))); +static_assert(!IsEnumCase(dom::WebGLPowerPreference(3))); +static_assert(!IsEnumCase(dom::WebGLPowerPreference(5))); + +#define USE_IS_ENUM_CASE(T) \ + template <> \ + struct QueueParamTraits<T> : QueueParamTraits_IsEnumCase<T> {}; + +USE_IS_ENUM_CASE(dom::WebGLPowerPreference) +USE_IS_ENUM_CASE(dom::PredefinedColorSpace) +USE_IS_ENUM_CASE(webgl::AttribBaseType) +USE_IS_ENUM_CASE(webgl::ProvokingVertex) + +#undef USE_IS_ENUM_CASE + +// --------------------------------------------------------------------- +// Custom QueueParamTraits + +template <typename T> +struct QueueParamTraits<RawBuffer<T>> { + using ParamType = RawBuffer<T>; + + template <typename U> + static bool Write(ProducerView<U>& view, const ParamType& in) { + const auto& elemCount = in.size(); + auto status = view.WriteParam(elemCount); + if (!status) return status; + if (!elemCount) return status; + + const auto& begin = in.begin(); + const bool hasData = static_cast<bool>(begin); + status = view.WriteParam(hasData); + if (!status) return status; + if (!hasData) return status; + + status = view.WriteFromRange(in.Data()); + return status; + } + + template <typename U> + static bool Read(ConsumerView<U>& view, ParamType* const out) { + size_t elemCount = 0; + auto status = view.ReadParam(&elemCount); + if (!status) return status; + if (!elemCount) { + *out = {}; + return true; + } + + uint8_t hasData = 0; + status = view.ReadParam(&hasData); + if (!status) return status; + if (!hasData) { + auto temp = RawBuffer<T>{elemCount}; + *out = std::move(temp); + return true; + } + + auto data = view.template ReadRange<T>(elemCount); + if (!data) return false; + *out = std::move(RawBuffer<T>{*data}); + return true; + } +}; + +template <> +struct QueueParamTraits<webgl::ContextLossReason> + : public ContiguousEnumSerializerInclusive< + webgl::ContextLossReason, webgl::ContextLossReason::None, + webgl::ContextLossReason::Guilty> {}; + +template <typename V, typename E> +struct QueueParamTraits<Result<V, E>> { + using T = Result<V, E>; + + template <typename U> + static bool Write(ProducerView<U>& aProducerView, const T& aArg) { + const auto ok = aArg.isOk(); + auto status = aProducerView.WriteParam(ok); + if (!status) return status; + if (ok) { + status = aProducerView.WriteParam(aArg.unwrap()); + } else { + status = aProducerView.WriteParam(aArg.unwrapErr()); + } + return status; + } + + template <typename U> + static bool Read(ConsumerView<U>& aConsumerView, T* aArg) { + bool ok; + auto status = aConsumerView.ReadParam(&ok); + if (!status) return status; + if (ok) { + V val; + status = aConsumerView.ReadParam(&val); + *aArg = val; + } else { + E val; + status = aConsumerView.ReadParam(&val); + *aArg = Err(val); + } + return status; + } +}; + +template <> +struct QueueParamTraits<std::string> { + using T = std::string; + + template <typename U> + static bool Write(ProducerView<U>& aProducerView, const T& aArg) { + const auto size = aArg.size(); + auto status = aProducerView.WriteParam(size); + if (!status) return status; + status = aProducerView.WriteFromRange(Range<const char>{aArg.data(), size}); + return status; + } + + template <typename U> + static bool Read(ConsumerView<U>& aConsumerView, T* aArg) { + size_t size; + auto status = aConsumerView.ReadParam(&size); + if (!status) return status; + + const auto view = aConsumerView.template ReadRange<char>(size); + if (!view) return false; + aArg->assign(view->begin().get(), size); + return status; + } +}; + +template <typename U> +struct QueueParamTraits<std::vector<U>> { + using T = std::vector<U>; + + template <typename V> + static bool Write(ProducerView<V>& aProducerView, const T& aArg) { + auto status = aProducerView.WriteParam(aArg.size()); + if (!status) return status; + + for (const auto& cur : aArg) { + status = aProducerView.WriteParam(cur); + if (!status) return status; + } + return status; + } + + template <typename V> + static bool Read(ConsumerView<V>& aConsumerView, T* aArg) { + size_t size; + auto status = aConsumerView.ReadParam(&size); + if (!status) return status; + aArg->resize(size); + + for (auto& cur : *aArg) { + status = aConsumerView.ReadParam(&cur); + if (!status) return status; + } + return status; + } +}; + +template <> +struct QueueParamTraits<WebGLExtensionID> + : public ContiguousEnumSerializer<WebGLExtensionID, + WebGLExtensionID::ANGLE_instanced_arrays, + WebGLExtensionID::Max> {}; + +template <> +struct QueueParamTraits<CompileResult> { + using T = CompileResult; + + template <typename U> + static bool Write(ProducerView<U>& aProducerView, const T& aArg) { + aProducerView.WriteParam(aArg.pending); + aProducerView.WriteParam(aArg.log); + aProducerView.WriteParam(aArg.translatedSource); + return aProducerView.WriteParam(aArg.success); + } + + template <typename U> + static bool Read(ConsumerView<U>& aConsumerView, T* aArg) { + aConsumerView.ReadParam(&aArg->pending); + aConsumerView.ReadParam(&aArg->log); + aConsumerView.ReadParam(&aArg->translatedSource); + return aConsumerView.ReadParam(&aArg->success); + } +}; + +template <> +struct QueueParamTraits<mozilla::layers::TextureType> + : public ContiguousEnumSerializer<mozilla::layers::TextureType, + mozilla::layers::TextureType::Unknown, + mozilla::layers::TextureType::Last> {}; + +template <> +struct QueueParamTraits<mozilla::gfx::SurfaceFormat> + : public ContiguousEnumSerializerInclusive< + mozilla::gfx::SurfaceFormat, mozilla::gfx::SurfaceFormat::B8G8R8A8, + mozilla::gfx::SurfaceFormat::UNKNOWN> {}; + +template <> +struct QueueParamTraits<gfxAlphaType> + : public ContiguousEnumSerializerInclusive< + gfxAlphaType, gfxAlphaType::Opaque, gfxAlphaType::NonPremult> {}; + +} // namespace webgl +} // namespace mozilla + +#endif // WEBGLQUEUEPARAMTRAITS_H_ |