// Copyright 2017 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_NATIVE_COMMANDALLOCATOR_H_ #define SRC_DAWN_NATIVE_COMMANDALLOCATOR_H_ #include <cstddef> #include <cstdint> #include <limits> #include <memory> #include <string_view> #include <vector> #include "dawn/common/Assert.h" #include "dawn/common/Math.h" #include "dawn/common/NonCopyable.h" #include "partition_alloc/pointers/raw_ptr_exclusion.h" namespace dawn::native { // Allocation for command buffers should be fast. To avoid doing an allocation per command // or to avoid copying commands when reallocing, we use a linear allocator in a growing set // of large memory blocks. We also use this to have the format to be (u32 commandId, command), // so that iteration over the commands is easy. // Usage of the allocator and iterator: // CommandAllocator allocator; // DrawCommand* cmd = allocator.Allocate<DrawCommand>(CommandType::Draw); // // Fill command // // Repeat allocation and filling commands // // CommandIterator commands(allocator); // CommandType type; // while(commands.NextCommandId(&type)) { // switch(type) { // case CommandType::Draw: // DrawCommand* draw = commands.NextCommand<DrawCommand>(); // // Do the draw // break; // // other cases // } // } // Note that you need to extract the commands from the CommandAllocator before destroying it // and must tell the CommandIterator when the allocated commands have been processed for // deletion. // These are the lists of blocks, should not be used directly, only through CommandAllocator // and CommandIterator struct BlockDef { … }; CommandBlocks; namespace detail { constexpr uint32_t kEndOfBlock = …; constexpr uint32_t kAdditionalData = …; } // namespace detail class CommandAllocator; class CommandIterator : public NonCopyable { … }; class CommandAllocator : public NonCopyable { … }; } // namespace dawn::native #endif // SRC_DAWN_NATIVE_COMMANDALLOCATOR_H_