blob: b0b065b64954ef27adde20a0f9a04115ad9307f9 [file] [log] [blame]
// Copyright 2025 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef SRC_DAWN_SERIALIZATION_SCHEMA_H_
#define SRC_DAWN_SERIALIZATION_SCHEMA_H_
#include <array>
#include <cstdint>
#include <string>
#include <vector>
namespace schema {
// NOTE: This file must be included after files that define
// DAWN_REPLAY_SERIALIZABLE and DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA.
// Those macro are different for serialization and deserialization.
// TODO(crbug.com/413053623): Switch to protobufs or json. This is just to get
// stuff working. We'll switch to something else once we're sure of the data we
// want to capture.
using ObjectId = uint64_t;
// device is always 1
const ObjectId kDeviceId = 1;
// Use alias of std::array since the preprocessor doesn't consider < > to be parenthesis for the
// logic of skipping commas (so the end up splitting macro invocation arguments).
using FloatArray7 = std::array<float, 7>;
using Mat3x3 = std::array<float, 9>;
using Mat4x3 = std::array<float, 12>;
#define DAWN_REPLAY_ENUM_MEMBER(NAME) NAME,
#define DAWN_REPLAY_ENUM(NAME, MEMBERS) \
enum class NAME : uint32_t { MEMBERS(DAWN_REPLAY_ENUM_MEMBER) };
#define DAWN_REPLAY_ENUM_WITH_INVALID(NAME, MEMBERS) \
enum class NAME : uint32_t { Invalid = 0, MEMBERS(DAWN_REPLAY_ENUM_MEMBER) };
#define DAWN_REPLAY_OBJECT_TYPES(X) \
X(BindGroup) \
X(BindGroupLayout) \
X(Buffer) \
X(CommandBuffer) \
X(ComputePipeline) \
X(Device) \
X(ExternalTexture) \
X(PipelineLayout) \
X(QuerySet) \
X(RenderBundle) \
X(RenderPipeline) \
X(Sampler) \
X(ShaderModule) \
X(Texture) \
X(TexelBufferView) \
X(TextureView)
#define DAWN_REPLAY_OBJECT_TYPES_ENUM(X) X(ObjectType, DAWN_REPLAY_OBJECT_TYPES)
DAWN_REPLAY_OBJECT_TYPES_ENUM(DAWN_REPLAY_ENUM_WITH_INVALID)
#define DAWN_REPLAY_BINDING_GROUP_LAYOUT_ENTRY_TYPES(X) \
X(BufferBinding) \
X(SamplerBinding) \
X(TextureBinding) \
X(TexelBufferBinding) \
X(StorageTextureBinding) \
X(ExternalTextureBinding) \
X(StaticSamplerBindingInfo) \
X(InputAttachmentBindingInfo)
#define DAWN_REPLAY_BINDING_GROUP_LAYOUT_ENTRY_TYPES_ENUM(X) \
X(BindGroupLayoutEntryType, DAWN_REPLAY_BINDING_GROUP_LAYOUT_ENTRY_TYPES)
DAWN_REPLAY_BINDING_GROUP_LAYOUT_ENTRY_TYPES_ENUM(DAWN_REPLAY_ENUM_WITH_INVALID)
#define DAWN_REPLAY_COMMAND_BUFFER_COMMANDS(X) \
X(BeginComputePass) \
X(BeginOcclusionQuery) \
X(BeginRenderPass) \
X(ClearBuffer) \
X(CopyBufferToBuffer) \
X(CopyBufferToTexture) \
X(CopyTextureToBuffer) \
X(CopyTextureToTexture) \
X(Dispatch) \
X(DispatchIndirect) \
X(Draw) \
X(DrawIndexed) \
X(DrawIndexedIndirect) \
X(DrawIndirect) \
X(End) \
X(EndOcclusionQuery) \
X(EndRenderPass) \
X(ExecuteBundles) \
X(InsertDebugMarker) \
X(PopDebugGroup) \
X(PushDebugGroup) \
X(ResolveQuerySet) \
X(SetBindGroup) \
X(SetBlendConstant) \
X(SetComputePipeline) \
X(SetImmediates) \
X(SetIndexBuffer) \
X(SetRenderPipeline) \
X(SetScissorRect) \
X(SetStencilReference) \
X(SetVertexBuffer) \
X(SetViewport) \
X(WriteBuffer) \
X(WriteTimestamp)
#define DAWN_REPLAY_SHARED_PASS_COMMANDS(X) \
X(SetBindGroup) \
X(SetImmediates)
#define DAWN_REPLAY_DEBUG_COMMANDS(X) \
X(PushDebugGroup) \
X(InsertDebugMarker) \
X(PopDebugGroup)
#define DAWN_REPLAY_RENDER_COMMANDS(X) \
X(SetRenderPipeline) \
X(SetVertexBuffer) \
X(SetIndexBuffer) \
X(Draw) \
X(DrawIndexed) \
X(DrawIndirect) \
X(DrawIndexedIndirect) \
DAWN_REPLAY_SHARED_PASS_COMMANDS(X) \
DAWN_REPLAY_DEBUG_COMMANDS(X)
#define DAWN_REPLAY_RENDER_BUNDLE_COMMANDS(X) \
DAWN_REPLAY_RENDER_COMMANDS(X) \
X(End)
#define DAWN_REPLAY_COMPUTE_PASS_COMMANDS(X) \
X(SetComputePipeline) \
X(Dispatch) \
X(DispatchIndirect) \
X(WriteTimestamp) \
DAWN_REPLAY_SHARED_PASS_COMMANDS(X) \
DAWN_REPLAY_DEBUG_COMMANDS(X) \
X(End)
#define DAWN_REPLAY_RENDER_PASS_COMMANDS(X) \
X(ExecuteBundles) \
X(BeginOcclusionQuery) \
X(EndOcclusionQuery) \
X(SetBlendConstant) \
X(SetScissorRect) \
X(SetStencilReference) \
X(SetViewport) \
X(WriteTimestamp) \
DAWN_REPLAY_RENDER_COMMANDS(X) \
X(End)
#define DAWN_REPLAY_ENCODER_CREATION_COMMANDS(X) \
X(BeginComputePass) \
X(BeginRenderPass)
#define DAWN_REPLAY_ENCODER_NON_CREATION_COMMANDS(X) \
X(ClearBuffer) \
X(CopyBufferToBuffer) \
X(CopyBufferToTexture) \
X(CopyTextureToBuffer) \
X(CopyTextureToTexture) \
X(ResolveQuerySet) \
X(WriteBuffer) \
X(WriteTimestamp) \
DAWN_REPLAY_DEBUG_COMMANDS(X) \
X(End)
#define DAWN_REPLAY_ENCODER_COMMANDS(X) \
DAWN_REPLAY_ENCODER_CREATION_COMMANDS(X) \
DAWN_REPLAY_ENCODER_NON_CREATION_COMMANDS(X)
#define DAWN_REPLAY_COMMAND_BUFFER_COMMANDS_ENUM(X) \
X(CommandBufferCommand, DAWN_REPLAY_COMMAND_BUFFER_COMMANDS)
DAWN_REPLAY_COMMAND_BUFFER_COMMANDS_ENUM(DAWN_REPLAY_ENUM_WITH_INVALID)
#define DAWN_REPLAY_EXPAND_RESOLVE_MODES(X) \
X(Unused) \
X(Disabled) \
X(Enabled)
#define DAWN_REPLAY_EXPAND_RESOLVE_MODES_ENUM(X) \
X(ExpandResolveMode, DAWN_REPLAY_EXPAND_RESOLVE_MODES)
DAWN_REPLAY_EXPAND_RESOLVE_MODES_ENUM(DAWN_REPLAY_ENUM)
#define DAWN_REPLAY_ROOT_COMMANDS(X) \
X(CreateResource) \
X(QueueSubmit) \
X(WriteBuffer) \
X(WriteTexture) \
X(SetLabel) \
X(InitTexture) \
X(End)
#define DAWN_REPLAY_ROOT_COMMANDS_ENUM(X) X(RootCommand, DAWN_REPLAY_ROOT_COMMANDS)
DAWN_REPLAY_ROOT_COMMANDS_ENUM(DAWN_REPLAY_ENUM_WITH_INVALID)
#undef DAWN_REPLAY_ENUM
#undef DAWN_REPLAY_GET_X_MACRO
#undef DAWN_REPLAY_ENUM_DEfAULT_MEMBER
#undef DAWN_REPLAY_ENUM_VALUE_MEMBER
#undef DAWN_REPLAY_ENUM_MEMBER
#define ORIGIN3D_MEMBER(X) \
X(uint32_t, x) \
X(uint32_t, y) \
X(uint32_t, z)
DAWN_REPLAY_SERIALIZABLE(struct, Origin3D, ORIGIN3D_MEMBER){};
#define ORIGIN2D_MEMBER(X) \
X(uint32_t, x) \
X(uint32_t, y)
DAWN_REPLAY_SERIALIZABLE(struct, Origin2D, ORIGIN2D_MEMBER){};
#define EXTENT3D_MEMBER(X) \
X(uint32_t, width) \
X(uint32_t, height) \
X(uint32_t, depthOrArrayLayers)
DAWN_REPLAY_SERIALIZABLE(struct, Extent3D, EXTENT3D_MEMBER){};
#define EXTENT2D_MEMBER(X) \
X(uint32_t, width) \
X(uint32_t, height)
DAWN_REPLAY_SERIALIZABLE(struct, Extent2D, EXTENT2D_MEMBER){};
#define COLOR_MEMBER(X) \
X(double, r) \
X(double, g) \
X(double, b) \
X(double, a)
DAWN_REPLAY_SERIALIZABLE(struct, Color, COLOR_MEMBER){};
#define TEXTURE_COMPONENT_SWIZZLE_MEMBER(X) \
X(wgpu::ComponentSwizzle, r) \
X(wgpu::ComponentSwizzle, g) \
X(wgpu::ComponentSwizzle, b) \
X(wgpu::ComponentSwizzle, a)
DAWN_REPLAY_SERIALIZABLE(struct, TextureComponentSwizzle, TEXTURE_COMPONENT_SWIZZLE_MEMBER){};
#define PIPELINE_CONSTANT_MEMBER(X) \
X(std::string, name) \
X(double, value)
DAWN_REPLAY_SERIALIZABLE(struct, PipelineConstant, PIPELINE_CONSTANT_MEMBER){};
#define PROGRAMMABLE_STAGE_MEMBER(X) \
X(ObjectId, moduleId) \
X(std::string, entryPoint) \
X(std::vector<PipelineConstant>, constants)
DAWN_REPLAY_SERIALIZABLE(struct, ProgrammableStage, PROGRAMMABLE_STAGE_MEMBER){};
#define VERTEX_ATTRIBUTE_MEMBER(X) \
X(wgpu::VertexFormat, format) \
X(uint64_t, offset) \
X(uint32_t, shaderLocation)
DAWN_REPLAY_SERIALIZABLE(struct, VertexAttribute, VERTEX_ATTRIBUTE_MEMBER){};
#define VERTEX_BUFFER_LAYOUT_MEMBER(X) \
X(uint64_t, arrayStride) \
X(wgpu::VertexStepMode, stepMode) \
X(std::vector<VertexAttribute>, attributes)
DAWN_REPLAY_SERIALIZABLE(struct, VertexBufferLayout, VERTEX_BUFFER_LAYOUT_MEMBER){};
#define VERTEX_STATE_MEMBER(X) \
X(ProgrammableStage, program) \
X(std::vector<VertexBufferLayout>, buffers)
DAWN_REPLAY_SERIALIZABLE(struct, VertexState, VERTEX_STATE_MEMBER){};
#define PRIMITIVE_STATE_MEMBER(X) \
X(wgpu::PrimitiveTopology, topology) \
X(wgpu::IndexFormat, stripIndexFormat) \
X(wgpu::FrontFace, frontFace) \
X(wgpu::CullMode, cullMode) \
X(bool, unclippedDepth)
DAWN_REPLAY_SERIALIZABLE(struct, PrimitiveState, PRIMITIVE_STATE_MEMBER){};
#define STENCIL_FACE_STATE_MEMBER(X) \
X(wgpu::CompareFunction, compare) \
X(wgpu::StencilOperation, failOp) \
X(wgpu::StencilOperation, depthFailOp) \
X(wgpu::StencilOperation, passOp)
DAWN_REPLAY_SERIALIZABLE(struct, StencilFaceState, STENCIL_FACE_STATE_MEMBER){};
#define DEPTH_STENCIL_STATE_MEMBER(X) \
X(wgpu::TextureFormat, format) \
X(bool, depthWriteEnabled) \
X(wgpu::CompareFunction, depthCompare) \
X(StencilFaceState, stencilFront) \
X(StencilFaceState, stencilBack) \
X(uint32_t, stencilReadMask) \
X(uint32_t, stencilWriteMask) \
X(int32_t, depthBias) \
X(float, depthBiasSlopeScale) \
X(float, depthBiasClamp)
DAWN_REPLAY_SERIALIZABLE(struct, DepthStencilState, DEPTH_STENCIL_STATE_MEMBER){};
#define MULTISAMPLE_STATE_MEMBER(X) \
X(uint32_t, count) \
X(uint32_t, mask) \
X(bool, alphaToCoverageEnabled)
DAWN_REPLAY_SERIALIZABLE(struct, MultisampleState, MULTISAMPLE_STATE_MEMBER){};
#define BLEND_COMPONENT_MEMBER(X) \
X(wgpu::BlendOperation, operation) \
X(wgpu::BlendFactor, srcFactor) \
X(wgpu::BlendFactor, dstFactor)
DAWN_REPLAY_SERIALIZABLE(struct, BlendComponent, BLEND_COMPONENT_MEMBER){};
#define BLEND_STATE_MEMBER(X) \
X(BlendComponent, color) \
X(BlendComponent, alpha)
DAWN_REPLAY_SERIALIZABLE(struct, BlendState, BLEND_STATE_MEMBER){};
#define COLOR_TARGET_STATE_MEMBER(X) \
X(wgpu::TextureFormat, format) \
X(BlendState, blend) \
X(wgpu::ColorWriteMask, writeMask) \
X(ExpandResolveMode, expandResolveMode)
DAWN_REPLAY_SERIALIZABLE(struct, ColorTargetState, COLOR_TARGET_STATE_MEMBER){};
#define FRAGMENT_STATE_MEMBER(X) \
X(ProgrammableStage, program) \
X(std::vector<ColorTargetState>, targets)
DAWN_REPLAY_SERIALIZABLE(struct, FragmentState, FRAGMENT_STATE_MEMBER){};
#define BIND_GROUP_LAYOUT_BINDING_MEMBER(X) \
X(uint32_t, binding) \
X(wgpu::ShaderStage, visibility) \
X(uint32_t, bindingArraySize)
DAWN_REPLAY_SERIALIZABLE(struct, BindGroupLayoutBinding, BIND_GROUP_LAYOUT_BINDING_MEMBER){};
#define BUFFER_BIND_GROUP_LAYOUT_MEMBER(X) \
X(wgpu::BufferBindingType, type) \
X(uint64_t, minBindingSize) \
X(bool, hasDynamicOffset)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(BufferBinding, BUFFER_BIND_GROUP_LAYOUT_MEMBER){};
#define SAMPLER_BIND_GROUP_LAYOUT_MEMBER(X) X(wgpu::SamplerBindingType, type)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(SamplerBinding, SAMPLER_BIND_GROUP_LAYOUT_MEMBER){};
#define STORAGE_TEXTURE_BIND_GROUP_LAYOUT_MEMBER(X) \
X(wgpu::TextureFormat, format) \
X(wgpu::TextureViewDimension, viewDimension) \
X(wgpu::StorageTextureAccess, access)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(StorageTextureBinding,
STORAGE_TEXTURE_BIND_GROUP_LAYOUT_MEMBER){};
#define TEXTURE_BIND_GROUP_LAYOUT_MEMBER(X) \
X(wgpu::TextureSampleType, sampleType) \
X(wgpu::TextureViewDimension, viewDimension) \
X(bool, multisampled)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(TextureBinding, TEXTURE_BIND_GROUP_LAYOUT_MEMBER){};
#define TEXEL_BUFFER_BIND_GROUP_LAYOUT_MEMBER(X)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(TexelBufferBinding,
TEXEL_BUFFER_BIND_GROUP_LAYOUT_MEMBER){};
#define EXTERNAL_TEXTURE_BIND_GROUP_LAYOUT_MEMBER(X)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(ExternalTextureBinding,
EXTERNAL_TEXTURE_BIND_GROUP_LAYOUT_MEMBER){};
#define STATIC_SAMPLER_BIND_GROUP_LAYOUT_MEMBER(X)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(StaticSamplerBindingInfo,
STATIC_SAMPLER_BIND_GROUP_LAYOUT_MEMBER){};
#define INPUT_ATTACHMENT_BIND_GROUP_LAYOUT_MEMBER(X)
DAWN_REPLAY_MAKE_BINDGROUP_LAYOUT_VARIANT(InputAttachmentBindingInfo,
INPUT_ATTACHMENT_BIND_GROUP_LAYOUT_MEMBER){};
#define BIND_GROUP_LAYOUT_MEMBER(X) X(uint32_t, numEntries)
DAWN_REPLAY_SERIALIZABLE(struct, BindGroupLayout, BIND_GROUP_LAYOUT_MEMBER){};
#define PIPELINE_LAYOUT_MEMBER(X) \
X(std::vector<ObjectId>, bindGroupLayoutIds) \
X(uint32_t, immediateSize)
DAWN_REPLAY_SERIALIZABLE(struct, PipelineLayout, PIPELINE_LAYOUT_MEMBER){};
#define BUFFER_CREATION_MEMBER(X) \
X(uint64_t, size) \
X(wgpu::BufferUsage, usage)
DAWN_REPLAY_SERIALIZABLE(struct, Buffer, BUFFER_CREATION_MEMBER){};
#define SAMPLER_CREATION_MEMBER(X) \
X(wgpu::AddressMode, addressModeU) \
X(wgpu::AddressMode, addressModeV) \
X(wgpu::AddressMode, addressModeW) \
X(wgpu::FilterMode, magFilter) \
X(wgpu::FilterMode, minFilter) \
X(wgpu::MipmapFilterMode, mipmapFilter) \
X(float, lodMinClamp) \
X(float, lodMaxClamp) \
X(wgpu::CompareFunction, compare) \
X(uint16_t, maxAnisotropy)
DAWN_REPLAY_SERIALIZABLE(struct, Sampler, SAMPLER_CREATION_MEMBER){};
#define RENDER_BUNDLE_CREATION_MEMBER(X) \
X(std::vector<wgpu::TextureFormat>, colorFormats) \
X(wgpu::TextureFormat, depthStencilFormat) \
X(uint32_t, sampleCount) \
X(bool, depthReadOnly) \
X(bool, stencilReadOnly)
DAWN_REPLAY_SERIALIZABLE(struct, RenderBundle, RENDER_BUNDLE_CREATION_MEMBER){};
#define TEXTURE_CREATION_MEMBER(X) \
X(wgpu::TextureUsage, usage) \
X(wgpu::TextureDimension, dimension) \
X(Extent3D, size) \
X(wgpu::TextureFormat, format) \
X(uint32_t, mipLevelCount) \
X(uint32_t, sampleCount) \
X(std::vector<wgpu::TextureFormat>, viewFormats)
DAWN_REPLAY_SERIALIZABLE(struct, Texture, TEXTURE_CREATION_MEMBER){};
#define TEXTURE_VIEW_CREATION_MEMBER(X) \
X(ObjectId, textureId) \
X(wgpu::TextureFormat, format) \
X(wgpu::TextureViewDimension, dimension) \
X(uint32_t, baseMipLevel) \
X(uint32_t, mipLevelCount) \
X(uint32_t, baseArrayLayer) \
X(uint32_t, arrayLayerCount) \
X(wgpu::TextureAspect, aspect) \
X(wgpu::TextureUsage, usage) \
X(TextureComponentSwizzle, swizzle)
DAWN_REPLAY_SERIALIZABLE(struct, TextureView, TEXTURE_VIEW_CREATION_MEMBER){};
#define TEXEL_BUFFER_VIEW_CREATION_MEMBER(X) \
X(wgpu::TextureFormat, format) \
X(uint64_t, offset) \
X(uint64_t, size)
DAWN_REPLAY_SERIALIZABLE(struct, TexelBufferView, TEXEL_BUFFER_VIEW_CREATION_MEMBER){};
#define QUERYSET_CREATION_MEMBER(X) \
X(wgpu::QueryType, type) \
X(uint32_t, count)
DAWN_REPLAY_SERIALIZABLE(struct, QuerySet, QUERYSET_CREATION_MEMBER){};
#define EXTERNAL_TEXTURE_CREATION_MEMBER(X) \
X(ObjectId, plane0Id) \
X(ObjectId, plane1Id) \
X(Origin2D, cropOrigin) \
X(Extent2D, cropSize) \
X(Extent2D, apparentSize) \
X(bool, doYuvToRgbConversionOnly) \
X(Mat4x3, yuvToRgbConversionMatrix) \
X(FloatArray7, srcTransferFunctionParameters) \
X(FloatArray7, dstTransferFunctionParameters) \
X(Mat3x3, gamutConversionMatrix) \
X(bool, mirrored) \
X(wgpu::ExternalTextureRotation, rotation)
DAWN_REPLAY_SERIALIZABLE(struct, ExternalTexture, EXTERNAL_TEXTURE_CREATION_MEMBER){};
// TODO(452840621): Make this use a chain instead of hard coded to WGSL only and handle other
// chained structs.
#define SHADER_MODULE_CREATION_MEMBER(X) X(std::string, code)
DAWN_REPLAY_SERIALIZABLE(struct, ShaderModule, SHADER_MODULE_CREATION_MEMBER){};
#define COMPUTE_PIPELINE_CREATION_MEMBER(X) \
X(ObjectId, layoutId) \
X(ProgrammableStage, compute)
DAWN_REPLAY_SERIALIZABLE(struct, ComputePipeline, COMPUTE_PIPELINE_CREATION_MEMBER){};
#define RENDER_PIPELINE_CREATION_MEMBER(X) \
X(ObjectId, layoutId) \
X(VertexState, vertex) \
X(PrimitiveState, primitive) \
X(DepthStencilState, depthStencil) \
X(MultisampleState, multisample) \
X(FragmentState, fragment)
DAWN_REPLAY_SERIALIZABLE(struct, RenderPipeline, RENDER_PIPELINE_CREATION_MEMBER){};
#define BUFFER_BIND_GROUP_ENTRY_MEMBER(X) \
X(ObjectId, bufferId) \
X(uint64_t, offset) \
X(uint64_t, size)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(BufferBinding, BUFFER_BIND_GROUP_ENTRY_MEMBER){};
#define SAMPLER_BIND_GROUP_ENTRY_MEMBER(X) X(ObjectId, samplerId)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(SamplerBinding, SAMPLER_BIND_GROUP_ENTRY_MEMBER){};
#define TEXTURE_BIND_GROUP_ENTRY_MEMBER(X) X(ObjectId, textureViewId)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(TextureBinding, TEXTURE_BIND_GROUP_ENTRY_MEMBER){};
#define STORAGE_TEXTURE_BIND_GROUP_ENTRY_MEMBER(X) X(ObjectId, textureViewId)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(StorageTextureBinding,
STORAGE_TEXTURE_BIND_GROUP_ENTRY_MEMBER){};
#define TEXEL_BUFFER_BIND_GROUP_ENTRY_MEMBER(X) X(ObjectId, texelBufferViewId)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(TexelBufferBinding, TEXEL_BUFFER_BIND_GROUP_ENTRY_MEMBER){};
#define INPUT_ATTACHMENTS_BIND_GROUP_ENTRY_MEMBER(X) X(ObjectId, textureViewId)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(InputAttachmentBindingInfo,
INPUT_ATTACHMENTS_BIND_GROUP_ENTRY_MEMBER){};
#define STATIC_SAMPLER_BIND_GROUP_ENTRY_MEMBER(X)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(StaticSamplerBindingInfo,
STATIC_SAMPLER_BIND_GROUP_ENTRY_MEMBER){};
#define EXTERNAL_TEXTURE_BIND_GROUP_ENTRY_MEMBER(X) \
X(ObjectId, externalTextureId) \
X(ObjectId, textureViewId)
DAWN_REPLAY_MAKE_BINDGROUP_VARIANT(ExternalTextureBinding,
EXTERNAL_TEXTURE_BIND_GROUP_ENTRY_MEMBER){};
#define BIND_GROUP_CREATION_MEMBER(X) \
X(ObjectId, layoutId) \
X(uint32_t, numEntries)
DAWN_REPLAY_SERIALIZABLE(struct, BindGroup, BIND_GROUP_CREATION_MEMBER){};
#define LABELED_RESOURCE_MEMBER(X) \
X(ObjectType, type) \
X(ObjectId, id) \
X(std::string, label)
DAWN_REPLAY_SERIALIZABLE(struct, LabeledResource, LABELED_RESOURCE_MEMBER){};
#define TEXEL_COPY_BUFFER_LAYOUT_MEMBER(X) \
X(uint64_t, offset) \
X(uint32_t, bytesPerRow) \
X(uint32_t, rowsPerImage)
DAWN_REPLAY_SERIALIZABLE(struct, TexelCopyBufferLayout, TEXEL_COPY_BUFFER_LAYOUT_MEMBER){};
#define TEXEL_COPY_BUFFER_INFO_MEMBER(X) \
X(ObjectId, bufferId) \
X(TexelCopyBufferLayout, layout)
DAWN_REPLAY_SERIALIZABLE(struct, TexelCopyBufferInfo, TEXEL_COPY_BUFFER_INFO_MEMBER){};
#define TEXEL_COPY_TEXTURE_INFO_MEMBER(X) \
X(ObjectId, textureId) \
X(uint32_t, mipLevel) \
X(Origin3D, origin) \
X(wgpu::TextureAspect, aspect)
DAWN_REPLAY_SERIALIZABLE(struct, TexelCopyTextureInfo, TEXEL_COPY_TEXTURE_INFO_MEMBER){};
#define TIMESTAMP_WRITES_MEMBER(X) \
X(ObjectId, querySetId) \
X(uint32_t, beginningOfPassWriteIndex) \
X(uint32_t, endOfPassWriteIndex)
DAWN_REPLAY_SERIALIZABLE(struct, TimestampWrites, TIMESTAMP_WRITES_MEMBER){};
#define COLOR_ATTACHMENT_MEMBER(X) \
X(ObjectId, viewId) \
X(uint32_t, depthSlice) \
X(ObjectId, resolveTargetId) \
X(wgpu::LoadOp, loadOp) \
X(wgpu::StoreOp, storeOp) \
X(Color, clearValue)
DAWN_REPLAY_SERIALIZABLE(struct, ColorAttachment, COLOR_ATTACHMENT_MEMBER){};
#define RENDER_PASS_DEPTH_STENCIL_ATTACHMENT_MEMBER(X) \
X(ObjectId, viewId) \
X(wgpu::LoadOp, depthLoadOp) \
X(wgpu::StoreOp, depthStoreOp) \
X(float, depthClearValue) \
X(bool, depthReadOnly) \
X(wgpu::LoadOp, stencilLoadOp) \
X(wgpu::StoreOp, stencilStoreOp) \
X(uint32_t, stencilClearValue) \
X(bool, stencilReadOnly)
DAWN_REPLAY_SERIALIZABLE(struct,
RenderPassDepthStencilAttachment,
RENDER_PASS_DEPTH_STENCIL_ATTACHMENT_MEMBER){};
#define RESOLVE_RECT_MEMBER(X) \
X(uint32_t, colorOffsetX) \
X(uint32_t, colorOffsetY) \
X(uint32_t, resolveOffsetX) \
X(uint32_t, resolveOffsetY) \
X(uint32_t, width) \
X(uint32_t, height)
DAWN_REPLAY_SERIALIZABLE(struct, ResolveRect, RESOLVE_RECT_MEMBER){};
#define CREATE_RESOURCE_CMD_DATA_MEMBER(X) X(LabeledResource, resource)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(CreateResource, CREATE_RESOURCE_CMD_DATA_MEMBER){};
#define SET_LABEL_CMD_DATA_MEMBER(X) \
X(ObjectId, id) \
X(ObjectType, type) \
X(std::string, label)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(SetLabel, SET_LABEL_CMD_DATA_MEMBER){};
#define WRITE_BUFFER_CMD_DATA_MEMBER(X) \
X(ObjectId, bufferId) \
X(uint64_t, bufferOffset) \
X(uint64_t, size)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(WriteBuffer, WRITE_BUFFER_CMD_DATA_MEMBER){};
#define WRITE_TEXTURE_CMD_DATA_MEMBER(X) \
X(TexelCopyTextureInfo, destination) \
X(TexelCopyBufferLayout, layout) \
X(Extent3D, size) \
X(uint64_t, dataSize)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(WriteTexture, WRITE_TEXTURE_CMD_DATA_MEMBER){};
#define INIT_TEXTURE_CMD_DATA_MEMBER(X) \
X(TexelCopyTextureInfo, destination) \
X(TexelCopyBufferLayout, layout) \
X(Extent3D, size) \
X(uint64_t, dataSize)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(InitTexture, INIT_TEXTURE_CMD_DATA_MEMBER){};
#define QUEUE_SUBMIT_CMD_DATA_MEMBER(X) X(std::vector<ObjectId>, commandBuffers)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(QueueSubmit, QUEUE_SUBMIT_CMD_DATA_MEMBER){};
#define END_ROOT_CMD_DATA_MEMBER(X)
DAWN_REPLAY_MAKE_ROOT_CMD_AND_CMD_DATA(End, END_ROOT_CMD_DATA_MEMBER){};
#define COPY_BUFFER_TO_BUFFER_CMD_DATA_MEMBER(X) \
X(ObjectId, srcBufferId) \
X(uint64_t, srcOffset) \
X(ObjectId, dstBufferId) \
X(uint64_t, dstOffset) \
X(uint64_t, size)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(CopyBufferToBuffer,
COPY_BUFFER_TO_BUFFER_CMD_DATA_MEMBER){};
#define COPY_BUFFER_TO_TEXTURE_CMD_DATA_MEMBER(X) \
X(TexelCopyBufferInfo, source) \
X(TexelCopyTextureInfo, destination) \
X(Extent3D, copySize)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(CopyBufferToTexture,
COPY_BUFFER_TO_TEXTURE_CMD_DATA_MEMBER){};
#define COPY_TEXTURE_TO_BUFFER_CMD_DATA_MEMBER(X) \
X(TexelCopyTextureInfo, source) \
X(TexelCopyBufferInfo, destination) \
X(Extent3D, copySize)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(CopyTextureToBuffer,
COPY_TEXTURE_TO_BUFFER_CMD_DATA_MEMBER){};
#define COPY_TEXTURE_TO_TEXTURE_CMD_DATA_MEMBER(X) \
X(TexelCopyTextureInfo, source) \
X(TexelCopyTextureInfo, destination) \
X(Extent3D, copySize)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(CopyTextureToTexture,
COPY_TEXTURE_TO_TEXTURE_CMD_DATA_MEMBER){};
#define WRITE_BUFFER_CMD_ENCODER_DATA_MEMBER(X) \
X(ObjectId, bufferId) \
X(uint64_t, bufferOffset) \
X(std::vector<uint8_t>, data)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(WriteBuffer,
WRITE_BUFFER_CMD_ENCODER_DATA_MEMBER){};
#define BEGIN_COMPUTE_PASS_CMD_DATA_MEMBER(X) \
X(std::string, label) \
X(TimestampWrites, timestampWrites)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(BeginComputePass,
BEGIN_COMPUTE_PASS_CMD_DATA_MEMBER){};
#define BEGIN_RENDER_PASS_CMD_DATA_MEMBER(X) \
X(std::string, label) \
X(std::vector<ColorAttachment>, colorAttachments) \
X(RenderPassDepthStencilAttachment, depthStencilAttachment) \
X(ObjectId, occlusionQuerySetId) \
X(TimestampWrites, timestampWrites) \
X(uint64_t, maxDrawCount) \
X(ResolveRect, resolveRect)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(BeginRenderPass,
BEGIN_RENDER_PASS_CMD_DATA_MEMBER){};
#define RESOLVE_QUERYSET_CMD_DATA_MEMBER(X) \
X(ObjectId, querySetId) \
X(uint32_t, firstQuery) \
X(uint32_t, queryCount) \
X(ObjectId, destinationId) \
X(uint64_t, destinationOffset)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(ResolveQuerySet,
RESOLVE_QUERYSET_CMD_DATA_MEMBER){};
#define SET_COMPUTE_PIPELINE_CMD_DATA_MEMBER(X) X(ObjectId, pipelineId)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetComputePipeline,
SET_COMPUTE_PIPELINE_CMD_DATA_MEMBER){};
#define SET_BIND_GROUP_CMD_DATA_MEMBER(X) \
X(uint32_t, index) \
X(ObjectId, bindGroupId) \
X(std::vector<uint32_t>, dynamicOffsets)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetBindGroup, SET_BIND_GROUP_CMD_DATA_MEMBER){};
#define SET_IMMEDIATES_CMD_DATA_MEMBER(X) \
X(uint32_t, offset) \
X(std::vector<uint8_t>, data)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetImmediates, SET_IMMEDIATES_CMD_DATA_MEMBER){};
#define SET_CLEAR_BUFFER_CMD_DATA_MEMBER(X) \
X(ObjectId, bufferId) \
X(uint64_t, offset) \
X(uint64_t, size)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(ClearBuffer, SET_CLEAR_BUFFER_CMD_DATA_MEMBER){};
#define DISPATCH_CMD_DATA_MEMBER(X) \
X(uint32_t, x) \
X(uint32_t, y) \
X(uint32_t, z)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(Dispatch, DISPATCH_CMD_DATA_MEMBER){};
#define DISPATCH_INDIRECT_CMD_DATA_MEMBER(X) \
X(ObjectId, bufferId) \
X(uint64_t, offset)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(DispatchIndirect,
DISPATCH_INDIRECT_CMD_DATA_MEMBER){};
#define SET_RENDER_PIPELINE_CMD_DATA_MEMBER(X) X(ObjectId, pipelineId)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetRenderPipeline,
SET_RENDER_PIPELINE_CMD_DATA_MEMBER){};
#define PUSH_DEBUG_GROUP_CMD_DATA_MEMBER(X) X(std::string, groupLabel)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(PushDebugGroup,
PUSH_DEBUG_GROUP_CMD_DATA_MEMBER){};
#define INSERT_DEBUG_MARKER_CMD_DATA_MEMBER(X) X(std::string, markerLabel)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(InsertDebugMarker,
INSERT_DEBUG_MARKER_CMD_DATA_MEMBER){};
#define BEGIN_OCCLUSION_QUERY_CMD_DATA_MEMBER(X) X(uint32_t, queryIndex)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(BeginOcclusionQuery,
BEGIN_OCCLUSION_QUERY_CMD_DATA_MEMBER){};
#define EXECUTE_BUNDLES_CMD_DATA_MEMBER(X) X(std::vector<ObjectId>, bundleIds)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(ExecuteBundles, EXECUTE_BUNDLES_CMD_DATA_MEMBER){};
#define END_CMD_DATA_MEMBER(X)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(End, END_CMD_DATA_MEMBER){};
#define POP_DEBUG_GROUP_CMD_DATA_MEMBER(X)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(PopDebugGroup, POP_DEBUG_GROUP_CMD_DATA_MEMBER){};
#define END_OCCLUSION_QUERY_CMD_DATA_MEMBER(X)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(EndOcclusionQuery,
END_OCCLUSION_QUERY_CMD_DATA_MEMBER){};
#define SET_VERTEX_BUFFER_CMD_DATA_MEMBER(X) \
X(uint32_t, slot) \
X(ObjectId, bufferId) \
X(uint64_t, offset) \
X(uint64_t, size)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetVertexBuffer,
SET_VERTEX_BUFFER_CMD_DATA_MEMBER){};
#define SET_INDEX_BUFFER_CMD_DATA_MEMBER(X) \
X(ObjectId, bufferId) \
X(wgpu::IndexFormat, format) \
X(uint64_t, offset) \
X(uint64_t, size)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetIndexBuffer,
SET_INDEX_BUFFER_CMD_DATA_MEMBER){};
#define SET_BLEND_CONSTANT_CMD_DATA_MEMBER(X) X(Color, color)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetBlendConstant,
SET_BLEND_CONSTANT_CMD_DATA_MEMBER){};
#define SET_SCISSOR_RECT_CMD_DATA_MEMBER(X) \
X(uint32_t, x) \
X(uint32_t, y) \
X(uint32_t, width) \
X(uint32_t, height)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetScissorRect,
SET_SCISSOR_RECT_CMD_DATA_MEMBER){};
#define SET_STENCIL_REFERENCE_CMD_DATA_MEMBER(X) X(uint32_t, reference)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetStencilReference,
SET_STENCIL_REFERENCE_CMD_DATA_MEMBER){};
#define SET_VIEWPORT_CMD_DATA_MEMBER(X) \
X(float, x) \
X(float, y) \
X(float, width) \
X(float, height) \
X(float, minDepth) \
X(float, maxDepth)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(SetViewport, SET_VIEWPORT_CMD_DATA_MEMBER){};
#define DRAW_CMD_DATA_MEMBER(X) \
X(uint32_t, vertexCount) \
X(uint32_t, instanceCount) \
X(uint32_t, firstVertex) \
X(uint32_t, firstInstance)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(Draw, DRAW_CMD_DATA_MEMBER){};
#define DRAW_INDEXED_CMD_DATA_MEMBER(X) \
X(uint32_t, indexCount) \
X(uint32_t, instanceCount) \
X(uint32_t, firstIndex) \
X(int32_t, baseVertex) \
X(uint32_t, firstInstance)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(DrawIndexed, DRAW_INDEXED_CMD_DATA_MEMBER){};
#define DRAW_INDIRECT_CMD_DATA_MEMBER(X) \
X(ObjectId, indirectBufferId) \
X(uint64_t, indirectOffset)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(DrawIndirect, DRAW_INDIRECT_CMD_DATA_MEMBER){};
#define DRAW_INDEXED_INDIRECT_CMD_DATA_MEMBER(X) \
X(ObjectId, indirectBufferId) \
X(uint64_t, indirectOffset)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(DrawIndexedIndirect,
DRAW_INDIRECT_CMD_DATA_MEMBER){};
#define WRITE_TIMESTAMP_CMD_DATA_MEMBER(X) \
X(ObjectId, querySetId) \
X(uint32_t, queryIndex)
DAWN_REPLAY_MAKE_COMMAND_BUFFER_CMD_AND_CMD_DATA(WriteTimestamp, WRITE_TIMESTAMP_CMD_DATA_MEMBER){};
} // namespace schema
#endif // SRC_DAWN_SERIALIZATION_SCHEMA_H_