// Copyright 2018 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/Commands.h" #include "dawn_native/BindGroup.h" #include "dawn_native/Buffer.h" #include "dawn_native/CommandAllocator.h" #include "dawn_native/ComputePipeline.h" #include "dawn_native/RenderPipeline.h" #include "dawn_native/Texture.h" namespace dawn_native { void FreeCommands(CommandIterator* commands) { commands->Reset(); Command type; while (commands->NextCommandId(&type)) { switch (type) { case Command::BeginComputePass: { BeginComputePassCmd* begin = commands->NextCommand(); begin->~BeginComputePassCmd(); } break; case Command::BeginRenderPass: { BeginRenderPassCmd* begin = commands->NextCommand(); begin->~BeginRenderPassCmd(); } break; case Command::CopyBufferToBuffer: { CopyBufferToBufferCmd* copy = commands->NextCommand(); copy->~CopyBufferToBufferCmd(); } break; case Command::CopyBufferToTexture: { CopyBufferToTextureCmd* copy = commands->NextCommand(); copy->~CopyBufferToTextureCmd(); } break; case Command::CopyTextureToBuffer: { CopyTextureToBufferCmd* copy = commands->NextCommand(); copy->~CopyTextureToBufferCmd(); } break; case Command::Dispatch: { DispatchCmd* dispatch = commands->NextCommand(); dispatch->~DispatchCmd(); } break; case Command::Draw: { DrawCmd* draw = commands->NextCommand(); draw->~DrawCmd(); } break; case Command::DrawIndexed: { DrawIndexedCmd* draw = commands->NextCommand(); draw->~DrawIndexedCmd(); } break; case Command::EndComputePass: { EndComputePassCmd* cmd = commands->NextCommand(); cmd->~EndComputePassCmd(); } break; case Command::EndRenderPass: { EndRenderPassCmd* cmd = commands->NextCommand(); cmd->~EndRenderPassCmd(); } break; case Command::InsertDebugMarker: { InsertDebugMarkerCmd* cmd = commands->NextCommand(); commands->NextData(cmd->length + 1); cmd->~InsertDebugMarkerCmd(); } break; case Command::PopDebugGroup: { PopDebugGroupCmd* cmd = commands->NextCommand(); cmd->~PopDebugGroupCmd(); } break; case Command::PushDebugGroup: { PushDebugGroupCmd* cmd = commands->NextCommand(); commands->NextData(cmd->length + 1); cmd->~PushDebugGroupCmd(); } break; case Command::SetComputePipeline: { SetComputePipelineCmd* cmd = commands->NextCommand(); cmd->~SetComputePipelineCmd(); } break; case Command::SetRenderPipeline: { SetRenderPipelineCmd* cmd = commands->NextCommand(); cmd->~SetRenderPipelineCmd(); } break; case Command::SetPushConstants: { SetPushConstantsCmd* cmd = commands->NextCommand(); commands->NextData(cmd->count); cmd->~SetPushConstantsCmd(); } break; case Command::SetStencilReference: { SetStencilReferenceCmd* cmd = commands->NextCommand(); cmd->~SetStencilReferenceCmd(); } break; case Command::SetScissorRect: { SetScissorRectCmd* cmd = commands->NextCommand(); cmd->~SetScissorRectCmd(); } break; case Command::SetBlendColor: { SetBlendColorCmd* cmd = commands->NextCommand(); cmd->~SetBlendColorCmd(); } break; case Command::SetBindGroup: { SetBindGroupCmd* cmd = commands->NextCommand(); cmd->~SetBindGroupCmd(); } break; case Command::SetIndexBuffer: { SetIndexBufferCmd* cmd = commands->NextCommand(); cmd->~SetIndexBufferCmd(); } break; case Command::SetVertexBuffers: { SetVertexBuffersCmd* cmd = commands->NextCommand(); auto buffers = commands->NextData>(cmd->count); for (size_t i = 0; i < cmd->count; ++i) { (&buffers[i])->~Ref(); } commands->NextData(cmd->count); cmd->~SetVertexBuffersCmd(); } break; } } commands->DataWasDestroyed(); } void SkipCommand(CommandIterator* commands, Command type) { switch (type) { case Command::BeginComputePass: commands->NextCommand(); break; case Command::BeginRenderPass: commands->NextCommand(); break; case Command::CopyBufferToBuffer: commands->NextCommand(); break; case Command::CopyBufferToTexture: commands->NextCommand(); break; case Command::CopyTextureToBuffer: commands->NextCommand(); break; case Command::Dispatch: commands->NextCommand(); break; case Command::Draw: commands->NextCommand(); break; case Command::DrawIndexed: commands->NextCommand(); break; case Command::EndComputePass: commands->NextCommand(); break; case Command::EndRenderPass: commands->NextCommand(); break; case Command::InsertDebugMarker: { InsertDebugMarkerCmd* cmd = commands->NextCommand(); commands->NextData(cmd->length + 1); } break; case Command::PopDebugGroup: commands->NextCommand(); break; case Command::PushDebugGroup: { PushDebugGroupCmd* cmd = commands->NextCommand(); commands->NextData(cmd->length + 1); } break; case Command::SetComputePipeline: commands->NextCommand(); break; case Command::SetRenderPipeline: commands->NextCommand(); break; case Command::SetPushConstants: { auto* cmd = commands->NextCommand(); commands->NextData(cmd->count); } break; case Command::SetStencilReference: commands->NextCommand(); break; case Command::SetScissorRect: commands->NextCommand(); break; case Command::SetBlendColor: commands->NextCommand(); break; case Command::SetBindGroup: commands->NextCommand(); break; case Command::SetIndexBuffer: commands->NextCommand(); break; case Command::SetVertexBuffers: { auto* cmd = commands->NextCommand(); commands->NextData>(cmd->count); commands->NextData(cmd->count); } break; } } } // namespace dawn_native