blob: de0f2895add7aad62ffdad73fc186ce3ea695ae6 [file] [log] [blame] [edit]
// Copyright 2022 The Dawn Authors
//
// 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.
#include "dawn/native/stream/Stream.h"
#include "dawn/native/TintUtils.h"
#include "tint/tint.h"
namespace dawn::native {
namespace {
template <typename OBJECT>
void StreamInTintObject(const OBJECT& object, stream::Sink* sink) {
tint::ForeachField(object, [&](auto& field) { StreamIn(sink, field); });
}
} // namespace
// static
template <>
void stream::Stream<tint::Program>::Write(stream::Sink* sink, const tint::Program& p) {
#if TINT_BUILD_WGSL_WRITER
tint::wgsl::writer::Options options{};
StreamIn(sink, tint::wgsl::writer::Generate(&p, options)->wgsl);
#else
// TODO(crbug.com/dawn/1481): We shouldn't need to write back to WGSL if we have a CacheKey
// built from the initial shader module input. Then, we would never need to parse the program
// and write back out to WGSL.
UNREACHABLE();
#endif
}
// static
template <>
void stream::Stream<tint::BindingPoint>::Write(stream::Sink* sink,
const tint::BindingPoint& point) {
StreamInTintObject(point, sink);
}
// static
template <>
MaybeError stream::Stream<tint::BindingPoint>::Read(Source* s, tint::BindingPoint* point) {
DAWN_TRY(StreamOut(s, &point->group));
DAWN_TRY(StreamOut(s, &point->binding));
return {};
}
// static
template <>
void stream::Stream<tint::ExternalTextureOptions::BindingPoints>::Write(
stream::Sink* sink,
const tint::ExternalTextureOptions::BindingPoints& point) {
StreamInTintObject(point, sink);
}
// static
template <>
void stream::Stream<tint::ExternalTextureOptions>::Write(
stream::Sink* sink,
const tint::ExternalTextureOptions& points) {
StreamInTintObject(points, sink);
}
// static
template <>
void stream::Stream<tint::ast::transform::VertexPulling::Config>::Write(
stream::Sink* sink,
const tint::ast::transform::VertexPulling::Config& cfg) {
StreamInTintObject(cfg, sink);
}
// static
template <>
void stream::Stream<tint::ast::transform::SubstituteOverride::Config>::Write(
stream::Sink* sink,
const tint::ast::transform::SubstituteOverride::Config& cfg) {
StreamInTintObject(cfg, sink);
}
// static
template <>
void stream::Stream<tint::OverrideId>::Write(stream::Sink* sink, const tint::OverrideId& id) {
StreamInTintObject(id, sink);
}
// static
template <>
void stream::Stream<tint::ast::transform::VertexBufferLayoutDescriptor>::Write(
stream::Sink* sink,
const tint::ast::transform::VertexBufferLayoutDescriptor& layout) {
StreamInTintObject(layout, sink);
}
// static
template <>
void stream::Stream<tint::ast::transform::VertexAttributeDescriptor>::Write(
stream::Sink* sink,
const tint::ast::transform::VertexAttributeDescriptor& attrib) {
StreamInTintObject(attrib, sink);
}
// static
template <>
void stream::Stream<tint::ArrayLengthFromUniformOptions>::Write(
stream::Sink* sink,
const tint::ArrayLengthFromUniformOptions& options) {
StreamInTintObject(options, sink);
}
// static
template <>
void stream::Stream<tint::TextureBuiltinsFromUniformOptions>::Write(
stream::Sink* sink,
const tint::TextureBuiltinsFromUniformOptions& options) {
StreamInTintObject(options, sink);
}
// static
template <>
void stream::Stream<tint::BindingRemapperOptions>::Write(
stream::Sink* sink,
const tint::BindingRemapperOptions& options) {
StreamInTintObject(options, sink);
}
} // namespace dawn::native