// 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_UTILS_WGPUHELPERS_H_ #define SRC_DAWN_NATIVE_UTILS_WGPUHELPERS_H_ #include <array> #include <initializer_list> #include <vector> #include "dawn/common/Ref.h" #include "dawn/native/Error.h" #include "dawn/native/UsageValidationMode.h" #include "dawn/native/dawn_platform.h" namespace tint::wgsl { enum class Extension : uint8_t; } namespace dawn::native::utils { ResultOrError<Ref<ShaderModuleBase>> CreateShaderModule( DeviceBase* device, const char* source, const std::vector<tint::wgsl::Extension>& internalExtensions = { … }; ResultOrError<Ref<BufferBase>> CreateBufferFromData(DeviceBase* device, wgpu::BufferUsage usage, const void* data, uint64_t size); template <typename T> ResultOrError<Ref<BufferBase>> CreateBufferFromData(DeviceBase* device, wgpu::BufferUsage usage, std::initializer_list<T> data) { … } ResultOrError<Ref<PipelineLayoutBase>> MakeBasicPipelineLayout( DeviceBase* device, const Ref<BindGroupLayoutBase>& bindGroupLayout); // Helpers to make creating bind group layouts look nicer: // // utils::MakeBindGroupLayout(device, { // {0, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}, // {1, wgpu::ShaderStage::Fragment, wgpu::SamplerBindingType::Filtering}, // {3, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float} // }); struct BindingLayoutEntryInitializationHelper : BindGroupLayoutEntry { … }; ResultOrError<Ref<BindGroupLayoutBase>> MakeBindGroupLayout( DeviceBase* device, std::initializer_list<BindingLayoutEntryInitializationHelper> entriesInitializer, bool allowInternalBinding = false); // Helpers to make creating bind groups look nicer: // // utils::MakeBindGroup(device, layout, { // {0, mySampler}, // {1, myBuffer, offset, size}, // {3, myTextureView} // }); // Structure with one constructor per-type of bindings, so that the initializer_list accepts // bindings with the right type and no extra information. struct BindingInitializationHelper { … }; // This helper is only used inside dawn native. ResultOrError<Ref<BindGroupBase>> MakeBindGroup( DeviceBase* device, const Ref<BindGroupLayoutBase>& layout, std::initializer_list<BindingInitializationHelper> entriesInitializer, UsageValidationMode mode); const char* GetLabelForTrace(const char* label); // Given a std vector, allocate an equivalent array that can be returned in an API's foos/fooCount // pair of fields. The apiData must eventually be freed using FreeApiSeq. template <typename T> void AllocateApiSeqFromStdVector(const T** apiData, size_t* apiSize, const std::vector<T>& vector) { … } // Free an API sequence that was allocated by AllocateApiSeqFromStdVector template <typename T> void FreeApiSeq(T** apiData, size_t* apiSize) { … } // Normalize the label, truncating it at the first null-terminator, if any. std::string_view NormalizeLabel(std::string_view in); std::string_view NormalizeLabel(std::optional<std::string_view> in); } // namespace dawn::native::utils #endif // SRC_DAWN_NATIVE_UTILS_WGPUHELPERS_H_