/* -*- 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 #include "ipc/EnumSerializer.h" #include "mozilla/dom/ProducerConsumerQueue.h" #include "TexUnpackBlob.h" #include "WebGLContext.h" #include "WebGLTypes.h" namespace mozilla { namespace webgl { template struct QueueParamTraits; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type { }; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template struct IsTriviallySerializable> : std::true_type {}; template struct IsTriviallySerializable> : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type { }; template <> struct IsTriviallySerializable : std::true_type {}; template <> struct IsTriviallySerializable : std::true_type {}; template struct QueueParamTraits> { using ParamType = RawBuffer; template static QueueStatus Write(ProducerView& 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(begin); status = view.WriteParam(hasData); if (!status) return status; if (!hasData) return status; status = view.WriteFromRange(in.Data()); return status; } template static QueueStatus Read(ConsumerView& view, ParamType* const out) { size_t elemCount = 0; auto status = view.ReadParam(&elemCount); if (!status) return status; if (!elemCount) { *out = {}; return QueueStatus::kSuccess; } uint8_t hasData = 0; status = view.ReadParam(&hasData); if (!status) return status; if (!hasData) { auto temp = RawBuffer{elemCount}; *out = std::move(temp); return QueueStatus::kSuccess; } auto data = view.template ReadRange(elemCount); if (!data) return QueueStatus::kTooSmall; *out = std::move(RawBuffer{*data}); return QueueStatus::kSuccess; } }; template <> struct QueueParamTraits : public ContiguousEnumSerializerInclusive< webgl::ContextLossReason, webgl::ContextLossReason::None, webgl::ContextLossReason::Guilty> {}; template struct QueueParamTraits> { using T = Result; template static QueueStatus Write(ProducerView& 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 static QueueStatus Read(ConsumerView& 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 { using T = std::string; template static QueueStatus Write(ProducerView& aProducerView, const T& aArg) { const auto size = aArg.size(); auto status = aProducerView.WriteParam(size); if (!status) return status; status = aProducerView.WriteFromRange(Range{aArg.data(), size}); return status; } template static QueueStatus Read(ConsumerView& aConsumerView, T* aArg) { size_t size; auto status = aConsumerView.ReadParam(&size); if (!status) return status; const auto view = aConsumerView.template ReadRange(size); if (!view) return QueueStatus::kFatalError; aArg->assign(view->begin().get(), size); return status; } }; template struct QueueParamTraits> { using T = std::vector; template static QueueStatus Write(ProducerView& 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 static QueueStatus Read(ConsumerView& 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 : public ContiguousEnumSerializer {}; template <> struct QueueParamTraits { using T = CompileResult; template static QueueStatus Write(ProducerView& aProducerView, const T& aArg) { aProducerView.WriteParam(aArg.pending); aProducerView.WriteParam(aArg.log); aProducerView.WriteParam(aArg.translatedSource); return aProducerView.WriteParam(aArg.success); } template static QueueStatus Read(ConsumerView& aConsumerView, T* aArg) { aConsumerView.ReadParam(&aArg->pending); aConsumerView.ReadParam(&aArg->log); aConsumerView.ReadParam(&aArg->translatedSource); return aConsumerView.ReadParam(&aArg->success); } }; template <> struct QueueParamTraits : public ContiguousEnumSerializer {}; template <> struct QueueParamTraits : public ContiguousEnumSerializerInclusive< mozilla::gfx::SurfaceFormat, mozilla::gfx::SurfaceFormat::B8G8R8A8, mozilla::gfx::SurfaceFormat::UNKNOWN> {}; template <> struct QueueParamTraits : public ContiguousEnumSerializerInclusive< gfxAlphaType, gfxAlphaType::Opaque, gfxAlphaType::NonPremult> {}; } // namespace webgl } // namespace mozilla #endif // WEBGLQUEUEPARAMTRAITS_H_