1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef WEBGLQUEUEPARAMTRAITS_H_
7 #define WEBGLQUEUEPARAMTRAITS_H_
11 #include "ipc/EnumSerializer.h"
12 #include "mozilla/dom/ProducerConsumerQueue.h"
13 #include "TexUnpackBlob.h"
14 #include "WebGLContext.h"
15 #include "WebGLTypes.h"
21 struct QueueParamTraits
;
24 struct IsTriviallySerializable
<FloatOrInt
> : std::true_type
{};
27 struct IsTriviallySerializable
<webgl::ShaderPrecisionFormat
> : std::true_type
{
31 struct IsTriviallySerializable
<WebGLContextOptions
> : std::true_type
{};
34 struct IsTriviallySerializable
<WebGLPixelStore
> : std::true_type
{};
37 struct IsTriviallySerializable
<WebGLTexImageData
> : std::true_type
{};
40 struct IsTriviallySerializable
<WebGLTexPboOffset
> : std::true_type
{};
43 struct IsTriviallySerializable
<webgl::ExtensionBits
> : std::true_type
{};
45 struct IsTriviallySerializable
<webgl::GetUniformData
> : std::true_type
{};
48 struct IsTriviallySerializable
<mozilla::webgl::PackingInfo
> : std::true_type
{};
51 struct IsTriviallySerializable
<ICRData
> : std::true_type
{};
54 struct IsTriviallySerializable
<gfx::IntSize
> : std::true_type
{};
57 struct IsTriviallySerializable
<avec2
<T
>> : std::true_type
{};
59 struct IsTriviallySerializable
<avec3
<T
>> : std::true_type
{};
62 struct IsTriviallySerializable
<webgl::TexUnpackBlob
> : std::true_type
{};
65 struct IsTriviallySerializable
<webgl::TypedQuad
> : std::true_type
{};
67 struct IsTriviallySerializable
<webgl::VertAttribPointerDesc
> : std::true_type
{
70 struct IsTriviallySerializable
<webgl::ReadPixelsDesc
> : std::true_type
{};
72 struct IsTriviallySerializable
<layers::SurfaceDescriptor
> : std::true_type
{};
75 struct QueueParamTraits
<RawBuffer
<T
>> {
76 using ParamType
= RawBuffer
<T
>;
79 static QueueStatus
Write(ProducerView
<U
>& view
, const ParamType
& in
) {
80 const auto& elemCount
= in
.size();
81 auto status
= view
.WriteParam(elemCount
);
82 if (!status
) return status
;
83 if (!elemCount
) return status
;
85 const auto& begin
= in
.begin();
86 const bool hasData
= static_cast<bool>(begin
);
87 status
= view
.WriteParam(hasData
);
88 if (!status
) return status
;
89 if (!hasData
) return status
;
91 status
= view
.WriteFromRange(in
.Data());
96 static QueueStatus
Read(ConsumerView
<U
>& view
, ParamType
* const out
) {
98 auto status
= view
.ReadParam(&elemCount
);
99 if (!status
) return status
;
102 return QueueStatus::kSuccess
;
106 status
= view
.ReadParam(&hasData
);
107 if (!status
) return status
;
109 auto temp
= RawBuffer
<T
>{elemCount
};
110 *out
= std::move(temp
);
111 return QueueStatus::kSuccess
;
114 auto data
= view
.template ReadRange
<T
>(elemCount
);
115 if (!data
) return QueueStatus::kTooSmall
;
116 *out
= std::move(RawBuffer
<T
>{*data
});
117 return QueueStatus::kSuccess
;
122 struct QueueParamTraits
<webgl::ContextLossReason
>
123 : public ContiguousEnumSerializerInclusive
<
124 webgl::ContextLossReason
, webgl::ContextLossReason::None
,
125 webgl::ContextLossReason::Guilty
> {};
127 template <typename V
, typename E
>
128 struct QueueParamTraits
<Result
<V
, E
>> {
129 using T
= Result
<V
, E
>;
131 template <typename U
>
132 static QueueStatus
Write(ProducerView
<U
>& aProducerView
, const T
& aArg
) {
133 const auto ok
= aArg
.isOk();
134 auto status
= aProducerView
.WriteParam(ok
);
135 if (!status
) return status
;
137 status
= aProducerView
.WriteParam(aArg
.unwrap());
139 status
= aProducerView
.WriteParam(aArg
.unwrapErr());
144 template <typename U
>
145 static QueueStatus
Read(ConsumerView
<U
>& aConsumerView
, T
* aArg
) {
147 auto status
= aConsumerView
.ReadParam(&ok
);
148 if (!status
) return status
;
151 status
= aConsumerView
.ReadParam(&val
);
155 status
= aConsumerView
.ReadParam(&val
);
163 struct QueueParamTraits
<std::string
> {
164 using T
= std::string
;
166 template <typename U
>
167 static QueueStatus
Write(ProducerView
<U
>& aProducerView
, const T
& aArg
) {
168 const auto size
= aArg
.size();
169 auto status
= aProducerView
.WriteParam(size
);
170 if (!status
) return status
;
171 status
= aProducerView
.WriteFromRange(Range
<const char>{aArg
.data(), size
});
175 template <typename U
>
176 static QueueStatus
Read(ConsumerView
<U
>& aConsumerView
, T
* aArg
) {
178 auto status
= aConsumerView
.ReadParam(&size
);
179 if (!status
) return status
;
181 const auto view
= aConsumerView
.template ReadRange
<char>(size
);
182 if (!view
) return QueueStatus::kFatalError
;
183 aArg
->assign(view
->begin().get(), size
);
188 template <typename U
>
189 struct QueueParamTraits
<std::vector
<U
>> {
190 using T
= std::vector
<U
>;
192 template <typename V
>
193 static QueueStatus
Write(ProducerView
<V
>& aProducerView
, const T
& aArg
) {
194 auto status
= aProducerView
.WriteParam(aArg
.size());
195 if (!status
) return status
;
197 for (const auto& cur
: aArg
) {
198 status
= aProducerView
.WriteParam(cur
);
199 if (!status
) return status
;
204 template <typename V
>
205 static QueueStatus
Read(ConsumerView
<V
>& aConsumerView
, T
* aArg
) {
207 auto status
= aConsumerView
.ReadParam(&size
);
208 if (!status
) return status
;
211 for (auto& cur
: *aArg
) {
212 status
= aConsumerView
.ReadParam(&cur
);
213 if (!status
) return status
;
220 struct QueueParamTraits
<WebGLExtensionID
>
221 : public ContiguousEnumSerializer
<WebGLExtensionID
,
222 WebGLExtensionID::ANGLE_instanced_arrays
,
223 WebGLExtensionID::Max
> {};
226 struct QueueParamTraits
<CompileResult
> {
227 using T
= CompileResult
;
229 template <typename U
>
230 static QueueStatus
Write(ProducerView
<U
>& aProducerView
, const T
& aArg
) {
231 aProducerView
.WriteParam(aArg
.pending
);
232 aProducerView
.WriteParam(aArg
.log
);
233 aProducerView
.WriteParam(aArg
.translatedSource
);
234 return aProducerView
.WriteParam(aArg
.success
);
237 template <typename U
>
238 static QueueStatus
Read(ConsumerView
<U
>& aConsumerView
, T
* aArg
) {
239 aConsumerView
.ReadParam(&aArg
->pending
);
240 aConsumerView
.ReadParam(&aArg
->log
);
241 aConsumerView
.ReadParam(&aArg
->translatedSource
);
242 return aConsumerView
.ReadParam(&aArg
->success
);
247 struct QueueParamTraits
<mozilla::layers::TextureType
>
248 : public ContiguousEnumSerializer
<mozilla::layers::TextureType
,
249 mozilla::layers::TextureType::Unknown
,
250 mozilla::layers::TextureType::Last
> {};
253 struct QueueParamTraits
<mozilla::gfx::SurfaceFormat
>
254 : public ContiguousEnumSerializerInclusive
<
255 mozilla::gfx::SurfaceFormat
, mozilla::gfx::SurfaceFormat::B8G8R8A8
,
256 mozilla::gfx::SurfaceFormat::UNKNOWN
> {};
259 struct QueueParamTraits
<gfxAlphaType
>
260 : public ContiguousEnumSerializerInclusive
<
261 gfxAlphaType
, gfxAlphaType::Opaque
, gfxAlphaType::NonPremult
> {};
264 } // namespace mozilla
266 #endif // WEBGLQUEUEPARAMTRAITS_H_