From d21d89be89fe057d7e45bfc68993318577ef8cac Mon Sep 17 00:00:00 2001 From: NALLEIN Date: Tue, 21 Jul 2020 15:11:17 +0800 Subject: [PATCH 01/11] Add ops and some tests --- .../include/webgpu/include/webgpu_cpp.cpp | 1746 ----------------- modules/dnn/src/dnn.cpp | 6 +- modules/dnn/src/layers/concat_layer.cpp | 16 +- modules/dnn/src/layers/convolution_layer.cpp | 69 +- modules/dnn/src/layers/elementwise_layers.cpp | 100 +- modules/dnn/src/layers/lrn_layer.cpp | 13 +- modules/dnn/src/layers/permute_layer.cpp | 12 +- modules/dnn/src/layers/pooling_layer.cpp | 40 +- modules/dnn/src/layers/prior_box_layer.cpp | 15 +- modules/dnn/src/layers/softmax_layer.cpp | 4 +- modules/dnn/src/op_webgpu.cpp | 11 +- modules/dnn/src/op_webgpu.hpp | 8 +- modules/dnn/src/precomp.hpp | 9 +- modules/dnn/src/webgpu/dawn/dawnUtils.cpp | 16 +- modules/dnn/src/webgpu/dawn/dawnUtils.hpp | 9 +- .../dnn/src/webgpu/dawnAPITest/CMakeLists.txt | 12 - .../src/webgpu/dawnAPITest/helloCompute.cpp | 319 --- .../src/webgpu/dawnWrapperTest/CMakeLists.txt | 32 - .../dawnWrapperTest/op_softmax_test.cpp | 35 - modules/dnn/src/webgpu/include/buffer.hpp | 15 +- modules/dnn/src/webgpu/include/op_base.hpp | 16 +- modules/dnn/src/webgpu/include/op_concat.hpp | 48 + modules/dnn/src/webgpu/include/op_conv.hpp | 80 + modules/dnn/src/webgpu/include/op_lrn.hpp | 65 + modules/dnn/src/webgpu/include/op_permute.hpp | 42 + modules/dnn/src/webgpu/include/op_pool.hpp | 63 + .../dnn/src/webgpu/include/op_prior_box.hpp | 59 + modules/dnn/src/webgpu/include/op_relu.hpp | 30 + modules/dnn/src/webgpu/include/op_softmax.hpp | 8 +- modules/dnn/src/webgpu/include/tensor.hpp | 17 +- modules/dnn/src/webgpu/include/wgpucom.hpp | 14 +- modules/dnn/src/webgpu/shader/avg_pool.comp | 70 + .../dnn/src/webgpu/shader/avg_pool_spv.cpp | 208 ++ modules/dnn/src/webgpu/shader/concat.comp | 29 + modules/dnn/src/webgpu/shader/concat_spv.cpp | 83 + modules/dnn/src/webgpu/shader/conv.comp | 75 + modules/dnn/src/webgpu/shader/conv48.comp | 140 ++ modules/dnn/src/webgpu/shader/conv48_spv.cpp | 1286 ++++++++++++ modules/dnn/src/webgpu/shader/conv_spv.cpp | 251 +++ modules/dnn/src/webgpu/shader/dw_conv.comp | 77 + modules/dnn/src/webgpu/shader/dw_conv_spv.cpp | 235 +++ modules/dnn/src/webgpu/shader/lrn.comp | 62 + modules/dnn/src/webgpu/shader/lrn_spv.cpp | 246 +++ modules/dnn/src/webgpu/shader/max_pool.comp | 64 + .../dnn/src/webgpu/shader/max_pool_spv.cpp | 196 ++ modules/dnn/src/webgpu/shader/permute.comp | 42 + modules/dnn/src/webgpu/shader/permute_spv.cpp | 109 + modules/dnn/src/webgpu/shader/prior_box.comp | 77 + .../dnn/src/webgpu/shader/prior_box_spv.cpp | 198 ++ modules/dnn/src/webgpu/shader/relu.comp | 23 + modules/dnn/src/webgpu/shader/relu_spv.cpp | 78 + modules/dnn/src/webgpu/shader/spv_shader.hpp | 10 + modules/dnn/src/webgpu/src/buffer.cpp | 11 +- modules/dnn/src/webgpu/src/common.hpp | 58 +- modules/dnn/src/webgpu/src/context.cpp | 7 +- modules/dnn/src/webgpu/src/context.hpp | 4 +- modules/dnn/src/webgpu/src/internal.cpp | 28 +- modules/dnn/src/webgpu/src/internal.hpp | 4 +- modules/dnn/src/webgpu/src/op_base.cpp | 49 +- modules/dnn/src/webgpu/src/op_concat.cpp | 137 ++ modules/dnn/src/webgpu/src/op_conv.cpp | 297 +++ modules/dnn/src/webgpu/src/op_lrn.cpp | 115 ++ modules/dnn/src/webgpu/src/op_permute.cpp | 184 ++ modules/dnn/src/webgpu/src/op_pool.cpp | 163 ++ modules/dnn/src/webgpu/src/op_prior_box.cpp | 177 ++ modules/dnn/src/webgpu/src/op_relu.cpp | 77 + modules/dnn/src/webgpu/src/op_softmax.cpp | 20 +- modules/dnn/src/webgpu/src/tensor.cpp | 6 +- modules/dnn/src/webgpu/src/webgpu_cpp.cpp | 7 +- modules/dnn/test/test_backends.cpp | 2 +- modules/dnn/test/test_common.hpp | 2 + modules/dnn/test/test_common.impl.hpp | 14 + modules/dnn/test/test_layers.cpp | 202 ++ modules/dnn/test/test_misc.cpp | 2 + 74 files changed, 5747 insertions(+), 2307 deletions(-) delete mode 100644 3rdparty/include/webgpu/include/webgpu_cpp.cpp delete mode 100644 modules/dnn/src/webgpu/dawnAPITest/CMakeLists.txt delete mode 100644 modules/dnn/src/webgpu/dawnAPITest/helloCompute.cpp delete mode 100644 modules/dnn/src/webgpu/dawnWrapperTest/CMakeLists.txt delete mode 100644 modules/dnn/src/webgpu/dawnWrapperTest/op_softmax_test.cpp create mode 100644 modules/dnn/src/webgpu/include/op_concat.hpp create mode 100644 modules/dnn/src/webgpu/include/op_conv.hpp create mode 100644 modules/dnn/src/webgpu/include/op_lrn.hpp create mode 100644 modules/dnn/src/webgpu/include/op_permute.hpp create mode 100644 modules/dnn/src/webgpu/include/op_pool.hpp create mode 100644 modules/dnn/src/webgpu/include/op_prior_box.hpp create mode 100644 modules/dnn/src/webgpu/include/op_relu.hpp create mode 100644 modules/dnn/src/webgpu/shader/avg_pool.comp create mode 100644 modules/dnn/src/webgpu/shader/avg_pool_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/concat.comp create mode 100644 modules/dnn/src/webgpu/shader/concat_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/conv.comp create mode 100644 modules/dnn/src/webgpu/shader/conv48.comp create mode 100644 modules/dnn/src/webgpu/shader/conv48_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/conv_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/dw_conv.comp create mode 100644 modules/dnn/src/webgpu/shader/dw_conv_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/lrn.comp create mode 100644 modules/dnn/src/webgpu/shader/lrn_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/max_pool.comp create mode 100644 modules/dnn/src/webgpu/shader/max_pool_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/permute.comp create mode 100644 modules/dnn/src/webgpu/shader/permute_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/prior_box.comp create mode 100644 modules/dnn/src/webgpu/shader/prior_box_spv.cpp create mode 100644 modules/dnn/src/webgpu/shader/relu.comp create mode 100644 modules/dnn/src/webgpu/shader/relu_spv.cpp create mode 100644 modules/dnn/src/webgpu/src/op_concat.cpp create mode 100644 modules/dnn/src/webgpu/src/op_conv.cpp create mode 100644 modules/dnn/src/webgpu/src/op_lrn.cpp create mode 100644 modules/dnn/src/webgpu/src/op_permute.cpp create mode 100644 modules/dnn/src/webgpu/src/op_pool.cpp create mode 100644 modules/dnn/src/webgpu/src/op_prior_box.cpp create mode 100644 modules/dnn/src/webgpu/src/op_relu.cpp diff --git a/3rdparty/include/webgpu/include/webgpu_cpp.cpp b/3rdparty/include/webgpu/include/webgpu_cpp.cpp deleted file mode 100644 index fd324184007c..000000000000 --- a/3rdparty/include/webgpu/include/webgpu_cpp.cpp +++ /dev/null @@ -1,1746 +0,0 @@ - -#include "dawn/webgpu_cpp.h" - -namespace wgpu { - - - static_assert(sizeof(AdapterType) == sizeof(WGPUAdapterType), "sizeof mismatch for AdapterType"); - static_assert(alignof(AdapterType) == alignof(WGPUAdapterType), "alignof mismatch for AdapterType"); - - static_assert(static_cast(AdapterType::DiscreteGPU) == WGPUAdapterType_DiscreteGPU, "value mismatch for AdapterType::DiscreteGPU"); - static_assert(static_cast(AdapterType::IntegratedGPU) == WGPUAdapterType_IntegratedGPU, "value mismatch for AdapterType::IntegratedGPU"); - static_assert(static_cast(AdapterType::CPU) == WGPUAdapterType_CPU, "value mismatch for AdapterType::CPU"); - static_assert(static_cast(AdapterType::Unknown) == WGPUAdapterType_Unknown, "value mismatch for AdapterType::Unknown"); - - - static_assert(sizeof(AddressMode) == sizeof(WGPUAddressMode), "sizeof mismatch for AddressMode"); - static_assert(alignof(AddressMode) == alignof(WGPUAddressMode), "alignof mismatch for AddressMode"); - - static_assert(static_cast(AddressMode::Repeat) == WGPUAddressMode_Repeat, "value mismatch for AddressMode::Repeat"); - static_assert(static_cast(AddressMode::MirrorRepeat) == WGPUAddressMode_MirrorRepeat, "value mismatch for AddressMode::MirrorRepeat"); - static_assert(static_cast(AddressMode::ClampToEdge) == WGPUAddressMode_ClampToEdge, "value mismatch for AddressMode::ClampToEdge"); - - - static_assert(sizeof(BackendType) == sizeof(WGPUBackendType), "sizeof mismatch for BackendType"); - static_assert(alignof(BackendType) == alignof(WGPUBackendType), "alignof mismatch for BackendType"); - - static_assert(static_cast(BackendType::Null) == WGPUBackendType_Null, "value mismatch for BackendType::Null"); - static_assert(static_cast(BackendType::D3D11) == WGPUBackendType_D3D11, "value mismatch for BackendType::D3D11"); - static_assert(static_cast(BackendType::D3D12) == WGPUBackendType_D3D12, "value mismatch for BackendType::D3D12"); - static_assert(static_cast(BackendType::Metal) == WGPUBackendType_Metal, "value mismatch for BackendType::Metal"); - static_assert(static_cast(BackendType::Vulkan) == WGPUBackendType_Vulkan, "value mismatch for BackendType::Vulkan"); - static_assert(static_cast(BackendType::OpenGL) == WGPUBackendType_OpenGL, "value mismatch for BackendType::OpenGL"); - static_assert(static_cast(BackendType::OpenGLES) == WGPUBackendType_OpenGLES, "value mismatch for BackendType::OpenGLES"); - - - static_assert(sizeof(BindingType) == sizeof(WGPUBindingType), "sizeof mismatch for BindingType"); - static_assert(alignof(BindingType) == alignof(WGPUBindingType), "alignof mismatch for BindingType"); - - static_assert(static_cast(BindingType::UniformBuffer) == WGPUBindingType_UniformBuffer, "value mismatch for BindingType::UniformBuffer"); - static_assert(static_cast(BindingType::StorageBuffer) == WGPUBindingType_StorageBuffer, "value mismatch for BindingType::StorageBuffer"); - static_assert(static_cast(BindingType::ReadonlyStorageBuffer) == WGPUBindingType_ReadonlyStorageBuffer, "value mismatch for BindingType::ReadonlyStorageBuffer"); - static_assert(static_cast(BindingType::Sampler) == WGPUBindingType_Sampler, "value mismatch for BindingType::Sampler"); - static_assert(static_cast(BindingType::ComparisonSampler) == WGPUBindingType_ComparisonSampler, "value mismatch for BindingType::ComparisonSampler"); - static_assert(static_cast(BindingType::SampledTexture) == WGPUBindingType_SampledTexture, "value mismatch for BindingType::SampledTexture"); - static_assert(static_cast(BindingType::StorageTexture) == WGPUBindingType_StorageTexture, "value mismatch for BindingType::StorageTexture"); - static_assert(static_cast(BindingType::ReadonlyStorageTexture) == WGPUBindingType_ReadonlyStorageTexture, "value mismatch for BindingType::ReadonlyStorageTexture"); - static_assert(static_cast(BindingType::WriteonlyStorageTexture) == WGPUBindingType_WriteonlyStorageTexture, "value mismatch for BindingType::WriteonlyStorageTexture"); - - - static_assert(sizeof(BlendFactor) == sizeof(WGPUBlendFactor), "sizeof mismatch for BlendFactor"); - static_assert(alignof(BlendFactor) == alignof(WGPUBlendFactor), "alignof mismatch for BlendFactor"); - - static_assert(static_cast(BlendFactor::Zero) == WGPUBlendFactor_Zero, "value mismatch for BlendFactor::Zero"); - static_assert(static_cast(BlendFactor::One) == WGPUBlendFactor_One, "value mismatch for BlendFactor::One"); - static_assert(static_cast(BlendFactor::SrcColor) == WGPUBlendFactor_SrcColor, "value mismatch for BlendFactor::SrcColor"); - static_assert(static_cast(BlendFactor::OneMinusSrcColor) == WGPUBlendFactor_OneMinusSrcColor, "value mismatch for BlendFactor::OneMinusSrcColor"); - static_assert(static_cast(BlendFactor::SrcAlpha) == WGPUBlendFactor_SrcAlpha, "value mismatch for BlendFactor::SrcAlpha"); - static_assert(static_cast(BlendFactor::OneMinusSrcAlpha) == WGPUBlendFactor_OneMinusSrcAlpha, "value mismatch for BlendFactor::OneMinusSrcAlpha"); - static_assert(static_cast(BlendFactor::DstColor) == WGPUBlendFactor_DstColor, "value mismatch for BlendFactor::DstColor"); - static_assert(static_cast(BlendFactor::OneMinusDstColor) == WGPUBlendFactor_OneMinusDstColor, "value mismatch for BlendFactor::OneMinusDstColor"); - static_assert(static_cast(BlendFactor::DstAlpha) == WGPUBlendFactor_DstAlpha, "value mismatch for BlendFactor::DstAlpha"); - static_assert(static_cast(BlendFactor::OneMinusDstAlpha) == WGPUBlendFactor_OneMinusDstAlpha, "value mismatch for BlendFactor::OneMinusDstAlpha"); - static_assert(static_cast(BlendFactor::SrcAlphaSaturated) == WGPUBlendFactor_SrcAlphaSaturated, "value mismatch for BlendFactor::SrcAlphaSaturated"); - static_assert(static_cast(BlendFactor::BlendColor) == WGPUBlendFactor_BlendColor, "value mismatch for BlendFactor::BlendColor"); - static_assert(static_cast(BlendFactor::OneMinusBlendColor) == WGPUBlendFactor_OneMinusBlendColor, "value mismatch for BlendFactor::OneMinusBlendColor"); - - - static_assert(sizeof(BlendOperation) == sizeof(WGPUBlendOperation), "sizeof mismatch for BlendOperation"); - static_assert(alignof(BlendOperation) == alignof(WGPUBlendOperation), "alignof mismatch for BlendOperation"); - - static_assert(static_cast(BlendOperation::Add) == WGPUBlendOperation_Add, "value mismatch for BlendOperation::Add"); - static_assert(static_cast(BlendOperation::Subtract) == WGPUBlendOperation_Subtract, "value mismatch for BlendOperation::Subtract"); - static_assert(static_cast(BlendOperation::ReverseSubtract) == WGPUBlendOperation_ReverseSubtract, "value mismatch for BlendOperation::ReverseSubtract"); - static_assert(static_cast(BlendOperation::Min) == WGPUBlendOperation_Min, "value mismatch for BlendOperation::Min"); - static_assert(static_cast(BlendOperation::Max) == WGPUBlendOperation_Max, "value mismatch for BlendOperation::Max"); - - - static_assert(sizeof(BufferMapAsyncStatus) == sizeof(WGPUBufferMapAsyncStatus), "sizeof mismatch for BufferMapAsyncStatus"); - static_assert(alignof(BufferMapAsyncStatus) == alignof(WGPUBufferMapAsyncStatus), "alignof mismatch for BufferMapAsyncStatus"); - - static_assert(static_cast(BufferMapAsyncStatus::Success) == WGPUBufferMapAsyncStatus_Success, "value mismatch for BufferMapAsyncStatus::Success"); - static_assert(static_cast(BufferMapAsyncStatus::Error) == WGPUBufferMapAsyncStatus_Error, "value mismatch for BufferMapAsyncStatus::Error"); - static_assert(static_cast(BufferMapAsyncStatus::Unknown) == WGPUBufferMapAsyncStatus_Unknown, "value mismatch for BufferMapAsyncStatus::Unknown"); - static_assert(static_cast(BufferMapAsyncStatus::DeviceLost) == WGPUBufferMapAsyncStatus_DeviceLost, "value mismatch for BufferMapAsyncStatus::DeviceLost"); - - - static_assert(sizeof(CompareFunction) == sizeof(WGPUCompareFunction), "sizeof mismatch for CompareFunction"); - static_assert(alignof(CompareFunction) == alignof(WGPUCompareFunction), "alignof mismatch for CompareFunction"); - - static_assert(static_cast(CompareFunction::Undefined) == WGPUCompareFunction_Undefined, "value mismatch for CompareFunction::Undefined"); - static_assert(static_cast(CompareFunction::Never) == WGPUCompareFunction_Never, "value mismatch for CompareFunction::Never"); - static_assert(static_cast(CompareFunction::Less) == WGPUCompareFunction_Less, "value mismatch for CompareFunction::Less"); - static_assert(static_cast(CompareFunction::LessEqual) == WGPUCompareFunction_LessEqual, "value mismatch for CompareFunction::LessEqual"); - static_assert(static_cast(CompareFunction::Greater) == WGPUCompareFunction_Greater, "value mismatch for CompareFunction::Greater"); - static_assert(static_cast(CompareFunction::GreaterEqual) == WGPUCompareFunction_GreaterEqual, "value mismatch for CompareFunction::GreaterEqual"); - static_assert(static_cast(CompareFunction::Equal) == WGPUCompareFunction_Equal, "value mismatch for CompareFunction::Equal"); - static_assert(static_cast(CompareFunction::NotEqual) == WGPUCompareFunction_NotEqual, "value mismatch for CompareFunction::NotEqual"); - static_assert(static_cast(CompareFunction::Always) == WGPUCompareFunction_Always, "value mismatch for CompareFunction::Always"); - - - static_assert(sizeof(CullMode) == sizeof(WGPUCullMode), "sizeof mismatch for CullMode"); - static_assert(alignof(CullMode) == alignof(WGPUCullMode), "alignof mismatch for CullMode"); - - static_assert(static_cast(CullMode::None) == WGPUCullMode_None, "value mismatch for CullMode::None"); - static_assert(static_cast(CullMode::Front) == WGPUCullMode_Front, "value mismatch for CullMode::Front"); - static_assert(static_cast(CullMode::Back) == WGPUCullMode_Back, "value mismatch for CullMode::Back"); - - - static_assert(sizeof(ErrorFilter) == sizeof(WGPUErrorFilter), "sizeof mismatch for ErrorFilter"); - static_assert(alignof(ErrorFilter) == alignof(WGPUErrorFilter), "alignof mismatch for ErrorFilter"); - - static_assert(static_cast(ErrorFilter::None) == WGPUErrorFilter_None, "value mismatch for ErrorFilter::None"); - static_assert(static_cast(ErrorFilter::Validation) == WGPUErrorFilter_Validation, "value mismatch for ErrorFilter::Validation"); - static_assert(static_cast(ErrorFilter::OutOfMemory) == WGPUErrorFilter_OutOfMemory, "value mismatch for ErrorFilter::OutOfMemory"); - - - static_assert(sizeof(ErrorType) == sizeof(WGPUErrorType), "sizeof mismatch for ErrorType"); - static_assert(alignof(ErrorType) == alignof(WGPUErrorType), "alignof mismatch for ErrorType"); - - static_assert(static_cast(ErrorType::NoError) == WGPUErrorType_NoError, "value mismatch for ErrorType::NoError"); - static_assert(static_cast(ErrorType::Validation) == WGPUErrorType_Validation, "value mismatch for ErrorType::Validation"); - static_assert(static_cast(ErrorType::OutOfMemory) == WGPUErrorType_OutOfMemory, "value mismatch for ErrorType::OutOfMemory"); - static_assert(static_cast(ErrorType::Unknown) == WGPUErrorType_Unknown, "value mismatch for ErrorType::Unknown"); - static_assert(static_cast(ErrorType::DeviceLost) == WGPUErrorType_DeviceLost, "value mismatch for ErrorType::DeviceLost"); - - - static_assert(sizeof(FenceCompletionStatus) == sizeof(WGPUFenceCompletionStatus), "sizeof mismatch for FenceCompletionStatus"); - static_assert(alignof(FenceCompletionStatus) == alignof(WGPUFenceCompletionStatus), "alignof mismatch for FenceCompletionStatus"); - - static_assert(static_cast(FenceCompletionStatus::Success) == WGPUFenceCompletionStatus_Success, "value mismatch for FenceCompletionStatus::Success"); - static_assert(static_cast(FenceCompletionStatus::Error) == WGPUFenceCompletionStatus_Error, "value mismatch for FenceCompletionStatus::Error"); - static_assert(static_cast(FenceCompletionStatus::Unknown) == WGPUFenceCompletionStatus_Unknown, "value mismatch for FenceCompletionStatus::Unknown"); - static_assert(static_cast(FenceCompletionStatus::DeviceLost) == WGPUFenceCompletionStatus_DeviceLost, "value mismatch for FenceCompletionStatus::DeviceLost"); - - - static_assert(sizeof(FilterMode) == sizeof(WGPUFilterMode), "sizeof mismatch for FilterMode"); - static_assert(alignof(FilterMode) == alignof(WGPUFilterMode), "alignof mismatch for FilterMode"); - - static_assert(static_cast(FilterMode::Nearest) == WGPUFilterMode_Nearest, "value mismatch for FilterMode::Nearest"); - static_assert(static_cast(FilterMode::Linear) == WGPUFilterMode_Linear, "value mismatch for FilterMode::Linear"); - - - static_assert(sizeof(FrontFace) == sizeof(WGPUFrontFace), "sizeof mismatch for FrontFace"); - static_assert(alignof(FrontFace) == alignof(WGPUFrontFace), "alignof mismatch for FrontFace"); - - static_assert(static_cast(FrontFace::CCW) == WGPUFrontFace_CCW, "value mismatch for FrontFace::CCW"); - static_assert(static_cast(FrontFace::CW) == WGPUFrontFace_CW, "value mismatch for FrontFace::CW"); - - - static_assert(sizeof(IndexFormat) == sizeof(WGPUIndexFormat), "sizeof mismatch for IndexFormat"); - static_assert(alignof(IndexFormat) == alignof(WGPUIndexFormat), "alignof mismatch for IndexFormat"); - - static_assert(static_cast(IndexFormat::Uint16) == WGPUIndexFormat_Uint16, "value mismatch for IndexFormat::Uint16"); - static_assert(static_cast(IndexFormat::Uint32) == WGPUIndexFormat_Uint32, "value mismatch for IndexFormat::Uint32"); - - - static_assert(sizeof(InputStepMode) == sizeof(WGPUInputStepMode), "sizeof mismatch for InputStepMode"); - static_assert(alignof(InputStepMode) == alignof(WGPUInputStepMode), "alignof mismatch for InputStepMode"); - - static_assert(static_cast(InputStepMode::Vertex) == WGPUInputStepMode_Vertex, "value mismatch for InputStepMode::Vertex"); - static_assert(static_cast(InputStepMode::Instance) == WGPUInputStepMode_Instance, "value mismatch for InputStepMode::Instance"); - - - static_assert(sizeof(LoadOp) == sizeof(WGPULoadOp), "sizeof mismatch for LoadOp"); - static_assert(alignof(LoadOp) == alignof(WGPULoadOp), "alignof mismatch for LoadOp"); - - static_assert(static_cast(LoadOp::Clear) == WGPULoadOp_Clear, "value mismatch for LoadOp::Clear"); - static_assert(static_cast(LoadOp::Load) == WGPULoadOp_Load, "value mismatch for LoadOp::Load"); - - - static_assert(sizeof(PresentMode) == sizeof(WGPUPresentMode), "sizeof mismatch for PresentMode"); - static_assert(alignof(PresentMode) == alignof(WGPUPresentMode), "alignof mismatch for PresentMode"); - - static_assert(static_cast(PresentMode::Immediate) == WGPUPresentMode_Immediate, "value mismatch for PresentMode::Immediate"); - static_assert(static_cast(PresentMode::Mailbox) == WGPUPresentMode_Mailbox, "value mismatch for PresentMode::Mailbox"); - static_assert(static_cast(PresentMode::Fifo) == WGPUPresentMode_Fifo, "value mismatch for PresentMode::Fifo"); - - - static_assert(sizeof(PrimitiveTopology) == sizeof(WGPUPrimitiveTopology), "sizeof mismatch for PrimitiveTopology"); - static_assert(alignof(PrimitiveTopology) == alignof(WGPUPrimitiveTopology), "alignof mismatch for PrimitiveTopology"); - - static_assert(static_cast(PrimitiveTopology::PointList) == WGPUPrimitiveTopology_PointList, "value mismatch for PrimitiveTopology::PointList"); - static_assert(static_cast(PrimitiveTopology::LineList) == WGPUPrimitiveTopology_LineList, "value mismatch for PrimitiveTopology::LineList"); - static_assert(static_cast(PrimitiveTopology::LineStrip) == WGPUPrimitiveTopology_LineStrip, "value mismatch for PrimitiveTopology::LineStrip"); - static_assert(static_cast(PrimitiveTopology::TriangleList) == WGPUPrimitiveTopology_TriangleList, "value mismatch for PrimitiveTopology::TriangleList"); - static_assert(static_cast(PrimitiveTopology::TriangleStrip) == WGPUPrimitiveTopology_TriangleStrip, "value mismatch for PrimitiveTopology::TriangleStrip"); - - - static_assert(sizeof(SType) == sizeof(WGPUSType), "sizeof mismatch for SType"); - static_assert(alignof(SType) == alignof(WGPUSType), "alignof mismatch for SType"); - - static_assert(static_cast(SType::Invalid) == WGPUSType_Invalid, "value mismatch for SType::Invalid"); - static_assert(static_cast(SType::SurfaceDescriptorFromMetalLayer) == WGPUSType_SurfaceDescriptorFromMetalLayer, "value mismatch for SType::SurfaceDescriptorFromMetalLayer"); - static_assert(static_cast(SType::SurfaceDescriptorFromWindowsHWND) == WGPUSType_SurfaceDescriptorFromWindowsHWND, "value mismatch for SType::SurfaceDescriptorFromWindowsHWND"); - static_assert(static_cast(SType::SurfaceDescriptorFromXlib) == WGPUSType_SurfaceDescriptorFromXlib, "value mismatch for SType::SurfaceDescriptorFromXlib"); - static_assert(static_cast(SType::SurfaceDescriptorFromHTMLCanvasId) == WGPUSType_SurfaceDescriptorFromHTMLCanvasId, "value mismatch for SType::SurfaceDescriptorFromHTMLCanvasId"); - static_assert(static_cast(SType::ShaderModuleSPIRVDescriptor) == WGPUSType_ShaderModuleSPIRVDescriptor, "value mismatch for SType::ShaderModuleSPIRVDescriptor"); - static_assert(static_cast(SType::ShaderModuleWGSLDescriptor) == WGPUSType_ShaderModuleWGSLDescriptor, "value mismatch for SType::ShaderModuleWGSLDescriptor"); - static_assert(static_cast(SType::SamplerDescriptorDummyAnisotropicFiltering) == WGPUSType_SamplerDescriptorDummyAnisotropicFiltering, "value mismatch for SType::SamplerDescriptorDummyAnisotropicFiltering"); - static_assert(static_cast(SType::RenderPipelineDescriptorDummyExtension) == WGPUSType_RenderPipelineDescriptorDummyExtension, "value mismatch for SType::RenderPipelineDescriptorDummyExtension"); - - - static_assert(sizeof(StencilOperation) == sizeof(WGPUStencilOperation), "sizeof mismatch for StencilOperation"); - static_assert(alignof(StencilOperation) == alignof(WGPUStencilOperation), "alignof mismatch for StencilOperation"); - - static_assert(static_cast(StencilOperation::Keep) == WGPUStencilOperation_Keep, "value mismatch for StencilOperation::Keep"); - static_assert(static_cast(StencilOperation::Zero) == WGPUStencilOperation_Zero, "value mismatch for StencilOperation::Zero"); - static_assert(static_cast(StencilOperation::Replace) == WGPUStencilOperation_Replace, "value mismatch for StencilOperation::Replace"); - static_assert(static_cast(StencilOperation::Invert) == WGPUStencilOperation_Invert, "value mismatch for StencilOperation::Invert"); - static_assert(static_cast(StencilOperation::IncrementClamp) == WGPUStencilOperation_IncrementClamp, "value mismatch for StencilOperation::IncrementClamp"); - static_assert(static_cast(StencilOperation::DecrementClamp) == WGPUStencilOperation_DecrementClamp, "value mismatch for StencilOperation::DecrementClamp"); - static_assert(static_cast(StencilOperation::IncrementWrap) == WGPUStencilOperation_IncrementWrap, "value mismatch for StencilOperation::IncrementWrap"); - static_assert(static_cast(StencilOperation::DecrementWrap) == WGPUStencilOperation_DecrementWrap, "value mismatch for StencilOperation::DecrementWrap"); - - - static_assert(sizeof(StoreOp) == sizeof(WGPUStoreOp), "sizeof mismatch for StoreOp"); - static_assert(alignof(StoreOp) == alignof(WGPUStoreOp), "alignof mismatch for StoreOp"); - - static_assert(static_cast(StoreOp::Store) == WGPUStoreOp_Store, "value mismatch for StoreOp::Store"); - static_assert(static_cast(StoreOp::Clear) == WGPUStoreOp_Clear, "value mismatch for StoreOp::Clear"); - - - static_assert(sizeof(TextureAspect) == sizeof(WGPUTextureAspect), "sizeof mismatch for TextureAspect"); - static_assert(alignof(TextureAspect) == alignof(WGPUTextureAspect), "alignof mismatch for TextureAspect"); - - static_assert(static_cast(TextureAspect::All) == WGPUTextureAspect_All, "value mismatch for TextureAspect::All"); - static_assert(static_cast(TextureAspect::StencilOnly) == WGPUTextureAspect_StencilOnly, "value mismatch for TextureAspect::StencilOnly"); - static_assert(static_cast(TextureAspect::DepthOnly) == WGPUTextureAspect_DepthOnly, "value mismatch for TextureAspect::DepthOnly"); - - - static_assert(sizeof(TextureComponentType) == sizeof(WGPUTextureComponentType), "sizeof mismatch for TextureComponentType"); - static_assert(alignof(TextureComponentType) == alignof(WGPUTextureComponentType), "alignof mismatch for TextureComponentType"); - - static_assert(static_cast(TextureComponentType::Float) == WGPUTextureComponentType_Float, "value mismatch for TextureComponentType::Float"); - static_assert(static_cast(TextureComponentType::Sint) == WGPUTextureComponentType_Sint, "value mismatch for TextureComponentType::Sint"); - static_assert(static_cast(TextureComponentType::Uint) == WGPUTextureComponentType_Uint, "value mismatch for TextureComponentType::Uint"); - - - static_assert(sizeof(TextureDimension) == sizeof(WGPUTextureDimension), "sizeof mismatch for TextureDimension"); - static_assert(alignof(TextureDimension) == alignof(WGPUTextureDimension), "alignof mismatch for TextureDimension"); - - static_assert(static_cast(TextureDimension::e1D) == WGPUTextureDimension_1D, "value mismatch for TextureDimension::e1D"); - static_assert(static_cast(TextureDimension::e2D) == WGPUTextureDimension_2D, "value mismatch for TextureDimension::e2D"); - static_assert(static_cast(TextureDimension::e3D) == WGPUTextureDimension_3D, "value mismatch for TextureDimension::e3D"); - - - static_assert(sizeof(TextureFormat) == sizeof(WGPUTextureFormat), "sizeof mismatch for TextureFormat"); - static_assert(alignof(TextureFormat) == alignof(WGPUTextureFormat), "alignof mismatch for TextureFormat"); - - static_assert(static_cast(TextureFormat::Undefined) == WGPUTextureFormat_Undefined, "value mismatch for TextureFormat::Undefined"); - static_assert(static_cast(TextureFormat::R8Unorm) == WGPUTextureFormat_R8Unorm, "value mismatch for TextureFormat::R8Unorm"); - static_assert(static_cast(TextureFormat::R8Snorm) == WGPUTextureFormat_R8Snorm, "value mismatch for TextureFormat::R8Snorm"); - static_assert(static_cast(TextureFormat::R8Uint) == WGPUTextureFormat_R8Uint, "value mismatch for TextureFormat::R8Uint"); - static_assert(static_cast(TextureFormat::R8Sint) == WGPUTextureFormat_R8Sint, "value mismatch for TextureFormat::R8Sint"); - static_assert(static_cast(TextureFormat::R16Uint) == WGPUTextureFormat_R16Uint, "value mismatch for TextureFormat::R16Uint"); - static_assert(static_cast(TextureFormat::R16Sint) == WGPUTextureFormat_R16Sint, "value mismatch for TextureFormat::R16Sint"); - static_assert(static_cast(TextureFormat::R16Float) == WGPUTextureFormat_R16Float, "value mismatch for TextureFormat::R16Float"); - static_assert(static_cast(TextureFormat::RG8Unorm) == WGPUTextureFormat_RG8Unorm, "value mismatch for TextureFormat::RG8Unorm"); - static_assert(static_cast(TextureFormat::RG8Snorm) == WGPUTextureFormat_RG8Snorm, "value mismatch for TextureFormat::RG8Snorm"); - static_assert(static_cast(TextureFormat::RG8Uint) == WGPUTextureFormat_RG8Uint, "value mismatch for TextureFormat::RG8Uint"); - static_assert(static_cast(TextureFormat::RG8Sint) == WGPUTextureFormat_RG8Sint, "value mismatch for TextureFormat::RG8Sint"); - static_assert(static_cast(TextureFormat::R32Float) == WGPUTextureFormat_R32Float, "value mismatch for TextureFormat::R32Float"); - static_assert(static_cast(TextureFormat::R32Uint) == WGPUTextureFormat_R32Uint, "value mismatch for TextureFormat::R32Uint"); - static_assert(static_cast(TextureFormat::R32Sint) == WGPUTextureFormat_R32Sint, "value mismatch for TextureFormat::R32Sint"); - static_assert(static_cast(TextureFormat::RG16Uint) == WGPUTextureFormat_RG16Uint, "value mismatch for TextureFormat::RG16Uint"); - static_assert(static_cast(TextureFormat::RG16Sint) == WGPUTextureFormat_RG16Sint, "value mismatch for TextureFormat::RG16Sint"); - static_assert(static_cast(TextureFormat::RG16Float) == WGPUTextureFormat_RG16Float, "value mismatch for TextureFormat::RG16Float"); - static_assert(static_cast(TextureFormat::RGBA8Unorm) == WGPUTextureFormat_RGBA8Unorm, "value mismatch for TextureFormat::RGBA8Unorm"); - static_assert(static_cast(TextureFormat::RGBA8UnormSrgb) == WGPUTextureFormat_RGBA8UnormSrgb, "value mismatch for TextureFormat::RGBA8UnormSrgb"); - static_assert(static_cast(TextureFormat::RGBA8Snorm) == WGPUTextureFormat_RGBA8Snorm, "value mismatch for TextureFormat::RGBA8Snorm"); - static_assert(static_cast(TextureFormat::RGBA8Uint) == WGPUTextureFormat_RGBA8Uint, "value mismatch for TextureFormat::RGBA8Uint"); - static_assert(static_cast(TextureFormat::RGBA8Sint) == WGPUTextureFormat_RGBA8Sint, "value mismatch for TextureFormat::RGBA8Sint"); - static_assert(static_cast(TextureFormat::BGRA8Unorm) == WGPUTextureFormat_BGRA8Unorm, "value mismatch for TextureFormat::BGRA8Unorm"); - static_assert(static_cast(TextureFormat::BGRA8UnormSrgb) == WGPUTextureFormat_BGRA8UnormSrgb, "value mismatch for TextureFormat::BGRA8UnormSrgb"); - static_assert(static_cast(TextureFormat::RGB10A2Unorm) == WGPUTextureFormat_RGB10A2Unorm, "value mismatch for TextureFormat::RGB10A2Unorm"); - static_assert(static_cast(TextureFormat::RG11B10Float) == WGPUTextureFormat_RG11B10Float, "value mismatch for TextureFormat::RG11B10Float"); - static_assert(static_cast(TextureFormat::RG32Float) == WGPUTextureFormat_RG32Float, "value mismatch for TextureFormat::RG32Float"); - static_assert(static_cast(TextureFormat::RG32Uint) == WGPUTextureFormat_RG32Uint, "value mismatch for TextureFormat::RG32Uint"); - static_assert(static_cast(TextureFormat::RG32Sint) == WGPUTextureFormat_RG32Sint, "value mismatch for TextureFormat::RG32Sint"); - static_assert(static_cast(TextureFormat::RGBA16Uint) == WGPUTextureFormat_RGBA16Uint, "value mismatch for TextureFormat::RGBA16Uint"); - static_assert(static_cast(TextureFormat::RGBA16Sint) == WGPUTextureFormat_RGBA16Sint, "value mismatch for TextureFormat::RGBA16Sint"); - static_assert(static_cast(TextureFormat::RGBA16Float) == WGPUTextureFormat_RGBA16Float, "value mismatch for TextureFormat::RGBA16Float"); - static_assert(static_cast(TextureFormat::RGBA32Float) == WGPUTextureFormat_RGBA32Float, "value mismatch for TextureFormat::RGBA32Float"); - static_assert(static_cast(TextureFormat::RGBA32Uint) == WGPUTextureFormat_RGBA32Uint, "value mismatch for TextureFormat::RGBA32Uint"); - static_assert(static_cast(TextureFormat::RGBA32Sint) == WGPUTextureFormat_RGBA32Sint, "value mismatch for TextureFormat::RGBA32Sint"); - static_assert(static_cast(TextureFormat::Depth32Float) == WGPUTextureFormat_Depth32Float, "value mismatch for TextureFormat::Depth32Float"); - static_assert(static_cast(TextureFormat::Depth24Plus) == WGPUTextureFormat_Depth24Plus, "value mismatch for TextureFormat::Depth24Plus"); - static_assert(static_cast(TextureFormat::Depth24PlusStencil8) == WGPUTextureFormat_Depth24PlusStencil8, "value mismatch for TextureFormat::Depth24PlusStencil8"); - static_assert(static_cast(TextureFormat::BC1RGBAUnorm) == WGPUTextureFormat_BC1RGBAUnorm, "value mismatch for TextureFormat::BC1RGBAUnorm"); - static_assert(static_cast(TextureFormat::BC1RGBAUnormSrgb) == WGPUTextureFormat_BC1RGBAUnormSrgb, "value mismatch for TextureFormat::BC1RGBAUnormSrgb"); - static_assert(static_cast(TextureFormat::BC2RGBAUnorm) == WGPUTextureFormat_BC2RGBAUnorm, "value mismatch for TextureFormat::BC2RGBAUnorm"); - static_assert(static_cast(TextureFormat::BC2RGBAUnormSrgb) == WGPUTextureFormat_BC2RGBAUnormSrgb, "value mismatch for TextureFormat::BC2RGBAUnormSrgb"); - static_assert(static_cast(TextureFormat::BC3RGBAUnorm) == WGPUTextureFormat_BC3RGBAUnorm, "value mismatch for TextureFormat::BC3RGBAUnorm"); - static_assert(static_cast(TextureFormat::BC3RGBAUnormSrgb) == WGPUTextureFormat_BC3RGBAUnormSrgb, "value mismatch for TextureFormat::BC3RGBAUnormSrgb"); - static_assert(static_cast(TextureFormat::BC4RUnorm) == WGPUTextureFormat_BC4RUnorm, "value mismatch for TextureFormat::BC4RUnorm"); - static_assert(static_cast(TextureFormat::BC4RSnorm) == WGPUTextureFormat_BC4RSnorm, "value mismatch for TextureFormat::BC4RSnorm"); - static_assert(static_cast(TextureFormat::BC5RGUnorm) == WGPUTextureFormat_BC5RGUnorm, "value mismatch for TextureFormat::BC5RGUnorm"); - static_assert(static_cast(TextureFormat::BC5RGSnorm) == WGPUTextureFormat_BC5RGSnorm, "value mismatch for TextureFormat::BC5RGSnorm"); - static_assert(static_cast(TextureFormat::BC6HRGBUfloat) == WGPUTextureFormat_BC6HRGBUfloat, "value mismatch for TextureFormat::BC6HRGBUfloat"); - static_assert(static_cast(TextureFormat::BC6HRGBSfloat) == WGPUTextureFormat_BC6HRGBSfloat, "value mismatch for TextureFormat::BC6HRGBSfloat"); - static_assert(static_cast(TextureFormat::BC7RGBAUnorm) == WGPUTextureFormat_BC7RGBAUnorm, "value mismatch for TextureFormat::BC7RGBAUnorm"); - static_assert(static_cast(TextureFormat::BC7RGBAUnormSrgb) == WGPUTextureFormat_BC7RGBAUnormSrgb, "value mismatch for TextureFormat::BC7RGBAUnormSrgb"); - - - static_assert(sizeof(TextureViewDimension) == sizeof(WGPUTextureViewDimension), "sizeof mismatch for TextureViewDimension"); - static_assert(alignof(TextureViewDimension) == alignof(WGPUTextureViewDimension), "alignof mismatch for TextureViewDimension"); - - static_assert(static_cast(TextureViewDimension::Undefined) == WGPUTextureViewDimension_Undefined, "value mismatch for TextureViewDimension::Undefined"); - static_assert(static_cast(TextureViewDimension::e1D) == WGPUTextureViewDimension_1D, "value mismatch for TextureViewDimension::e1D"); - static_assert(static_cast(TextureViewDimension::e2D) == WGPUTextureViewDimension_2D, "value mismatch for TextureViewDimension::e2D"); - static_assert(static_cast(TextureViewDimension::e2DArray) == WGPUTextureViewDimension_2DArray, "value mismatch for TextureViewDimension::e2DArray"); - static_assert(static_cast(TextureViewDimension::Cube) == WGPUTextureViewDimension_Cube, "value mismatch for TextureViewDimension::Cube"); - static_assert(static_cast(TextureViewDimension::CubeArray) == WGPUTextureViewDimension_CubeArray, "value mismatch for TextureViewDimension::CubeArray"); - static_assert(static_cast(TextureViewDimension::e3D) == WGPUTextureViewDimension_3D, "value mismatch for TextureViewDimension::e3D"); - - - static_assert(sizeof(VertexFormat) == sizeof(WGPUVertexFormat), "sizeof mismatch for VertexFormat"); - static_assert(alignof(VertexFormat) == alignof(WGPUVertexFormat), "alignof mismatch for VertexFormat"); - - static_assert(static_cast(VertexFormat::UChar2) == WGPUVertexFormat_UChar2, "value mismatch for VertexFormat::UChar2"); - static_assert(static_cast(VertexFormat::UChar4) == WGPUVertexFormat_UChar4, "value mismatch for VertexFormat::UChar4"); - static_assert(static_cast(VertexFormat::Char2) == WGPUVertexFormat_Char2, "value mismatch for VertexFormat::Char2"); - static_assert(static_cast(VertexFormat::Char4) == WGPUVertexFormat_Char4, "value mismatch for VertexFormat::Char4"); - static_assert(static_cast(VertexFormat::UChar2Norm) == WGPUVertexFormat_UChar2Norm, "value mismatch for VertexFormat::UChar2Norm"); - static_assert(static_cast(VertexFormat::UChar4Norm) == WGPUVertexFormat_UChar4Norm, "value mismatch for VertexFormat::UChar4Norm"); - static_assert(static_cast(VertexFormat::Char2Norm) == WGPUVertexFormat_Char2Norm, "value mismatch for VertexFormat::Char2Norm"); - static_assert(static_cast(VertexFormat::Char4Norm) == WGPUVertexFormat_Char4Norm, "value mismatch for VertexFormat::Char4Norm"); - static_assert(static_cast(VertexFormat::UShort2) == WGPUVertexFormat_UShort2, "value mismatch for VertexFormat::UShort2"); - static_assert(static_cast(VertexFormat::UShort4) == WGPUVertexFormat_UShort4, "value mismatch for VertexFormat::UShort4"); - static_assert(static_cast(VertexFormat::Short2) == WGPUVertexFormat_Short2, "value mismatch for VertexFormat::Short2"); - static_assert(static_cast(VertexFormat::Short4) == WGPUVertexFormat_Short4, "value mismatch for VertexFormat::Short4"); - static_assert(static_cast(VertexFormat::UShort2Norm) == WGPUVertexFormat_UShort2Norm, "value mismatch for VertexFormat::UShort2Norm"); - static_assert(static_cast(VertexFormat::UShort4Norm) == WGPUVertexFormat_UShort4Norm, "value mismatch for VertexFormat::UShort4Norm"); - static_assert(static_cast(VertexFormat::Short2Norm) == WGPUVertexFormat_Short2Norm, "value mismatch for VertexFormat::Short2Norm"); - static_assert(static_cast(VertexFormat::Short4Norm) == WGPUVertexFormat_Short4Norm, "value mismatch for VertexFormat::Short4Norm"); - static_assert(static_cast(VertexFormat::Half2) == WGPUVertexFormat_Half2, "value mismatch for VertexFormat::Half2"); - static_assert(static_cast(VertexFormat::Half4) == WGPUVertexFormat_Half4, "value mismatch for VertexFormat::Half4"); - static_assert(static_cast(VertexFormat::Float) == WGPUVertexFormat_Float, "value mismatch for VertexFormat::Float"); - static_assert(static_cast(VertexFormat::Float2) == WGPUVertexFormat_Float2, "value mismatch for VertexFormat::Float2"); - static_assert(static_cast(VertexFormat::Float3) == WGPUVertexFormat_Float3, "value mismatch for VertexFormat::Float3"); - static_assert(static_cast(VertexFormat::Float4) == WGPUVertexFormat_Float4, "value mismatch for VertexFormat::Float4"); - static_assert(static_cast(VertexFormat::UInt) == WGPUVertexFormat_UInt, "value mismatch for VertexFormat::UInt"); - static_assert(static_cast(VertexFormat::UInt2) == WGPUVertexFormat_UInt2, "value mismatch for VertexFormat::UInt2"); - static_assert(static_cast(VertexFormat::UInt3) == WGPUVertexFormat_UInt3, "value mismatch for VertexFormat::UInt3"); - static_assert(static_cast(VertexFormat::UInt4) == WGPUVertexFormat_UInt4, "value mismatch for VertexFormat::UInt4"); - static_assert(static_cast(VertexFormat::Int) == WGPUVertexFormat_Int, "value mismatch for VertexFormat::Int"); - static_assert(static_cast(VertexFormat::Int2) == WGPUVertexFormat_Int2, "value mismatch for VertexFormat::Int2"); - static_assert(static_cast(VertexFormat::Int3) == WGPUVertexFormat_Int3, "value mismatch for VertexFormat::Int3"); - static_assert(static_cast(VertexFormat::Int4) == WGPUVertexFormat_Int4, "value mismatch for VertexFormat::Int4"); - - - - static_assert(sizeof(BufferUsage) == sizeof(WGPUBufferUsageFlags), "sizeof mismatch for BufferUsage"); - static_assert(alignof(BufferUsage) == alignof(WGPUBufferUsageFlags), "alignof mismatch for BufferUsage"); - - static_assert(static_cast(BufferUsage::None) == WGPUBufferUsage_None, "value mismatch for BufferUsage::None"); - static_assert(static_cast(BufferUsage::MapRead) == WGPUBufferUsage_MapRead, "value mismatch for BufferUsage::MapRead"); - static_assert(static_cast(BufferUsage::MapWrite) == WGPUBufferUsage_MapWrite, "value mismatch for BufferUsage::MapWrite"); - static_assert(static_cast(BufferUsage::CopySrc) == WGPUBufferUsage_CopySrc, "value mismatch for BufferUsage::CopySrc"); - static_assert(static_cast(BufferUsage::CopyDst) == WGPUBufferUsage_CopyDst, "value mismatch for BufferUsage::CopyDst"); - static_assert(static_cast(BufferUsage::Index) == WGPUBufferUsage_Index, "value mismatch for BufferUsage::Index"); - static_assert(static_cast(BufferUsage::Vertex) == WGPUBufferUsage_Vertex, "value mismatch for BufferUsage::Vertex"); - static_assert(static_cast(BufferUsage::Uniform) == WGPUBufferUsage_Uniform, "value mismatch for BufferUsage::Uniform"); - static_assert(static_cast(BufferUsage::Storage) == WGPUBufferUsage_Storage, "value mismatch for BufferUsage::Storage"); - static_assert(static_cast(BufferUsage::Indirect) == WGPUBufferUsage_Indirect, "value mismatch for BufferUsage::Indirect"); - - - static_assert(sizeof(ColorWriteMask) == sizeof(WGPUColorWriteMaskFlags), "sizeof mismatch for ColorWriteMask"); - static_assert(alignof(ColorWriteMask) == alignof(WGPUColorWriteMaskFlags), "alignof mismatch for ColorWriteMask"); - - static_assert(static_cast(ColorWriteMask::None) == WGPUColorWriteMask_None, "value mismatch for ColorWriteMask::None"); - static_assert(static_cast(ColorWriteMask::Red) == WGPUColorWriteMask_Red, "value mismatch for ColorWriteMask::Red"); - static_assert(static_cast(ColorWriteMask::Green) == WGPUColorWriteMask_Green, "value mismatch for ColorWriteMask::Green"); - static_assert(static_cast(ColorWriteMask::Blue) == WGPUColorWriteMask_Blue, "value mismatch for ColorWriteMask::Blue"); - static_assert(static_cast(ColorWriteMask::Alpha) == WGPUColorWriteMask_Alpha, "value mismatch for ColorWriteMask::Alpha"); - static_assert(static_cast(ColorWriteMask::All) == WGPUColorWriteMask_All, "value mismatch for ColorWriteMask::All"); - - - static_assert(sizeof(ShaderStage) == sizeof(WGPUShaderStageFlags), "sizeof mismatch for ShaderStage"); - static_assert(alignof(ShaderStage) == alignof(WGPUShaderStageFlags), "alignof mismatch for ShaderStage"); - - static_assert(static_cast(ShaderStage::None) == WGPUShaderStage_None, "value mismatch for ShaderStage::None"); - static_assert(static_cast(ShaderStage::Vertex) == WGPUShaderStage_Vertex, "value mismatch for ShaderStage::Vertex"); - static_assert(static_cast(ShaderStage::Fragment) == WGPUShaderStage_Fragment, "value mismatch for ShaderStage::Fragment"); - static_assert(static_cast(ShaderStage::Compute) == WGPUShaderStage_Compute, "value mismatch for ShaderStage::Compute"); - - - static_assert(sizeof(TextureUsage) == sizeof(WGPUTextureUsageFlags), "sizeof mismatch for TextureUsage"); - static_assert(alignof(TextureUsage) == alignof(WGPUTextureUsageFlags), "alignof mismatch for TextureUsage"); - - static_assert(static_cast(TextureUsage::None) == WGPUTextureUsage_None, "value mismatch for TextureUsage::None"); - static_assert(static_cast(TextureUsage::CopySrc) == WGPUTextureUsage_CopySrc, "value mismatch for TextureUsage::CopySrc"); - static_assert(static_cast(TextureUsage::CopyDst) == WGPUTextureUsage_CopyDst, "value mismatch for TextureUsage::CopyDst"); - static_assert(static_cast(TextureUsage::Sampled) == WGPUTextureUsage_Sampled, "value mismatch for TextureUsage::Sampled"); - static_assert(static_cast(TextureUsage::Storage) == WGPUTextureUsage_Storage, "value mismatch for TextureUsage::Storage"); - static_assert(static_cast(TextureUsage::OutputAttachment) == WGPUTextureUsage_OutputAttachment, "value mismatch for TextureUsage::OutputAttachment"); - static_assert(static_cast(TextureUsage::Present) == WGPUTextureUsage_Present, "value mismatch for TextureUsage::Present"); - - - static_assert(sizeof(ChainedStruct) == sizeof(WGPUChainedStruct), - "sizeof mismatch for ChainedStruct"); - static_assert(alignof(ChainedStruct) == alignof(WGPUChainedStruct), - "alignof mismatch for ChainedStruct"); - static_assert(offsetof(ChainedStruct, nextInChain) == offsetof(WGPUChainedStruct, next), - "offsetof mismatch for ChainedStruct::nextInChain"); - static_assert(offsetof(ChainedStruct, sType) == offsetof(WGPUChainedStruct, sType), - "offsetof mismatch for ChainedStruct::sType"); - - - static_assert(sizeof(AdapterProperties) == sizeof(WGPUAdapterProperties), "sizeof mismatch for AdapterProperties"); - static_assert(alignof(AdapterProperties) == alignof(WGPUAdapterProperties), "alignof mismatch for AdapterProperties"); - - static_assert(offsetof(AdapterProperties, nextInChain) == offsetof(WGPUAdapterProperties, nextInChain), - "offsetof mismatch for AdapterProperties::nextInChain"); - static_assert(offsetof(AdapterProperties, deviceID) == offsetof(WGPUAdapterProperties, deviceID), - "offsetof mismatch for AdapterProperties::deviceID"); - static_assert(offsetof(AdapterProperties, vendorID) == offsetof(WGPUAdapterProperties, vendorID), - "offsetof mismatch for AdapterProperties::vendorID"); - static_assert(offsetof(AdapterProperties, name) == offsetof(WGPUAdapterProperties, name), - "offsetof mismatch for AdapterProperties::name"); - static_assert(offsetof(AdapterProperties, adapterType) == offsetof(WGPUAdapterProperties, adapterType), - "offsetof mismatch for AdapterProperties::adapterType"); - static_assert(offsetof(AdapterProperties, backendType) == offsetof(WGPUAdapterProperties, backendType), - "offsetof mismatch for AdapterProperties::backendType"); - - - static_assert(sizeof(BindGroupEntry) == sizeof(WGPUBindGroupEntry), "sizeof mismatch for BindGroupEntry"); - static_assert(alignof(BindGroupEntry) == alignof(WGPUBindGroupEntry), "alignof mismatch for BindGroupEntry"); - - static_assert(offsetof(BindGroupEntry, binding) == offsetof(WGPUBindGroupEntry, binding), - "offsetof mismatch for BindGroupEntry::binding"); - static_assert(offsetof(BindGroupEntry, buffer) == offsetof(WGPUBindGroupEntry, buffer), - "offsetof mismatch for BindGroupEntry::buffer"); - static_assert(offsetof(BindGroupEntry, offset) == offsetof(WGPUBindGroupEntry, offset), - "offsetof mismatch for BindGroupEntry::offset"); - static_assert(offsetof(BindGroupEntry, size) == offsetof(WGPUBindGroupEntry, size), - "offsetof mismatch for BindGroupEntry::size"); - static_assert(offsetof(BindGroupEntry, sampler) == offsetof(WGPUBindGroupEntry, sampler), - "offsetof mismatch for BindGroupEntry::sampler"); - static_assert(offsetof(BindGroupEntry, textureView) == offsetof(WGPUBindGroupEntry, textureView), - "offsetof mismatch for BindGroupEntry::textureView"); - - - static_assert(sizeof(BindGroupLayoutEntry) == sizeof(WGPUBindGroupLayoutEntry), "sizeof mismatch for BindGroupLayoutEntry"); - static_assert(alignof(BindGroupLayoutEntry) == alignof(WGPUBindGroupLayoutEntry), "alignof mismatch for BindGroupLayoutEntry"); - - static_assert(offsetof(BindGroupLayoutEntry, binding) == offsetof(WGPUBindGroupLayoutEntry, binding), - "offsetof mismatch for BindGroupLayoutEntry::binding"); - static_assert(offsetof(BindGroupLayoutEntry, visibility) == offsetof(WGPUBindGroupLayoutEntry, visibility), - "offsetof mismatch for BindGroupLayoutEntry::visibility"); - static_assert(offsetof(BindGroupLayoutEntry, type) == offsetof(WGPUBindGroupLayoutEntry, type), - "offsetof mismatch for BindGroupLayoutEntry::type"); - static_assert(offsetof(BindGroupLayoutEntry, hasDynamicOffset) == offsetof(WGPUBindGroupLayoutEntry, hasDynamicOffset), - "offsetof mismatch for BindGroupLayoutEntry::hasDynamicOffset"); - static_assert(offsetof(BindGroupLayoutEntry, multisampled) == offsetof(WGPUBindGroupLayoutEntry, multisampled), - "offsetof mismatch for BindGroupLayoutEntry::multisampled"); - static_assert(offsetof(BindGroupLayoutEntry, viewDimension) == offsetof(WGPUBindGroupLayoutEntry, viewDimension), - "offsetof mismatch for BindGroupLayoutEntry::viewDimension"); - static_assert(offsetof(BindGroupLayoutEntry, textureComponentType) == offsetof(WGPUBindGroupLayoutEntry, textureComponentType), - "offsetof mismatch for BindGroupLayoutEntry::textureComponentType"); - static_assert(offsetof(BindGroupLayoutEntry, storageTextureFormat) == offsetof(WGPUBindGroupLayoutEntry, storageTextureFormat), - "offsetof mismatch for BindGroupLayoutEntry::storageTextureFormat"); - - - static_assert(sizeof(BlendDescriptor) == sizeof(WGPUBlendDescriptor), "sizeof mismatch for BlendDescriptor"); - static_assert(alignof(BlendDescriptor) == alignof(WGPUBlendDescriptor), "alignof mismatch for BlendDescriptor"); - - static_assert(offsetof(BlendDescriptor, operation) == offsetof(WGPUBlendDescriptor, operation), - "offsetof mismatch for BlendDescriptor::operation"); - static_assert(offsetof(BlendDescriptor, srcFactor) == offsetof(WGPUBlendDescriptor, srcFactor), - "offsetof mismatch for BlendDescriptor::srcFactor"); - static_assert(offsetof(BlendDescriptor, dstFactor) == offsetof(WGPUBlendDescriptor, dstFactor), - "offsetof mismatch for BlendDescriptor::dstFactor"); - - - static_assert(sizeof(BufferCopyView) == sizeof(WGPUBufferCopyView), "sizeof mismatch for BufferCopyView"); - static_assert(alignof(BufferCopyView) == alignof(WGPUBufferCopyView), "alignof mismatch for BufferCopyView"); - - static_assert(offsetof(BufferCopyView, nextInChain) == offsetof(WGPUBufferCopyView, nextInChain), - "offsetof mismatch for BufferCopyView::nextInChain"); - static_assert(offsetof(BufferCopyView, buffer) == offsetof(WGPUBufferCopyView, buffer), - "offsetof mismatch for BufferCopyView::buffer"); - static_assert(offsetof(BufferCopyView, offset) == offsetof(WGPUBufferCopyView, offset), - "offsetof mismatch for BufferCopyView::offset"); - static_assert(offsetof(BufferCopyView, bytesPerRow) == offsetof(WGPUBufferCopyView, bytesPerRow), - "offsetof mismatch for BufferCopyView::bytesPerRow"); - static_assert(offsetof(BufferCopyView, rowsPerImage) == offsetof(WGPUBufferCopyView, rowsPerImage), - "offsetof mismatch for BufferCopyView::rowsPerImage"); - - - static_assert(sizeof(BufferDescriptor) == sizeof(WGPUBufferDescriptor), "sizeof mismatch for BufferDescriptor"); - static_assert(alignof(BufferDescriptor) == alignof(WGPUBufferDescriptor), "alignof mismatch for BufferDescriptor"); - - static_assert(offsetof(BufferDescriptor, nextInChain) == offsetof(WGPUBufferDescriptor, nextInChain), - "offsetof mismatch for BufferDescriptor::nextInChain"); - static_assert(offsetof(BufferDescriptor, label) == offsetof(WGPUBufferDescriptor, label), - "offsetof mismatch for BufferDescriptor::label"); - static_assert(offsetof(BufferDescriptor, usage) == offsetof(WGPUBufferDescriptor, usage), - "offsetof mismatch for BufferDescriptor::usage"); - static_assert(offsetof(BufferDescriptor, size) == offsetof(WGPUBufferDescriptor, size), - "offsetof mismatch for BufferDescriptor::size"); - - - static_assert(sizeof(Color) == sizeof(WGPUColor), "sizeof mismatch for Color"); - static_assert(alignof(Color) == alignof(WGPUColor), "alignof mismatch for Color"); - - static_assert(offsetof(Color, r) == offsetof(WGPUColor, r), - "offsetof mismatch for Color::r"); - static_assert(offsetof(Color, g) == offsetof(WGPUColor, g), - "offsetof mismatch for Color::g"); - static_assert(offsetof(Color, b) == offsetof(WGPUColor, b), - "offsetof mismatch for Color::b"); - static_assert(offsetof(Color, a) == offsetof(WGPUColor, a), - "offsetof mismatch for Color::a"); - - - static_assert(sizeof(CommandBufferDescriptor) == sizeof(WGPUCommandBufferDescriptor), "sizeof mismatch for CommandBufferDescriptor"); - static_assert(alignof(CommandBufferDescriptor) == alignof(WGPUCommandBufferDescriptor), "alignof mismatch for CommandBufferDescriptor"); - - static_assert(offsetof(CommandBufferDescriptor, nextInChain) == offsetof(WGPUCommandBufferDescriptor, nextInChain), - "offsetof mismatch for CommandBufferDescriptor::nextInChain"); - static_assert(offsetof(CommandBufferDescriptor, label) == offsetof(WGPUCommandBufferDescriptor, label), - "offsetof mismatch for CommandBufferDescriptor::label"); - - - static_assert(sizeof(CommandEncoderDescriptor) == sizeof(WGPUCommandEncoderDescriptor), "sizeof mismatch for CommandEncoderDescriptor"); - static_assert(alignof(CommandEncoderDescriptor) == alignof(WGPUCommandEncoderDescriptor), "alignof mismatch for CommandEncoderDescriptor"); - - static_assert(offsetof(CommandEncoderDescriptor, nextInChain) == offsetof(WGPUCommandEncoderDescriptor, nextInChain), - "offsetof mismatch for CommandEncoderDescriptor::nextInChain"); - static_assert(offsetof(CommandEncoderDescriptor, label) == offsetof(WGPUCommandEncoderDescriptor, label), - "offsetof mismatch for CommandEncoderDescriptor::label"); - - - static_assert(sizeof(ComputePassDescriptor) == sizeof(WGPUComputePassDescriptor), "sizeof mismatch for ComputePassDescriptor"); - static_assert(alignof(ComputePassDescriptor) == alignof(WGPUComputePassDescriptor), "alignof mismatch for ComputePassDescriptor"); - - static_assert(offsetof(ComputePassDescriptor, nextInChain) == offsetof(WGPUComputePassDescriptor, nextInChain), - "offsetof mismatch for ComputePassDescriptor::nextInChain"); - static_assert(offsetof(ComputePassDescriptor, label) == offsetof(WGPUComputePassDescriptor, label), - "offsetof mismatch for ComputePassDescriptor::label"); - - - static_assert(sizeof(CreateBufferMappedResult) == sizeof(WGPUCreateBufferMappedResult), "sizeof mismatch for CreateBufferMappedResult"); - static_assert(alignof(CreateBufferMappedResult) == alignof(WGPUCreateBufferMappedResult), "alignof mismatch for CreateBufferMappedResult"); - - static_assert(offsetof(CreateBufferMappedResult, buffer) == offsetof(WGPUCreateBufferMappedResult, buffer), - "offsetof mismatch for CreateBufferMappedResult::buffer"); - static_assert(offsetof(CreateBufferMappedResult, dataLength) == offsetof(WGPUCreateBufferMappedResult, dataLength), - "offsetof mismatch for CreateBufferMappedResult::dataLength"); - static_assert(offsetof(CreateBufferMappedResult, data) == offsetof(WGPUCreateBufferMappedResult, data), - "offsetof mismatch for CreateBufferMappedResult::data"); - - - static_assert(sizeof(DeviceProperties) == sizeof(WGPUDeviceProperties), "sizeof mismatch for DeviceProperties"); - static_assert(alignof(DeviceProperties) == alignof(WGPUDeviceProperties), "alignof mismatch for DeviceProperties"); - - static_assert(offsetof(DeviceProperties, textureCompressionBC) == offsetof(WGPUDeviceProperties, textureCompressionBC), - "offsetof mismatch for DeviceProperties::textureCompressionBC"); - static_assert(offsetof(DeviceProperties, shaderFloat16) == offsetof(WGPUDeviceProperties, shaderFloat16), - "offsetof mismatch for DeviceProperties::shaderFloat16"); - static_assert(offsetof(DeviceProperties, pipelineStatisticsQuery) == offsetof(WGPUDeviceProperties, pipelineStatisticsQuery), - "offsetof mismatch for DeviceProperties::pipelineStatisticsQuery"); - static_assert(offsetof(DeviceProperties, timestampQuery) == offsetof(WGPUDeviceProperties, timestampQuery), - "offsetof mismatch for DeviceProperties::timestampQuery"); - - - static_assert(sizeof(Extent3D) == sizeof(WGPUExtent3D), "sizeof mismatch for Extent3D"); - static_assert(alignof(Extent3D) == alignof(WGPUExtent3D), "alignof mismatch for Extent3D"); - - static_assert(offsetof(Extent3D, width) == offsetof(WGPUExtent3D, width), - "offsetof mismatch for Extent3D::width"); - static_assert(offsetof(Extent3D, height) == offsetof(WGPUExtent3D, height), - "offsetof mismatch for Extent3D::height"); - static_assert(offsetof(Extent3D, depth) == offsetof(WGPUExtent3D, depth), - "offsetof mismatch for Extent3D::depth"); - - - static_assert(sizeof(FenceDescriptor) == sizeof(WGPUFenceDescriptor), "sizeof mismatch for FenceDescriptor"); - static_assert(alignof(FenceDescriptor) == alignof(WGPUFenceDescriptor), "alignof mismatch for FenceDescriptor"); - - static_assert(offsetof(FenceDescriptor, nextInChain) == offsetof(WGPUFenceDescriptor, nextInChain), - "offsetof mismatch for FenceDescriptor::nextInChain"); - static_assert(offsetof(FenceDescriptor, label) == offsetof(WGPUFenceDescriptor, label), - "offsetof mismatch for FenceDescriptor::label"); - static_assert(offsetof(FenceDescriptor, initialValue) == offsetof(WGPUFenceDescriptor, initialValue), - "offsetof mismatch for FenceDescriptor::initialValue"); - - - static_assert(sizeof(InstanceDescriptor) == sizeof(WGPUInstanceDescriptor), "sizeof mismatch for InstanceDescriptor"); - static_assert(alignof(InstanceDescriptor) == alignof(WGPUInstanceDescriptor), "alignof mismatch for InstanceDescriptor"); - - static_assert(offsetof(InstanceDescriptor, nextInChain) == offsetof(WGPUInstanceDescriptor, nextInChain), - "offsetof mismatch for InstanceDescriptor::nextInChain"); - - - static_assert(sizeof(Origin3D) == sizeof(WGPUOrigin3D), "sizeof mismatch for Origin3D"); - static_assert(alignof(Origin3D) == alignof(WGPUOrigin3D), "alignof mismatch for Origin3D"); - - static_assert(offsetof(Origin3D, x) == offsetof(WGPUOrigin3D, x), - "offsetof mismatch for Origin3D::x"); - static_assert(offsetof(Origin3D, y) == offsetof(WGPUOrigin3D, y), - "offsetof mismatch for Origin3D::y"); - static_assert(offsetof(Origin3D, z) == offsetof(WGPUOrigin3D, z), - "offsetof mismatch for Origin3D::z"); - - - static_assert(sizeof(PipelineLayoutDescriptor) == sizeof(WGPUPipelineLayoutDescriptor), "sizeof mismatch for PipelineLayoutDescriptor"); - static_assert(alignof(PipelineLayoutDescriptor) == alignof(WGPUPipelineLayoutDescriptor), "alignof mismatch for PipelineLayoutDescriptor"); - - static_assert(offsetof(PipelineLayoutDescriptor, nextInChain) == offsetof(WGPUPipelineLayoutDescriptor, nextInChain), - "offsetof mismatch for PipelineLayoutDescriptor::nextInChain"); - static_assert(offsetof(PipelineLayoutDescriptor, label) == offsetof(WGPUPipelineLayoutDescriptor, label), - "offsetof mismatch for PipelineLayoutDescriptor::label"); - static_assert(offsetof(PipelineLayoutDescriptor, bindGroupLayoutCount) == offsetof(WGPUPipelineLayoutDescriptor, bindGroupLayoutCount), - "offsetof mismatch for PipelineLayoutDescriptor::bindGroupLayoutCount"); - static_assert(offsetof(PipelineLayoutDescriptor, bindGroupLayouts) == offsetof(WGPUPipelineLayoutDescriptor, bindGroupLayouts), - "offsetof mismatch for PipelineLayoutDescriptor::bindGroupLayouts"); - - - static_assert(sizeof(ProgrammableStageDescriptor) == sizeof(WGPUProgrammableStageDescriptor), "sizeof mismatch for ProgrammableStageDescriptor"); - static_assert(alignof(ProgrammableStageDescriptor) == alignof(WGPUProgrammableStageDescriptor), "alignof mismatch for ProgrammableStageDescriptor"); - - static_assert(offsetof(ProgrammableStageDescriptor, nextInChain) == offsetof(WGPUProgrammableStageDescriptor, nextInChain), - "offsetof mismatch for ProgrammableStageDescriptor::nextInChain"); - static_assert(offsetof(ProgrammableStageDescriptor, module) == offsetof(WGPUProgrammableStageDescriptor, module), - "offsetof mismatch for ProgrammableStageDescriptor::module"); - static_assert(offsetof(ProgrammableStageDescriptor, entryPoint) == offsetof(WGPUProgrammableStageDescriptor, entryPoint), - "offsetof mismatch for ProgrammableStageDescriptor::entryPoint"); - - - static_assert(sizeof(RasterizationStateDescriptor) == sizeof(WGPURasterizationStateDescriptor), "sizeof mismatch for RasterizationStateDescriptor"); - static_assert(alignof(RasterizationStateDescriptor) == alignof(WGPURasterizationStateDescriptor), "alignof mismatch for RasterizationStateDescriptor"); - - static_assert(offsetof(RasterizationStateDescriptor, nextInChain) == offsetof(WGPURasterizationStateDescriptor, nextInChain), - "offsetof mismatch for RasterizationStateDescriptor::nextInChain"); - static_assert(offsetof(RasterizationStateDescriptor, frontFace) == offsetof(WGPURasterizationStateDescriptor, frontFace), - "offsetof mismatch for RasterizationStateDescriptor::frontFace"); - static_assert(offsetof(RasterizationStateDescriptor, cullMode) == offsetof(WGPURasterizationStateDescriptor, cullMode), - "offsetof mismatch for RasterizationStateDescriptor::cullMode"); - static_assert(offsetof(RasterizationStateDescriptor, depthBias) == offsetof(WGPURasterizationStateDescriptor, depthBias), - "offsetof mismatch for RasterizationStateDescriptor::depthBias"); - static_assert(offsetof(RasterizationStateDescriptor, depthBiasSlopeScale) == offsetof(WGPURasterizationStateDescriptor, depthBiasSlopeScale), - "offsetof mismatch for RasterizationStateDescriptor::depthBiasSlopeScale"); - static_assert(offsetof(RasterizationStateDescriptor, depthBiasClamp) == offsetof(WGPURasterizationStateDescriptor, depthBiasClamp), - "offsetof mismatch for RasterizationStateDescriptor::depthBiasClamp"); - - - static_assert(sizeof(RenderBundleDescriptor) == sizeof(WGPURenderBundleDescriptor), "sizeof mismatch for RenderBundleDescriptor"); - static_assert(alignof(RenderBundleDescriptor) == alignof(WGPURenderBundleDescriptor), "alignof mismatch for RenderBundleDescriptor"); - - static_assert(offsetof(RenderBundleDescriptor, nextInChain) == offsetof(WGPURenderBundleDescriptor, nextInChain), - "offsetof mismatch for RenderBundleDescriptor::nextInChain"); - static_assert(offsetof(RenderBundleDescriptor, label) == offsetof(WGPURenderBundleDescriptor, label), - "offsetof mismatch for RenderBundleDescriptor::label"); - - - static_assert(sizeof(RenderBundleEncoderDescriptor) == sizeof(WGPURenderBundleEncoderDescriptor), "sizeof mismatch for RenderBundleEncoderDescriptor"); - static_assert(alignof(RenderBundleEncoderDescriptor) == alignof(WGPURenderBundleEncoderDescriptor), "alignof mismatch for RenderBundleEncoderDescriptor"); - - static_assert(offsetof(RenderBundleEncoderDescriptor, nextInChain) == offsetof(WGPURenderBundleEncoderDescriptor, nextInChain), - "offsetof mismatch for RenderBundleEncoderDescriptor::nextInChain"); - static_assert(offsetof(RenderBundleEncoderDescriptor, label) == offsetof(WGPURenderBundleEncoderDescriptor, label), - "offsetof mismatch for RenderBundleEncoderDescriptor::label"); - static_assert(offsetof(RenderBundleEncoderDescriptor, colorFormatsCount) == offsetof(WGPURenderBundleEncoderDescriptor, colorFormatsCount), - "offsetof mismatch for RenderBundleEncoderDescriptor::colorFormatsCount"); - static_assert(offsetof(RenderBundleEncoderDescriptor, colorFormats) == offsetof(WGPURenderBundleEncoderDescriptor, colorFormats), - "offsetof mismatch for RenderBundleEncoderDescriptor::colorFormats"); - static_assert(offsetof(RenderBundleEncoderDescriptor, depthStencilFormat) == offsetof(WGPURenderBundleEncoderDescriptor, depthStencilFormat), - "offsetof mismatch for RenderBundleEncoderDescriptor::depthStencilFormat"); - static_assert(offsetof(RenderBundleEncoderDescriptor, sampleCount) == offsetof(WGPURenderBundleEncoderDescriptor, sampleCount), - "offsetof mismatch for RenderBundleEncoderDescriptor::sampleCount"); - - - static_assert(sizeof(RenderPassDepthStencilAttachmentDescriptor) == sizeof(WGPURenderPassDepthStencilAttachmentDescriptor), "sizeof mismatch for RenderPassDepthStencilAttachmentDescriptor"); - static_assert(alignof(RenderPassDepthStencilAttachmentDescriptor) == alignof(WGPURenderPassDepthStencilAttachmentDescriptor), "alignof mismatch for RenderPassDepthStencilAttachmentDescriptor"); - - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, attachment) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, attachment), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::attachment"); - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, depthLoadOp) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, depthLoadOp), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::depthLoadOp"); - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, depthStoreOp) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, depthStoreOp), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::depthStoreOp"); - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, clearDepth) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, clearDepth), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::clearDepth"); - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, stencilLoadOp) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, stencilLoadOp), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::stencilLoadOp"); - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, stencilStoreOp) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, stencilStoreOp), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::stencilStoreOp"); - static_assert(offsetof(RenderPassDepthStencilAttachmentDescriptor, clearStencil) == offsetof(WGPURenderPassDepthStencilAttachmentDescriptor, clearStencil), - "offsetof mismatch for RenderPassDepthStencilAttachmentDescriptor::clearStencil"); - - - static_assert(sizeof(SamplerDescriptor) == sizeof(WGPUSamplerDescriptor), "sizeof mismatch for SamplerDescriptor"); - static_assert(alignof(SamplerDescriptor) == alignof(WGPUSamplerDescriptor), "alignof mismatch for SamplerDescriptor"); - - static_assert(offsetof(SamplerDescriptor, nextInChain) == offsetof(WGPUSamplerDescriptor, nextInChain), - "offsetof mismatch for SamplerDescriptor::nextInChain"); - static_assert(offsetof(SamplerDescriptor, label) == offsetof(WGPUSamplerDescriptor, label), - "offsetof mismatch for SamplerDescriptor::label"); - static_assert(offsetof(SamplerDescriptor, addressModeU) == offsetof(WGPUSamplerDescriptor, addressModeU), - "offsetof mismatch for SamplerDescriptor::addressModeU"); - static_assert(offsetof(SamplerDescriptor, addressModeV) == offsetof(WGPUSamplerDescriptor, addressModeV), - "offsetof mismatch for SamplerDescriptor::addressModeV"); - static_assert(offsetof(SamplerDescriptor, addressModeW) == offsetof(WGPUSamplerDescriptor, addressModeW), - "offsetof mismatch for SamplerDescriptor::addressModeW"); - static_assert(offsetof(SamplerDescriptor, magFilter) == offsetof(WGPUSamplerDescriptor, magFilter), - "offsetof mismatch for SamplerDescriptor::magFilter"); - static_assert(offsetof(SamplerDescriptor, minFilter) == offsetof(WGPUSamplerDescriptor, minFilter), - "offsetof mismatch for SamplerDescriptor::minFilter"); - static_assert(offsetof(SamplerDescriptor, mipmapFilter) == offsetof(WGPUSamplerDescriptor, mipmapFilter), - "offsetof mismatch for SamplerDescriptor::mipmapFilter"); - static_assert(offsetof(SamplerDescriptor, lodMinClamp) == offsetof(WGPUSamplerDescriptor, lodMinClamp), - "offsetof mismatch for SamplerDescriptor::lodMinClamp"); - static_assert(offsetof(SamplerDescriptor, lodMaxClamp) == offsetof(WGPUSamplerDescriptor, lodMaxClamp), - "offsetof mismatch for SamplerDescriptor::lodMaxClamp"); - static_assert(offsetof(SamplerDescriptor, compare) == offsetof(WGPUSamplerDescriptor, compare), - "offsetof mismatch for SamplerDescriptor::compare"); - - - static_assert(sizeof(SamplerDescriptorDummyAnisotropicFiltering) == sizeof(WGPUSamplerDescriptorDummyAnisotropicFiltering), "sizeof mismatch for SamplerDescriptorDummyAnisotropicFiltering"); - static_assert(alignof(SamplerDescriptorDummyAnisotropicFiltering) == alignof(WGPUSamplerDescriptorDummyAnisotropicFiltering), "alignof mismatch for SamplerDescriptorDummyAnisotropicFiltering"); - - static_assert(offsetof(SamplerDescriptorDummyAnisotropicFiltering, maxAnisotropy) == offsetof(WGPUSamplerDescriptorDummyAnisotropicFiltering, maxAnisotropy), - "offsetof mismatch for SamplerDescriptorDummyAnisotropicFiltering::maxAnisotropy"); - - - static_assert(sizeof(ShaderModuleDescriptor) == sizeof(WGPUShaderModuleDescriptor), "sizeof mismatch for ShaderModuleDescriptor"); - static_assert(alignof(ShaderModuleDescriptor) == alignof(WGPUShaderModuleDescriptor), "alignof mismatch for ShaderModuleDescriptor"); - - static_assert(offsetof(ShaderModuleDescriptor, nextInChain) == offsetof(WGPUShaderModuleDescriptor, nextInChain), - "offsetof mismatch for ShaderModuleDescriptor::nextInChain"); - static_assert(offsetof(ShaderModuleDescriptor, label) == offsetof(WGPUShaderModuleDescriptor, label), - "offsetof mismatch for ShaderModuleDescriptor::label"); - - - static_assert(sizeof(ShaderModuleSPIRVDescriptor) == sizeof(WGPUShaderModuleSPIRVDescriptor), "sizeof mismatch for ShaderModuleSPIRVDescriptor"); - static_assert(alignof(ShaderModuleSPIRVDescriptor) == alignof(WGPUShaderModuleSPIRVDescriptor), "alignof mismatch for ShaderModuleSPIRVDescriptor"); - - static_assert(offsetof(ShaderModuleSPIRVDescriptor, codeSize) == offsetof(WGPUShaderModuleSPIRVDescriptor, codeSize), - "offsetof mismatch for ShaderModuleSPIRVDescriptor::codeSize"); - static_assert(offsetof(ShaderModuleSPIRVDescriptor, code) == offsetof(WGPUShaderModuleSPIRVDescriptor, code), - "offsetof mismatch for ShaderModuleSPIRVDescriptor::code"); - - - static_assert(sizeof(ShaderModuleWGSLDescriptor) == sizeof(WGPUShaderModuleWGSLDescriptor), "sizeof mismatch for ShaderModuleWGSLDescriptor"); - static_assert(alignof(ShaderModuleWGSLDescriptor) == alignof(WGPUShaderModuleWGSLDescriptor), "alignof mismatch for ShaderModuleWGSLDescriptor"); - - static_assert(offsetof(ShaderModuleWGSLDescriptor, source) == offsetof(WGPUShaderModuleWGSLDescriptor, source), - "offsetof mismatch for ShaderModuleWGSLDescriptor::source"); - - - static_assert(sizeof(StencilStateFaceDescriptor) == sizeof(WGPUStencilStateFaceDescriptor), "sizeof mismatch for StencilStateFaceDescriptor"); - static_assert(alignof(StencilStateFaceDescriptor) == alignof(WGPUStencilStateFaceDescriptor), "alignof mismatch for StencilStateFaceDescriptor"); - - static_assert(offsetof(StencilStateFaceDescriptor, compare) == offsetof(WGPUStencilStateFaceDescriptor, compare), - "offsetof mismatch for StencilStateFaceDescriptor::compare"); - static_assert(offsetof(StencilStateFaceDescriptor, failOp) == offsetof(WGPUStencilStateFaceDescriptor, failOp), - "offsetof mismatch for StencilStateFaceDescriptor::failOp"); - static_assert(offsetof(StencilStateFaceDescriptor, depthFailOp) == offsetof(WGPUStencilStateFaceDescriptor, depthFailOp), - "offsetof mismatch for StencilStateFaceDescriptor::depthFailOp"); - static_assert(offsetof(StencilStateFaceDescriptor, passOp) == offsetof(WGPUStencilStateFaceDescriptor, passOp), - "offsetof mismatch for StencilStateFaceDescriptor::passOp"); - - - static_assert(sizeof(SurfaceDescriptor) == sizeof(WGPUSurfaceDescriptor), "sizeof mismatch for SurfaceDescriptor"); - static_assert(alignof(SurfaceDescriptor) == alignof(WGPUSurfaceDescriptor), "alignof mismatch for SurfaceDescriptor"); - - static_assert(offsetof(SurfaceDescriptor, nextInChain) == offsetof(WGPUSurfaceDescriptor, nextInChain), - "offsetof mismatch for SurfaceDescriptor::nextInChain"); - static_assert(offsetof(SurfaceDescriptor, label) == offsetof(WGPUSurfaceDescriptor, label), - "offsetof mismatch for SurfaceDescriptor::label"); - - - static_assert(sizeof(SurfaceDescriptorFromHTMLCanvasId) == sizeof(WGPUSurfaceDescriptorFromHTMLCanvasId), "sizeof mismatch for SurfaceDescriptorFromHTMLCanvasId"); - static_assert(alignof(SurfaceDescriptorFromHTMLCanvasId) == alignof(WGPUSurfaceDescriptorFromHTMLCanvasId), "alignof mismatch for SurfaceDescriptorFromHTMLCanvasId"); - - static_assert(offsetof(SurfaceDescriptorFromHTMLCanvasId, id) == offsetof(WGPUSurfaceDescriptorFromHTMLCanvasId, id), - "offsetof mismatch for SurfaceDescriptorFromHTMLCanvasId::id"); - - - static_assert(sizeof(SurfaceDescriptorFromMetalLayer) == sizeof(WGPUSurfaceDescriptorFromMetalLayer), "sizeof mismatch for SurfaceDescriptorFromMetalLayer"); - static_assert(alignof(SurfaceDescriptorFromMetalLayer) == alignof(WGPUSurfaceDescriptorFromMetalLayer), "alignof mismatch for SurfaceDescriptorFromMetalLayer"); - - static_assert(offsetof(SurfaceDescriptorFromMetalLayer, layer) == offsetof(WGPUSurfaceDescriptorFromMetalLayer, layer), - "offsetof mismatch for SurfaceDescriptorFromMetalLayer::layer"); - - - static_assert(sizeof(SurfaceDescriptorFromWindowsHWND) == sizeof(WGPUSurfaceDescriptorFromWindowsHWND), "sizeof mismatch for SurfaceDescriptorFromWindowsHWND"); - static_assert(alignof(SurfaceDescriptorFromWindowsHWND) == alignof(WGPUSurfaceDescriptorFromWindowsHWND), "alignof mismatch for SurfaceDescriptorFromWindowsHWND"); - - static_assert(offsetof(SurfaceDescriptorFromWindowsHWND, hinstance) == offsetof(WGPUSurfaceDescriptorFromWindowsHWND, hinstance), - "offsetof mismatch for SurfaceDescriptorFromWindowsHWND::hinstance"); - static_assert(offsetof(SurfaceDescriptorFromWindowsHWND, hwnd) == offsetof(WGPUSurfaceDescriptorFromWindowsHWND, hwnd), - "offsetof mismatch for SurfaceDescriptorFromWindowsHWND::hwnd"); - - - static_assert(sizeof(SurfaceDescriptorFromXlib) == sizeof(WGPUSurfaceDescriptorFromXlib), "sizeof mismatch for SurfaceDescriptorFromXlib"); - static_assert(alignof(SurfaceDescriptorFromXlib) == alignof(WGPUSurfaceDescriptorFromXlib), "alignof mismatch for SurfaceDescriptorFromXlib"); - - static_assert(offsetof(SurfaceDescriptorFromXlib, display) == offsetof(WGPUSurfaceDescriptorFromXlib, display), - "offsetof mismatch for SurfaceDescriptorFromXlib::display"); - static_assert(offsetof(SurfaceDescriptorFromXlib, window) == offsetof(WGPUSurfaceDescriptorFromXlib, window), - "offsetof mismatch for SurfaceDescriptorFromXlib::window"); - - - static_assert(sizeof(SwapChainDescriptor) == sizeof(WGPUSwapChainDescriptor), "sizeof mismatch for SwapChainDescriptor"); - static_assert(alignof(SwapChainDescriptor) == alignof(WGPUSwapChainDescriptor), "alignof mismatch for SwapChainDescriptor"); - - static_assert(offsetof(SwapChainDescriptor, nextInChain) == offsetof(WGPUSwapChainDescriptor, nextInChain), - "offsetof mismatch for SwapChainDescriptor::nextInChain"); - static_assert(offsetof(SwapChainDescriptor, label) == offsetof(WGPUSwapChainDescriptor, label), - "offsetof mismatch for SwapChainDescriptor::label"); - static_assert(offsetof(SwapChainDescriptor, usage) == offsetof(WGPUSwapChainDescriptor, usage), - "offsetof mismatch for SwapChainDescriptor::usage"); - static_assert(offsetof(SwapChainDescriptor, format) == offsetof(WGPUSwapChainDescriptor, format), - "offsetof mismatch for SwapChainDescriptor::format"); - static_assert(offsetof(SwapChainDescriptor, width) == offsetof(WGPUSwapChainDescriptor, width), - "offsetof mismatch for SwapChainDescriptor::width"); - static_assert(offsetof(SwapChainDescriptor, height) == offsetof(WGPUSwapChainDescriptor, height), - "offsetof mismatch for SwapChainDescriptor::height"); - static_assert(offsetof(SwapChainDescriptor, presentMode) == offsetof(WGPUSwapChainDescriptor, presentMode), - "offsetof mismatch for SwapChainDescriptor::presentMode"); - static_assert(offsetof(SwapChainDescriptor, implementation) == offsetof(WGPUSwapChainDescriptor, implementation), - "offsetof mismatch for SwapChainDescriptor::implementation"); - - - static_assert(sizeof(TextureViewDescriptor) == sizeof(WGPUTextureViewDescriptor), "sizeof mismatch for TextureViewDescriptor"); - static_assert(alignof(TextureViewDescriptor) == alignof(WGPUTextureViewDescriptor), "alignof mismatch for TextureViewDescriptor"); - - static_assert(offsetof(TextureViewDescriptor, nextInChain) == offsetof(WGPUTextureViewDescriptor, nextInChain), - "offsetof mismatch for TextureViewDescriptor::nextInChain"); - static_assert(offsetof(TextureViewDescriptor, label) == offsetof(WGPUTextureViewDescriptor, label), - "offsetof mismatch for TextureViewDescriptor::label"); - static_assert(offsetof(TextureViewDescriptor, format) == offsetof(WGPUTextureViewDescriptor, format), - "offsetof mismatch for TextureViewDescriptor::format"); - static_assert(offsetof(TextureViewDescriptor, dimension) == offsetof(WGPUTextureViewDescriptor, dimension), - "offsetof mismatch for TextureViewDescriptor::dimension"); - static_assert(offsetof(TextureViewDescriptor, baseMipLevel) == offsetof(WGPUTextureViewDescriptor, baseMipLevel), - "offsetof mismatch for TextureViewDescriptor::baseMipLevel"); - static_assert(offsetof(TextureViewDescriptor, mipLevelCount) == offsetof(WGPUTextureViewDescriptor, mipLevelCount), - "offsetof mismatch for TextureViewDescriptor::mipLevelCount"); - static_assert(offsetof(TextureViewDescriptor, baseArrayLayer) == offsetof(WGPUTextureViewDescriptor, baseArrayLayer), - "offsetof mismatch for TextureViewDescriptor::baseArrayLayer"); - static_assert(offsetof(TextureViewDescriptor, arrayLayerCount) == offsetof(WGPUTextureViewDescriptor, arrayLayerCount), - "offsetof mismatch for TextureViewDescriptor::arrayLayerCount"); - static_assert(offsetof(TextureViewDescriptor, aspect) == offsetof(WGPUTextureViewDescriptor, aspect), - "offsetof mismatch for TextureViewDescriptor::aspect"); - - - static_assert(sizeof(VertexAttributeDescriptor) == sizeof(WGPUVertexAttributeDescriptor), "sizeof mismatch for VertexAttributeDescriptor"); - static_assert(alignof(VertexAttributeDescriptor) == alignof(WGPUVertexAttributeDescriptor), "alignof mismatch for VertexAttributeDescriptor"); - - static_assert(offsetof(VertexAttributeDescriptor, format) == offsetof(WGPUVertexAttributeDescriptor, format), - "offsetof mismatch for VertexAttributeDescriptor::format"); - static_assert(offsetof(VertexAttributeDescriptor, offset) == offsetof(WGPUVertexAttributeDescriptor, offset), - "offsetof mismatch for VertexAttributeDescriptor::offset"); - static_assert(offsetof(VertexAttributeDescriptor, shaderLocation) == offsetof(WGPUVertexAttributeDescriptor, shaderLocation), - "offsetof mismatch for VertexAttributeDescriptor::shaderLocation"); - - - static_assert(sizeof(BindGroupDescriptor) == sizeof(WGPUBindGroupDescriptor), "sizeof mismatch for BindGroupDescriptor"); - static_assert(alignof(BindGroupDescriptor) == alignof(WGPUBindGroupDescriptor), "alignof mismatch for BindGroupDescriptor"); - - static_assert(offsetof(BindGroupDescriptor, nextInChain) == offsetof(WGPUBindGroupDescriptor, nextInChain), - "offsetof mismatch for BindGroupDescriptor::nextInChain"); - static_assert(offsetof(BindGroupDescriptor, label) == offsetof(WGPUBindGroupDescriptor, label), - "offsetof mismatch for BindGroupDescriptor::label"); - static_assert(offsetof(BindGroupDescriptor, layout) == offsetof(WGPUBindGroupDescriptor, layout), - "offsetof mismatch for BindGroupDescriptor::layout"); - static_assert(offsetof(BindGroupDescriptor, entryCount) == offsetof(WGPUBindGroupDescriptor, entryCount), - "offsetof mismatch for BindGroupDescriptor::entryCount"); - static_assert(offsetof(BindGroupDescriptor, entries) == offsetof(WGPUBindGroupDescriptor, entries), - "offsetof mismatch for BindGroupDescriptor::entries"); - - - static_assert(sizeof(BindGroupLayoutDescriptor) == sizeof(WGPUBindGroupLayoutDescriptor), "sizeof mismatch for BindGroupLayoutDescriptor"); - static_assert(alignof(BindGroupLayoutDescriptor) == alignof(WGPUBindGroupLayoutDescriptor), "alignof mismatch for BindGroupLayoutDescriptor"); - - static_assert(offsetof(BindGroupLayoutDescriptor, nextInChain) == offsetof(WGPUBindGroupLayoutDescriptor, nextInChain), - "offsetof mismatch for BindGroupLayoutDescriptor::nextInChain"); - static_assert(offsetof(BindGroupLayoutDescriptor, label) == offsetof(WGPUBindGroupLayoutDescriptor, label), - "offsetof mismatch for BindGroupLayoutDescriptor::label"); - static_assert(offsetof(BindGroupLayoutDescriptor, entryCount) == offsetof(WGPUBindGroupLayoutDescriptor, entryCount), - "offsetof mismatch for BindGroupLayoutDescriptor::entryCount"); - static_assert(offsetof(BindGroupLayoutDescriptor, entries) == offsetof(WGPUBindGroupLayoutDescriptor, entries), - "offsetof mismatch for BindGroupLayoutDescriptor::entries"); - - - static_assert(sizeof(ColorStateDescriptor) == sizeof(WGPUColorStateDescriptor), "sizeof mismatch for ColorStateDescriptor"); - static_assert(alignof(ColorStateDescriptor) == alignof(WGPUColorStateDescriptor), "alignof mismatch for ColorStateDescriptor"); - - static_assert(offsetof(ColorStateDescriptor, nextInChain) == offsetof(WGPUColorStateDescriptor, nextInChain), - "offsetof mismatch for ColorStateDescriptor::nextInChain"); - static_assert(offsetof(ColorStateDescriptor, format) == offsetof(WGPUColorStateDescriptor, format), - "offsetof mismatch for ColorStateDescriptor::format"); - static_assert(offsetof(ColorStateDescriptor, alphaBlend) == offsetof(WGPUColorStateDescriptor, alphaBlend), - "offsetof mismatch for ColorStateDescriptor::alphaBlend"); - static_assert(offsetof(ColorStateDescriptor, colorBlend) == offsetof(WGPUColorStateDescriptor, colorBlend), - "offsetof mismatch for ColorStateDescriptor::colorBlend"); - static_assert(offsetof(ColorStateDescriptor, writeMask) == offsetof(WGPUColorStateDescriptor, writeMask), - "offsetof mismatch for ColorStateDescriptor::writeMask"); - - - static_assert(sizeof(ComputePipelineDescriptor) == sizeof(WGPUComputePipelineDescriptor), "sizeof mismatch for ComputePipelineDescriptor"); - static_assert(alignof(ComputePipelineDescriptor) == alignof(WGPUComputePipelineDescriptor), "alignof mismatch for ComputePipelineDescriptor"); - - static_assert(offsetof(ComputePipelineDescriptor, nextInChain) == offsetof(WGPUComputePipelineDescriptor, nextInChain), - "offsetof mismatch for ComputePipelineDescriptor::nextInChain"); - static_assert(offsetof(ComputePipelineDescriptor, label) == offsetof(WGPUComputePipelineDescriptor, label), - "offsetof mismatch for ComputePipelineDescriptor::label"); - static_assert(offsetof(ComputePipelineDescriptor, layout) == offsetof(WGPUComputePipelineDescriptor, layout), - "offsetof mismatch for ComputePipelineDescriptor::layout"); - static_assert(offsetof(ComputePipelineDescriptor, computeStage) == offsetof(WGPUComputePipelineDescriptor, computeStage), - "offsetof mismatch for ComputePipelineDescriptor::computeStage"); - - - static_assert(sizeof(DepthStencilStateDescriptor) == sizeof(WGPUDepthStencilStateDescriptor), "sizeof mismatch for DepthStencilStateDescriptor"); - static_assert(alignof(DepthStencilStateDescriptor) == alignof(WGPUDepthStencilStateDescriptor), "alignof mismatch for DepthStencilStateDescriptor"); - - static_assert(offsetof(DepthStencilStateDescriptor, nextInChain) == offsetof(WGPUDepthStencilStateDescriptor, nextInChain), - "offsetof mismatch for DepthStencilStateDescriptor::nextInChain"); - static_assert(offsetof(DepthStencilStateDescriptor, format) == offsetof(WGPUDepthStencilStateDescriptor, format), - "offsetof mismatch for DepthStencilStateDescriptor::format"); - static_assert(offsetof(DepthStencilStateDescriptor, depthWriteEnabled) == offsetof(WGPUDepthStencilStateDescriptor, depthWriteEnabled), - "offsetof mismatch for DepthStencilStateDescriptor::depthWriteEnabled"); - static_assert(offsetof(DepthStencilStateDescriptor, depthCompare) == offsetof(WGPUDepthStencilStateDescriptor, depthCompare), - "offsetof mismatch for DepthStencilStateDescriptor::depthCompare"); - static_assert(offsetof(DepthStencilStateDescriptor, stencilFront) == offsetof(WGPUDepthStencilStateDescriptor, stencilFront), - "offsetof mismatch for DepthStencilStateDescriptor::stencilFront"); - static_assert(offsetof(DepthStencilStateDescriptor, stencilBack) == offsetof(WGPUDepthStencilStateDescriptor, stencilBack), - "offsetof mismatch for DepthStencilStateDescriptor::stencilBack"); - static_assert(offsetof(DepthStencilStateDescriptor, stencilReadMask) == offsetof(WGPUDepthStencilStateDescriptor, stencilReadMask), - "offsetof mismatch for DepthStencilStateDescriptor::stencilReadMask"); - static_assert(offsetof(DepthStencilStateDescriptor, stencilWriteMask) == offsetof(WGPUDepthStencilStateDescriptor, stencilWriteMask), - "offsetof mismatch for DepthStencilStateDescriptor::stencilWriteMask"); - - - static_assert(sizeof(RenderPassColorAttachmentDescriptor) == sizeof(WGPURenderPassColorAttachmentDescriptor), "sizeof mismatch for RenderPassColorAttachmentDescriptor"); - static_assert(alignof(RenderPassColorAttachmentDescriptor) == alignof(WGPURenderPassColorAttachmentDescriptor), "alignof mismatch for RenderPassColorAttachmentDescriptor"); - - static_assert(offsetof(RenderPassColorAttachmentDescriptor, attachment) == offsetof(WGPURenderPassColorAttachmentDescriptor, attachment), - "offsetof mismatch for RenderPassColorAttachmentDescriptor::attachment"); - static_assert(offsetof(RenderPassColorAttachmentDescriptor, resolveTarget) == offsetof(WGPURenderPassColorAttachmentDescriptor, resolveTarget), - "offsetof mismatch for RenderPassColorAttachmentDescriptor::resolveTarget"); - static_assert(offsetof(RenderPassColorAttachmentDescriptor, loadOp) == offsetof(WGPURenderPassColorAttachmentDescriptor, loadOp), - "offsetof mismatch for RenderPassColorAttachmentDescriptor::loadOp"); - static_assert(offsetof(RenderPassColorAttachmentDescriptor, storeOp) == offsetof(WGPURenderPassColorAttachmentDescriptor, storeOp), - "offsetof mismatch for RenderPassColorAttachmentDescriptor::storeOp"); - static_assert(offsetof(RenderPassColorAttachmentDescriptor, clearColor) == offsetof(WGPURenderPassColorAttachmentDescriptor, clearColor), - "offsetof mismatch for RenderPassColorAttachmentDescriptor::clearColor"); - - - static_assert(sizeof(RenderPipelineDescriptorDummyExtension) == sizeof(WGPURenderPipelineDescriptorDummyExtension), "sizeof mismatch for RenderPipelineDescriptorDummyExtension"); - static_assert(alignof(RenderPipelineDescriptorDummyExtension) == alignof(WGPURenderPipelineDescriptorDummyExtension), "alignof mismatch for RenderPipelineDescriptorDummyExtension"); - - static_assert(offsetof(RenderPipelineDescriptorDummyExtension, dummyStage) == offsetof(WGPURenderPipelineDescriptorDummyExtension, dummyStage), - "offsetof mismatch for RenderPipelineDescriptorDummyExtension::dummyStage"); - - - static_assert(sizeof(TextureCopyView) == sizeof(WGPUTextureCopyView), "sizeof mismatch for TextureCopyView"); - static_assert(alignof(TextureCopyView) == alignof(WGPUTextureCopyView), "alignof mismatch for TextureCopyView"); - - static_assert(offsetof(TextureCopyView, nextInChain) == offsetof(WGPUTextureCopyView, nextInChain), - "offsetof mismatch for TextureCopyView::nextInChain"); - static_assert(offsetof(TextureCopyView, texture) == offsetof(WGPUTextureCopyView, texture), - "offsetof mismatch for TextureCopyView::texture"); - static_assert(offsetof(TextureCopyView, mipLevel) == offsetof(WGPUTextureCopyView, mipLevel), - "offsetof mismatch for TextureCopyView::mipLevel"); - static_assert(offsetof(TextureCopyView, arrayLayer) == offsetof(WGPUTextureCopyView, arrayLayer), - "offsetof mismatch for TextureCopyView::arrayLayer"); - static_assert(offsetof(TextureCopyView, origin) == offsetof(WGPUTextureCopyView, origin), - "offsetof mismatch for TextureCopyView::origin"); - - - static_assert(sizeof(TextureDescriptor) == sizeof(WGPUTextureDescriptor), "sizeof mismatch for TextureDescriptor"); - static_assert(alignof(TextureDescriptor) == alignof(WGPUTextureDescriptor), "alignof mismatch for TextureDescriptor"); - - static_assert(offsetof(TextureDescriptor, nextInChain) == offsetof(WGPUTextureDescriptor, nextInChain), - "offsetof mismatch for TextureDescriptor::nextInChain"); - static_assert(offsetof(TextureDescriptor, label) == offsetof(WGPUTextureDescriptor, label), - "offsetof mismatch for TextureDescriptor::label"); - static_assert(offsetof(TextureDescriptor, usage) == offsetof(WGPUTextureDescriptor, usage), - "offsetof mismatch for TextureDescriptor::usage"); - static_assert(offsetof(TextureDescriptor, dimension) == offsetof(WGPUTextureDescriptor, dimension), - "offsetof mismatch for TextureDescriptor::dimension"); - static_assert(offsetof(TextureDescriptor, size) == offsetof(WGPUTextureDescriptor, size), - "offsetof mismatch for TextureDescriptor::size"); - static_assert(offsetof(TextureDescriptor, arrayLayerCount) == offsetof(WGPUTextureDescriptor, arrayLayerCount), - "offsetof mismatch for TextureDescriptor::arrayLayerCount"); - static_assert(offsetof(TextureDescriptor, format) == offsetof(WGPUTextureDescriptor, format), - "offsetof mismatch for TextureDescriptor::format"); - static_assert(offsetof(TextureDescriptor, mipLevelCount) == offsetof(WGPUTextureDescriptor, mipLevelCount), - "offsetof mismatch for TextureDescriptor::mipLevelCount"); - static_assert(offsetof(TextureDescriptor, sampleCount) == offsetof(WGPUTextureDescriptor, sampleCount), - "offsetof mismatch for TextureDescriptor::sampleCount"); - - - static_assert(sizeof(VertexBufferLayoutDescriptor) == sizeof(WGPUVertexBufferLayoutDescriptor), "sizeof mismatch for VertexBufferLayoutDescriptor"); - static_assert(alignof(VertexBufferLayoutDescriptor) == alignof(WGPUVertexBufferLayoutDescriptor), "alignof mismatch for VertexBufferLayoutDescriptor"); - - static_assert(offsetof(VertexBufferLayoutDescriptor, arrayStride) == offsetof(WGPUVertexBufferLayoutDescriptor, arrayStride), - "offsetof mismatch for VertexBufferLayoutDescriptor::arrayStride"); - static_assert(offsetof(VertexBufferLayoutDescriptor, stepMode) == offsetof(WGPUVertexBufferLayoutDescriptor, stepMode), - "offsetof mismatch for VertexBufferLayoutDescriptor::stepMode"); - static_assert(offsetof(VertexBufferLayoutDescriptor, attributeCount) == offsetof(WGPUVertexBufferLayoutDescriptor, attributeCount), - "offsetof mismatch for VertexBufferLayoutDescriptor::attributeCount"); - static_assert(offsetof(VertexBufferLayoutDescriptor, attributes) == offsetof(WGPUVertexBufferLayoutDescriptor, attributes), - "offsetof mismatch for VertexBufferLayoutDescriptor::attributes"); - - - static_assert(sizeof(RenderPassDescriptor) == sizeof(WGPURenderPassDescriptor), "sizeof mismatch for RenderPassDescriptor"); - static_assert(alignof(RenderPassDescriptor) == alignof(WGPURenderPassDescriptor), "alignof mismatch for RenderPassDescriptor"); - - static_assert(offsetof(RenderPassDescriptor, nextInChain) == offsetof(WGPURenderPassDescriptor, nextInChain), - "offsetof mismatch for RenderPassDescriptor::nextInChain"); - static_assert(offsetof(RenderPassDescriptor, label) == offsetof(WGPURenderPassDescriptor, label), - "offsetof mismatch for RenderPassDescriptor::label"); - static_assert(offsetof(RenderPassDescriptor, colorAttachmentCount) == offsetof(WGPURenderPassDescriptor, colorAttachmentCount), - "offsetof mismatch for RenderPassDescriptor::colorAttachmentCount"); - static_assert(offsetof(RenderPassDescriptor, colorAttachments) == offsetof(WGPURenderPassDescriptor, colorAttachments), - "offsetof mismatch for RenderPassDescriptor::colorAttachments"); - static_assert(offsetof(RenderPassDescriptor, depthStencilAttachment) == offsetof(WGPURenderPassDescriptor, depthStencilAttachment), - "offsetof mismatch for RenderPassDescriptor::depthStencilAttachment"); - - - static_assert(sizeof(VertexStateDescriptor) == sizeof(WGPUVertexStateDescriptor), "sizeof mismatch for VertexStateDescriptor"); - static_assert(alignof(VertexStateDescriptor) == alignof(WGPUVertexStateDescriptor), "alignof mismatch for VertexStateDescriptor"); - - static_assert(offsetof(VertexStateDescriptor, nextInChain) == offsetof(WGPUVertexStateDescriptor, nextInChain), - "offsetof mismatch for VertexStateDescriptor::nextInChain"); - static_assert(offsetof(VertexStateDescriptor, indexFormat) == offsetof(WGPUVertexStateDescriptor, indexFormat), - "offsetof mismatch for VertexStateDescriptor::indexFormat"); - static_assert(offsetof(VertexStateDescriptor, vertexBufferCount) == offsetof(WGPUVertexStateDescriptor, vertexBufferCount), - "offsetof mismatch for VertexStateDescriptor::vertexBufferCount"); - static_assert(offsetof(VertexStateDescriptor, vertexBuffers) == offsetof(WGPUVertexStateDescriptor, vertexBuffers), - "offsetof mismatch for VertexStateDescriptor::vertexBuffers"); - - - static_assert(sizeof(RenderPipelineDescriptor) == sizeof(WGPURenderPipelineDescriptor), "sizeof mismatch for RenderPipelineDescriptor"); - static_assert(alignof(RenderPipelineDescriptor) == alignof(WGPURenderPipelineDescriptor), "alignof mismatch for RenderPipelineDescriptor"); - - static_assert(offsetof(RenderPipelineDescriptor, nextInChain) == offsetof(WGPURenderPipelineDescriptor, nextInChain), - "offsetof mismatch for RenderPipelineDescriptor::nextInChain"); - static_assert(offsetof(RenderPipelineDescriptor, label) == offsetof(WGPURenderPipelineDescriptor, label), - "offsetof mismatch for RenderPipelineDescriptor::label"); - static_assert(offsetof(RenderPipelineDescriptor, layout) == offsetof(WGPURenderPipelineDescriptor, layout), - "offsetof mismatch for RenderPipelineDescriptor::layout"); - static_assert(offsetof(RenderPipelineDescriptor, vertexStage) == offsetof(WGPURenderPipelineDescriptor, vertexStage), - "offsetof mismatch for RenderPipelineDescriptor::vertexStage"); - static_assert(offsetof(RenderPipelineDescriptor, fragmentStage) == offsetof(WGPURenderPipelineDescriptor, fragmentStage), - "offsetof mismatch for RenderPipelineDescriptor::fragmentStage"); - static_assert(offsetof(RenderPipelineDescriptor, vertexState) == offsetof(WGPURenderPipelineDescriptor, vertexState), - "offsetof mismatch for RenderPipelineDescriptor::vertexState"); - static_assert(offsetof(RenderPipelineDescriptor, primitiveTopology) == offsetof(WGPURenderPipelineDescriptor, primitiveTopology), - "offsetof mismatch for RenderPipelineDescriptor::primitiveTopology"); - static_assert(offsetof(RenderPipelineDescriptor, rasterizationState) == offsetof(WGPURenderPipelineDescriptor, rasterizationState), - "offsetof mismatch for RenderPipelineDescriptor::rasterizationState"); - static_assert(offsetof(RenderPipelineDescriptor, sampleCount) == offsetof(WGPURenderPipelineDescriptor, sampleCount), - "offsetof mismatch for RenderPipelineDescriptor::sampleCount"); - static_assert(offsetof(RenderPipelineDescriptor, depthStencilState) == offsetof(WGPURenderPipelineDescriptor, depthStencilState), - "offsetof mismatch for RenderPipelineDescriptor::depthStencilState"); - static_assert(offsetof(RenderPipelineDescriptor, colorStateCount) == offsetof(WGPURenderPipelineDescriptor, colorStateCount), - "offsetof mismatch for RenderPipelineDescriptor::colorStateCount"); - static_assert(offsetof(RenderPipelineDescriptor, colorStates) == offsetof(WGPURenderPipelineDescriptor, colorStates), - "offsetof mismatch for RenderPipelineDescriptor::colorStates"); - static_assert(offsetof(RenderPipelineDescriptor, sampleMask) == offsetof(WGPURenderPipelineDescriptor, sampleMask), - "offsetof mismatch for RenderPipelineDescriptor::sampleMask"); - static_assert(offsetof(RenderPipelineDescriptor, alphaToCoverageEnabled) == offsetof(WGPURenderPipelineDescriptor, alphaToCoverageEnabled), - "offsetof mismatch for RenderPipelineDescriptor::alphaToCoverageEnabled"); - - - - static_assert(sizeof(BindGroup) == sizeof(WGPUBindGroup), "sizeof mismatch for BindGroup"); - static_assert(alignof(BindGroup) == alignof(WGPUBindGroup), "alignof mismatch for BindGroup"); - - - - void BindGroup::WGPUReference(WGPUBindGroup handle) { - if (handle != nullptr) { - wgpuBindGroupReference(handle); - } - } - void BindGroup::WGPURelease(WGPUBindGroup handle) { - if (handle != nullptr) { - wgpuBindGroupRelease(handle); - } - } - - - static_assert(sizeof(BindGroupLayout) == sizeof(WGPUBindGroupLayout), "sizeof mismatch for BindGroupLayout"); - static_assert(alignof(BindGroupLayout) == alignof(WGPUBindGroupLayout), "alignof mismatch for BindGroupLayout"); - - - - void BindGroupLayout::WGPUReference(WGPUBindGroupLayout handle) { - if (handle != nullptr) { - wgpuBindGroupLayoutReference(handle); - } - } - void BindGroupLayout::WGPURelease(WGPUBindGroupLayout handle) { - if (handle != nullptr) { - wgpuBindGroupLayoutRelease(handle); - } - } - - - static_assert(sizeof(Buffer) == sizeof(WGPUBuffer), "sizeof mismatch for Buffer"); - static_assert(alignof(Buffer) == alignof(WGPUBuffer), "alignof mismatch for Buffer"); - - - - void Buffer::Destroy() const { - wgpuBufferDestroy(Get()); - } - void Buffer::MapReadAsync(BufferMapReadCallback callback, void * userdata) const { - wgpuBufferMapReadAsync(Get(), callback, reinterpret_cast(userdata)); - } - void Buffer::MapWriteAsync(BufferMapWriteCallback callback, void * userdata) const { - wgpuBufferMapWriteAsync(Get(), callback, reinterpret_cast(userdata)); - } - void Buffer::SetSubData(uint64_t start, uint64_t count, void const * data) const { - wgpuBufferSetSubData(Get(), start, count, reinterpret_cast(data)); - } - void Buffer::Unmap() const { - wgpuBufferUnmap(Get()); - } - void Buffer::WGPUReference(WGPUBuffer handle) { - if (handle != nullptr) { - wgpuBufferReference(handle); - } - } - void Buffer::WGPURelease(WGPUBuffer handle) { - if (handle != nullptr) { - wgpuBufferRelease(handle); - } - } - - - static_assert(sizeof(CommandBuffer) == sizeof(WGPUCommandBuffer), "sizeof mismatch for CommandBuffer"); - static_assert(alignof(CommandBuffer) == alignof(WGPUCommandBuffer), "alignof mismatch for CommandBuffer"); - - - - void CommandBuffer::WGPUReference(WGPUCommandBuffer handle) { - if (handle != nullptr) { - wgpuCommandBufferReference(handle); - } - } - void CommandBuffer::WGPURelease(WGPUCommandBuffer handle) { - if (handle != nullptr) { - wgpuCommandBufferRelease(handle); - } - } - - - static_assert(sizeof(CommandEncoder) == sizeof(WGPUCommandEncoder), "sizeof mismatch for CommandEncoder"); - static_assert(alignof(CommandEncoder) == alignof(WGPUCommandEncoder), "alignof mismatch for CommandEncoder"); - - - - ComputePassEncoder CommandEncoder::BeginComputePass(ComputePassDescriptor const * descriptor) const { - auto result = wgpuCommandEncoderBeginComputePass(Get(), reinterpret_cast(descriptor)); - return ComputePassEncoder::Acquire(result); - } - RenderPassEncoder CommandEncoder::BeginRenderPass(RenderPassDescriptor const * descriptor) const { - auto result = wgpuCommandEncoderBeginRenderPass(Get(), reinterpret_cast(descriptor)); - return RenderPassEncoder::Acquire(result); - } - void CommandEncoder::CopyBufferToBuffer(Buffer const& source, uint64_t sourceOffset, Buffer const& destination, uint64_t destinationOffset, uint64_t size) const { - wgpuCommandEncoderCopyBufferToBuffer(Get(), source.Get(), sourceOffset, destination.Get(), destinationOffset, size); - } - void CommandEncoder::CopyBufferToTexture(BufferCopyView const * source, TextureCopyView const * destination, Extent3D const * copySize) const { - wgpuCommandEncoderCopyBufferToTexture(Get(), reinterpret_cast(source), reinterpret_cast(destination), reinterpret_cast(copySize)); - } - void CommandEncoder::CopyTextureToBuffer(TextureCopyView const * source, BufferCopyView const * destination, Extent3D const * copySize) const { - wgpuCommandEncoderCopyTextureToBuffer(Get(), reinterpret_cast(source), reinterpret_cast(destination), reinterpret_cast(copySize)); - } - void CommandEncoder::CopyTextureToTexture(TextureCopyView const * source, TextureCopyView const * destination, Extent3D const * copySize) const { - wgpuCommandEncoderCopyTextureToTexture(Get(), reinterpret_cast(source), reinterpret_cast(destination), reinterpret_cast(copySize)); - } - CommandBuffer CommandEncoder::Finish(CommandBufferDescriptor const * descriptor) const { - auto result = wgpuCommandEncoderFinish(Get(), reinterpret_cast(descriptor)); - return CommandBuffer::Acquire(result); - } - void CommandEncoder::InsertDebugMarker(char const * groupLabel) const { - wgpuCommandEncoderInsertDebugMarker(Get(), reinterpret_cast(groupLabel)); - } - void CommandEncoder::PopDebugGroup() const { - wgpuCommandEncoderPopDebugGroup(Get()); - } - void CommandEncoder::PushDebugGroup(char const * groupLabel) const { - wgpuCommandEncoderPushDebugGroup(Get(), reinterpret_cast(groupLabel)); - } - void CommandEncoder::WGPUReference(WGPUCommandEncoder handle) { - if (handle != nullptr) { - wgpuCommandEncoderReference(handle); - } - } - void CommandEncoder::WGPURelease(WGPUCommandEncoder handle) { - if (handle != nullptr) { - wgpuCommandEncoderRelease(handle); - } - } - - - static_assert(sizeof(ComputePassEncoder) == sizeof(WGPUComputePassEncoder), "sizeof mismatch for ComputePassEncoder"); - static_assert(alignof(ComputePassEncoder) == alignof(WGPUComputePassEncoder), "alignof mismatch for ComputePassEncoder"); - - - - void ComputePassEncoder::Dispatch(uint32_t x, uint32_t y, uint32_t z) const { - wgpuComputePassEncoderDispatch(Get(), x, y, z); - } - void ComputePassEncoder::DispatchIndirect(Buffer const& indirectBuffer, uint64_t indirectOffset) const { - wgpuComputePassEncoderDispatchIndirect(Get(), indirectBuffer.Get(), indirectOffset); - } - void ComputePassEncoder::EndPass() const { - wgpuComputePassEncoderEndPass(Get()); - } - void ComputePassEncoder::InsertDebugMarker(char const * groupLabel) const { - wgpuComputePassEncoderInsertDebugMarker(Get(), reinterpret_cast(groupLabel)); - } - void ComputePassEncoder::PopDebugGroup() const { - wgpuComputePassEncoderPopDebugGroup(Get()); - } - void ComputePassEncoder::PushDebugGroup(char const * groupLabel) const { - wgpuComputePassEncoderPushDebugGroup(Get(), reinterpret_cast(groupLabel)); - } - void ComputePassEncoder::SetBindGroup(uint32_t groupIndex, BindGroup const& group, uint32_t dynamicOffsetCount, uint32_t const * dynamicOffsets) const { - wgpuComputePassEncoderSetBindGroup(Get(), groupIndex, group.Get(), dynamicOffsetCount, reinterpret_cast(dynamicOffsets)); - } - void ComputePassEncoder::SetPipeline(ComputePipeline const& pipeline) const { - wgpuComputePassEncoderSetPipeline(Get(), pipeline.Get()); - } - void ComputePassEncoder::WGPUReference(WGPUComputePassEncoder handle) { - if (handle != nullptr) { - wgpuComputePassEncoderReference(handle); - } - } - void ComputePassEncoder::WGPURelease(WGPUComputePassEncoder handle) { - if (handle != nullptr) { - wgpuComputePassEncoderRelease(handle); - } - } - - - static_assert(sizeof(ComputePipeline) == sizeof(WGPUComputePipeline), "sizeof mismatch for ComputePipeline"); - static_assert(alignof(ComputePipeline) == alignof(WGPUComputePipeline), "alignof mismatch for ComputePipeline"); - - - - BindGroupLayout ComputePipeline::GetBindGroupLayout(uint32_t groupIndex) const { - auto result = wgpuComputePipelineGetBindGroupLayout(Get(), groupIndex); - return BindGroupLayout::Acquire(result); - } - void ComputePipeline::WGPUReference(WGPUComputePipeline handle) { - if (handle != nullptr) { - wgpuComputePipelineReference(handle); - } - } - void ComputePipeline::WGPURelease(WGPUComputePipeline handle) { - if (handle != nullptr) { - wgpuComputePipelineRelease(handle); - } - } - - - static_assert(sizeof(Device) == sizeof(WGPUDevice), "sizeof mismatch for Device"); - static_assert(alignof(Device) == alignof(WGPUDevice), "alignof mismatch for Device"); - - - - BindGroup Device::CreateBindGroup(BindGroupDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateBindGroup(Get(), reinterpret_cast(descriptor)); - return BindGroup::Acquire(result); - } - BindGroupLayout Device::CreateBindGroupLayout(BindGroupLayoutDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateBindGroupLayout(Get(), reinterpret_cast(descriptor)); - return BindGroupLayout::Acquire(result); - } - Buffer Device::CreateBuffer(BufferDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateBuffer(Get(), reinterpret_cast(descriptor)); - return Buffer::Acquire(result); - } - CreateBufferMappedResult Device::CreateBufferMapped(BufferDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateBufferMapped(Get(), reinterpret_cast(descriptor)); - return CreateBufferMappedResult { - Buffer::Acquire(result.buffer), - result.dataLength, - result.data - }; - } - CommandEncoder Device::CreateCommandEncoder(CommandEncoderDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateCommandEncoder(Get(), reinterpret_cast(descriptor)); - return CommandEncoder::Acquire(result); - } - ComputePipeline Device::CreateComputePipeline(ComputePipelineDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateComputePipeline(Get(), reinterpret_cast(descriptor)); - return ComputePipeline::Acquire(result); - } - PipelineLayout Device::CreatePipelineLayout(PipelineLayoutDescriptor const * descriptor) const { - auto result = wgpuDeviceCreatePipelineLayout(Get(), reinterpret_cast(descriptor)); - return PipelineLayout::Acquire(result); - } - RenderBundleEncoder Device::CreateRenderBundleEncoder(RenderBundleEncoderDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateRenderBundleEncoder(Get(), reinterpret_cast(descriptor)); - return RenderBundleEncoder::Acquire(result); - } - RenderPipeline Device::CreateRenderPipeline(RenderPipelineDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateRenderPipeline(Get(), reinterpret_cast(descriptor)); - return RenderPipeline::Acquire(result); - } - Sampler Device::CreateSampler(SamplerDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateSampler(Get(), reinterpret_cast(descriptor)); - return Sampler::Acquire(result); - } - ShaderModule Device::CreateShaderModule(ShaderModuleDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateShaderModule(Get(), reinterpret_cast(descriptor)); - return ShaderModule::Acquire(result); - } - SwapChain Device::CreateSwapChain(Surface const& surface, SwapChainDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateSwapChain(Get(), surface.Get(), reinterpret_cast(descriptor)); - return SwapChain::Acquire(result); - } - Texture Device::CreateTexture(TextureDescriptor const * descriptor) const { - auto result = wgpuDeviceCreateTexture(Get(), reinterpret_cast(descriptor)); - return Texture::Acquire(result); - } - Queue Device::GetDefaultQueue() const { - auto result = wgpuDeviceGetDefaultQueue(Get()); - return Queue::Acquire(result); - } - void Device::InjectError(ErrorType type, char const * message) const { - wgpuDeviceInjectError(Get(), static_cast(type), reinterpret_cast(message)); - } - void Device::LoseForTesting() const { - wgpuDeviceLoseForTesting(Get()); - } - bool Device::PopErrorScope(ErrorCallback callback, void * userdata) const { - auto result = wgpuDevicePopErrorScope(Get(), callback, reinterpret_cast(userdata)); - return result; - } - void Device::PushErrorScope(ErrorFilter filter) const { - wgpuDevicePushErrorScope(Get(), static_cast(filter)); - } - void Device::SetDeviceLostCallback(DeviceLostCallback callback, void * userdata) const { - wgpuDeviceSetDeviceLostCallback(Get(), callback, reinterpret_cast(userdata)); - } - void Device::SetUncapturedErrorCallback(ErrorCallback callback, void * userdata) const { - wgpuDeviceSetUncapturedErrorCallback(Get(), callback, reinterpret_cast(userdata)); - } - void Device::Tick() const { - wgpuDeviceTick(Get()); - } - void Device::WGPUReference(WGPUDevice handle) { - if (handle != nullptr) { - wgpuDeviceReference(handle); - } - } - void Device::WGPURelease(WGPUDevice handle) { - if (handle != nullptr) { - wgpuDeviceRelease(handle); - } - } - - - static_assert(sizeof(Fence) == sizeof(WGPUFence), "sizeof mismatch for Fence"); - static_assert(alignof(Fence) == alignof(WGPUFence), "alignof mismatch for Fence"); - - - - uint64_t Fence::GetCompletedValue() const { - auto result = wgpuFenceGetCompletedValue(Get()); - return result; - } - void Fence::OnCompletion(uint64_t value, FenceOnCompletionCallback callback, void * userdata) const { - wgpuFenceOnCompletion(Get(), value, callback, reinterpret_cast(userdata)); - } - void Fence::WGPUReference(WGPUFence handle) { - if (handle != nullptr) { - wgpuFenceReference(handle); - } - } - void Fence::WGPURelease(WGPUFence handle) { - if (handle != nullptr) { - wgpuFenceRelease(handle); - } - } - - - static_assert(sizeof(Instance) == sizeof(WGPUInstance), "sizeof mismatch for Instance"); - static_assert(alignof(Instance) == alignof(WGPUInstance), "alignof mismatch for Instance"); - - - - Surface Instance::CreateSurface(SurfaceDescriptor const * descriptor) const { - auto result = wgpuInstanceCreateSurface(Get(), reinterpret_cast(descriptor)); - return Surface::Acquire(result); - } - void Instance::WGPUReference(WGPUInstance handle) { - if (handle != nullptr) { - wgpuInstanceReference(handle); - } - } - void Instance::WGPURelease(WGPUInstance handle) { - if (handle != nullptr) { - wgpuInstanceRelease(handle); - } - } - - - static_assert(sizeof(PipelineLayout) == sizeof(WGPUPipelineLayout), "sizeof mismatch for PipelineLayout"); - static_assert(alignof(PipelineLayout) == alignof(WGPUPipelineLayout), "alignof mismatch for PipelineLayout"); - - - - void PipelineLayout::WGPUReference(WGPUPipelineLayout handle) { - if (handle != nullptr) { - wgpuPipelineLayoutReference(handle); - } - } - void PipelineLayout::WGPURelease(WGPUPipelineLayout handle) { - if (handle != nullptr) { - wgpuPipelineLayoutRelease(handle); - } - } - - - static_assert(sizeof(Queue) == sizeof(WGPUQueue), "sizeof mismatch for Queue"); - static_assert(alignof(Queue) == alignof(WGPUQueue), "alignof mismatch for Queue"); - - - - Fence Queue::CreateFence(FenceDescriptor const * descriptor) const { - auto result = wgpuQueueCreateFence(Get(), reinterpret_cast(descriptor)); - return Fence::Acquire(result); - } - void Queue::Signal(Fence const& fence, uint64_t signalValue) const { - wgpuQueueSignal(Get(), fence.Get(), signalValue); - } - void Queue::Submit(uint32_t commandCount, CommandBuffer const * commands) const { - wgpuQueueSubmit(Get(), commandCount, reinterpret_cast(commands)); - } - void Queue::WGPUReference(WGPUQueue handle) { - if (handle != nullptr) { - wgpuQueueReference(handle); - } - } - void Queue::WGPURelease(WGPUQueue handle) { - if (handle != nullptr) { - wgpuQueueRelease(handle); - } - } - - - static_assert(sizeof(RenderBundle) == sizeof(WGPURenderBundle), "sizeof mismatch for RenderBundle"); - static_assert(alignof(RenderBundle) == alignof(WGPURenderBundle), "alignof mismatch for RenderBundle"); - - - - void RenderBundle::WGPUReference(WGPURenderBundle handle) { - if (handle != nullptr) { - wgpuRenderBundleReference(handle); - } - } - void RenderBundle::WGPURelease(WGPURenderBundle handle) { - if (handle != nullptr) { - wgpuRenderBundleRelease(handle); - } - } - - - static_assert(sizeof(RenderBundleEncoder) == sizeof(WGPURenderBundleEncoder), "sizeof mismatch for RenderBundleEncoder"); - static_assert(alignof(RenderBundleEncoder) == alignof(WGPURenderBundleEncoder), "alignof mismatch for RenderBundleEncoder"); - - - - void RenderBundleEncoder::Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) const { - wgpuRenderBundleEncoderDraw(Get(), vertexCount, instanceCount, firstVertex, firstInstance); - } - void RenderBundleEncoder::DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t baseVertex, uint32_t firstInstance) const { - wgpuRenderBundleEncoderDrawIndexed(Get(), indexCount, instanceCount, firstIndex, baseVertex, firstInstance); - } - void RenderBundleEncoder::DrawIndexedIndirect(Buffer const& indirectBuffer, uint64_t indirectOffset) const { - wgpuRenderBundleEncoderDrawIndexedIndirect(Get(), indirectBuffer.Get(), indirectOffset); - } - void RenderBundleEncoder::DrawIndirect(Buffer const& indirectBuffer, uint64_t indirectOffset) const { - wgpuRenderBundleEncoderDrawIndirect(Get(), indirectBuffer.Get(), indirectOffset); - } - RenderBundle RenderBundleEncoder::Finish(RenderBundleDescriptor const * descriptor) const { - auto result = wgpuRenderBundleEncoderFinish(Get(), reinterpret_cast(descriptor)); - return RenderBundle::Acquire(result); - } - void RenderBundleEncoder::InsertDebugMarker(char const * groupLabel) const { - wgpuRenderBundleEncoderInsertDebugMarker(Get(), reinterpret_cast(groupLabel)); - } - void RenderBundleEncoder::PopDebugGroup() const { - wgpuRenderBundleEncoderPopDebugGroup(Get()); - } - void RenderBundleEncoder::PushDebugGroup(char const * groupLabel) const { - wgpuRenderBundleEncoderPushDebugGroup(Get(), reinterpret_cast(groupLabel)); - } - void RenderBundleEncoder::SetBindGroup(uint32_t groupIndex, BindGroup const& group, uint32_t dynamicOffsetCount, uint32_t const * dynamicOffsets) const { - wgpuRenderBundleEncoderSetBindGroup(Get(), groupIndex, group.Get(), dynamicOffsetCount, reinterpret_cast(dynamicOffsets)); - } - void RenderBundleEncoder::SetIndexBuffer(Buffer const& buffer, uint64_t offset, uint64_t size) const { - wgpuRenderBundleEncoderSetIndexBuffer(Get(), buffer.Get(), offset, size); - } - void RenderBundleEncoder::SetPipeline(RenderPipeline const& pipeline) const { - wgpuRenderBundleEncoderSetPipeline(Get(), pipeline.Get()); - } - void RenderBundleEncoder::SetVertexBuffer(uint32_t slot, Buffer const& buffer, uint64_t offset, uint64_t size) const { - wgpuRenderBundleEncoderSetVertexBuffer(Get(), slot, buffer.Get(), offset, size); - } - void RenderBundleEncoder::WGPUReference(WGPURenderBundleEncoder handle) { - if (handle != nullptr) { - wgpuRenderBundleEncoderReference(handle); - } - } - void RenderBundleEncoder::WGPURelease(WGPURenderBundleEncoder handle) { - if (handle != nullptr) { - wgpuRenderBundleEncoderRelease(handle); - } - } - - - static_assert(sizeof(RenderPassEncoder) == sizeof(WGPURenderPassEncoder), "sizeof mismatch for RenderPassEncoder"); - static_assert(alignof(RenderPassEncoder) == alignof(WGPURenderPassEncoder), "alignof mismatch for RenderPassEncoder"); - - - - void RenderPassEncoder::Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) const { - wgpuRenderPassEncoderDraw(Get(), vertexCount, instanceCount, firstVertex, firstInstance); - } - void RenderPassEncoder::DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t baseVertex, uint32_t firstInstance) const { - wgpuRenderPassEncoderDrawIndexed(Get(), indexCount, instanceCount, firstIndex, baseVertex, firstInstance); - } - void RenderPassEncoder::DrawIndexedIndirect(Buffer const& indirectBuffer, uint64_t indirectOffset) const { - wgpuRenderPassEncoderDrawIndexedIndirect(Get(), indirectBuffer.Get(), indirectOffset); - } - void RenderPassEncoder::DrawIndirect(Buffer const& indirectBuffer, uint64_t indirectOffset) const { - wgpuRenderPassEncoderDrawIndirect(Get(), indirectBuffer.Get(), indirectOffset); - } - void RenderPassEncoder::EndPass() const { - wgpuRenderPassEncoderEndPass(Get()); - } - void RenderPassEncoder::ExecuteBundles(uint32_t bundlesCount, RenderBundle const * bundles) const { - wgpuRenderPassEncoderExecuteBundles(Get(), bundlesCount, reinterpret_cast(bundles)); - } - void RenderPassEncoder::InsertDebugMarker(char const * groupLabel) const { - wgpuRenderPassEncoderInsertDebugMarker(Get(), reinterpret_cast(groupLabel)); - } - void RenderPassEncoder::PopDebugGroup() const { - wgpuRenderPassEncoderPopDebugGroup(Get()); - } - void RenderPassEncoder::PushDebugGroup(char const * groupLabel) const { - wgpuRenderPassEncoderPushDebugGroup(Get(), reinterpret_cast(groupLabel)); - } - void RenderPassEncoder::SetBindGroup(uint32_t groupIndex, BindGroup const& group, uint32_t dynamicOffsetCount, uint32_t const * dynamicOffsets) const { - wgpuRenderPassEncoderSetBindGroup(Get(), groupIndex, group.Get(), dynamicOffsetCount, reinterpret_cast(dynamicOffsets)); - } - void RenderPassEncoder::SetBlendColor(Color const * color) const { - wgpuRenderPassEncoderSetBlendColor(Get(), reinterpret_cast(color)); - } - void RenderPassEncoder::SetIndexBuffer(Buffer const& buffer, uint64_t offset, uint64_t size) const { - wgpuRenderPassEncoderSetIndexBuffer(Get(), buffer.Get(), offset, size); - } - void RenderPassEncoder::SetPipeline(RenderPipeline const& pipeline) const { - wgpuRenderPassEncoderSetPipeline(Get(), pipeline.Get()); - } - void RenderPassEncoder::SetScissorRect(uint32_t x, uint32_t y, uint32_t width, uint32_t height) const { - wgpuRenderPassEncoderSetScissorRect(Get(), x, y, width, height); - } - void RenderPassEncoder::SetStencilReference(uint32_t reference) const { - wgpuRenderPassEncoderSetStencilReference(Get(), reference); - } - void RenderPassEncoder::SetVertexBuffer(uint32_t slot, Buffer const& buffer, uint64_t offset, uint64_t size) const { - wgpuRenderPassEncoderSetVertexBuffer(Get(), slot, buffer.Get(), offset, size); - } - void RenderPassEncoder::SetViewport(float x, float y, float width, float height, float minDepth, float maxDepth) const { - wgpuRenderPassEncoderSetViewport(Get(), x, y, width, height, minDepth, maxDepth); - } - void RenderPassEncoder::WGPUReference(WGPURenderPassEncoder handle) { - if (handle != nullptr) { - wgpuRenderPassEncoderReference(handle); - } - } - void RenderPassEncoder::WGPURelease(WGPURenderPassEncoder handle) { - if (handle != nullptr) { - wgpuRenderPassEncoderRelease(handle); - } - } - - - static_assert(sizeof(RenderPipeline) == sizeof(WGPURenderPipeline), "sizeof mismatch for RenderPipeline"); - static_assert(alignof(RenderPipeline) == alignof(WGPURenderPipeline), "alignof mismatch for RenderPipeline"); - - - - BindGroupLayout RenderPipeline::GetBindGroupLayout(uint32_t groupIndex) const { - auto result = wgpuRenderPipelineGetBindGroupLayout(Get(), groupIndex); - return BindGroupLayout::Acquire(result); - } - void RenderPipeline::WGPUReference(WGPURenderPipeline handle) { - if (handle != nullptr) { - wgpuRenderPipelineReference(handle); - } - } - void RenderPipeline::WGPURelease(WGPURenderPipeline handle) { - if (handle != nullptr) { - wgpuRenderPipelineRelease(handle); - } - } - - - static_assert(sizeof(Sampler) == sizeof(WGPUSampler), "sizeof mismatch for Sampler"); - static_assert(alignof(Sampler) == alignof(WGPUSampler), "alignof mismatch for Sampler"); - - - - void Sampler::WGPUReference(WGPUSampler handle) { - if (handle != nullptr) { - wgpuSamplerReference(handle); - } - } - void Sampler::WGPURelease(WGPUSampler handle) { - if (handle != nullptr) { - wgpuSamplerRelease(handle); - } - } - - - static_assert(sizeof(ShaderModule) == sizeof(WGPUShaderModule), "sizeof mismatch for ShaderModule"); - static_assert(alignof(ShaderModule) == alignof(WGPUShaderModule), "alignof mismatch for ShaderModule"); - - - - void ShaderModule::WGPUReference(WGPUShaderModule handle) { - if (handle != nullptr) { - wgpuShaderModuleReference(handle); - } - } - void ShaderModule::WGPURelease(WGPUShaderModule handle) { - if (handle != nullptr) { - wgpuShaderModuleRelease(handle); - } - } - - - static_assert(sizeof(Surface) == sizeof(WGPUSurface), "sizeof mismatch for Surface"); - static_assert(alignof(Surface) == alignof(WGPUSurface), "alignof mismatch for Surface"); - - - - void Surface::WGPUReference(WGPUSurface handle) { - if (handle != nullptr) { - wgpuSurfaceReference(handle); - } - } - void Surface::WGPURelease(WGPUSurface handle) { - if (handle != nullptr) { - wgpuSurfaceRelease(handle); - } - } - - - static_assert(sizeof(SwapChain) == sizeof(WGPUSwapChain), "sizeof mismatch for SwapChain"); - static_assert(alignof(SwapChain) == alignof(WGPUSwapChain), "alignof mismatch for SwapChain"); - - - - void SwapChain::Configure(TextureFormat format, TextureUsage allowedUsage, uint32_t width, uint32_t height) const { - wgpuSwapChainConfigure(Get(), static_cast(format), static_cast(allowedUsage), width, height); - } - TextureView SwapChain::GetCurrentTextureView() const { - auto result = wgpuSwapChainGetCurrentTextureView(Get()); - return TextureView::Acquire(result); - } - void SwapChain::Present() const { - wgpuSwapChainPresent(Get()); - } - void SwapChain::WGPUReference(WGPUSwapChain handle) { - if (handle != nullptr) { - wgpuSwapChainReference(handle); - } - } - void SwapChain::WGPURelease(WGPUSwapChain handle) { - if (handle != nullptr) { - wgpuSwapChainRelease(handle); - } - } - - - static_assert(sizeof(Texture) == sizeof(WGPUTexture), "sizeof mismatch for Texture"); - static_assert(alignof(Texture) == alignof(WGPUTexture), "alignof mismatch for Texture"); - - - - TextureView Texture::CreateView(TextureViewDescriptor const * descriptor) const { - auto result = wgpuTextureCreateView(Get(), reinterpret_cast(descriptor)); - return TextureView::Acquire(result); - } - void Texture::Destroy() const { - wgpuTextureDestroy(Get()); - } - void Texture::WGPUReference(WGPUTexture handle) { - if (handle != nullptr) { - wgpuTextureReference(handle); - } - } - void Texture::WGPURelease(WGPUTexture handle) { - if (handle != nullptr) { - wgpuTextureRelease(handle); - } - } - - - static_assert(sizeof(TextureView) == sizeof(WGPUTextureView), "sizeof mismatch for TextureView"); - static_assert(alignof(TextureView) == alignof(WGPUTextureView), "alignof mismatch for TextureView"); - - - - void TextureView::WGPUReference(WGPUTextureView handle) { - if (handle != nullptr) { - wgpuTextureViewReference(handle); - } - } - void TextureView::WGPURelease(WGPUTextureView handle) { - if (handle != nullptr) { - wgpuTextureViewRelease(handle); - } - } - - - Instance CreateInstance(const InstanceDescriptor* descriptor) { - const WGPUInstanceDescriptor* cDescriptor = - reinterpret_cast(descriptor); - return Instance::Acquire(wgpuCreateInstance(cDescriptor)); - } - - Proc GetProcAddress(Device const& device, const char* procName) { - return reinterpret_cast(wgpuGetProcAddress(device.Get(), procName)); - } - -} diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 15c64c1d5b89..57e53f8f44a7 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -246,7 +246,7 @@ class BackendRegistry #ifdef HAVE_WEBGPU if(haveWGPU()) backends.push_back(std::make_pair(DNN_BACKEND_WGPU, DNN_TARGET_WGPU)); -#endif +#endif // HAVE_WEBGPU #ifdef HAVE_CUDA if (haveCUDA()) { @@ -1283,7 +1283,7 @@ struct Net::Impl : public detail::NetImplBase { #ifdef HAVE_WEBGPU return Ptr(new WGPUBackendWrapper(baseBuffer, host)); -#endif +#endif // HAVE_WEBGPU } else if (preferableBackend == DNN_BACKEND_CUDA) { @@ -2417,7 +2417,7 @@ struct Net::Impl : public detail::NetImplBase ld.backendNodes[DNN_BACKEND_WGPU] = Ptr(); } } -#endif +#endif // HAVE_WEBGPU } void initCUDABackend() { diff --git a/modules/dnn/src/layers/concat_layer.cpp b/modules/dnn/src/layers/concat_layer.cpp index 8a0f4a67c6b5..59c22755f3fe 100644 --- a/modules/dnn/src/layers/concat_layer.cpp +++ b/modules/dnn/src/layers/concat_layer.cpp @@ -47,6 +47,7 @@ #include "../op_inf_engine.hpp" #include "../ie_ngraph.hpp" #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #ifdef HAVE_OPENCL #include "opencl_kernels_dnn.hpp" @@ -116,7 +117,8 @@ class ConcatLayerImpl CV_FINAL : public ConcatLayer (backendId == DNN_BACKEND_HALIDE && haveHalide() && axis == 1 && !padding) || // By channels (backendId == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019 && haveInfEngine() && !padding) || backendId == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH || - (backendId == DNN_BACKEND_VKCOM && haveVulkan() && !padding); + (backendId == DNN_BACKEND_VKCOM && haveVulkan() && !padding) || + (backendId == DNN_BACKEND_WGPU && haveWGPU() && !padding); } class ChannelConcatInvoker : public ParallelLoopBody @@ -312,6 +314,18 @@ class ConcatLayerImpl CV_FINAL : public ConcatLayer return Ptr(); } + virtual Ptr initWGPU(const std::vector > &input) CV_OVERRIDE + { +#ifdef HAVE_WEBGPU + webgpu::Tensor in = WGPUTensor(input[0]); + int cAxis = clamp(axis, in.dimNum()); + std::shared_ptr op(new webgpu::OpConcat(cAxis)); + return Ptr(new WGPUBackendNode(input, op)); +#endif // HAVE_WEBGPU + return Ptr(); + } + + virtual Ptr initHalide(const std::vector > &input) CV_OVERRIDE { #ifdef HAVE_HALIDE diff --git a/modules/dnn/src/layers/convolution_layer.cpp b/modules/dnn/src/layers/convolution_layer.cpp index 5e5af51ba99a..b2b3088fa506 100644 --- a/modules/dnn/src/layers/convolution_layer.cpp +++ b/modules/dnn/src/layers/convolution_layer.cpp @@ -47,6 +47,7 @@ #include "../op_inf_engine.hpp" #include "../ie_ngraph.hpp" #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #include "opencv2/core/hal/hal.hpp" #include "opencv2/core/hal/intrin.hpp" @@ -303,7 +304,8 @@ class ConvolutionLayerImpl CV_FINAL : public BaseConvolutionLayerImpl else if (kernel_size.size() == 2) return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE || - (backendId == DNN_BACKEND_VKCOM && haveVulkan()); + (backendId == DNN_BACKEND_VKCOM && haveVulkan()) || + (backendId == DNN_BACKEND_WGPU && haveWGPU()); else return false; } @@ -581,6 +583,71 @@ class ConvolutionLayerImpl CV_FINAL : public BaseConvolutionLayerImpl return Ptr(); } + virtual Ptr initWGPU(const std::vector > &inputs) CV_OVERRIDE + { +#ifdef HAVE_WEBGPU + int out_channel = blobs[0].size[0]; + bool has_bias = hasBias() || fusedBias; + int filter_size[2] = {kernel.height, kernel.width}; + int pad_size[2] = {pad.height, pad.width}; + int stride_size[2] = {stride.height, stride.width}; + int dilation_size[2] = {dilation.height, dilation.width}; + int activation = 0; + webgpu::Tensor input_tensor = WGPUTensor(inputs[0]); + int in_channel = input_tensor.dimSize(1); + int group = in_channel / blobs[0].size[1]; + + // TODO: support group > 1 + if (group != 1) + return Ptr(); + + int padding_mode; + if (padMode.empty()) + { + padding_mode = webgpu::wPaddingModeCaffe; + } + else if (padMode == "VALID") + { + padding_mode = webgpu::wPaddingModeValid; + } + else if (padMode == "SAME") + { + padding_mode = webgpu::wPaddingModeSame; + } + else + CV_Error(Error::StsError, "Unsupported padding mode " + padMode); + + std::shared_ptr op(new webgpu::OpConv(out_channel, has_bias, + filter_size, pad_size, + stride_size, dilation_size, + activation, group, + padding_mode)); + + std::vector > blobsWrapper; + + if (fusedWeights) + { + Mat wm; + weightsMat.copyTo(wm); // to handle the case of isContinuous() == false + wm = wm.reshape(1, blobs[0].dims, blobs[0].size); + blobsWrapper.push_back(Ptr(new WGPUBackendWrapper(wm))); + } + else + { + blobsWrapper.push_back(Ptr(new WGPUBackendWrapper(blobs[0]))); + } + + if (has_bias) + { + Mat biasesMat({out_channel}, CV_32F, &biasvec[0]); + blobsWrapper.push_back(Ptr(new WGPUBackendWrapper(biasesMat))); + } + + return Ptr(new WGPUBackendNode(inputs, op, blobsWrapper)); +#endif // HAVE_WEBGPU + return Ptr(); + } + virtual Ptr initHalide(const std::vector > &inputs) CV_OVERRIDE { #ifdef HAVE_HALIDE diff --git a/modules/dnn/src/layers/elementwise_layers.cpp b/modules/dnn/src/layers/elementwise_layers.cpp index 85b39ddfea68..dc7b98fbd78b 100644 --- a/modules/dnn/src/layers/elementwise_layers.cpp +++ b/modules/dnn/src/layers/elementwise_layers.cpp @@ -47,6 +47,7 @@ #include "../op_inf_engine.hpp" #include "../ie_ngraph.hpp" #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #include #include @@ -189,6 +190,14 @@ class ElementWiseLayer : public Func::Layer return Ptr(); } + virtual Ptr initWGPU(const std::vector >& inputs) CV_OVERRIDE + { +#ifdef HAVE_WEBGPU + return Ptr(new WGPUBackendNode(inputs, func.initWGPU())); +#endif // HAVE_WEBGPU + return Ptr(); + } + virtual bool tryFuse(Ptr& top) CV_OVERRIDE { return func.tryFuse(top); @@ -310,7 +319,8 @@ struct ReLUFunctor : public BaseFunctor return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_CUDA || backendId == DNN_BACKEND_HALIDE || - backendId == DNN_BACKEND_VKCOM; + backendId == DNN_BACKEND_VKCOM || + backendId == DNN_BACKEND_WGPU; } void apply(const float* srcptr, float* dstptr, int len, size_t planeSize, int cn0, int cn1) const @@ -436,6 +446,14 @@ struct ReLUFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + std::shared_ptr op(new webgpu::OpReLU(slope)); + return op; + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 1; } }; @@ -559,6 +577,14 @@ struct ReLU6Functor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 2; } }; @@ -651,6 +677,14 @@ struct TanHFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 1; } }; @@ -743,6 +777,14 @@ struct SwishFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 3; } }; @@ -840,6 +882,14 @@ struct MishFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 3; } }; @@ -932,6 +982,14 @@ struct SigmoidFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 3; } }; @@ -1024,6 +1082,14 @@ struct ELUFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 2; } }; @@ -1122,6 +1188,14 @@ struct AbsValFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 1; } }; @@ -1215,6 +1289,14 @@ struct BNLLFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 5; } }; @@ -1363,6 +1445,14 @@ struct PowerFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + bool tryFuse(Ptr& top) { if (power != 1.0f && shift != 0.0f) @@ -1526,6 +1616,14 @@ struct ChannelsPReLUFunctor : public BaseFunctor } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + std::shared_ptr initWGPU() + { + // TODO: add webgpu implementation + return std::shared_ptr(); + } +#endif // HAVE_WEBGPU + int64 getFLOPSPerElement() const { return 1; } }; diff --git a/modules/dnn/src/layers/lrn_layer.cpp b/modules/dnn/src/layers/lrn_layer.cpp index 71970a3f6bc6..3060f9fd973a 100644 --- a/modules/dnn/src/layers/lrn_layer.cpp +++ b/modules/dnn/src/layers/lrn_layer.cpp @@ -47,6 +47,7 @@ #include "../op_inf_engine.hpp" #include "../ie_ngraph.hpp" #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/dnn/shape_utils.hpp" @@ -108,7 +109,8 @@ class LRNLayerImpl CV_FINAL : public LRNLayer return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_CUDA || backendId == DNN_BACKEND_HALIDE || - (backendId == DNN_BACKEND_VKCOM && haveVulkan() && (size % 2 == 1) && (type == CHANNEL_NRM)); + (backendId == DNN_BACKEND_VKCOM && haveVulkan() && (size % 2 == 1) && (type == CHANNEL_NRM)) + || (backendId == DNN_BACKEND_WGPU && haveWGPU() && (size % 2 == 1) && (type == CHANNEL_NRM)); } #ifdef HAVE_OPENCL @@ -371,6 +373,15 @@ class LRNLayerImpl CV_FINAL : public LRNLayer return Ptr(); } + virtual Ptr initWGPU(const std::vector > &inputs) CV_OVERRIDE + { +#ifdef HAVE_WEBGPU + std::shared_ptr op(new webgpu::OpLRN(size / 2, bias, alpha, beta, normBySize)); + return Ptr(new WGPUBackendNode(inputs, op)); +#endif // HAVE_WEBGPU + return Ptr(); + } + virtual Ptr initHalide(const std::vector > &inputs) CV_OVERRIDE { #ifdef HAVE_HALIDE diff --git a/modules/dnn/src/layers/permute_layer.cpp b/modules/dnn/src/layers/permute_layer.cpp index 943e347ff617..cff9d9c80760 100644 --- a/modules/dnn/src/layers/permute_layer.cpp +++ b/modules/dnn/src/layers/permute_layer.cpp @@ -46,6 +46,7 @@ #include "../op_inf_engine.hpp" #include "../ie_ngraph.hpp" #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #include #include @@ -116,7 +117,8 @@ class PermuteLayerImpl CV_FINAL : public PermuteLayer return backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_CUDA || ((backendId == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019 || backendId == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH) && haveInfEngine()) || - (backendId == DNN_BACKEND_VKCOM && haveVulkan()); + (backendId == DNN_BACKEND_VKCOM && haveVulkan()) || + (backendId == DNN_BACKEND_WGPU && haveWGPU());; } bool getMemoryShapes(const std::vector &inputs, @@ -427,6 +429,14 @@ class PermuteLayerImpl CV_FINAL : public PermuteLayer } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + virtual Ptr initWGPU(const std::vector > &input) CV_OVERRIDE + { + CV_Assert(!_order.empty()); + std::shared_ptr op(new webgpu::OpPermute(_order)); + return Ptr(new WGPUBackendNode(input, op)); + } +#endif // HAVE_VULKAN size_t _count; std::vector _order; diff --git a/modules/dnn/src/layers/pooling_layer.cpp b/modules/dnn/src/layers/pooling_layer.cpp index fc3bc4fc361b..6449405eca79 100644 --- a/modules/dnn/src/layers/pooling_layer.cpp +++ b/modules/dnn/src/layers/pooling_layer.cpp @@ -54,6 +54,7 @@ #endif #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #include #include @@ -211,7 +212,8 @@ class PoolingLayerImpl CV_FINAL : public PoolingLayer { return !computeMaxIdx && type != STOCHASTIC; } - if (backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE || backendId == DNN_BACKEND_VKCOM) + if (backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE || + backendId == DNN_BACKEND_VKCOM || backendId == DNN_BACKEND_WGPU) { if (kernel_size.size() == 3) return (backendId == DNN_BACKEND_OPENCV && preferableTarget == DNN_TARGET_CPU); @@ -220,6 +222,8 @@ class PoolingLayerImpl CV_FINAL : public PoolingLayer (backendId == DNN_BACKEND_HALIDE && haveHalide() && (type == MAX || (type == AVE && !pad_t && !pad_l && !pad_b && !pad_r))) || (backendId == DNN_BACKEND_VKCOM && haveVulkan() && + (type == MAX || type == AVE)) || + (backendId == DNN_BACKEND_WGPU && haveWGPU() && (type == MAX || type == AVE)); else return false; @@ -444,6 +448,40 @@ class PoolingLayerImpl CV_FINAL : public PoolingLayer } #endif +#ifdef HAVE_WEBGPU + virtual Ptr initWGPU(const std::vector > &inputs) CV_OVERRIDE + { + int padding_mode; + webgpu::PoolType pool_type; + int filter_size[2] = {kernel.height, kernel.width}; + int pad_size[2] = {pad.height, pad.width}; + int stride_size[2] = {stride.height, stride.width}; + pool_type = type == MAX ? webgpu::PoolType::wPoolTypeMax: + (type == AVE ? webgpu::PoolType::wPoolTypeAvg: + webgpu::PoolType::wPoolTypeNum); + + if (padMode.empty()) + { + padding_mode = webgpu::wPaddingModeCaffe; + } + else if (padMode == "VALID") + { + padding_mode = webgpu::wPaddingModeValid; + } + else if (padMode == "SAME") + { + padding_mode = webgpu::wPaddingModeSame; + } + else + CV_Error(Error::StsError, "Unsupported padding mode " + padMode); + + std::shared_ptr op(new webgpu::OpPool(filter_size, pad_size, + stride_size, padding_mode, + pool_type, avePoolPaddedArea)); + return Ptr(new WGPUBackendNode(inputs, op)); + } +#endif // HAVE_WEBGPU + virtual Ptr initHalide(const std::vector > &inputs) CV_OVERRIDE { diff --git a/modules/dnn/src/layers/prior_box_layer.cpp b/modules/dnn/src/layers/prior_box_layer.cpp index c06065d566a3..8606ff4cea2d 100644 --- a/modules/dnn/src/layers/prior_box_layer.cpp +++ b/modules/dnn/src/layers/prior_box_layer.cpp @@ -52,6 +52,7 @@ #endif #include "../op_vkcom.hpp" +#include "../op_webgpu.hpp" #include #include @@ -295,7 +296,8 @@ class PriorBoxLayerImpl CV_FINAL : public PriorBoxLayer backendId == DNN_BACKEND_CUDA || (backendId == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019 && haveInfEngine() && ( _explicitSizes || (_minSize.size() == 1 && _maxSize.size() <= 1))) - || (backendId == DNN_BACKEND_VKCOM && haveVulkan()); + || (backendId == DNN_BACKEND_VKCOM && haveVulkan()) + || (backendId == DNN_BACKEND_WGPU && haveWGPU()); } bool getMemoryShapes(const std::vector &inputs, @@ -681,6 +683,17 @@ class PriorBoxLayerImpl CV_FINAL : public PriorBoxLayer } #endif // HAVE_VULKAN +#ifdef HAVE_WEBGPU + virtual Ptr initWGPU(const std::vector > &input) CV_OVERRIDE + { + std::shared_ptr op(new webgpu::OpPriorBox(_stepX, _stepY, + _clip, _numPriors, + _variance, _offsetsX, + _offsetsY, _boxWidths, + _boxHeights)); + return Ptr(new WGPUBackendNode(input, op)); + } +#endif // HAVE_WEBGPU virtual int64 getFLOPS(const std::vector &inputs, const std::vector &outputs) const CV_OVERRIDE diff --git a/modules/dnn/src/layers/softmax_layer.cpp b/modules/dnn/src/layers/softmax_layer.cpp index 2ffdd57949ac..3e58baa6b862 100644 --- a/modules/dnn/src/layers/softmax_layer.cpp +++ b/modules/dnn/src/layers/softmax_layer.cpp @@ -325,12 +325,12 @@ class SoftMaxLayerImpl CV_FINAL : public SoftmaxLayer virtual Ptr initWGPU(const std::vector > &inputs) CV_OVERRIDE { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU webgpu::Tensor in = WGPUTensor(inputs[0]); int cAxis = clamp(axisRaw, in.dimNum()); std::shared_ptr op(new webgpu::OpSoftmax(cAxis, logSoftMax)); return Ptr(new WGPUBackendNode(inputs, op)); -// #endif // HAVE_WEBGPU +#endif // HAVE_WEBGPU return Ptr(); } diff --git a/modules/dnn/src/op_webgpu.cpp b/modules/dnn/src/op_webgpu.cpp index ddc876e2978e..45f27f56f9ee 100644 --- a/modules/dnn/src/op_webgpu.cpp +++ b/modules/dnn/src/op_webgpu.cpp @@ -6,7 +6,7 @@ namespace cv { namespace dnn { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU void copyToTensor(webgpu::Tensor &dst, const Mat &src) { CV_Assert(src.isContinuous() && src.type() == CV_32F); @@ -120,8 +120,6 @@ bool WGPUBackendNode::forward(std::vector& outs) return operation->forward(ins, blobs, outs); } -// #endif //HAVE_WEBGPU - void setBackendWrappersDirty(std::vector >& ptrs) { for (const Ptr& ptr : ptrs) @@ -130,18 +128,19 @@ void setBackendWrappersDirty(std::vector >& ptrs) } } +#endif // HAVE_WEBGPU + void forwardWGPU(std::vector > &outputs, const Ptr& node) { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU CV_Assert(!node.empty()); Ptr node_ = node.dynamicCast(); std::vector outs = WGPUTensors(outputs); node_->forward(outs); setBackendWrappersDirty(outputs); - -// #endif +#endif // HAVE_WEBGPU } bool haveWGPU() diff --git a/modules/dnn/src/op_webgpu.hpp b/modules/dnn/src/op_webgpu.hpp index 089da35e09fd..53007621696e 100644 --- a/modules/dnn/src/op_webgpu.hpp +++ b/modules/dnn/src/op_webgpu.hpp @@ -2,15 +2,15 @@ #define OPENCV_DNN_OP_WEBGPU_HPP #include -// #ifdef HAVE_WEBGP&U +#ifdef HAVE_WEBGPU #include "webgpu/include/wgpucom.hpp" -// #endif // HAVE_WEBGPU +#endif // HAVE_WEBGPU namespace cv { namespace dnn { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU std::vector WGPUTensors( const std::vector >& ptrs); webgpu::Tensor WGPUTensor(const Ptr& ptr); @@ -53,7 +53,7 @@ namespace dnn std::vector > inputsWrapper_; std::shared_ptr operation; }; -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU void forwardWGPU(std::vector > &outputs, const Ptr& node); diff --git a/modules/dnn/src/precomp.hpp b/modules/dnn/src/precomp.hpp index 4390264e5590..adda226a3b91 100644 --- a/modules/dnn/src/precomp.hpp +++ b/modules/dnn/src/precomp.hpp @@ -40,6 +40,7 @@ //M*/ #include +#include "cvconfig.h" #ifndef CV_OCL4DNN #define CV_OCL4DNN 0 @@ -65,6 +66,12 @@ #undef HAVE_CUDA #endif +#include +#include + #include #include -#include \ No newline at end of file +#include +#include + +#include "dnn_common.hpp" \ No newline at end of file diff --git a/modules/dnn/src/webgpu/dawn/dawnUtils.cpp b/modules/dnn/src/webgpu/dawn/dawnUtils.cpp index 22862d45936f..793d4dd5808d 100644 --- a/modules/dnn/src/webgpu/dawn/dawnUtils.cpp +++ b/modules/dnn/src/webgpu/dawn/dawnUtils.cpp @@ -1,26 +1,20 @@ #include -// #ifdef HAVE_WEBGPU -#include -#include -#include -#include -#include "opencv2/core/base.hpp" -#include "dawnUtils.hpp" -// #endif #include #include #include #include #include #include +#include "dawnUtils.hpp" +#include "opencv2/core/base.hpp" namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU static dawn_native::Instance* instance; static wgpu::BackendType backendType = wgpu::BackendType::Vulkan; -void PrintDeviceError(WGPUErrorType errorType, const char* message, void*) { +void PrintDeviceError(WGPUErrorType errorType, const char* message, void*) { String errorTypeName = ""; switch (errorType) { case WGPUErrorType_Validation: @@ -113,6 +107,6 @@ wgpu::BindGroupLayout MakeBindGroupLayout( return device.CreateBindGroupLayout(&descriptor); } -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} //namespace cv::dnn::webgpu \ No newline at end of file diff --git a/modules/dnn/src/webgpu/dawn/dawnUtils.hpp b/modules/dnn/src/webgpu/dawn/dawnUtils.hpp index ca7151ad9983..090cddfdb982 100644 --- a/modules/dnn/src/webgpu/dawn/dawnUtils.hpp +++ b/modules/dnn/src/webgpu/dawn/dawnUtils.hpp @@ -1,12 +1,15 @@ // #ifdef HAVE_WEBGPU #include -// #endif +#include +#include +#include +// #endif // HAVE_WEBGPU #include #include #include namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU wgpu::Device createCppDawnDevice(); @@ -27,6 +30,6 @@ wgpu::BindGroupLayout MakeBindGroupLayout( const wgpu::Device& device, std::vector entriesInitializer); -// #endif //HAVE_WEBGPU +#endif //HAVE_WEBGPU }}} // namespace cv::dnn::webgpu \ No newline at end of file diff --git a/modules/dnn/src/webgpu/dawnAPITest/CMakeLists.txt b/modules/dnn/src/webgpu/dawnAPITest/CMakeLists.txt deleted file mode 100644 index 41ed5c90fe09..000000000000 --- a/modules/dnn/src/webgpu/dawnAPITest/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(WEBGPU VERSION 1.0) -set(OPENCV_SOURCE_DIR "/home/webml/GSoC/Forked/opencv") - -set(WEBGPU_INCLUDE_DIRS "${OPENCV_SOURCE_DIR}/3rdparty/include/webgpu/include") -set(WEBGPU_LIBRARIES "${OPENCV_SOURCE_DIR}/3rdparty/include/webgpu/lib") - -add_executable(WEBGPU helloCompute.cpp ${WEBGPU_LIBRARIES}/webgpu_cpp.cpp) -set_property(TARGET WEBGPU PROPERTY CXX_STANDARD 14) -include_directories(${WEBGPU_INCLUDE_DIRS} ) -target_link_directories(WEBGPU PUBLIC ${WEBGPU_LIBRARIES}) -target_link_libraries(WEBGPU PUBLIC dawn_wire dawn_proc dawn_native ) \ No newline at end of file diff --git a/modules/dnn/src/webgpu/dawnAPITest/helloCompute.cpp b/modules/dnn/src/webgpu/dawnAPITest/helloCompute.cpp deleted file mode 100644 index 1e6b93ad359e..000000000000 --- a/modules/dnn/src/webgpu/dawnAPITest/helloCompute.cpp +++ /dev/null @@ -1,319 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -// Refer to https://developers.google.com/web/updates/2019/08/get-started-with-gpu-compute-on-the-web -const char* computeShaderCode = R"(#version 450 - - layout(std430, set = 0, binding = 0) readonly buffer FirstMatrix { - vec2 size; - float numbers[]; - } firstMatrix; - - layout(std430, set = 0, binding = 1) readonly buffer SecondMatrix { - vec2 size; - float numbers[]; - } secondMatrix; - - layout(std430, set = 0, binding = 2) buffer ResultMatrix { - vec2 size; - float numbers[]; - } resultMatrix; - - void main() { - resultMatrix.size = vec2(firstMatrix.size.x, secondMatrix.size.y); - - ivec2 resultCell = ivec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y); - float result = 0.0; - for (int i = 0; i < firstMatrix.size.y; i++) { - int a = i + resultCell.x * int(firstMatrix.size.y); - int b = resultCell.y + i * int(secondMatrix.size.y); - result += firstMatrix.numbers[a] * secondMatrix.numbers[b]; - } - - int index = resultCell.y + resultCell.x * int(secondMatrix.size.y); - resultMatrix.numbers[index] = result; - } -)"; -const uint32_t shaderBuffer[705] = { - 0x07230203,0x00010000,0x00080009,0x0000006a,0x00000000,0x00020011,0x00000001,0x0006000b, - 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, - 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000026,0x00060010,0x00000004, - 0x00000011,0x00000001,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, - 0x00000004,0x6e69616d,0x00000000,0x00060005,0x00000009,0x75736552,0x614d746c,0x78697274, - 0x00000000,0x00050006,0x00000009,0x00000000,0x657a6973,0x00000000,0x00050006,0x00000009, - 0x00000001,0x626d756e,0x00737265,0x00060005,0x0000000b,0x75736572,0x614d746c,0x78697274, - 0x00000000,0x00050005,0x0000000f,0x73726946,0x74614d74,0x00786972,0x00050006,0x0000000f, - 0x00000000,0x657a6973,0x00000000,0x00050006,0x0000000f,0x00000001,0x626d756e,0x00737265, - 0x00050005,0x00000011,0x73726966,0x74614d74,0x00786972,0x00060005,0x00000018,0x6f636553, - 0x614d646e,0x78697274,0x00000000,0x00050006,0x00000018,0x00000000,0x657a6973,0x00000000, - 0x00050006,0x00000018,0x00000001,0x626d756e,0x00737265,0x00060005,0x0000001a,0x6f636573, - 0x614d646e,0x78697274,0x00000000,0x00050005,0x00000023,0x75736572,0x6543746c,0x00006c6c, - 0x00080005,0x00000026,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044, - 0x00040005,0x00000030,0x75736572,0x0000746c,0x00030005,0x00000033,0x00000069,0x00030005, - 0x0000003f,0x00000061,0x00030005,0x00000048,0x00000062,0x00040005,0x0000005d,0x65646e69, - 0x00000078,0x00040047,0x00000008,0x00000006,0x00000004,0x00050048,0x00000009,0x00000000, - 0x00000023,0x00000000,0x00050048,0x00000009,0x00000001,0x00000023,0x00000008,0x00030047, - 0x00000009,0x00000003,0x00040047,0x0000000b,0x00000022,0x00000000,0x00040047,0x0000000b, - 0x00000021,0x00000002,0x00040047,0x0000000e,0x00000006,0x00000004,0x00040048,0x0000000f, - 0x00000000,0x00000018,0x00050048,0x0000000f,0x00000000,0x00000023,0x00000000,0x00040048, - 0x0000000f,0x00000001,0x00000018,0x00050048,0x0000000f,0x00000001,0x00000023,0x00000008, - 0x00030047,0x0000000f,0x00000003,0x00040047,0x00000011,0x00000022,0x00000000,0x00040047, - 0x00000011,0x00000021,0x00000000,0x00040047,0x00000017,0x00000006,0x00000004,0x00040048, - 0x00000018,0x00000000,0x00000018,0x00050048,0x00000018,0x00000000,0x00000023,0x00000000, - 0x00040048,0x00000018,0x00000001,0x00000018,0x00050048,0x00000018,0x00000001,0x00000023, - 0x00000008,0x00030047,0x00000018,0x00000003,0x00040047,0x0000001a,0x00000022,0x00000000, - 0x00040047,0x0000001a,0x00000021,0x00000001,0x00040047,0x00000026,0x0000000b,0x0000001c, - 0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020, - 0x00040017,0x00000007,0x00000006,0x00000002,0x0003001d,0x00000008,0x00000006,0x0004001e, - 0x00000009,0x00000007,0x00000008,0x00040020,0x0000000a,0x00000002,0x00000009,0x0004003b, - 0x0000000a,0x0000000b,0x00000002,0x00040015,0x0000000c,0x00000020,0x00000001,0x0004002b, - 0x0000000c,0x0000000d,0x00000000,0x0003001d,0x0000000e,0x00000006,0x0004001e,0x0000000f, - 0x00000007,0x0000000e,0x00040020,0x00000010,0x00000002,0x0000000f,0x0004003b,0x00000010, - 0x00000011,0x00000002,0x00040015,0x00000012,0x00000020,0x00000000,0x0004002b,0x00000012, - 0x00000013,0x00000000,0x00040020,0x00000014,0x00000002,0x00000006,0x0003001d,0x00000017, - 0x00000006,0x0004001e,0x00000018,0x00000007,0x00000017,0x00040020,0x00000019,0x00000002, - 0x00000018,0x0004003b,0x00000019,0x0000001a,0x00000002,0x0004002b,0x00000012,0x0000001b, - 0x00000001,0x00040020,0x0000001f,0x00000002,0x00000007,0x00040017,0x00000021,0x0000000c, - 0x00000002,0x00040020,0x00000022,0x00000007,0x00000021,0x00040017,0x00000024,0x00000012, - 0x00000003,0x00040020,0x00000025,0x00000001,0x00000024,0x0004003b,0x00000025,0x00000026, - 0x00000001,0x00040020,0x00000027,0x00000001,0x00000012,0x00040020,0x0000002f,0x00000007, - 0x00000006,0x0004002b,0x00000006,0x00000031,0x00000000,0x00040020,0x00000032,0x00000007, - 0x0000000c,0x00020014,0x0000003d,0x0004002b,0x0000000c,0x00000051,0x00000001,0x00050036, - 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000022, - 0x00000023,0x00000007,0x0004003b,0x0000002f,0x00000030,0x00000007,0x0004003b,0x00000032, - 0x00000033,0x00000007,0x0004003b,0x00000032,0x0000003f,0x00000007,0x0004003b,0x00000032, - 0x00000048,0x00000007,0x0004003b,0x00000032,0x0000005d,0x00000007,0x00060041,0x00000014, - 0x00000015,0x00000011,0x0000000d,0x00000013,0x0004003d,0x00000006,0x00000016,0x00000015, - 0x00060041,0x00000014,0x0000001c,0x0000001a,0x0000000d,0x0000001b,0x0004003d,0x00000006, - 0x0000001d,0x0000001c,0x00050050,0x00000007,0x0000001e,0x00000016,0x0000001d,0x00050041, - 0x0000001f,0x00000020,0x0000000b,0x0000000d,0x0003003e,0x00000020,0x0000001e,0x00050041, - 0x00000027,0x00000028,0x00000026,0x00000013,0x0004003d,0x00000012,0x00000029,0x00000028, - 0x0004007c,0x0000000c,0x0000002a,0x00000029,0x00050041,0x00000027,0x0000002b,0x00000026, - 0x0000001b,0x0004003d,0x00000012,0x0000002c,0x0000002b,0x0004007c,0x0000000c,0x0000002d, - 0x0000002c,0x00050050,0x00000021,0x0000002e,0x0000002a,0x0000002d,0x0003003e,0x00000023, - 0x0000002e,0x0003003e,0x00000030,0x00000031,0x0003003e,0x00000033,0x0000000d,0x000200f9, - 0x00000034,0x000200f8,0x00000034,0x000400f6,0x00000036,0x00000037,0x00000000,0x000200f9, - 0x00000038,0x000200f8,0x00000038,0x0004003d,0x0000000c,0x00000039,0x00000033,0x0004006f, - 0x00000006,0x0000003a,0x00000039,0x00060041,0x00000014,0x0000003b,0x00000011,0x0000000d, - 0x0000001b,0x0004003d,0x00000006,0x0000003c,0x0000003b,0x000500b8,0x0000003d,0x0000003e, - 0x0000003a,0x0000003c,0x000400fa,0x0000003e,0x00000035,0x00000036,0x000200f8,0x00000035, - 0x0004003d,0x0000000c,0x00000040,0x00000033,0x00050041,0x00000032,0x00000041,0x00000023, - 0x00000013,0x0004003d,0x0000000c,0x00000042,0x00000041,0x00060041,0x00000014,0x00000043, - 0x00000011,0x0000000d,0x0000001b,0x0004003d,0x00000006,0x00000044,0x00000043,0x0004006e, - 0x0000000c,0x00000045,0x00000044,0x00050084,0x0000000c,0x00000046,0x00000042,0x00000045, - 0x00050080,0x0000000c,0x00000047,0x00000040,0x00000046,0x0003003e,0x0000003f,0x00000047, - 0x00050041,0x00000032,0x00000049,0x00000023,0x0000001b,0x0004003d,0x0000000c,0x0000004a, - 0x00000049,0x0004003d,0x0000000c,0x0000004b,0x00000033,0x00060041,0x00000014,0x0000004c, - 0x0000001a,0x0000000d,0x0000001b,0x0004003d,0x00000006,0x0000004d,0x0000004c,0x0004006e, - 0x0000000c,0x0000004e,0x0000004d,0x00050084,0x0000000c,0x0000004f,0x0000004b,0x0000004e, - 0x00050080,0x0000000c,0x00000050,0x0000004a,0x0000004f,0x0003003e,0x00000048,0x00000050, - 0x0004003d,0x0000000c,0x00000052,0x0000003f,0x00060041,0x00000014,0x00000053,0x00000011, - 0x00000051,0x00000052,0x0004003d,0x00000006,0x00000054,0x00000053,0x0004003d,0x0000000c, - 0x00000055,0x00000048,0x00060041,0x00000014,0x00000056,0x0000001a,0x00000051,0x00000055, - 0x0004003d,0x00000006,0x00000057,0x00000056,0x00050085,0x00000006,0x00000058,0x00000054, - 0x00000057,0x0004003d,0x00000006,0x00000059,0x00000030,0x00050081,0x00000006,0x0000005a, - 0x00000059,0x00000058,0x0003003e,0x00000030,0x0000005a,0x000200f9,0x00000037,0x000200f8, - 0x00000037,0x0004003d,0x0000000c,0x0000005b,0x00000033,0x00050080,0x0000000c,0x0000005c, - 0x0000005b,0x00000051,0x0003003e,0x00000033,0x0000005c,0x000200f9,0x00000034,0x000200f8, - 0x00000036,0x00050041,0x00000032,0x0000005e,0x00000023,0x0000001b,0x0004003d,0x0000000c, - 0x0000005f,0x0000005e,0x00050041,0x00000032,0x00000060,0x00000023,0x00000013,0x0004003d, - 0x0000000c,0x00000061,0x00000060,0x00060041,0x00000014,0x00000062,0x0000001a,0x0000000d, - 0x0000001b,0x0004003d,0x00000006,0x00000063,0x00000062,0x0004006e,0x0000000c,0x00000064, - 0x00000063,0x00050084,0x0000000c,0x00000065,0x00000061,0x00000064,0x00050080,0x0000000c, - 0x00000066,0x0000005f,0x00000065,0x0003003e,0x0000005d,0x00000066,0x0004003d,0x0000000c, - 0x00000067,0x0000005d,0x0004003d,0x00000006,0x00000068,0x00000030,0x00060041,0x00000014, - 0x00000069,0x0000000b,0x00000051,0x00000067,0x0003003e,0x00000069,0x00000068,0x000100fd, - 0x00010038 -}; - -void PrintDeviceError(WGPUErrorType errorType, const char* message, void*) { - std::string errorTypeName = ""; - switch (errorType) { - case WGPUErrorType_Validation: - errorTypeName = "WGPUErrorTyp Validation"; - break; - case WGPUErrorType_OutOfMemory: - errorTypeName = "WGPUErrorTyp Out of memory"; - break; - case WGPUErrorType_Unknown: - errorTypeName = "WGPUErrorTyp Unknown"; - break; - case WGPUErrorType_DeviceLost: - errorTypeName = "WGPUErrorTyp Device lost"; - break; - default : - errorTypeName = "WGPUErrorTyp Unknown"; - return; - } - std::cout<<"Device error:" << errorTypeName< instance; - instance = std::make_unique(); - instance->DiscoverDefaultAdapters(); - // Get an adapter for the backend to use, and create the device. - dawn_native::Adapter backendAdapter; - { - std::vector adapters = instance->GetAdapters(); - auto adapterIt = std::find_if(adapters.begin(), adapters.end(), - [](const dawn_native::Adapter adapter) -> bool { - wgpu::AdapterProperties properties; - adapter.GetProperties(&properties); - return properties.backendType == backendType; - }); - backendAdapter = *adapterIt; - } - WGPUDevice backendDevice = backendAdapter.CreateDevice(); - DawnProcTable backendProcs = dawn_native::GetProcs(); - dawnProcSetProcs(&backendProcs); - backendProcs.deviceSetUncapturedErrorCallback(backendDevice, PrintDeviceError, nullptr); - return wgpu::Device::Acquire(backendDevice); -} - -wgpu::CreateBufferMappedResult createBufferMappedFromData(wgpu::Device& device, - const void* data, - size_t size, - wgpu::BufferUsage usage){ - wgpu::BufferDescriptor descriptor = {}; - descriptor.size = size; - descriptor.usage = usage | wgpu::BufferUsage::CopyDst; - wgpu::CreateBufferMappedResult result = device.CreateBufferMapped(&descriptor); - memcpy(result.data, data, size); - return result; -} - -void readBufferMapReadCallback(WGPUBufferMapAsyncStatus status, - const void* ptr, - uint64_t dataLength, - void* userdata) { - (void)status; - (void)userdata; - printf("resultMatrix: ["); - size_t num = dataLength / sizeof(float); - for (size_t i = 0; i < num; ++i) { - printf("%f", ((const float*)ptr)[i]); - if (i != num - 1) - printf(", "); - } - printf("]\n"); -} - -int main(int /*argc*/, char** /*argv*/) -{ - wgpu::Device device = createCppDawnDevice(); - wgpu::Queue queue = device.GetDefaultQueue(); - // create buffer - wgpu::Buffer inputsBuffer1, inputsBuffer2; - wgpu::Buffer resultBuffer,gpuReadBuffer; - float const inputData1[] = { 2 /* rows */, 4 /* columns */, - 1, 2, 3, 4, 5, 6, 7, 8}; - float const inputData2[] = { 4 /* rows */, 2 /* columns */, - 1, 2, 3, 4, 5, 6, 7, 8}; - - wgpu::BufferDescriptor desc0 = {}; - desc0.size = sizeof(inputData1); - desc0.usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopyDst; - inputsBuffer1 =device.CreateBuffer(&desc0); - inputsBuffer1.SetSubData(0, sizeof(inputData1), inputData1); - - wgpu::BufferDescriptor desc1 = {}; - desc1.size = sizeof(inputData2); - desc1.usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopyDst; - inputsBuffer2 =device.CreateBuffer(&desc1); - inputsBuffer2.SetSubData(0, sizeof(inputData2), inputData2); - - wgpu::BufferDescriptor desc2 = {}; - desc2.size = sizeof(float) * 6; - desc2.usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc; - resultBuffer = device.CreateBuffer(& desc2); - - wgpu::BufferDescriptor desc3 = {}; - desc3.size = sizeof(float) * 6; - desc3.usage = wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::MapRead; - gpuReadBuffer = device.CreateBuffer(& desc3); - - std::cout << "buffer create succeed" < bglEntries { - {0, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}, - {1, wgpu::ShaderStage::Compute, wgpu::BindingType::ReadonlyStorageBuffer}, - {2, wgpu::ShaderStage::Compute, wgpu::BindingType::StorageBuffer}}; - wgpu::BindGroupLayoutDescriptor bglDesc; - bglDesc.entryCount = static_cast(bglEntries.size()); - bglDesc.entries = bglEntries.data(); - wgpu::BindGroupLayout bgl = device.CreateBindGroupLayout(&bglDesc); - - std::vector bgEntries { - { 0, inputsBuffer1, 0, sizeof(inputData1), nullptr, nullptr }, - { 1, inputsBuffer2, 0, sizeof(inputData2), nullptr, nullptr }, - { 2, resultBuffer, 0, sizeof(float) * 6, nullptr, nullptr } }; - wgpu::BindGroupDescriptor bgDesc; - bgDesc.layout = bgl; - bgDesc.entryCount = bgEntries.size(); - bgDesc.entries = bgEntries.data(); - wgpu::BindGroup bg = device.CreateBindGroup(&bgDesc); - std::cout<<"create BindGroup succeed"< -#include -#include "../include/op_softmax.hpp" -#include "../src/context.hpp" -#include "../include/wgpucom.hpp" -#include -#include "../src/common.hpp" -#include -using namespace cv::dnn; -void printData(const void * data, int num) { - printf("resultMatrix: ["); - for (size_t i = 0; i < num; ++i) { - printf("%f", ((const float*)data)[i]); - if (i != num - 1) - printf(", "); - } - printf("]\n"); -} -int main(int argc, char** argv ) -{ - webgpu::isAvailable(); - float inputData1[] = {1, 2, 3, 4, 5, 6, 7, 8}; - std::vector shape = {2,4,1}; // outer_size * channels * channel_size - - webgpu::Tensor input(inputData1, shape, webgpu::Format::wFormatFp32); - webgpu::Tensor out(nullptr, shape, webgpu::Format::wFormatFp32); - - webgpu::OpSoftmax op1(1, false); - op1.forward(input, out); - - const void * result = out.getBuffer()->MapReadAsyncAndWait(); - out.unMap(); - printData(result, out.size()/sizeof(float)); - std::cout<<"Finish"< + #include #include -// #endif -namespace cv { namespace dnn { namespace webgpu { +#ifdef HAVE_WEBGPU +#include +#endif // HAVE_WEBGPU +namespace cv { namespace dnn { namespace webgpu { +#ifdef HAVE_WEBGPU class Buffer { -// #ifdef HAVE_WEBGPU public: Buffer(const std::shared_ptr device); Buffer(const std::shared_ptr device, @@ -20,7 +21,7 @@ class Buffer wgpu::BufferUsage usage = wgpu::BufferUsage::Uniform | wgpu::BufferUsage::CopyDst); ~Buffer() { - if(buffer_) buffer_.Release(); + buffer_.Release(); if(gpuReadBuffer_) gpuReadBuffer_.Release(); } wgpu::Buffer * getWebGPUBuffer() { return & buffer_; } @@ -47,7 +48,7 @@ class Buffer const void * mappedData = nullptr; }; -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} //namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/include/op_base.hpp b/modules/dnn/src/webgpu/include/op_base.hpp index 90ba108371e1..bb9fecb866b5 100644 --- a/modules/dnn/src/webgpu/include/op_base.hpp +++ b/modules/dnn/src/webgpu/include/op_base.hpp @@ -1,20 +1,12 @@ -// This file is part of OpenCV project. -// It is subject to the license terms in the LICENSE file found in the top-level directory -// of this distribution and at http://opencv.org/license.html. -// -// Copyright (C) 2018, Intel Corporation, all rights reserved. -// Third party copyrights are property of their respective owners. - #ifndef OPENCV_DNN_WEBGPU_OP_BASE_HPP #define OPENCV_DNN_WEBGPU_OP_BASE_HPP #include "../../precomp.hpp" #include "wgpucom.hpp" #include "../dawn/dawnUtils.hpp" -#include "tensor.hpp" namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU class Context; class Tensor; class OpBase @@ -45,15 +37,15 @@ class OpBase wgpu::BindGroup bindgroup_; wgpu::ShaderModule module_; wgpu::PipelineLayout pipeline_layout_; - std::vector bgEntries; + std::vector bgEntries = {}; - bool needsUniform = true; uint32_t group_x_; uint32_t group_y_; uint32_t group_z_; std::string type_; }; -// #endif //HAVE_WEBGPU + +#endif // HAVE_WEBGPU }}} //namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/include/op_concat.hpp b/modules/dnn/src/webgpu/include/op_concat.hpp new file mode 100644 index 000000000000..964486aa4266 --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_concat.hpp @@ -0,0 +1,48 @@ +#ifndef OPENCV_DNN_WGPU_OP_CONCAT_HPP +#define OPENCV_DNN_WGPU_OP_CONCAT_HPP + +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +struct ConcatShaderConfig +{ + int local_size_x; + int local_size_y; + int local_size_z; + int block_height; + int block_width; + int block_depth; +}; + +class OpConcat: public OpBase +{ +public: + OpConcat(const int axis); + ~OpConcat(); + bool forward(std::vector& ins, Tensor& out); + void reshapeOutTensor(std::vector& in, Tensor& out); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; + +private: + bool init(const int axis); + bool computeGroupCount(); + ConcatShaderConfig config_; + int axis_; + int out_concat_axis_; + int accumulated_concat_axis_; + int concat_size_; + int total_concat_size_; + int thread_num_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_CONCAT_HPP diff --git a/modules/dnn/src/webgpu/include/op_conv.hpp b/modules/dnn/src/webgpu/include/op_conv.hpp new file mode 100644 index 000000000000..ddf4626bff7b --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_conv.hpp @@ -0,0 +1,80 @@ +#ifndef OPENCV_DNN_WGPU_OP_CONV_HPP +#define OPENCV_DNN_WGPU_OP_CONV_HPP + +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +enum ConvShaderType +{ + wConvShaderTypeBasic = 0, + wConvShaderType48, + wConvShaderTypeDepthWise, + wConvShaderTypeNum +}; + +struct ConvShaderConfig +{ + int local_size_x; + int local_size_y; + int local_size_z; + int block_height; + int block_width; + int block_depth; + ConvShaderType shader_type; +}; + +class OpConv : public OpBase +{ +public: + OpConv(const int out_channel, const bool has_bias, + const int* filter_size, const int* pad, + const int* stride, const int* dilation, + const int activation, const int group, + const int padding_mode); + ~OpConv(); + void reshapeOutTensor(Tensor& in, Tensor& out); + bool forward(Tensor& in, Tensor& filter_weights, Tensor& bias, Tensor& out); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; +private: + bool init(const int out_channel, const bool has_bias, + const int* filter_size, const int* pad, + const int* stride, const int* dilation, + const int activation, const int group, + const int padding_mode); + bool computeGroupCount(); + + int batch_; + int in_height_; + int in_width_; + int in_channel_; + int out_height_; + int out_width_; + int out_channel_; + int filter_height_; + int filter_width_; + int stride_height_; + int stride_width_; + int padding_top_; + int padding_left_; + int dilation_height_; + int dilation_width_; + int activation_; + PaddingMode padding_mode_; + int group_; + int has_bias_; + Tensor* swizzled_weights; + ConvShaderConfig config_; + bool dwconv_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_CONV_HPP diff --git a/modules/dnn/src/webgpu/include/op_lrn.hpp b/modules/dnn/src/webgpu/include/op_lrn.hpp new file mode 100644 index 000000000000..d9e261160558 --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_lrn.hpp @@ -0,0 +1,65 @@ +#ifndef OPENCV_DNN_WGPU_OP_LRN_HPP +#define OPENCV_DNN_WGPU_OP_LRN_HPP + +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +enum LRNShaderType +{ + kLRNShaderTypeBasic = 0, + kLRNShaderTypeNum +}; + +struct LRNShaderConfig +{ + int local_size_x; + int local_size_y; + int local_size_z; + int block_height; + int block_width; + int block_depth; + LRNShaderType shader_type; +}; + +class OpLRN : public OpBase +{ +public: + OpLRN(const int radius, const float bias, + const float alpha, const float beta, + const bool norm_by_size); + ~OpLRN(); + void reshapeOutTensor(Tensor& in, Tensor& out); + bool forward(Tensor& in, Tensor& out); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; + +private: + bool init(const int radius, const float bias, + const float alpha, const float beta, + const bool norm_by_size); + bool computeGroupCount(); + int batch_; + int height_; + int width_; + int channels_; + int radius_; + float bias_; + float alpha_; + float beta_; + int filter_len_; + int thread_num_; + bool norm_by_size_; + LRNShaderConfig config_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_LRN_HPP + diff --git a/modules/dnn/src/webgpu/include/op_permute.hpp b/modules/dnn/src/webgpu/include/op_permute.hpp new file mode 100644 index 000000000000..eba016b4b9db --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_permute.hpp @@ -0,0 +1,42 @@ +#ifndef OPENCV_DNN_WGPU_OP_PERMUTE_HPP +#define OPENCV_DNN_WGPU_OP_PERMUTE_HPP +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +class OpPermute: public OpBase +{ +public: + OpPermute(std::vector& order); + bool forward(std::vector& ins, std::vector& outs); + void reshapeOutTensor(std::vector& in, std::vector& outs); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; + ~OpPermute(); +private: + void prepareStrides(const Shape &shape_before, const Shape &shape_after); + bool computeGroupCount(); + + std::vector order_; + bool need_permute_; + int global_size_; + int nthreads_; + int dims_; + Tensor* tensor_order_; + Tensor* tensor_old_stride_; + Tensor* tensor_new_stride_; + std::vector old_stride_; + std::vector new_stride_; + Shape in_shape_; + Shape out_shape_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_PERMUTE_HPP diff --git a/modules/dnn/src/webgpu/include/op_pool.hpp b/modules/dnn/src/webgpu/include/op_pool.hpp new file mode 100644 index 000000000000..ded5454f1777 --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_pool.hpp @@ -0,0 +1,63 @@ +#ifndef OPENCV_DNN_WGPU_OP_POOL_HPP +#define OPENCV_DNN_WGPU_OP_POOL_HPP +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +enum PoolType { wPoolTypeAvg, wPoolTypeMax, wPoolTypeNum }; + +struct PoolShaderConfig +{ + int local_size_x; + int local_size_y; + int local_size_z; + int block_height; + int block_width; + int block_depth; +}; + +class OpPool: public OpBase +{ +public: + OpPool(const int* filter_size, const int* pad, const int* stride, + const int padding_mode, const PoolType pool_type, + const bool avg_pool_padded_area); + ~OpPool(); + bool forward(Tensor& in, Tensor& out, Tensor& mask); + void reshapeOutTensor(Tensor& in, Tensor& out); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; +private: + bool init(const int* filter_size, const int* pad, const int* stride, + const int padding_mode, const PoolType type, const bool avg_pool_padded_area); + bool computeGroupCount(); + + int batch_; + int channels_; + int in_height_; + int in_width_; + int out_height_; + int out_width_; + int filter_height_; + int filter_width_; + int stride_height_; + int stride_width_; + int padding_left_; + int padding_top_; + PoolType pool_type_; + int avg_pool_padded_area_; + int need_mask_; + PaddingMode padding_mode_; + //int activation_; + PoolShaderConfig config_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_POOL_HPP \ No newline at end of file diff --git a/modules/dnn/src/webgpu/include/op_prior_box.hpp b/modules/dnn/src/webgpu/include/op_prior_box.hpp new file mode 100644 index 000000000000..940d0837abe9 --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_prior_box.hpp @@ -0,0 +1,59 @@ +#ifndef OPENCV_DNN_WGPU_OP_PRIOR_BOX_HPP +#define OPENCV_DNN_WGPU_OP_PRIOR_BOX_HPP +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +class OpPriorBox: public OpBase +{ +public: + OpPriorBox(float step_x, + float step_y, + bool clip, + int num_priors, + std::vector& variance, + std::vector& offsets_x, + std::vector& offsets_y, + std::vector& box_widths, + std::vector& box_heights); + ~OpPriorBox(); + bool forward(std::vector& in, Tensor& out); + void reshapeOutTensor(std::vector& in, Tensor& out); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; +private: + bool computeGroupCount(); + + int global_size_; + int nthreads_; + float step_x_; + float step_y_; + bool clip_; + int num_priors_; + std::vector variance_; + std::vector offsets_x_; + std::vector offsets_y_; + std::vector box_widths_; + std::vector box_heights_; + int img_h_; + int img_w_; + int in_h_; + int in_w_; + int out_channel_; + int out_channel_size_; + Tensor* tensor_offsets_x_; + Tensor* tensor_offsets_y_; + Tensor* tensor_widths_; + Tensor* tensor_heights_; + Tensor* tensor_variance_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_PRIOR_BOX_HPP diff --git a/modules/dnn/src/webgpu/include/op_relu.hpp b/modules/dnn/src/webgpu/include/op_relu.hpp new file mode 100644 index 000000000000..255ef6d7987b --- /dev/null +++ b/modules/dnn/src/webgpu/include/op_relu.hpp @@ -0,0 +1,30 @@ +#ifndef OPENCV_DNN_WGPU_OP_RELU_HPP +#define OPENCV_DNN_WGPU_OP_RELU_HPP +#include "wgpucom.hpp" +#include "op_base.hpp" +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +class OpReLU: public OpBase +{ +public: + OpReLU(const float slope = 1.f); + ~OpReLU(); + bool forward(Tensor& in, Tensor& out); + void reshapeOutTensor(Tensor& in, Tensor& out); + virtual bool forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) CV_OVERRIDE; +private: + bool computeGroupCount(); + int total_; + float slope_; + Buffer* uniformBuffer_ = nullptr; +}; + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu + +#endif // OPENCV_DNN_WGPU_OP_RELU_HPP diff --git a/modules/dnn/src/webgpu/include/op_softmax.hpp b/modules/dnn/src/webgpu/include/op_softmax.hpp index 5f2d5424d9b0..230bebfb1388 100644 --- a/modules/dnn/src/webgpu/include/op_softmax.hpp +++ b/modules/dnn/src/webgpu/include/op_softmax.hpp @@ -4,7 +4,7 @@ #include "op_base.hpp" namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU struct SoftmaxShaderConfig { @@ -35,13 +35,13 @@ class OpSoftmax: public OpBase int channel_size_; int outer_size_; bool log_softmax_; + SoftmaxShaderConfig config_; Tensor* max_tensor_ = nullptr; Tensor* sum_tensor_ = nullptr; - Buffer* uniformBuffer_; - SoftmaxShaderConfig config_; + Buffer* uniformBuffer_ = nullptr; }; -// #endif // HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/include/tensor.hpp b/modules/dnn/src/webgpu/include/tensor.hpp index 505fe5395a69..766497fb1585 100644 --- a/modules/dnn/src/webgpu/include/tensor.hpp +++ b/modules/dnn/src/webgpu/include/tensor.hpp @@ -1,13 +1,12 @@ #ifndef OPENCV_DNN_WEBGPU_TENSOR_HPP #define OPENCV_DNN_WEBGPU_TENSOR_HPP -// #ifdef HAVE_WEBGPU -#include -// #endif -#include"buffer.hpp" -#include"wgpucom.hpp" -#include +#ifdef HAVE_WEBGPU +#include +#endif // HAVE_WEBGPU +#include "wgpucom.hpp" +#include namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU class Buffer; class Tensor{ public: @@ -37,12 +36,12 @@ class Tensor{ std::vector shape_; size_t size_in_byte_; std::shared_ptr buffer_; - Format format_; + Format format_ = wFormatFp32; wgpu::BufferUsage usage_ = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst; }; -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} //namespace cv::dnn:webgpu diff --git a/modules/dnn/src/webgpu/include/wgpucom.hpp b/modules/dnn/src/webgpu/include/wgpucom.hpp index 6e5d1dde5bf7..2720b32ca765 100644 --- a/modules/dnn/src/webgpu/include/wgpucom.hpp +++ b/modules/dnn/src/webgpu/include/wgpucom.hpp @@ -11,7 +11,8 @@ #include namespace cv { namespace dnn { namespace webgpu { -//#ifndef HAVE_WEBGPU +#ifdef HAVE_WEBGPU + enum Format { wFormatInvalid = -1, @@ -55,13 +56,20 @@ enum FusedActivationType typedef std::vector Shape; bool isAvailable(); -//#endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} //namespace cv::dnn::webgpu -#include "tensor.hpp" #include "buffer.hpp" +#include "tensor.hpp" #include "op_base.hpp" +#include "op_concat.hpp" +#include "op_conv.hpp" +#include "op_lrn.hpp" #include "op_softmax.hpp" +#include "op_relu.hpp" +#include "op_pool.hpp" +#include "op_prior_box.hpp" +#include "op_permute.hpp" #endif// OPENCV_DNN_WEBGPU_HPP \ No newline at end of file diff --git a/modules/dnn/src/webgpu/shader/avg_pool.comp b/modules/dnn/src/webgpu/shader/avg_pool.comp new file mode 100644 index 000000000000..f17d9e2d131a --- /dev/null +++ b/modules/dnn/src/webgpu/shader/avg_pool.comp @@ -0,0 +1,70 @@ +#version 450 +#define LOCAL_SZ_X 256 + +layout(binding = 0) buffer Input0{ + float in_buffer[]; +}; + +layout(binding = 1) buffer Output{ + float out_buffer[]; +}; + +layout(binding = 2) uniform pushBlock { + int channels; + int in_h; + int in_w; + int out_h; + int out_w; + int padding_h; + int padding_w; + int filter_h; + int filter_w; + int stride_h; + int stride_w; + int total; + int padded_area; +} p; + +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; + +void main() +{ + int global_size = int(gl_WorkGroupSize.x * gl_NumWorkGroups.x); + int gid = int(gl_GlobalInvocationID.x); + for (int index = gid; index < p.total; index += global_size) + { + const int pw = index % p.out_w; + const int ph = (index / p.out_w) % p.out_h; + const int c = (index / p.out_w / p.out_h) % p.channels; + const int n = index / p.out_w / p.out_h / p.channels; + int hstart = ph * p.stride_h - p.padding_h; + int wstart = pw * p.stride_w - p.padding_w; + int hend = min(hstart + p.filter_h, p.in_h + p.padding_h); + int wend = min(wstart + p.filter_w, p.in_w + p.padding_w); + int pool_size; + if (p.padded_area == 1) + { + pool_size = (hend - hstart) * (wend - wstart); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + hend = min(hend, p.in_h); + wend = min(wend, p.in_w); + } + else + { + hstart = max(hstart, 0); + wstart = max(wstart, 0); + hend = min(hend, p.in_h); + wend = min(wend, p.in_w); + pool_size = (hend - hstart) * (wend - wstart); + } + float aveval = 0; + int off = (n * p.channels + c) * p.in_h * p.in_w; + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + aveval += in_buffer[off + h * p.in_w + w]; + } + } + out_buffer[index] = aveval / pool_size; + } +} diff --git a/modules/dnn/src/webgpu/shader/avg_pool_spv.cpp b/modules/dnn/src/webgpu/shader/avg_pool_spv.cpp new file mode 100644 index 000000000000..2da59a4f0af8 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/avg_pool_spv.cpp @@ -0,0 +1,208 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int avg_pool_spv[1538] = { + 0x07230203,0x00010000,0x00080009,0x000000f5,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0007000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000015,0x00060010, + 0x00000004,0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2, + 0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x626f6c67,0x735f6c61, + 0x00657a69,0x00070005,0x0000000d,0x4e5f6c67,0x6f576d75,0x72476b72,0x7370756f,0x00000000, + 0x00030005,0x00000014,0x00646967,0x00080005,0x00000015,0x475f6c67,0x61626f6c,0x766e496c, + 0x7461636f,0x496e6f69,0x00000044,0x00040005,0x00000019,0x65646e69,0x00000078,0x00050005, + 0x00000021,0x68737570,0x636f6c42,0x0000006b,0x00060006,0x00000021,0x00000000,0x6e616863, + 0x736c656e,0x00000000,0x00050006,0x00000021,0x00000001,0x685f6e69,0x00000000,0x00050006, + 0x00000021,0x00000002,0x775f6e69,0x00000000,0x00050006,0x00000021,0x00000003,0x5f74756f, + 0x00000068,0x00050006,0x00000021,0x00000004,0x5f74756f,0x00000077,0x00060006,0x00000021, + 0x00000005,0x64646170,0x5f676e69,0x00000068,0x00060006,0x00000021,0x00000006,0x64646170, + 0x5f676e69,0x00000077,0x00060006,0x00000021,0x00000007,0x746c6966,0x685f7265,0x00000000, + 0x00060006,0x00000021,0x00000008,0x746c6966,0x775f7265,0x00000000,0x00060006,0x00000021, + 0x00000009,0x69727473,0x685f6564,0x00000000,0x00060006,0x00000021,0x0000000a,0x69727473, + 0x775f6564,0x00000000,0x00050006,0x00000021,0x0000000b,0x61746f74,0x0000006c,0x00060006, + 0x00000021,0x0000000c,0x64646170,0x615f6465,0x00616572,0x00030005,0x00000023,0x00000070, + 0x00030005,0x0000002a,0x00007770,0x00030005,0x00000030,0x00006870,0x00030005,0x00000039, + 0x00000063,0x00030005,0x00000045,0x0000006e,0x00040005,0x00000050,0x61747368,0x00007472, + 0x00040005,0x0000005a,0x61747377,0x00007472,0x00040005,0x00000064,0x646e6568,0x00000000, + 0x00040005,0x00000071,0x646e6577,0x00000000,0x00050005,0x00000084,0x6c6f6f70,0x7a69735f, + 0x00000065,0x00040005,0x000000ae,0x76657661,0x00006c61,0x00030005,0x000000b0,0x0066666f, + 0x00030005,0x000000bd,0x00000068,0x00030005,0x000000c7,0x00000077,0x00040005,0x000000d2, + 0x75706e49,0x00003074,0x00060006,0x000000d2,0x00000000,0x625f6e69,0x65666675,0x00000072, + 0x00030005,0x000000d4,0x00000000,0x00040005,0x000000e7,0x7074754f,0x00007475,0x00060006, + 0x000000e7,0x00000000,0x5f74756f,0x66667562,0x00007265,0x00030005,0x000000e9,0x00000000, + 0x00040047,0x0000000d,0x0000000b,0x00000018,0x00040047,0x00000015,0x0000000b,0x0000001c, + 0x00050048,0x00000021,0x00000000,0x00000023,0x00000000,0x00050048,0x00000021,0x00000001, + 0x00000023,0x00000004,0x00050048,0x00000021,0x00000002,0x00000023,0x00000008,0x00050048, + 0x00000021,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000021,0x00000004,0x00000023, + 0x00000010,0x00050048,0x00000021,0x00000005,0x00000023,0x00000014,0x00050048,0x00000021, + 0x00000006,0x00000023,0x00000018,0x00050048,0x00000021,0x00000007,0x00000023,0x0000001c, + 0x00050048,0x00000021,0x00000008,0x00000023,0x00000020,0x00050048,0x00000021,0x00000009, + 0x00000023,0x00000024,0x00050048,0x00000021,0x0000000a,0x00000023,0x00000028,0x00050048, + 0x00000021,0x0000000b,0x00000023,0x0000002c,0x00050048,0x00000021,0x0000000c,0x00000023, + 0x00000030,0x00030047,0x00000021,0x00000002,0x00040047,0x00000023,0x00000022,0x00000000, + 0x00040047,0x00000023,0x00000021,0x00000002,0x00040047,0x000000d1,0x00000006,0x00000004, + 0x00050048,0x000000d2,0x00000000,0x00000023,0x00000000,0x00030047,0x000000d2,0x00000003, + 0x00040047,0x000000d4,0x00000022,0x00000000,0x00040047,0x000000d4,0x00000021,0x00000000, + 0x00040047,0x000000e6,0x00000006,0x00000004,0x00050048,0x000000e7,0x00000000,0x00000023, + 0x00000000,0x00030047,0x000000e7,0x00000003,0x00040047,0x000000e9,0x00000022,0x00000000, + 0x00040047,0x000000e9,0x00000021,0x00000001,0x00040047,0x000000f4,0x0000000b,0x00000019, + 0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020, + 0x00000001,0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020, + 0x00000000,0x0004002b,0x00000009,0x0000000a,0x00000100,0x00040017,0x0000000b,0x00000009, + 0x00000003,0x00040020,0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d, + 0x00000001,0x0004002b,0x00000009,0x0000000e,0x00000000,0x00040020,0x0000000f,0x00000001, + 0x00000009,0x0004003b,0x0000000c,0x00000015,0x00000001,0x000f001e,0x00000021,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x00000022,0x00000002,0x00000021, + 0x0004003b,0x00000022,0x00000023,0x00000002,0x0004002b,0x00000006,0x00000024,0x0000000b, + 0x00040020,0x00000025,0x00000002,0x00000006,0x00020014,0x00000028,0x0004002b,0x00000006, + 0x0000002c,0x00000004,0x0004002b,0x00000006,0x00000035,0x00000003,0x0004002b,0x00000006, + 0x00000041,0x00000000,0x0004002b,0x00000006,0x00000052,0x00000009,0x0004002b,0x00000006, + 0x00000056,0x00000005,0x0004002b,0x00000006,0x0000005c,0x0000000a,0x0004002b,0x00000006, + 0x00000060,0x00000006,0x0004002b,0x00000006,0x00000066,0x00000007,0x0004002b,0x00000006, + 0x0000006a,0x00000001,0x0004002b,0x00000006,0x00000073,0x00000008,0x0004002b,0x00000006, + 0x00000077,0x00000002,0x0004002b,0x00000006,0x0000007e,0x0000000c,0x00030016,0x000000ac, + 0x00000020,0x00040020,0x000000ad,0x00000007,0x000000ac,0x0004002b,0x000000ac,0x000000af, + 0x00000000,0x0003001d,0x000000d1,0x000000ac,0x0003001e,0x000000d2,0x000000d1,0x00040020, + 0x000000d3,0x00000002,0x000000d2,0x0004003b,0x000000d3,0x000000d4,0x00000002,0x00040020, + 0x000000dd,0x00000002,0x000000ac,0x0003001d,0x000000e6,0x000000ac,0x0003001e,0x000000e7, + 0x000000e6,0x00040020,0x000000e8,0x00000002,0x000000e7,0x0004003b,0x000000e8,0x000000e9, + 0x00000002,0x0004002b,0x00000009,0x000000f3,0x00000001,0x0006002c,0x0000000b,0x000000f4, + 0x0000000a,0x000000f3,0x000000f3,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003, + 0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,0x00000007, + 0x00000014,0x00000007,0x0004003b,0x00000007,0x00000019,0x00000007,0x0004003b,0x00000007, + 0x0000002a,0x00000007,0x0004003b,0x00000007,0x00000030,0x00000007,0x0004003b,0x00000007, + 0x00000039,0x00000007,0x0004003b,0x00000007,0x00000045,0x00000007,0x0004003b,0x00000007, + 0x00000050,0x00000007,0x0004003b,0x00000007,0x0000005a,0x00000007,0x0004003b,0x00000007, + 0x00000064,0x00000007,0x0004003b,0x00000007,0x00000071,0x00000007,0x0004003b,0x00000007, + 0x00000084,0x00000007,0x0004003b,0x000000ad,0x000000ae,0x00000007,0x0004003b,0x00000007, + 0x000000b0,0x00000007,0x0004003b,0x00000007,0x000000bd,0x00000007,0x0004003b,0x00000007, + 0x000000c7,0x00000007,0x00050041,0x0000000f,0x00000010,0x0000000d,0x0000000e,0x0004003d, + 0x00000009,0x00000011,0x00000010,0x00050084,0x00000009,0x00000012,0x0000000a,0x00000011, + 0x0004007c,0x00000006,0x00000013,0x00000012,0x0003003e,0x00000008,0x00000013,0x00050041, + 0x0000000f,0x00000016,0x00000015,0x0000000e,0x0004003d,0x00000009,0x00000017,0x00000016, + 0x0004007c,0x00000006,0x00000018,0x00000017,0x0003003e,0x00000014,0x00000018,0x0004003d, + 0x00000006,0x0000001a,0x00000014,0x0003003e,0x00000019,0x0000001a,0x000200f9,0x0000001b, + 0x000200f8,0x0000001b,0x000400f6,0x0000001d,0x0000001e,0x00000000,0x000200f9,0x0000001f, + 0x000200f8,0x0000001f,0x0004003d,0x00000006,0x00000020,0x00000019,0x00050041,0x00000025, + 0x00000026,0x00000023,0x00000024,0x0004003d,0x00000006,0x00000027,0x00000026,0x000500b1, + 0x00000028,0x00000029,0x00000020,0x00000027,0x000400fa,0x00000029,0x0000001c,0x0000001d, + 0x000200f8,0x0000001c,0x0004003d,0x00000006,0x0000002b,0x00000019,0x00050041,0x00000025, + 0x0000002d,0x00000023,0x0000002c,0x0004003d,0x00000006,0x0000002e,0x0000002d,0x0005008b, + 0x00000006,0x0000002f,0x0000002b,0x0000002e,0x0003003e,0x0000002a,0x0000002f,0x0004003d, + 0x00000006,0x00000031,0x00000019,0x00050041,0x00000025,0x00000032,0x00000023,0x0000002c, + 0x0004003d,0x00000006,0x00000033,0x00000032,0x00050087,0x00000006,0x00000034,0x00000031, + 0x00000033,0x00050041,0x00000025,0x00000036,0x00000023,0x00000035,0x0004003d,0x00000006, + 0x00000037,0x00000036,0x0005008b,0x00000006,0x00000038,0x00000034,0x00000037,0x0003003e, + 0x00000030,0x00000038,0x0004003d,0x00000006,0x0000003a,0x00000019,0x00050041,0x00000025, + 0x0000003b,0x00000023,0x0000002c,0x0004003d,0x00000006,0x0000003c,0x0000003b,0x00050087, + 0x00000006,0x0000003d,0x0000003a,0x0000003c,0x00050041,0x00000025,0x0000003e,0x00000023, + 0x00000035,0x0004003d,0x00000006,0x0000003f,0x0000003e,0x00050087,0x00000006,0x00000040, + 0x0000003d,0x0000003f,0x00050041,0x00000025,0x00000042,0x00000023,0x00000041,0x0004003d, + 0x00000006,0x00000043,0x00000042,0x0005008b,0x00000006,0x00000044,0x00000040,0x00000043, + 0x0003003e,0x00000039,0x00000044,0x0004003d,0x00000006,0x00000046,0x00000019,0x00050041, + 0x00000025,0x00000047,0x00000023,0x0000002c,0x0004003d,0x00000006,0x00000048,0x00000047, + 0x00050087,0x00000006,0x00000049,0x00000046,0x00000048,0x00050041,0x00000025,0x0000004a, + 0x00000023,0x00000035,0x0004003d,0x00000006,0x0000004b,0x0000004a,0x00050087,0x00000006, + 0x0000004c,0x00000049,0x0000004b,0x00050041,0x00000025,0x0000004d,0x00000023,0x00000041, + 0x0004003d,0x00000006,0x0000004e,0x0000004d,0x00050087,0x00000006,0x0000004f,0x0000004c, + 0x0000004e,0x0003003e,0x00000045,0x0000004f,0x0004003d,0x00000006,0x00000051,0x00000030, + 0x00050041,0x00000025,0x00000053,0x00000023,0x00000052,0x0004003d,0x00000006,0x00000054, + 0x00000053,0x00050084,0x00000006,0x00000055,0x00000051,0x00000054,0x00050041,0x00000025, + 0x00000057,0x00000023,0x00000056,0x0004003d,0x00000006,0x00000058,0x00000057,0x00050082, + 0x00000006,0x00000059,0x00000055,0x00000058,0x0003003e,0x00000050,0x00000059,0x0004003d, + 0x00000006,0x0000005b,0x0000002a,0x00050041,0x00000025,0x0000005d,0x00000023,0x0000005c, + 0x0004003d,0x00000006,0x0000005e,0x0000005d,0x00050084,0x00000006,0x0000005f,0x0000005b, + 0x0000005e,0x00050041,0x00000025,0x00000061,0x00000023,0x00000060,0x0004003d,0x00000006, + 0x00000062,0x00000061,0x00050082,0x00000006,0x00000063,0x0000005f,0x00000062,0x0003003e, + 0x0000005a,0x00000063,0x0004003d,0x00000006,0x00000065,0x00000050,0x00050041,0x00000025, + 0x00000067,0x00000023,0x00000066,0x0004003d,0x00000006,0x00000068,0x00000067,0x00050080, + 0x00000006,0x00000069,0x00000065,0x00000068,0x00050041,0x00000025,0x0000006b,0x00000023, + 0x0000006a,0x0004003d,0x00000006,0x0000006c,0x0000006b,0x00050041,0x00000025,0x0000006d, + 0x00000023,0x00000056,0x0004003d,0x00000006,0x0000006e,0x0000006d,0x00050080,0x00000006, + 0x0000006f,0x0000006c,0x0000006e,0x0007000c,0x00000006,0x00000070,0x00000001,0x00000027, + 0x00000069,0x0000006f,0x0003003e,0x00000064,0x00000070,0x0004003d,0x00000006,0x00000072, + 0x0000005a,0x00050041,0x00000025,0x00000074,0x00000023,0x00000073,0x0004003d,0x00000006, + 0x00000075,0x00000074,0x00050080,0x00000006,0x00000076,0x00000072,0x00000075,0x00050041, + 0x00000025,0x00000078,0x00000023,0x00000077,0x0004003d,0x00000006,0x00000079,0x00000078, + 0x00050041,0x00000025,0x0000007a,0x00000023,0x00000060,0x0004003d,0x00000006,0x0000007b, + 0x0000007a,0x00050080,0x00000006,0x0000007c,0x00000079,0x0000007b,0x0007000c,0x00000006, + 0x0000007d,0x00000001,0x00000027,0x00000076,0x0000007c,0x0003003e,0x00000071,0x0000007d, + 0x00050041,0x00000025,0x0000007f,0x00000023,0x0000007e,0x0004003d,0x00000006,0x00000080, + 0x0000007f,0x000500aa,0x00000028,0x00000081,0x00000080,0x0000006a,0x000300f7,0x00000083, + 0x00000000,0x000400fa,0x00000081,0x00000082,0x00000098,0x000200f8,0x00000082,0x0004003d, + 0x00000006,0x00000085,0x00000064,0x0004003d,0x00000006,0x00000086,0x00000050,0x00050082, + 0x00000006,0x00000087,0x00000085,0x00000086,0x0004003d,0x00000006,0x00000088,0x00000071, + 0x0004003d,0x00000006,0x00000089,0x0000005a,0x00050082,0x00000006,0x0000008a,0x00000088, + 0x00000089,0x00050084,0x00000006,0x0000008b,0x00000087,0x0000008a,0x0003003e,0x00000084, + 0x0000008b,0x0004003d,0x00000006,0x0000008c,0x00000050,0x0007000c,0x00000006,0x0000008d, + 0x00000001,0x0000002a,0x0000008c,0x00000041,0x0003003e,0x00000050,0x0000008d,0x0004003d, + 0x00000006,0x0000008e,0x0000005a,0x0007000c,0x00000006,0x0000008f,0x00000001,0x0000002a, + 0x0000008e,0x00000041,0x0003003e,0x0000005a,0x0000008f,0x0004003d,0x00000006,0x00000090, + 0x00000064,0x00050041,0x00000025,0x00000091,0x00000023,0x0000006a,0x0004003d,0x00000006, + 0x00000092,0x00000091,0x0007000c,0x00000006,0x00000093,0x00000001,0x00000027,0x00000090, + 0x00000092,0x0003003e,0x00000064,0x00000093,0x0004003d,0x00000006,0x00000094,0x00000071, + 0x00050041,0x00000025,0x00000095,0x00000023,0x00000077,0x0004003d,0x00000006,0x00000096, + 0x00000095,0x0007000c,0x00000006,0x00000097,0x00000001,0x00000027,0x00000094,0x00000096, + 0x0003003e,0x00000071,0x00000097,0x000200f9,0x00000083,0x000200f8,0x00000098,0x0004003d, + 0x00000006,0x00000099,0x00000050,0x0007000c,0x00000006,0x0000009a,0x00000001,0x0000002a, + 0x00000099,0x00000041,0x0003003e,0x00000050,0x0000009a,0x0004003d,0x00000006,0x0000009b, + 0x0000005a,0x0007000c,0x00000006,0x0000009c,0x00000001,0x0000002a,0x0000009b,0x00000041, + 0x0003003e,0x0000005a,0x0000009c,0x0004003d,0x00000006,0x0000009d,0x00000064,0x00050041, + 0x00000025,0x0000009e,0x00000023,0x0000006a,0x0004003d,0x00000006,0x0000009f,0x0000009e, + 0x0007000c,0x00000006,0x000000a0,0x00000001,0x00000027,0x0000009d,0x0000009f,0x0003003e, + 0x00000064,0x000000a0,0x0004003d,0x00000006,0x000000a1,0x00000071,0x00050041,0x00000025, + 0x000000a2,0x00000023,0x00000077,0x0004003d,0x00000006,0x000000a3,0x000000a2,0x0007000c, + 0x00000006,0x000000a4,0x00000001,0x00000027,0x000000a1,0x000000a3,0x0003003e,0x00000071, + 0x000000a4,0x0004003d,0x00000006,0x000000a5,0x00000064,0x0004003d,0x00000006,0x000000a6, + 0x00000050,0x00050082,0x00000006,0x000000a7,0x000000a5,0x000000a6,0x0004003d,0x00000006, + 0x000000a8,0x00000071,0x0004003d,0x00000006,0x000000a9,0x0000005a,0x00050082,0x00000006, + 0x000000aa,0x000000a8,0x000000a9,0x00050084,0x00000006,0x000000ab,0x000000a7,0x000000aa, + 0x0003003e,0x00000084,0x000000ab,0x000200f9,0x00000083,0x000200f8,0x00000083,0x0003003e, + 0x000000ae,0x000000af,0x0004003d,0x00000006,0x000000b1,0x00000045,0x00050041,0x00000025, + 0x000000b2,0x00000023,0x00000041,0x0004003d,0x00000006,0x000000b3,0x000000b2,0x00050084, + 0x00000006,0x000000b4,0x000000b1,0x000000b3,0x0004003d,0x00000006,0x000000b5,0x00000039, + 0x00050080,0x00000006,0x000000b6,0x000000b4,0x000000b5,0x00050041,0x00000025,0x000000b7, + 0x00000023,0x0000006a,0x0004003d,0x00000006,0x000000b8,0x000000b7,0x00050084,0x00000006, + 0x000000b9,0x000000b6,0x000000b8,0x00050041,0x00000025,0x000000ba,0x00000023,0x00000077, + 0x0004003d,0x00000006,0x000000bb,0x000000ba,0x00050084,0x00000006,0x000000bc,0x000000b9, + 0x000000bb,0x0003003e,0x000000b0,0x000000bc,0x0004003d,0x00000006,0x000000be,0x00000050, + 0x0003003e,0x000000bd,0x000000be,0x000200f9,0x000000bf,0x000200f8,0x000000bf,0x000400f6, + 0x000000c1,0x000000c2,0x00000000,0x000200f9,0x000000c3,0x000200f8,0x000000c3,0x0004003d, + 0x00000006,0x000000c4,0x000000bd,0x0004003d,0x00000006,0x000000c5,0x00000064,0x000500b1, + 0x00000028,0x000000c6,0x000000c4,0x000000c5,0x000400fa,0x000000c6,0x000000c0,0x000000c1, + 0x000200f8,0x000000c0,0x0004003d,0x00000006,0x000000c8,0x0000005a,0x0003003e,0x000000c7, + 0x000000c8,0x000200f9,0x000000c9,0x000200f8,0x000000c9,0x000400f6,0x000000cb,0x000000cc, + 0x00000000,0x000200f9,0x000000cd,0x000200f8,0x000000cd,0x0004003d,0x00000006,0x000000ce, + 0x000000c7,0x0004003d,0x00000006,0x000000cf,0x00000071,0x000500b1,0x00000028,0x000000d0, + 0x000000ce,0x000000cf,0x000400fa,0x000000d0,0x000000ca,0x000000cb,0x000200f8,0x000000ca, + 0x0004003d,0x00000006,0x000000d5,0x000000b0,0x0004003d,0x00000006,0x000000d6,0x000000bd, + 0x00050041,0x00000025,0x000000d7,0x00000023,0x00000077,0x0004003d,0x00000006,0x000000d8, + 0x000000d7,0x00050084,0x00000006,0x000000d9,0x000000d6,0x000000d8,0x00050080,0x00000006, + 0x000000da,0x000000d5,0x000000d9,0x0004003d,0x00000006,0x000000db,0x000000c7,0x00050080, + 0x00000006,0x000000dc,0x000000da,0x000000db,0x00060041,0x000000dd,0x000000de,0x000000d4, + 0x00000041,0x000000dc,0x0004003d,0x000000ac,0x000000df,0x000000de,0x0004003d,0x000000ac, + 0x000000e0,0x000000ae,0x00050081,0x000000ac,0x000000e1,0x000000e0,0x000000df,0x0003003e, + 0x000000ae,0x000000e1,0x000200f9,0x000000cc,0x000200f8,0x000000cc,0x0004003d,0x00000006, + 0x000000e2,0x000000c7,0x00050080,0x00000006,0x000000e3,0x000000e2,0x0000006a,0x0003003e, + 0x000000c7,0x000000e3,0x000200f9,0x000000c9,0x000200f8,0x000000cb,0x000200f9,0x000000c2, + 0x000200f8,0x000000c2,0x0004003d,0x00000006,0x000000e4,0x000000bd,0x00050080,0x00000006, + 0x000000e5,0x000000e4,0x0000006a,0x0003003e,0x000000bd,0x000000e5,0x000200f9,0x000000bf, + 0x000200f8,0x000000c1,0x0004003d,0x00000006,0x000000ea,0x00000019,0x0004003d,0x000000ac, + 0x000000eb,0x000000ae,0x0004003d,0x00000006,0x000000ec,0x00000084,0x0004006f,0x000000ac, + 0x000000ed,0x000000ec,0x00050088,0x000000ac,0x000000ee,0x000000eb,0x000000ed,0x00060041, + 0x000000dd,0x000000ef,0x000000e9,0x00000041,0x000000ea,0x0003003e,0x000000ef,0x000000ee, + 0x000200f9,0x0000001e,0x000200f8,0x0000001e,0x0004003d,0x00000006,0x000000f0,0x00000008, + 0x0004003d,0x00000006,0x000000f1,0x00000019,0x00050080,0x00000006,0x000000f2,0x000000f1, + 0x000000f0,0x0003003e,0x00000019,0x000000f2,0x000200f9,0x0000001b,0x000200f8,0x0000001d, + 0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/concat.comp b/modules/dnn/src/webgpu/shader/concat.comp new file mode 100644 index 000000000000..d8ae0a15dc1c --- /dev/null +++ b/modules/dnn/src/webgpu/shader/concat.comp @@ -0,0 +1,29 @@ +#version 450 +#define LOCAL_SZ_X 256 + +layout(binding = 0) buffer Input0{ + float data[]; +} src; +layout(binding = 1) buffer Output{ + float data[]; +} dst; +layout(binding = 2) uniform pushBlock { + int out_concat_axis; + int accumulated_concat_axis; + int concat_size; + int total_concat_size; + int thread_num; +} p; + +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; +void main() +{ + int index = int(gl_GlobalInvocationID.x); + if (index < p.thread_num) + { + int concat_num = index / p.total_concat_size; + int concat_index = index % p.total_concat_size; + int out_index = concat_index + (concat_num * p.out_concat_axis + p.accumulated_concat_axis) * p.concat_size; + dst.data[out_index] = src.data[index]; + } +} diff --git a/modules/dnn/src/webgpu/shader/concat_spv.cpp b/modules/dnn/src/webgpu/shader/concat_spv.cpp new file mode 100644 index 000000000000..8466b2497460 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/concat_spv.cpp @@ -0,0 +1,83 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int concat_spv[541] = { + 0x07230203,0x00010000,0x00080009,0x0000004b,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00060010,0x00000004, + 0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00040005,0x00000008,0x65646e69,0x00000078,0x00080005, + 0x0000000c,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00050005, + 0x00000013,0x68737570,0x636f6c42,0x0000006b,0x00070006,0x00000013,0x00000000,0x5f74756f, + 0x636e6f63,0x615f7461,0x00736978,0x00090006,0x00000013,0x00000001,0x75636361,0x616c756d, + 0x5f646574,0x636e6f63,0x615f7461,0x00736978,0x00060006,0x00000013,0x00000002,0x636e6f63, + 0x735f7461,0x00657a69,0x00080006,0x00000013,0x00000003,0x61746f74,0x6f635f6c,0x7461636e, + 0x7a69735f,0x00000065,0x00060006,0x00000013,0x00000004,0x65726874,0x6e5f6461,0x00006d75, + 0x00030005,0x00000015,0x00000070,0x00050005,0x0000001e,0x636e6f63,0x6e5f7461,0x00006d75, + 0x00060005,0x00000024,0x636e6f63,0x695f7461,0x7865646e,0x00000000,0x00050005,0x00000029, + 0x5f74756f,0x65646e69,0x00000078,0x00040005,0x0000003b,0x7074754f,0x00007475,0x00050006, + 0x0000003b,0x00000000,0x61746164,0x00000000,0x00030005,0x0000003d,0x00747364,0x00040005, + 0x00000040,0x75706e49,0x00003074,0x00050006,0x00000040,0x00000000,0x61746164,0x00000000, + 0x00030005,0x00000042,0x00637273,0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00050048, + 0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013,0x00000001,0x00000023, + 0x00000004,0x00050048,0x00000013,0x00000002,0x00000023,0x00000008,0x00050048,0x00000013, + 0x00000003,0x00000023,0x0000000c,0x00050048,0x00000013,0x00000004,0x00000023,0x00000010, + 0x00030047,0x00000013,0x00000002,0x00040047,0x00000015,0x00000022,0x00000000,0x00040047, + 0x00000015,0x00000021,0x00000002,0x00040047,0x0000003a,0x00000006,0x00000004,0x00050048, + 0x0000003b,0x00000000,0x00000023,0x00000000,0x00030047,0x0000003b,0x00000003,0x00040047, + 0x0000003d,0x00000022,0x00000000,0x00040047,0x0000003d,0x00000021,0x00000001,0x00040047, + 0x0000003f,0x00000006,0x00000004,0x00050048,0x00000040,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000040,0x00000003,0x00040047,0x00000042,0x00000022,0x00000000,0x00040047, + 0x00000042,0x00000021,0x00000000,0x00040047,0x0000004a,0x0000000b,0x00000019,0x00020013, + 0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001, + 0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000, + 0x00040017,0x0000000a,0x00000009,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a, + 0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000009,0x0000000d,0x00000000, + 0x00040020,0x0000000e,0x00000001,0x00000009,0x0007001e,0x00000013,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00040020,0x00000014,0x00000002,0x00000013,0x0004003b, + 0x00000014,0x00000015,0x00000002,0x0004002b,0x00000006,0x00000016,0x00000004,0x00040020, + 0x00000017,0x00000002,0x00000006,0x00020014,0x0000001a,0x0004002b,0x00000006,0x00000020, + 0x00000003,0x0004002b,0x00000006,0x0000002c,0x00000000,0x0004002b,0x00000006,0x00000030, + 0x00000001,0x0004002b,0x00000006,0x00000034,0x00000002,0x00030016,0x00000039,0x00000020, + 0x0003001d,0x0000003a,0x00000039,0x0003001e,0x0000003b,0x0000003a,0x00040020,0x0000003c, + 0x00000002,0x0000003b,0x0004003b,0x0000003c,0x0000003d,0x00000002,0x0003001d,0x0000003f, + 0x00000039,0x0003001e,0x00000040,0x0000003f,0x00040020,0x00000041,0x00000002,0x00000040, + 0x0004003b,0x00000041,0x00000042,0x00000002,0x00040020,0x00000044,0x00000002,0x00000039, + 0x0004002b,0x00000009,0x00000048,0x00000100,0x0004002b,0x00000009,0x00000049,0x00000001, + 0x0006002c,0x0000000a,0x0000004a,0x00000048,0x00000049,0x00000049,0x00050036,0x00000002, + 0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008, + 0x00000007,0x0004003b,0x00000007,0x0000001e,0x00000007,0x0004003b,0x00000007,0x00000024, + 0x00000007,0x0004003b,0x00000007,0x00000029,0x00000007,0x00050041,0x0000000e,0x0000000f, + 0x0000000c,0x0000000d,0x0004003d,0x00000009,0x00000010,0x0000000f,0x0004007c,0x00000006, + 0x00000011,0x00000010,0x0003003e,0x00000008,0x00000011,0x0004003d,0x00000006,0x00000012, + 0x00000008,0x00050041,0x00000017,0x00000018,0x00000015,0x00000016,0x0004003d,0x00000006, + 0x00000019,0x00000018,0x000500b1,0x0000001a,0x0000001b,0x00000012,0x00000019,0x000300f7, + 0x0000001d,0x00000000,0x000400fa,0x0000001b,0x0000001c,0x0000001d,0x000200f8,0x0000001c, + 0x0004003d,0x00000006,0x0000001f,0x00000008,0x00050041,0x00000017,0x00000021,0x00000015, + 0x00000020,0x0004003d,0x00000006,0x00000022,0x00000021,0x00050087,0x00000006,0x00000023, + 0x0000001f,0x00000022,0x0003003e,0x0000001e,0x00000023,0x0004003d,0x00000006,0x00000025, + 0x00000008,0x00050041,0x00000017,0x00000026,0x00000015,0x00000020,0x0004003d,0x00000006, + 0x00000027,0x00000026,0x0005008b,0x00000006,0x00000028,0x00000025,0x00000027,0x0003003e, + 0x00000024,0x00000028,0x0004003d,0x00000006,0x0000002a,0x00000024,0x0004003d,0x00000006, + 0x0000002b,0x0000001e,0x00050041,0x00000017,0x0000002d,0x00000015,0x0000002c,0x0004003d, + 0x00000006,0x0000002e,0x0000002d,0x00050084,0x00000006,0x0000002f,0x0000002b,0x0000002e, + 0x00050041,0x00000017,0x00000031,0x00000015,0x00000030,0x0004003d,0x00000006,0x00000032, + 0x00000031,0x00050080,0x00000006,0x00000033,0x0000002f,0x00000032,0x00050041,0x00000017, + 0x00000035,0x00000015,0x00000034,0x0004003d,0x00000006,0x00000036,0x00000035,0x00050084, + 0x00000006,0x00000037,0x00000033,0x00000036,0x00050080,0x00000006,0x00000038,0x0000002a, + 0x00000037,0x0003003e,0x00000029,0x00000038,0x0004003d,0x00000006,0x0000003e,0x00000029, + 0x0004003d,0x00000006,0x00000043,0x00000008,0x00060041,0x00000044,0x00000045,0x00000042, + 0x0000002c,0x00000043,0x0004003d,0x00000039,0x00000046,0x00000045,0x00060041,0x00000044, + 0x00000047,0x0000003d,0x0000002c,0x0000003e,0x0003003e,0x00000047,0x00000046,0x000200f9, + 0x0000001d,0x000200f8,0x0000001d,0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/conv.comp b/modules/dnn/src/webgpu/shader/conv.comp new file mode 100644 index 000000000000..5da87de87d21 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/conv.comp @@ -0,0 +1,75 @@ +#version 450 +#define LOCAL_SZ_X 256 +layout(binding = 0) buffer Input0{ + float image_data[]; +}; +layout(binding = 1) buffer Input1 { + float bias_data[]; +}; +layout(binding = 2) buffer Input3{ + float weight_data[]; +}; +layout(binding = 3) buffer Output{ + float convolved_image_data[]; +}; +layout(binding = 4) uniform pushBlock { + int in_h; + int in_w; + int out_h; + int out_w; + int stride_h; + int stride_w; + int pad_h; + int pad_w; + int filter_h; + int filter_w; + int dilation_h; + int dilation_w; + int channels; + int batch; + int has_bias; + int M; + int K; + int N; + int basic_shader_batch_idx; + int basic_shader_partition_idx; + int basic_shader_partition_size; +} p; + +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; +void main() +{ + int gx = int(gl_GlobalInvocationID.x); + int gy = int(gl_GlobalInvocationID.y) + p.basic_shader_partition_idx * p.basic_shader_partition_size; + int gz = p.basic_shader_batch_idx; + if(gx < p.M && gy < p.N) + { + float sum = 0.0f; + int output_y = gx / p.out_w; + int output_x = gx % p.out_w; + int org_y = output_y * p.stride_h - p.pad_h; + int org_x = output_x * p.stride_w - p.pad_w; + int weight_off = gy * p.K; + int input_off = gz * p.in_h * p.in_w * p.channels + (org_y * p.in_w + org_x); + for(int c = 0; c < p.channels; c++) + { + for(int y = 0; y < p.filter_h; y++) + { + for(int x = 0; x < p.filter_w; x++) + { + if((org_y + y * p.dilation_h >= 0) && (org_y + y * p.dilation_h < p.in_h) && (org_x + x * p.dilation_w >= 0) && (org_x + x * p.dilation_w < p.in_w)) + { + sum += image_data[input_off + x * p.dilation_w] * weight_data[weight_off + x]; + } + } + input_off += p.in_w * p.dilation_h; + weight_off += p.filter_w; + } + input_off += p.in_h * p.in_w - p.in_w * p.filter_h * p.dilation_h; + } + int offset = gz * p.M * p.N + gx + gy * p.M; + if (p.has_bias == 1) + sum += bias_data[gy]; + convolved_image_data[offset] = sum; + } +} diff --git a/modules/dnn/src/webgpu/shader/conv48.comp b/modules/dnn/src/webgpu/shader/conv48.comp new file mode 100644 index 000000000000..3067d1b13e08 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/conv48.comp @@ -0,0 +1,140 @@ +#version 450 + +#if defined(ACTIVATION_RELU) +#define ACTIVATION_FUNCTION(x) clamp(x, vec4(0.0), vec4(999999999.0)) +#elif defined(ACTIVATION_RELU1) +#define ACTIVATION_FUNCTION(x) clamp(x, vec4(-1.0), vec4(1.0)) +#elif defined(ACTIVATION_RELU6) +#define ACTIVATION_FUNCTION(x) clamp(x, vec4(0.0), vec4(6.0)) +#else +#define ACTIVATION_FUNCTION(x) (x) +#endif + +layout(binding = 0) buffer Input0{ + float data[]; +} src0; +layout(binding = 1) buffer Input1 { + vec4 data[]; +} bias; +layout(binding = 2) buffer Input3{ + vec4 data[]; +} src1; +layout(binding = 3) buffer Output{ + vec4 data[]; +} out0; +layout(binding = 4) uniform pushBlock{ + int LOCAL_SZ_X; + int LOCAL_SZ_Y; + int LOCAL_SZ_Z; + int IN_H; + int IN_W; + int OUT_W; + int STRIDE_H; + int STRIDE_W; + int PAD_H; + int PAD_W; + int FILTER_H; + int FILTER_W; + int CHANNELS; + int BATCH; + int M; + int K; + int N; + int TAIL_M; + int DILATION_H; + int DILATION_W; +} p; +layout(local_size_x_id = 0, local_size_y_id = 1, local_size_z_id = 2) in; + +#define VEC_SIZE 4 +#define BLOCK_H 4 +#define BLOCK_W 8 +#define FILTER_AREA (p.FILTER_H * p.FILTER_W) +#define LOAD_A(elm_idx, a_component) \ + src0_x = org_x + ((i * VEC_SIZE + elm_idx) % p.FILTER_W) * p.DILATION_W; \ + src0_y = org_y + (((i * VEC_SIZE + elm_idx) % FILTER_AREA) / p.FILTER_W) * p.DILATION_H; \ + src0_z = (i * VEC_SIZE + elm_idx) / FILTER_AREA; \ + if(src0_y >= 0 && src0_y < p.IN_H && src0_x >= 0 && src0_x < p.IN_W) \ + { \ + a_component = src0.data[input_batch_offset + src0_z * (p.IN_H * p.IN_W) + src0_y * p.IN_W + src0_x]; \ + } + +#define A_MULTIPLY_BTILE(a, sliver_num, comp) \ + dst_x = (out_y + sliver_num) % p.OUT_W; \ + dst_y = (out_y + sliver_num) / p.OUT_W; \ + org_y = dst_y * p.STRIDE_H - p.PAD_H; \ + org_x = dst_x * p.STRIDE_W - p.PAD_W; \ + LOAD_A(0, a.x); \ + LOAD_A(1, a.y); \ + LOAD_A(2, a.z); \ + LOAD_A(3, a.w); \ + dot0.comp += dot(brow0, a); \ + dot1.comp += dot(brow1, a); \ + dot2.comp += dot(brow2, a); \ + dot3.comp += dot(brow3, a); \ + dot4.comp += dot(brow4, a); \ + dot5.comp += dot(brow5, a); \ + dot6.comp += dot(brow6, a); \ + dot7.comp += dot(brow7, a); + +void main() +{ + int gx = int(gl_GlobalInvocationID.x); + int gy = int(gl_GlobalInvocationID.y); + int gz = int(gl_GlobalInvocationID.z); + int out_x = BLOCK_W * gx; + int out_y = BLOCK_H * gy; + int input_batch_offset = gz * p.IN_H * p.IN_W * p.CHANNELS; + int output_batch_offset = gz * p.M * p.N / VEC_SIZE; + if (out_x < p.N && gy < p.M / BLOCK_H) + { + int width0 = p.K / VEC_SIZE; + int width1 = p.N / VEC_SIZE; + int src1_read0_offset = out_x * width0; + vec4 dot0 = vec4(0.f); + vec4 dot1 = vec4(0.f); + vec4 dot2 = vec4(0.f); + vec4 dot3 = vec4(0.f); + vec4 dot4 = vec4(0.f); + vec4 dot5 = vec4(0.f); + vec4 dot6 = vec4(0.f); + vec4 dot7 = vec4(0.f); + int i = 0; + do + { + int dst_x, dst_y, org_x, org_y, src0_x, src0_y, src0_z; + vec4 a0 = vec4(0.f), a1 = vec4(0.f), a2 = vec4(0.f), a3 = vec4(0.f); + vec4 brow0 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow1 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow2 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow3 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow4 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow5 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow6 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + vec4 brow7 = src1.data[src1_read0_offset]; src1_read0_offset += width0; + src1_read0_offset += 1 - BLOCK_W * width0; + + A_MULTIPLY_BTILE(a0, 0, x); + A_MULTIPLY_BTILE(a1, 1, y); + A_MULTIPLY_BTILE(a2, 2, z); + A_MULTIPLY_BTILE(a3, 3, w); + i++; + } + while( i < width0 ); + + vec4 bias_val; + bias_val = bias.data[2 * int(gl_GlobalInvocationID.x)]; + dot0 += bias_val.xxxx; dot1 += bias_val.yyyy; dot2 += bias_val.zzzz; dot3 += bias_val.wwww; + bias_val = bias.data[2 * int(gl_GlobalInvocationID.x) + 1]; + dot4 += bias_val.xxxx; dot5 += bias_val.yyyy; dot6 += bias_val.zzzz; dot7 += bias_val.wwww; + + out0.data[output_batch_offset + (out_x + 0) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot0); + out0.data[output_batch_offset + (out_x + 1) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot1); + out0.data[output_batch_offset + (out_x + 2) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot2); + out0.data[output_batch_offset + (out_x + 3) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot3); + out0.data[output_batch_offset + (out_x + 4) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot4); + out0.data[output_batch_offset + (out_x + 5) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot5); + out0.data[output_batch_offset + (out_x + 6) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot6); + out0.data[output_batch_offset + (out_x + 7) * p.M / VEC_SIZE + gy] = ACTIVATION_FUNCTION(dot7); + } +} diff --git a/modules/dnn/src/webgpu/shader/conv48_spv.cpp b/modules/dnn/src/webgpu/shader/conv48_spv.cpp new file mode 100644 index 000000000000..ad523f44cedf --- /dev/null +++ b/modules/dnn/src/webgpu/shader/conv48_spv.cpp @@ -0,0 +1,1286 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int conv48_spv[10161] = { + 0x07230203,0x00010000,0x00080009,0x0000077c,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00060010,0x00000004, + 0x00000011,0x00000001,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00030005,0x00000008,0x00007867,0x00080005,0x0000000c, + 0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00030005,0x00000012, + 0x00007967,0x00030005,0x00000017,0x00007a67,0x00040005,0x0000001c,0x5f74756f,0x00000078, + 0x00040005,0x00000020,0x5f74756f,0x00000079,0x00070005,0x00000024,0x75706e69,0x61625f74, + 0x5f686374,0x7366666f,0x00007465,0x00050005,0x00000026,0x68737570,0x636f6c42,0x0000006b, + 0x00060006,0x00000026,0x00000000,0x41434f4c,0x5a535f4c,0x0000585f,0x00060006,0x00000026, + 0x00000001,0x41434f4c,0x5a535f4c,0x0000595f,0x00060006,0x00000026,0x00000002,0x41434f4c, + 0x5a535f4c,0x00005a5f,0x00050006,0x00000026,0x00000003,0x485f4e49,0x00000000,0x00050006, + 0x00000026,0x00000004,0x575f4e49,0x00000000,0x00050006,0x00000026,0x00000005,0x5f54554f, + 0x00000057,0x00060006,0x00000026,0x00000006,0x49525453,0x485f4544,0x00000000,0x00060006, + 0x00000026,0x00000007,0x49525453,0x575f4544,0x00000000,0x00050006,0x00000026,0x00000008, + 0x5f444150,0x00000048,0x00050006,0x00000026,0x00000009,0x5f444150,0x00000057,0x00060006, + 0x00000026,0x0000000a,0x544c4946,0x485f5245,0x00000000,0x00060006,0x00000026,0x0000000b, + 0x544c4946,0x575f5245,0x00000000,0x00060006,0x00000026,0x0000000c,0x4e414843,0x534c454e, + 0x00000000,0x00050006,0x00000026,0x0000000d,0x43544142,0x00000048,0x00040006,0x00000026, + 0x0000000e,0x0000004d,0x00040006,0x00000026,0x0000000f,0x0000004b,0x00040006,0x00000026, + 0x00000010,0x0000004e,0x00050006,0x00000026,0x00000011,0x4c494154,0x00004d5f,0x00060006, + 0x00000026,0x00000012,0x414c4944,0x4e4f4954,0x0000485f,0x00060006,0x00000026,0x00000013, + 0x414c4944,0x4e4f4954,0x0000575f,0x00030005,0x00000028,0x00000070,0x00070005,0x00000035, + 0x7074756f,0x625f7475,0x68637461,0x66666f5f,0x00746573,0x00040005,0x0000004f,0x74646977, + 0x00003068,0x00040005,0x00000054,0x74646977,0x00003168,0x00070005,0x00000058,0x31637273, + 0x6165725f,0x6f5f3064,0x65736666,0x00000074,0x00040005,0x0000005f,0x30746f64,0x00000000, + 0x00040005,0x00000062,0x31746f64,0x00000000,0x00040005,0x00000063,0x32746f64,0x00000000, + 0x00040005,0x00000064,0x33746f64,0x00000000,0x00040005,0x00000065,0x34746f64,0x00000000, + 0x00040005,0x00000066,0x35746f64,0x00000000,0x00040005,0x00000067,0x36746f64,0x00000000, + 0x00040005,0x00000068,0x37746f64,0x00000000,0x00030005,0x00000069,0x00000069,0x00030005, + 0x0000006f,0x00003061,0x00030005,0x00000070,0x00003161,0x00030005,0x00000071,0x00003261, + 0x00030005,0x00000072,0x00003361,0x00040005,0x00000073,0x776f7262,0x00000030,0x00040005, + 0x00000075,0x75706e49,0x00003374,0x00050006,0x00000075,0x00000000,0x61746164,0x00000000, + 0x00040005,0x00000077,0x31637273,0x00000000,0x00040005,0x0000007f,0x776f7262,0x00000031, + 0x00040005,0x00000086,0x776f7262,0x00000032,0x00040005,0x0000008d,0x776f7262,0x00000033, + 0x00040005,0x00000094,0x776f7262,0x00000034,0x00040005,0x0000009b,0x776f7262,0x00000035, + 0x00040005,0x000000a2,0x776f7262,0x00000036,0x00040005,0x000000a9,0x776f7262,0x00000037, + 0x00040005,0x000000b6,0x5f747364,0x00000078,0x00040005,0x000000bd,0x5f747364,0x00000079, + 0x00040005,0x000000c3,0x5f67726f,0x00000079,0x00040005,0x000000cc,0x5f67726f,0x00000078, + 0x00040005,0x000000d6,0x30637273,0x0000785f,0x00040005,0x000000e4,0x30637273,0x0000795f, + 0x00040005,0x000000f8,0x30637273,0x00007a5f,0x00040005,0x00000118,0x75706e49,0x00003074, + 0x00050006,0x00000118,0x00000000,0x61746164,0x00000000,0x00040005,0x0000011a,0x30637273, + 0x00000000,0x00050005,0x000006e2,0x73616962,0x6c61765f,0x00000000,0x00040005,0x000006e4, + 0x75706e49,0x00003174,0x00050006,0x000006e4,0x00000000,0x61746164,0x00000000,0x00040005, + 0x000006e6,0x73616962,0x00000000,0x00040005,0x00000715,0x7074754f,0x00007475,0x00050006, + 0x00000715,0x00000000,0x61746164,0x00000000,0x00040005,0x00000717,0x3074756f,0x00000000, + 0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00050048,0x00000026,0x00000000,0x00000023, + 0x00000000,0x00050048,0x00000026,0x00000001,0x00000023,0x00000004,0x00050048,0x00000026, + 0x00000002,0x00000023,0x00000008,0x00050048,0x00000026,0x00000003,0x00000023,0x0000000c, + 0x00050048,0x00000026,0x00000004,0x00000023,0x00000010,0x00050048,0x00000026,0x00000005, + 0x00000023,0x00000014,0x00050048,0x00000026,0x00000006,0x00000023,0x00000018,0x00050048, + 0x00000026,0x00000007,0x00000023,0x0000001c,0x00050048,0x00000026,0x00000008,0x00000023, + 0x00000020,0x00050048,0x00000026,0x00000009,0x00000023,0x00000024,0x00050048,0x00000026, + 0x0000000a,0x00000023,0x00000028,0x00050048,0x00000026,0x0000000b,0x00000023,0x0000002c, + 0x00050048,0x00000026,0x0000000c,0x00000023,0x00000030,0x00050048,0x00000026,0x0000000d, + 0x00000023,0x00000034,0x00050048,0x00000026,0x0000000e,0x00000023,0x00000038,0x00050048, + 0x00000026,0x0000000f,0x00000023,0x0000003c,0x00050048,0x00000026,0x00000010,0x00000023, + 0x00000040,0x00050048,0x00000026,0x00000011,0x00000023,0x00000044,0x00050048,0x00000026, + 0x00000012,0x00000023,0x00000048,0x00050048,0x00000026,0x00000013,0x00000023,0x0000004c, + 0x00030047,0x00000026,0x00000002,0x00040047,0x00000028,0x00000022,0x00000000,0x00040047, + 0x00000028,0x00000021,0x00000004,0x00040047,0x00000074,0x00000006,0x00000010,0x00050048, + 0x00000075,0x00000000,0x00000023,0x00000000,0x00030047,0x00000075,0x00000003,0x00040047, + 0x00000077,0x00000022,0x00000000,0x00040047,0x00000077,0x00000021,0x00000002,0x00040047, + 0x00000117,0x00000006,0x00000004,0x00050048,0x00000118,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000118,0x00000003,0x00040047,0x0000011a,0x00000022,0x00000000,0x00040047, + 0x0000011a,0x00000021,0x00000000,0x00040047,0x000006e3,0x00000006,0x00000010,0x00050048, + 0x000006e4,0x00000000,0x00000023,0x00000000,0x00030047,0x000006e4,0x00000003,0x00040047, + 0x000006e6,0x00000022,0x00000000,0x00040047,0x000006e6,0x00000021,0x00000001,0x00040047, + 0x00000714,0x00000006,0x00000010,0x00050048,0x00000715,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000715,0x00000003,0x00040047,0x00000717,0x00000022,0x00000000,0x00040047, + 0x00000717,0x00000021,0x00000003,0x00040047,0x00000778,0x00000001,0x00000000,0x00040047, + 0x00000779,0x00000001,0x00000001,0x00040047,0x0000077a,0x00000001,0x00000002,0x00040047, + 0x0000077b,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002, + 0x00040015,0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,0x00000007,0x00000006, + 0x00040015,0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,0x00000009,0x00000003, + 0x00040020,0x0000000b,0x00000001,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000001, + 0x0004002b,0x00000009,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000001,0x00000009, + 0x0004002b,0x00000009,0x00000013,0x00000001,0x0004002b,0x00000009,0x00000018,0x00000002, + 0x0004002b,0x00000006,0x0000001d,0x00000008,0x0004002b,0x00000006,0x00000021,0x00000004, + 0x0016001e,0x00000026,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x00000027, + 0x00000002,0x00000026,0x0004003b,0x00000027,0x00000028,0x00000002,0x0004002b,0x00000006, + 0x00000029,0x00000003,0x00040020,0x0000002a,0x00000002,0x00000006,0x0004002b,0x00000006, + 0x00000031,0x0000000c,0x0004002b,0x00000006,0x00000037,0x0000000e,0x0004002b,0x00000006, + 0x0000003b,0x00000010,0x00020014,0x00000040,0x0004002b,0x00000006,0x00000050,0x0000000f, + 0x00030016,0x0000005c,0x00000020,0x00040017,0x0000005d,0x0000005c,0x00000004,0x00040020, + 0x0000005e,0x00000007,0x0000005d,0x0004002b,0x0000005c,0x00000060,0x00000000,0x0007002c, + 0x0000005d,0x00000061,0x00000060,0x00000060,0x00000060,0x00000060,0x0004002b,0x00000006, + 0x0000006a,0x00000000,0x0003001d,0x00000074,0x0000005d,0x0003001e,0x00000075,0x00000074, + 0x00040020,0x00000076,0x00000002,0x00000075,0x0004003b,0x00000076,0x00000077,0x00000002, + 0x00040020,0x00000079,0x00000002,0x0000005d,0x0004002b,0x00000006,0x000000b0,0x00000001, + 0x0004002b,0x00000006,0x000000b9,0x00000005,0x0004002b,0x00000006,0x000000c5,0x00000006, + 0x0004002b,0x00000006,0x000000ce,0x00000007,0x0004002b,0x00000006,0x000000d2,0x00000009, + 0x0004002b,0x00000006,0x000000db,0x0000000b,0x0004002b,0x00000006,0x000000df,0x00000013, + 0x0004002b,0x00000006,0x000000e9,0x0000000a,0x0004002b,0x00000006,0x000000f3,0x00000012, + 0x0003001d,0x00000117,0x0000005c,0x0003001e,0x00000118,0x00000117,0x00040020,0x00000119, + 0x00000002,0x00000118,0x0004003b,0x00000119,0x0000011a,0x00000002,0x00040020,0x0000012b, + 0x00000002,0x0000005c,0x00040020,0x0000012e,0x00000007,0x0000005c,0x0004002b,0x00000006, + 0x00000180,0x00000002,0x0004002b,0x00000009,0x00000217,0x00000003,0x0003001d,0x000006e3, + 0x0000005d,0x0003001e,0x000006e4,0x000006e3,0x00040020,0x000006e5,0x00000002,0x000006e4, + 0x0004003b,0x000006e5,0x000006e6,0x00000002,0x0003001d,0x00000714,0x0000005d,0x0003001e, + 0x00000715,0x00000714,0x00040020,0x00000716,0x00000002,0x00000715,0x0004003b,0x00000716, + 0x00000717,0x00000002,0x00040032,0x00000009,0x00000778,0x00000001,0x00040032,0x00000009, + 0x00000779,0x00000001,0x00040032,0x00000009,0x0000077a,0x00000001,0x00060033,0x0000000a, + 0x0000077b,0x00000778,0x00000779,0x0000077a,0x00050036,0x00000002,0x00000004,0x00000000, + 0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b, + 0x00000007,0x00000012,0x00000007,0x0004003b,0x00000007,0x00000017,0x00000007,0x0004003b, + 0x00000007,0x0000001c,0x00000007,0x0004003b,0x00000007,0x00000020,0x00000007,0x0004003b, + 0x00000007,0x00000024,0x00000007,0x0004003b,0x00000007,0x00000035,0x00000007,0x0004003b, + 0x00000007,0x0000004f,0x00000007,0x0004003b,0x00000007,0x00000054,0x00000007,0x0004003b, + 0x00000007,0x00000058,0x00000007,0x0004003b,0x0000005e,0x0000005f,0x00000007,0x0004003b, + 0x0000005e,0x00000062,0x00000007,0x0004003b,0x0000005e,0x00000063,0x00000007,0x0004003b, + 0x0000005e,0x00000064,0x00000007,0x0004003b,0x0000005e,0x00000065,0x00000007,0x0004003b, + 0x0000005e,0x00000066,0x00000007,0x0004003b,0x0000005e,0x00000067,0x00000007,0x0004003b, + 0x0000005e,0x00000068,0x00000007,0x0004003b,0x00000007,0x00000069,0x00000007,0x0004003b, + 0x0000005e,0x0000006f,0x00000007,0x0004003b,0x0000005e,0x00000070,0x00000007,0x0004003b, + 0x0000005e,0x00000071,0x00000007,0x0004003b,0x0000005e,0x00000072,0x00000007,0x0004003b, + 0x0000005e,0x00000073,0x00000007,0x0004003b,0x0000005e,0x0000007f,0x00000007,0x0004003b, + 0x0000005e,0x00000086,0x00000007,0x0004003b,0x0000005e,0x0000008d,0x00000007,0x0004003b, + 0x0000005e,0x00000094,0x00000007,0x0004003b,0x0000005e,0x0000009b,0x00000007,0x0004003b, + 0x0000005e,0x000000a2,0x00000007,0x0004003b,0x0000005e,0x000000a9,0x00000007,0x0004003b, + 0x00000007,0x000000b6,0x00000007,0x0004003b,0x00000007,0x000000bd,0x00000007,0x0004003b, + 0x00000007,0x000000c3,0x00000007,0x0004003b,0x00000007,0x000000cc,0x00000007,0x0004003b, + 0x00000007,0x000000d6,0x00000007,0x0004003b,0x00000007,0x000000e4,0x00000007,0x0004003b, + 0x00000007,0x000000f8,0x00000007,0x0004003b,0x0000005e,0x000006e2,0x00000007,0x00050041, + 0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000009,0x00000010,0x0000000f, + 0x0004007c,0x00000006,0x00000011,0x00000010,0x0003003e,0x00000008,0x00000011,0x00050041, + 0x0000000e,0x00000014,0x0000000c,0x00000013,0x0004003d,0x00000009,0x00000015,0x00000014, + 0x0004007c,0x00000006,0x00000016,0x00000015,0x0003003e,0x00000012,0x00000016,0x00050041, + 0x0000000e,0x00000019,0x0000000c,0x00000018,0x0004003d,0x00000009,0x0000001a,0x00000019, + 0x0004007c,0x00000006,0x0000001b,0x0000001a,0x0003003e,0x00000017,0x0000001b,0x0004003d, + 0x00000006,0x0000001e,0x00000008,0x00050084,0x00000006,0x0000001f,0x0000001d,0x0000001e, + 0x0003003e,0x0000001c,0x0000001f,0x0004003d,0x00000006,0x00000022,0x00000012,0x00050084, + 0x00000006,0x00000023,0x00000021,0x00000022,0x0003003e,0x00000020,0x00000023,0x0004003d, + 0x00000006,0x00000025,0x00000017,0x00050041,0x0000002a,0x0000002b,0x00000028,0x00000029, + 0x0004003d,0x00000006,0x0000002c,0x0000002b,0x00050084,0x00000006,0x0000002d,0x00000025, + 0x0000002c,0x00050041,0x0000002a,0x0000002e,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x0000002f,0x0000002e,0x00050084,0x00000006,0x00000030,0x0000002d,0x0000002f,0x00050041, + 0x0000002a,0x00000032,0x00000028,0x00000031,0x0004003d,0x00000006,0x00000033,0x00000032, + 0x00050084,0x00000006,0x00000034,0x00000030,0x00000033,0x0003003e,0x00000024,0x00000034, + 0x0004003d,0x00000006,0x00000036,0x00000017,0x00050041,0x0000002a,0x00000038,0x00000028, + 0x00000037,0x0004003d,0x00000006,0x00000039,0x00000038,0x00050084,0x00000006,0x0000003a, + 0x00000036,0x00000039,0x00050041,0x0000002a,0x0000003c,0x00000028,0x0000003b,0x0004003d, + 0x00000006,0x0000003d,0x0000003c,0x00050084,0x00000006,0x0000003e,0x0000003a,0x0000003d, + 0x00050087,0x00000006,0x0000003f,0x0000003e,0x00000021,0x0003003e,0x00000035,0x0000003f, + 0x0004003d,0x00000006,0x00000041,0x0000001c,0x00050041,0x0000002a,0x00000042,0x00000028, + 0x0000003b,0x0004003d,0x00000006,0x00000043,0x00000042,0x000500b1,0x00000040,0x00000044, + 0x00000041,0x00000043,0x000300f7,0x00000046,0x00000000,0x000400fa,0x00000044,0x00000045, + 0x00000046,0x000200f8,0x00000045,0x0004003d,0x00000006,0x00000047,0x00000012,0x00050041, + 0x0000002a,0x00000048,0x00000028,0x00000037,0x0004003d,0x00000006,0x00000049,0x00000048, + 0x00050087,0x00000006,0x0000004a,0x00000049,0x00000021,0x000500b1,0x00000040,0x0000004b, + 0x00000047,0x0000004a,0x000200f9,0x00000046,0x000200f8,0x00000046,0x000700f5,0x00000040, + 0x0000004c,0x00000044,0x00000005,0x0000004b,0x00000045,0x000300f7,0x0000004e,0x00000000, + 0x000400fa,0x0000004c,0x0000004d,0x0000004e,0x000200f8,0x0000004d,0x00050041,0x0000002a, + 0x00000051,0x00000028,0x00000050,0x0004003d,0x00000006,0x00000052,0x00000051,0x00050087, + 0x00000006,0x00000053,0x00000052,0x00000021,0x0003003e,0x0000004f,0x00000053,0x00050041, + 0x0000002a,0x00000055,0x00000028,0x0000003b,0x0004003d,0x00000006,0x00000056,0x00000055, + 0x00050087,0x00000006,0x00000057,0x00000056,0x00000021,0x0003003e,0x00000054,0x00000057, + 0x0004003d,0x00000006,0x00000059,0x0000001c,0x0004003d,0x00000006,0x0000005a,0x0000004f, + 0x00050084,0x00000006,0x0000005b,0x00000059,0x0000005a,0x0003003e,0x00000058,0x0000005b, + 0x0003003e,0x0000005f,0x00000061,0x0003003e,0x00000062,0x00000061,0x0003003e,0x00000063, + 0x00000061,0x0003003e,0x00000064,0x00000061,0x0003003e,0x00000065,0x00000061,0x0003003e, + 0x00000066,0x00000061,0x0003003e,0x00000067,0x00000061,0x0003003e,0x00000068,0x00000061, + 0x0003003e,0x00000069,0x0000006a,0x000200f9,0x0000006b,0x000200f8,0x0000006b,0x000400f6, + 0x0000006d,0x0000006e,0x00000000,0x000200f9,0x0000006c,0x000200f8,0x0000006c,0x0003003e, + 0x0000006f,0x00000061,0x0003003e,0x00000070,0x00000061,0x0003003e,0x00000071,0x00000061, + 0x0003003e,0x00000072,0x00000061,0x0004003d,0x00000006,0x00000078,0x00000058,0x00060041, + 0x00000079,0x0000007a,0x00000077,0x0000006a,0x00000078,0x0004003d,0x0000005d,0x0000007b, + 0x0000007a,0x0003003e,0x00000073,0x0000007b,0x0004003d,0x00000006,0x0000007c,0x0000004f, + 0x0004003d,0x00000006,0x0000007d,0x00000058,0x00050080,0x00000006,0x0000007e,0x0000007d, + 0x0000007c,0x0003003e,0x00000058,0x0000007e,0x0004003d,0x00000006,0x00000080,0x00000058, + 0x00060041,0x00000079,0x00000081,0x00000077,0x0000006a,0x00000080,0x0004003d,0x0000005d, + 0x00000082,0x00000081,0x0003003e,0x0000007f,0x00000082,0x0004003d,0x00000006,0x00000083, + 0x0000004f,0x0004003d,0x00000006,0x00000084,0x00000058,0x00050080,0x00000006,0x00000085, + 0x00000084,0x00000083,0x0003003e,0x00000058,0x00000085,0x0004003d,0x00000006,0x00000087, + 0x00000058,0x00060041,0x00000079,0x00000088,0x00000077,0x0000006a,0x00000087,0x0004003d, + 0x0000005d,0x00000089,0x00000088,0x0003003e,0x00000086,0x00000089,0x0004003d,0x00000006, + 0x0000008a,0x0000004f,0x0004003d,0x00000006,0x0000008b,0x00000058,0x00050080,0x00000006, + 0x0000008c,0x0000008b,0x0000008a,0x0003003e,0x00000058,0x0000008c,0x0004003d,0x00000006, + 0x0000008e,0x00000058,0x00060041,0x00000079,0x0000008f,0x00000077,0x0000006a,0x0000008e, + 0x0004003d,0x0000005d,0x00000090,0x0000008f,0x0003003e,0x0000008d,0x00000090,0x0004003d, + 0x00000006,0x00000091,0x0000004f,0x0004003d,0x00000006,0x00000092,0x00000058,0x00050080, + 0x00000006,0x00000093,0x00000092,0x00000091,0x0003003e,0x00000058,0x00000093,0x0004003d, + 0x00000006,0x00000095,0x00000058,0x00060041,0x00000079,0x00000096,0x00000077,0x0000006a, + 0x00000095,0x0004003d,0x0000005d,0x00000097,0x00000096,0x0003003e,0x00000094,0x00000097, + 0x0004003d,0x00000006,0x00000098,0x0000004f,0x0004003d,0x00000006,0x00000099,0x00000058, + 0x00050080,0x00000006,0x0000009a,0x00000099,0x00000098,0x0003003e,0x00000058,0x0000009a, + 0x0004003d,0x00000006,0x0000009c,0x00000058,0x00060041,0x00000079,0x0000009d,0x00000077, + 0x0000006a,0x0000009c,0x0004003d,0x0000005d,0x0000009e,0x0000009d,0x0003003e,0x0000009b, + 0x0000009e,0x0004003d,0x00000006,0x0000009f,0x0000004f,0x0004003d,0x00000006,0x000000a0, + 0x00000058,0x00050080,0x00000006,0x000000a1,0x000000a0,0x0000009f,0x0003003e,0x00000058, + 0x000000a1,0x0004003d,0x00000006,0x000000a3,0x00000058,0x00060041,0x00000079,0x000000a4, + 0x00000077,0x0000006a,0x000000a3,0x0004003d,0x0000005d,0x000000a5,0x000000a4,0x0003003e, + 0x000000a2,0x000000a5,0x0004003d,0x00000006,0x000000a6,0x0000004f,0x0004003d,0x00000006, + 0x000000a7,0x00000058,0x00050080,0x00000006,0x000000a8,0x000000a7,0x000000a6,0x0003003e, + 0x00000058,0x000000a8,0x0004003d,0x00000006,0x000000aa,0x00000058,0x00060041,0x00000079, + 0x000000ab,0x00000077,0x0000006a,0x000000aa,0x0004003d,0x0000005d,0x000000ac,0x000000ab, + 0x0003003e,0x000000a9,0x000000ac,0x0004003d,0x00000006,0x000000ad,0x0000004f,0x0004003d, + 0x00000006,0x000000ae,0x00000058,0x00050080,0x00000006,0x000000af,0x000000ae,0x000000ad, + 0x0003003e,0x00000058,0x000000af,0x0004003d,0x00000006,0x000000b1,0x0000004f,0x00050084, + 0x00000006,0x000000b2,0x0000001d,0x000000b1,0x00050082,0x00000006,0x000000b3,0x000000b0, + 0x000000b2,0x0004003d,0x00000006,0x000000b4,0x00000058,0x00050080,0x00000006,0x000000b5, + 0x000000b4,0x000000b3,0x0003003e,0x00000058,0x000000b5,0x0004003d,0x00000006,0x000000b7, + 0x00000020,0x00050080,0x00000006,0x000000b8,0x000000b7,0x0000006a,0x00050041,0x0000002a, + 0x000000ba,0x00000028,0x000000b9,0x0004003d,0x00000006,0x000000bb,0x000000ba,0x0005008b, + 0x00000006,0x000000bc,0x000000b8,0x000000bb,0x0003003e,0x000000b6,0x000000bc,0x0004003d, + 0x00000006,0x000000be,0x00000020,0x00050080,0x00000006,0x000000bf,0x000000be,0x0000006a, + 0x00050041,0x0000002a,0x000000c0,0x00000028,0x000000b9,0x0004003d,0x00000006,0x000000c1, + 0x000000c0,0x00050087,0x00000006,0x000000c2,0x000000bf,0x000000c1,0x0003003e,0x000000bd, + 0x000000c2,0x0004003d,0x00000006,0x000000c4,0x000000bd,0x00050041,0x0000002a,0x000000c6, + 0x00000028,0x000000c5,0x0004003d,0x00000006,0x000000c7,0x000000c6,0x00050084,0x00000006, + 0x000000c8,0x000000c4,0x000000c7,0x00050041,0x0000002a,0x000000c9,0x00000028,0x0000001d, + 0x0004003d,0x00000006,0x000000ca,0x000000c9,0x00050082,0x00000006,0x000000cb,0x000000c8, + 0x000000ca,0x0003003e,0x000000c3,0x000000cb,0x0004003d,0x00000006,0x000000cd,0x000000b6, + 0x00050041,0x0000002a,0x000000cf,0x00000028,0x000000ce,0x0004003d,0x00000006,0x000000d0, + 0x000000cf,0x00050084,0x00000006,0x000000d1,0x000000cd,0x000000d0,0x00050041,0x0000002a, + 0x000000d3,0x00000028,0x000000d2,0x0004003d,0x00000006,0x000000d4,0x000000d3,0x00050082, + 0x00000006,0x000000d5,0x000000d1,0x000000d4,0x0003003e,0x000000cc,0x000000d5,0x0004003d, + 0x00000006,0x000000d7,0x000000cc,0x0004003d,0x00000006,0x000000d8,0x00000069,0x00050084, + 0x00000006,0x000000d9,0x000000d8,0x00000021,0x00050080,0x00000006,0x000000da,0x000000d9, + 0x0000006a,0x00050041,0x0000002a,0x000000dc,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x000000dd,0x000000dc,0x0005008b,0x00000006,0x000000de,0x000000da,0x000000dd,0x00050041, + 0x0000002a,0x000000e0,0x00000028,0x000000df,0x0004003d,0x00000006,0x000000e1,0x000000e0, + 0x00050084,0x00000006,0x000000e2,0x000000de,0x000000e1,0x00050080,0x00000006,0x000000e3, + 0x000000d7,0x000000e2,0x0003003e,0x000000d6,0x000000e3,0x0004003d,0x00000006,0x000000e5, + 0x000000c3,0x0004003d,0x00000006,0x000000e6,0x00000069,0x00050084,0x00000006,0x000000e7, + 0x000000e6,0x00000021,0x00050080,0x00000006,0x000000e8,0x000000e7,0x0000006a,0x00050041, + 0x0000002a,0x000000ea,0x00000028,0x000000e9,0x0004003d,0x00000006,0x000000eb,0x000000ea, + 0x00050041,0x0000002a,0x000000ec,0x00000028,0x000000db,0x0004003d,0x00000006,0x000000ed, + 0x000000ec,0x00050084,0x00000006,0x000000ee,0x000000eb,0x000000ed,0x0005008b,0x00000006, + 0x000000ef,0x000000e8,0x000000ee,0x00050041,0x0000002a,0x000000f0,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x000000f1,0x000000f0,0x00050087,0x00000006,0x000000f2,0x000000ef, + 0x000000f1,0x00050041,0x0000002a,0x000000f4,0x00000028,0x000000f3,0x0004003d,0x00000006, + 0x000000f5,0x000000f4,0x00050084,0x00000006,0x000000f6,0x000000f2,0x000000f5,0x00050080, + 0x00000006,0x000000f7,0x000000e5,0x000000f6,0x0003003e,0x000000e4,0x000000f7,0x0004003d, + 0x00000006,0x000000f9,0x00000069,0x00050084,0x00000006,0x000000fa,0x000000f9,0x00000021, + 0x00050080,0x00000006,0x000000fb,0x000000fa,0x0000006a,0x00050041,0x0000002a,0x000000fc, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x000000fd,0x000000fc,0x00050041,0x0000002a, + 0x000000fe,0x00000028,0x000000db,0x0004003d,0x00000006,0x000000ff,0x000000fe,0x00050084, + 0x00000006,0x00000100,0x000000fd,0x000000ff,0x00050087,0x00000006,0x00000101,0x000000fb, + 0x00000100,0x0003003e,0x000000f8,0x00000101,0x0004003d,0x00000006,0x00000102,0x000000e4, + 0x000500af,0x00000040,0x00000103,0x00000102,0x0000006a,0x000300f7,0x00000105,0x00000000, + 0x000400fa,0x00000103,0x00000104,0x00000105,0x000200f8,0x00000104,0x0004003d,0x00000006, + 0x00000106,0x000000e4,0x00050041,0x0000002a,0x00000107,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x00000108,0x00000107,0x000500b1,0x00000040,0x00000109,0x00000106,0x00000108, + 0x000200f9,0x00000105,0x000200f8,0x00000105,0x000700f5,0x00000040,0x0000010a,0x00000103, + 0x0000006c,0x00000109,0x00000104,0x0004003d,0x00000006,0x0000010b,0x000000d6,0x000500af, + 0x00000040,0x0000010c,0x0000010b,0x0000006a,0x000500a7,0x00000040,0x0000010d,0x0000010a, + 0x0000010c,0x000300f7,0x0000010f,0x00000000,0x000400fa,0x0000010d,0x0000010e,0x0000010f, + 0x000200f8,0x0000010e,0x0004003d,0x00000006,0x00000110,0x000000d6,0x00050041,0x0000002a, + 0x00000111,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000112,0x00000111,0x000500b1, + 0x00000040,0x00000113,0x00000110,0x00000112,0x000200f9,0x0000010f,0x000200f8,0x0000010f, + 0x000700f5,0x00000040,0x00000114,0x0000010d,0x00000105,0x00000113,0x0000010e,0x000300f7, + 0x00000116,0x00000000,0x000400fa,0x00000114,0x00000115,0x00000116,0x000200f8,0x00000115, + 0x0004003d,0x00000006,0x0000011b,0x00000024,0x0004003d,0x00000006,0x0000011c,0x000000f8, + 0x00050041,0x0000002a,0x0000011d,0x00000028,0x00000029,0x0004003d,0x00000006,0x0000011e, + 0x0000011d,0x00050041,0x0000002a,0x0000011f,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x00000120,0x0000011f,0x00050084,0x00000006,0x00000121,0x0000011e,0x00000120,0x00050084, + 0x00000006,0x00000122,0x0000011c,0x00000121,0x00050080,0x00000006,0x00000123,0x0000011b, + 0x00000122,0x0004003d,0x00000006,0x00000124,0x000000e4,0x00050041,0x0000002a,0x00000125, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x00000126,0x00000125,0x00050084,0x00000006, + 0x00000127,0x00000124,0x00000126,0x00050080,0x00000006,0x00000128,0x00000123,0x00000127, + 0x0004003d,0x00000006,0x00000129,0x000000d6,0x00050080,0x00000006,0x0000012a,0x00000128, + 0x00000129,0x00060041,0x0000012b,0x0000012c,0x0000011a,0x0000006a,0x0000012a,0x0004003d, + 0x0000005c,0x0000012d,0x0000012c,0x00050041,0x0000012e,0x0000012f,0x0000006f,0x0000000d, + 0x0003003e,0x0000012f,0x0000012d,0x000200f9,0x00000116,0x000200f8,0x00000116,0x0004003d, + 0x00000006,0x00000130,0x000000cc,0x0004003d,0x00000006,0x00000131,0x00000069,0x00050084, + 0x00000006,0x00000132,0x00000131,0x00000021,0x00050080,0x00000006,0x00000133,0x00000132, + 0x000000b0,0x00050041,0x0000002a,0x00000134,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x00000135,0x00000134,0x0005008b,0x00000006,0x00000136,0x00000133,0x00000135,0x00050041, + 0x0000002a,0x00000137,0x00000028,0x000000df,0x0004003d,0x00000006,0x00000138,0x00000137, + 0x00050084,0x00000006,0x00000139,0x00000136,0x00000138,0x00050080,0x00000006,0x0000013a, + 0x00000130,0x00000139,0x0003003e,0x000000d6,0x0000013a,0x0004003d,0x00000006,0x0000013b, + 0x000000c3,0x0004003d,0x00000006,0x0000013c,0x00000069,0x00050084,0x00000006,0x0000013d, + 0x0000013c,0x00000021,0x00050080,0x00000006,0x0000013e,0x0000013d,0x000000b0,0x00050041, + 0x0000002a,0x0000013f,0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000140,0x0000013f, + 0x00050041,0x0000002a,0x00000141,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000142, + 0x00000141,0x00050084,0x00000006,0x00000143,0x00000140,0x00000142,0x0005008b,0x00000006, + 0x00000144,0x0000013e,0x00000143,0x00050041,0x0000002a,0x00000145,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x00000146,0x00000145,0x00050087,0x00000006,0x00000147,0x00000144, + 0x00000146,0x00050041,0x0000002a,0x00000148,0x00000028,0x000000f3,0x0004003d,0x00000006, + 0x00000149,0x00000148,0x00050084,0x00000006,0x0000014a,0x00000147,0x00000149,0x00050080, + 0x00000006,0x0000014b,0x0000013b,0x0000014a,0x0003003e,0x000000e4,0x0000014b,0x0004003d, + 0x00000006,0x0000014c,0x00000069,0x00050084,0x00000006,0x0000014d,0x0000014c,0x00000021, + 0x00050080,0x00000006,0x0000014e,0x0000014d,0x000000b0,0x00050041,0x0000002a,0x0000014f, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000150,0x0000014f,0x00050041,0x0000002a, + 0x00000151,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000152,0x00000151,0x00050084, + 0x00000006,0x00000153,0x00000150,0x00000152,0x00050087,0x00000006,0x00000154,0x0000014e, + 0x00000153,0x0003003e,0x000000f8,0x00000154,0x0004003d,0x00000006,0x00000155,0x000000e4, + 0x000500af,0x00000040,0x00000156,0x00000155,0x0000006a,0x000300f7,0x00000158,0x00000000, + 0x000400fa,0x00000156,0x00000157,0x00000158,0x000200f8,0x00000157,0x0004003d,0x00000006, + 0x00000159,0x000000e4,0x00050041,0x0000002a,0x0000015a,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x0000015b,0x0000015a,0x000500b1,0x00000040,0x0000015c,0x00000159,0x0000015b, + 0x000200f9,0x00000158,0x000200f8,0x00000158,0x000700f5,0x00000040,0x0000015d,0x00000156, + 0x00000116,0x0000015c,0x00000157,0x0004003d,0x00000006,0x0000015e,0x000000d6,0x000500af, + 0x00000040,0x0000015f,0x0000015e,0x0000006a,0x000500a7,0x00000040,0x00000160,0x0000015d, + 0x0000015f,0x000300f7,0x00000162,0x00000000,0x000400fa,0x00000160,0x00000161,0x00000162, + 0x000200f8,0x00000161,0x0004003d,0x00000006,0x00000163,0x000000d6,0x00050041,0x0000002a, + 0x00000164,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000165,0x00000164,0x000500b1, + 0x00000040,0x00000166,0x00000163,0x00000165,0x000200f9,0x00000162,0x000200f8,0x00000162, + 0x000700f5,0x00000040,0x00000167,0x00000160,0x00000158,0x00000166,0x00000161,0x000300f7, + 0x00000169,0x00000000,0x000400fa,0x00000167,0x00000168,0x00000169,0x000200f8,0x00000168, + 0x0004003d,0x00000006,0x0000016a,0x00000024,0x0004003d,0x00000006,0x0000016b,0x000000f8, + 0x00050041,0x0000002a,0x0000016c,0x00000028,0x00000029,0x0004003d,0x00000006,0x0000016d, + 0x0000016c,0x00050041,0x0000002a,0x0000016e,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x0000016f,0x0000016e,0x00050084,0x00000006,0x00000170,0x0000016d,0x0000016f,0x00050084, + 0x00000006,0x00000171,0x0000016b,0x00000170,0x00050080,0x00000006,0x00000172,0x0000016a, + 0x00000171,0x0004003d,0x00000006,0x00000173,0x000000e4,0x00050041,0x0000002a,0x00000174, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x00000175,0x00000174,0x00050084,0x00000006, + 0x00000176,0x00000173,0x00000175,0x00050080,0x00000006,0x00000177,0x00000172,0x00000176, + 0x0004003d,0x00000006,0x00000178,0x000000d6,0x00050080,0x00000006,0x00000179,0x00000177, + 0x00000178,0x00060041,0x0000012b,0x0000017a,0x0000011a,0x0000006a,0x00000179,0x0004003d, + 0x0000005c,0x0000017b,0x0000017a,0x00050041,0x0000012e,0x0000017c,0x0000006f,0x00000013, + 0x0003003e,0x0000017c,0x0000017b,0x000200f9,0x00000169,0x000200f8,0x00000169,0x0004003d, + 0x00000006,0x0000017d,0x000000cc,0x0004003d,0x00000006,0x0000017e,0x00000069,0x00050084, + 0x00000006,0x0000017f,0x0000017e,0x00000021,0x00050080,0x00000006,0x00000181,0x0000017f, + 0x00000180,0x00050041,0x0000002a,0x00000182,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x00000183,0x00000182,0x0005008b,0x00000006,0x00000184,0x00000181,0x00000183,0x00050041, + 0x0000002a,0x00000185,0x00000028,0x000000df,0x0004003d,0x00000006,0x00000186,0x00000185, + 0x00050084,0x00000006,0x00000187,0x00000184,0x00000186,0x00050080,0x00000006,0x00000188, + 0x0000017d,0x00000187,0x0003003e,0x000000d6,0x00000188,0x0004003d,0x00000006,0x00000189, + 0x000000c3,0x0004003d,0x00000006,0x0000018a,0x00000069,0x00050084,0x00000006,0x0000018b, + 0x0000018a,0x00000021,0x00050080,0x00000006,0x0000018c,0x0000018b,0x00000180,0x00050041, + 0x0000002a,0x0000018d,0x00000028,0x000000e9,0x0004003d,0x00000006,0x0000018e,0x0000018d, + 0x00050041,0x0000002a,0x0000018f,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000190, + 0x0000018f,0x00050084,0x00000006,0x00000191,0x0000018e,0x00000190,0x0005008b,0x00000006, + 0x00000192,0x0000018c,0x00000191,0x00050041,0x0000002a,0x00000193,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x00000194,0x00000193,0x00050087,0x00000006,0x00000195,0x00000192, + 0x00000194,0x00050041,0x0000002a,0x00000196,0x00000028,0x000000f3,0x0004003d,0x00000006, + 0x00000197,0x00000196,0x00050084,0x00000006,0x00000198,0x00000195,0x00000197,0x00050080, + 0x00000006,0x00000199,0x00000189,0x00000198,0x0003003e,0x000000e4,0x00000199,0x0004003d, + 0x00000006,0x0000019a,0x00000069,0x00050084,0x00000006,0x0000019b,0x0000019a,0x00000021, + 0x00050080,0x00000006,0x0000019c,0x0000019b,0x00000180,0x00050041,0x0000002a,0x0000019d, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x0000019e,0x0000019d,0x00050041,0x0000002a, + 0x0000019f,0x00000028,0x000000db,0x0004003d,0x00000006,0x000001a0,0x0000019f,0x00050084, + 0x00000006,0x000001a1,0x0000019e,0x000001a0,0x00050087,0x00000006,0x000001a2,0x0000019c, + 0x000001a1,0x0003003e,0x000000f8,0x000001a2,0x0004003d,0x00000006,0x000001a3,0x000000e4, + 0x000500af,0x00000040,0x000001a4,0x000001a3,0x0000006a,0x000300f7,0x000001a6,0x00000000, + 0x000400fa,0x000001a4,0x000001a5,0x000001a6,0x000200f8,0x000001a5,0x0004003d,0x00000006, + 0x000001a7,0x000000e4,0x00050041,0x0000002a,0x000001a8,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x000001a9,0x000001a8,0x000500b1,0x00000040,0x000001aa,0x000001a7,0x000001a9, + 0x000200f9,0x000001a6,0x000200f8,0x000001a6,0x000700f5,0x00000040,0x000001ab,0x000001a4, + 0x00000169,0x000001aa,0x000001a5,0x0004003d,0x00000006,0x000001ac,0x000000d6,0x000500af, + 0x00000040,0x000001ad,0x000001ac,0x0000006a,0x000500a7,0x00000040,0x000001ae,0x000001ab, + 0x000001ad,0x000300f7,0x000001b0,0x00000000,0x000400fa,0x000001ae,0x000001af,0x000001b0, + 0x000200f8,0x000001af,0x0004003d,0x00000006,0x000001b1,0x000000d6,0x00050041,0x0000002a, + 0x000001b2,0x00000028,0x00000021,0x0004003d,0x00000006,0x000001b3,0x000001b2,0x000500b1, + 0x00000040,0x000001b4,0x000001b1,0x000001b3,0x000200f9,0x000001b0,0x000200f8,0x000001b0, + 0x000700f5,0x00000040,0x000001b5,0x000001ae,0x000001a6,0x000001b4,0x000001af,0x000300f7, + 0x000001b7,0x00000000,0x000400fa,0x000001b5,0x000001b6,0x000001b7,0x000200f8,0x000001b6, + 0x0004003d,0x00000006,0x000001b8,0x00000024,0x0004003d,0x00000006,0x000001b9,0x000000f8, + 0x00050041,0x0000002a,0x000001ba,0x00000028,0x00000029,0x0004003d,0x00000006,0x000001bb, + 0x000001ba,0x00050041,0x0000002a,0x000001bc,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x000001bd,0x000001bc,0x00050084,0x00000006,0x000001be,0x000001bb,0x000001bd,0x00050084, + 0x00000006,0x000001bf,0x000001b9,0x000001be,0x00050080,0x00000006,0x000001c0,0x000001b8, + 0x000001bf,0x0004003d,0x00000006,0x000001c1,0x000000e4,0x00050041,0x0000002a,0x000001c2, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x000001c3,0x000001c2,0x00050084,0x00000006, + 0x000001c4,0x000001c1,0x000001c3,0x00050080,0x00000006,0x000001c5,0x000001c0,0x000001c4, + 0x0004003d,0x00000006,0x000001c6,0x000000d6,0x00050080,0x00000006,0x000001c7,0x000001c5, + 0x000001c6,0x00060041,0x0000012b,0x000001c8,0x0000011a,0x0000006a,0x000001c7,0x0004003d, + 0x0000005c,0x000001c9,0x000001c8,0x00050041,0x0000012e,0x000001ca,0x0000006f,0x00000018, + 0x0003003e,0x000001ca,0x000001c9,0x000200f9,0x000001b7,0x000200f8,0x000001b7,0x0004003d, + 0x00000006,0x000001cb,0x000000cc,0x0004003d,0x00000006,0x000001cc,0x00000069,0x00050084, + 0x00000006,0x000001cd,0x000001cc,0x00000021,0x00050080,0x00000006,0x000001ce,0x000001cd, + 0x00000029,0x00050041,0x0000002a,0x000001cf,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x000001d0,0x000001cf,0x0005008b,0x00000006,0x000001d1,0x000001ce,0x000001d0,0x00050041, + 0x0000002a,0x000001d2,0x00000028,0x000000df,0x0004003d,0x00000006,0x000001d3,0x000001d2, + 0x00050084,0x00000006,0x000001d4,0x000001d1,0x000001d3,0x00050080,0x00000006,0x000001d5, + 0x000001cb,0x000001d4,0x0003003e,0x000000d6,0x000001d5,0x0004003d,0x00000006,0x000001d6, + 0x000000c3,0x0004003d,0x00000006,0x000001d7,0x00000069,0x00050084,0x00000006,0x000001d8, + 0x000001d7,0x00000021,0x00050080,0x00000006,0x000001d9,0x000001d8,0x00000029,0x00050041, + 0x0000002a,0x000001da,0x00000028,0x000000e9,0x0004003d,0x00000006,0x000001db,0x000001da, + 0x00050041,0x0000002a,0x000001dc,0x00000028,0x000000db,0x0004003d,0x00000006,0x000001dd, + 0x000001dc,0x00050084,0x00000006,0x000001de,0x000001db,0x000001dd,0x0005008b,0x00000006, + 0x000001df,0x000001d9,0x000001de,0x00050041,0x0000002a,0x000001e0,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x000001e1,0x000001e0,0x00050087,0x00000006,0x000001e2,0x000001df, + 0x000001e1,0x00050041,0x0000002a,0x000001e3,0x00000028,0x000000f3,0x0004003d,0x00000006, + 0x000001e4,0x000001e3,0x00050084,0x00000006,0x000001e5,0x000001e2,0x000001e4,0x00050080, + 0x00000006,0x000001e6,0x000001d6,0x000001e5,0x0003003e,0x000000e4,0x000001e6,0x0004003d, + 0x00000006,0x000001e7,0x00000069,0x00050084,0x00000006,0x000001e8,0x000001e7,0x00000021, + 0x00050080,0x00000006,0x000001e9,0x000001e8,0x00000029,0x00050041,0x0000002a,0x000001ea, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x000001eb,0x000001ea,0x00050041,0x0000002a, + 0x000001ec,0x00000028,0x000000db,0x0004003d,0x00000006,0x000001ed,0x000001ec,0x00050084, + 0x00000006,0x000001ee,0x000001eb,0x000001ed,0x00050087,0x00000006,0x000001ef,0x000001e9, + 0x000001ee,0x0003003e,0x000000f8,0x000001ef,0x0004003d,0x00000006,0x000001f0,0x000000e4, + 0x000500af,0x00000040,0x000001f1,0x000001f0,0x0000006a,0x000300f7,0x000001f3,0x00000000, + 0x000400fa,0x000001f1,0x000001f2,0x000001f3,0x000200f8,0x000001f2,0x0004003d,0x00000006, + 0x000001f4,0x000000e4,0x00050041,0x0000002a,0x000001f5,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x000001f6,0x000001f5,0x000500b1,0x00000040,0x000001f7,0x000001f4,0x000001f6, + 0x000200f9,0x000001f3,0x000200f8,0x000001f3,0x000700f5,0x00000040,0x000001f8,0x000001f1, + 0x000001b7,0x000001f7,0x000001f2,0x0004003d,0x00000006,0x000001f9,0x000000d6,0x000500af, + 0x00000040,0x000001fa,0x000001f9,0x0000006a,0x000500a7,0x00000040,0x000001fb,0x000001f8, + 0x000001fa,0x000300f7,0x000001fd,0x00000000,0x000400fa,0x000001fb,0x000001fc,0x000001fd, + 0x000200f8,0x000001fc,0x0004003d,0x00000006,0x000001fe,0x000000d6,0x00050041,0x0000002a, + 0x000001ff,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000200,0x000001ff,0x000500b1, + 0x00000040,0x00000201,0x000001fe,0x00000200,0x000200f9,0x000001fd,0x000200f8,0x000001fd, + 0x000700f5,0x00000040,0x00000202,0x000001fb,0x000001f3,0x00000201,0x000001fc,0x000300f7, + 0x00000204,0x00000000,0x000400fa,0x00000202,0x00000203,0x00000204,0x000200f8,0x00000203, + 0x0004003d,0x00000006,0x00000205,0x00000024,0x0004003d,0x00000006,0x00000206,0x000000f8, + 0x00050041,0x0000002a,0x00000207,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000208, + 0x00000207,0x00050041,0x0000002a,0x00000209,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x0000020a,0x00000209,0x00050084,0x00000006,0x0000020b,0x00000208,0x0000020a,0x00050084, + 0x00000006,0x0000020c,0x00000206,0x0000020b,0x00050080,0x00000006,0x0000020d,0x00000205, + 0x0000020c,0x0004003d,0x00000006,0x0000020e,0x000000e4,0x00050041,0x0000002a,0x0000020f, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x00000210,0x0000020f,0x00050084,0x00000006, + 0x00000211,0x0000020e,0x00000210,0x00050080,0x00000006,0x00000212,0x0000020d,0x00000211, + 0x0004003d,0x00000006,0x00000213,0x000000d6,0x00050080,0x00000006,0x00000214,0x00000212, + 0x00000213,0x00060041,0x0000012b,0x00000215,0x0000011a,0x0000006a,0x00000214,0x0004003d, + 0x0000005c,0x00000216,0x00000215,0x00050041,0x0000012e,0x00000218,0x0000006f,0x00000217, + 0x0003003e,0x00000218,0x00000216,0x000200f9,0x00000204,0x000200f8,0x00000204,0x0004003d, + 0x0000005d,0x00000219,0x00000073,0x0004003d,0x0000005d,0x0000021a,0x0000006f,0x00050094, + 0x0000005c,0x0000021b,0x00000219,0x0000021a,0x00050041,0x0000012e,0x0000021c,0x0000005f, + 0x0000000d,0x0004003d,0x0000005c,0x0000021d,0x0000021c,0x00050081,0x0000005c,0x0000021e, + 0x0000021d,0x0000021b,0x00050041,0x0000012e,0x0000021f,0x0000005f,0x0000000d,0x0003003e, + 0x0000021f,0x0000021e,0x0004003d,0x0000005d,0x00000220,0x0000007f,0x0004003d,0x0000005d, + 0x00000221,0x0000006f,0x00050094,0x0000005c,0x00000222,0x00000220,0x00000221,0x00050041, + 0x0000012e,0x00000223,0x00000062,0x0000000d,0x0004003d,0x0000005c,0x00000224,0x00000223, + 0x00050081,0x0000005c,0x00000225,0x00000224,0x00000222,0x00050041,0x0000012e,0x00000226, + 0x00000062,0x0000000d,0x0003003e,0x00000226,0x00000225,0x0004003d,0x0000005d,0x00000227, + 0x00000086,0x0004003d,0x0000005d,0x00000228,0x0000006f,0x00050094,0x0000005c,0x00000229, + 0x00000227,0x00000228,0x00050041,0x0000012e,0x0000022a,0x00000063,0x0000000d,0x0004003d, + 0x0000005c,0x0000022b,0x0000022a,0x00050081,0x0000005c,0x0000022c,0x0000022b,0x00000229, + 0x00050041,0x0000012e,0x0000022d,0x00000063,0x0000000d,0x0003003e,0x0000022d,0x0000022c, + 0x0004003d,0x0000005d,0x0000022e,0x0000008d,0x0004003d,0x0000005d,0x0000022f,0x0000006f, + 0x00050094,0x0000005c,0x00000230,0x0000022e,0x0000022f,0x00050041,0x0000012e,0x00000231, + 0x00000064,0x0000000d,0x0004003d,0x0000005c,0x00000232,0x00000231,0x00050081,0x0000005c, + 0x00000233,0x00000232,0x00000230,0x00050041,0x0000012e,0x00000234,0x00000064,0x0000000d, + 0x0003003e,0x00000234,0x00000233,0x0004003d,0x0000005d,0x00000235,0x00000094,0x0004003d, + 0x0000005d,0x00000236,0x0000006f,0x00050094,0x0000005c,0x00000237,0x00000235,0x00000236, + 0x00050041,0x0000012e,0x00000238,0x00000065,0x0000000d,0x0004003d,0x0000005c,0x00000239, + 0x00000238,0x00050081,0x0000005c,0x0000023a,0x00000239,0x00000237,0x00050041,0x0000012e, + 0x0000023b,0x00000065,0x0000000d,0x0003003e,0x0000023b,0x0000023a,0x0004003d,0x0000005d, + 0x0000023c,0x0000009b,0x0004003d,0x0000005d,0x0000023d,0x0000006f,0x00050094,0x0000005c, + 0x0000023e,0x0000023c,0x0000023d,0x00050041,0x0000012e,0x0000023f,0x00000066,0x0000000d, + 0x0004003d,0x0000005c,0x00000240,0x0000023f,0x00050081,0x0000005c,0x00000241,0x00000240, + 0x0000023e,0x00050041,0x0000012e,0x00000242,0x00000066,0x0000000d,0x0003003e,0x00000242, + 0x00000241,0x0004003d,0x0000005d,0x00000243,0x000000a2,0x0004003d,0x0000005d,0x00000244, + 0x0000006f,0x00050094,0x0000005c,0x00000245,0x00000243,0x00000244,0x00050041,0x0000012e, + 0x00000246,0x00000067,0x0000000d,0x0004003d,0x0000005c,0x00000247,0x00000246,0x00050081, + 0x0000005c,0x00000248,0x00000247,0x00000245,0x00050041,0x0000012e,0x00000249,0x00000067, + 0x0000000d,0x0003003e,0x00000249,0x00000248,0x0004003d,0x0000005d,0x0000024a,0x000000a9, + 0x0004003d,0x0000005d,0x0000024b,0x0000006f,0x00050094,0x0000005c,0x0000024c,0x0000024a, + 0x0000024b,0x00050041,0x0000012e,0x0000024d,0x00000068,0x0000000d,0x0004003d,0x0000005c, + 0x0000024e,0x0000024d,0x00050081,0x0000005c,0x0000024f,0x0000024e,0x0000024c,0x00050041, + 0x0000012e,0x00000250,0x00000068,0x0000000d,0x0003003e,0x00000250,0x0000024f,0x0004003d, + 0x00000006,0x00000251,0x00000020,0x00050080,0x00000006,0x00000252,0x00000251,0x000000b0, + 0x00050041,0x0000002a,0x00000253,0x00000028,0x000000b9,0x0004003d,0x00000006,0x00000254, + 0x00000253,0x0005008b,0x00000006,0x00000255,0x00000252,0x00000254,0x0003003e,0x000000b6, + 0x00000255,0x0004003d,0x00000006,0x00000256,0x00000020,0x00050080,0x00000006,0x00000257, + 0x00000256,0x000000b0,0x00050041,0x0000002a,0x00000258,0x00000028,0x000000b9,0x0004003d, + 0x00000006,0x00000259,0x00000258,0x00050087,0x00000006,0x0000025a,0x00000257,0x00000259, + 0x0003003e,0x000000bd,0x0000025a,0x0004003d,0x00000006,0x0000025b,0x000000bd,0x00050041, + 0x0000002a,0x0000025c,0x00000028,0x000000c5,0x0004003d,0x00000006,0x0000025d,0x0000025c, + 0x00050084,0x00000006,0x0000025e,0x0000025b,0x0000025d,0x00050041,0x0000002a,0x0000025f, + 0x00000028,0x0000001d,0x0004003d,0x00000006,0x00000260,0x0000025f,0x00050082,0x00000006, + 0x00000261,0x0000025e,0x00000260,0x0003003e,0x000000c3,0x00000261,0x0004003d,0x00000006, + 0x00000262,0x000000b6,0x00050041,0x0000002a,0x00000263,0x00000028,0x000000ce,0x0004003d, + 0x00000006,0x00000264,0x00000263,0x00050084,0x00000006,0x00000265,0x00000262,0x00000264, + 0x00050041,0x0000002a,0x00000266,0x00000028,0x000000d2,0x0004003d,0x00000006,0x00000267, + 0x00000266,0x00050082,0x00000006,0x00000268,0x00000265,0x00000267,0x0003003e,0x000000cc, + 0x00000268,0x0004003d,0x00000006,0x00000269,0x000000cc,0x0004003d,0x00000006,0x0000026a, + 0x00000069,0x00050084,0x00000006,0x0000026b,0x0000026a,0x00000021,0x00050080,0x00000006, + 0x0000026c,0x0000026b,0x0000006a,0x00050041,0x0000002a,0x0000026d,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x0000026e,0x0000026d,0x0005008b,0x00000006,0x0000026f,0x0000026c, + 0x0000026e,0x00050041,0x0000002a,0x00000270,0x00000028,0x000000df,0x0004003d,0x00000006, + 0x00000271,0x00000270,0x00050084,0x00000006,0x00000272,0x0000026f,0x00000271,0x00050080, + 0x00000006,0x00000273,0x00000269,0x00000272,0x0003003e,0x000000d6,0x00000273,0x0004003d, + 0x00000006,0x00000274,0x000000c3,0x0004003d,0x00000006,0x00000275,0x00000069,0x00050084, + 0x00000006,0x00000276,0x00000275,0x00000021,0x00050080,0x00000006,0x00000277,0x00000276, + 0x0000006a,0x00050041,0x0000002a,0x00000278,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x00000279,0x00000278,0x00050041,0x0000002a,0x0000027a,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x0000027b,0x0000027a,0x00050084,0x00000006,0x0000027c,0x00000279,0x0000027b, + 0x0005008b,0x00000006,0x0000027d,0x00000277,0x0000027c,0x00050041,0x0000002a,0x0000027e, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x0000027f,0x0000027e,0x00050087,0x00000006, + 0x00000280,0x0000027d,0x0000027f,0x00050041,0x0000002a,0x00000281,0x00000028,0x000000f3, + 0x0004003d,0x00000006,0x00000282,0x00000281,0x00050084,0x00000006,0x00000283,0x00000280, + 0x00000282,0x00050080,0x00000006,0x00000284,0x00000274,0x00000283,0x0003003e,0x000000e4, + 0x00000284,0x0004003d,0x00000006,0x00000285,0x00000069,0x00050084,0x00000006,0x00000286, + 0x00000285,0x00000021,0x00050080,0x00000006,0x00000287,0x00000286,0x0000006a,0x00050041, + 0x0000002a,0x00000288,0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000289,0x00000288, + 0x00050041,0x0000002a,0x0000028a,0x00000028,0x000000db,0x0004003d,0x00000006,0x0000028b, + 0x0000028a,0x00050084,0x00000006,0x0000028c,0x00000289,0x0000028b,0x00050087,0x00000006, + 0x0000028d,0x00000287,0x0000028c,0x0003003e,0x000000f8,0x0000028d,0x0004003d,0x00000006, + 0x0000028e,0x000000e4,0x000500af,0x00000040,0x0000028f,0x0000028e,0x0000006a,0x000300f7, + 0x00000291,0x00000000,0x000400fa,0x0000028f,0x00000290,0x00000291,0x000200f8,0x00000290, + 0x0004003d,0x00000006,0x00000292,0x000000e4,0x00050041,0x0000002a,0x00000293,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x00000294,0x00000293,0x000500b1,0x00000040,0x00000295, + 0x00000292,0x00000294,0x000200f9,0x00000291,0x000200f8,0x00000291,0x000700f5,0x00000040, + 0x00000296,0x0000028f,0x00000204,0x00000295,0x00000290,0x0004003d,0x00000006,0x00000297, + 0x000000d6,0x000500af,0x00000040,0x00000298,0x00000297,0x0000006a,0x000500a7,0x00000040, + 0x00000299,0x00000296,0x00000298,0x000300f7,0x0000029b,0x00000000,0x000400fa,0x00000299, + 0x0000029a,0x0000029b,0x000200f8,0x0000029a,0x0004003d,0x00000006,0x0000029c,0x000000d6, + 0x00050041,0x0000002a,0x0000029d,0x00000028,0x00000021,0x0004003d,0x00000006,0x0000029e, + 0x0000029d,0x000500b1,0x00000040,0x0000029f,0x0000029c,0x0000029e,0x000200f9,0x0000029b, + 0x000200f8,0x0000029b,0x000700f5,0x00000040,0x000002a0,0x00000299,0x00000291,0x0000029f, + 0x0000029a,0x000300f7,0x000002a2,0x00000000,0x000400fa,0x000002a0,0x000002a1,0x000002a2, + 0x000200f8,0x000002a1,0x0004003d,0x00000006,0x000002a3,0x00000024,0x0004003d,0x00000006, + 0x000002a4,0x000000f8,0x00050041,0x0000002a,0x000002a5,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x000002a6,0x000002a5,0x00050041,0x0000002a,0x000002a7,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x000002a8,0x000002a7,0x00050084,0x00000006,0x000002a9,0x000002a6, + 0x000002a8,0x00050084,0x00000006,0x000002aa,0x000002a4,0x000002a9,0x00050080,0x00000006, + 0x000002ab,0x000002a3,0x000002aa,0x0004003d,0x00000006,0x000002ac,0x000000e4,0x00050041, + 0x0000002a,0x000002ad,0x00000028,0x00000021,0x0004003d,0x00000006,0x000002ae,0x000002ad, + 0x00050084,0x00000006,0x000002af,0x000002ac,0x000002ae,0x00050080,0x00000006,0x000002b0, + 0x000002ab,0x000002af,0x0004003d,0x00000006,0x000002b1,0x000000d6,0x00050080,0x00000006, + 0x000002b2,0x000002b0,0x000002b1,0x00060041,0x0000012b,0x000002b3,0x0000011a,0x0000006a, + 0x000002b2,0x0004003d,0x0000005c,0x000002b4,0x000002b3,0x00050041,0x0000012e,0x000002b5, + 0x00000070,0x0000000d,0x0003003e,0x000002b5,0x000002b4,0x000200f9,0x000002a2,0x000200f8, + 0x000002a2,0x0004003d,0x00000006,0x000002b6,0x000000cc,0x0004003d,0x00000006,0x000002b7, + 0x00000069,0x00050084,0x00000006,0x000002b8,0x000002b7,0x00000021,0x00050080,0x00000006, + 0x000002b9,0x000002b8,0x000000b0,0x00050041,0x0000002a,0x000002ba,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x000002bb,0x000002ba,0x0005008b,0x00000006,0x000002bc,0x000002b9, + 0x000002bb,0x00050041,0x0000002a,0x000002bd,0x00000028,0x000000df,0x0004003d,0x00000006, + 0x000002be,0x000002bd,0x00050084,0x00000006,0x000002bf,0x000002bc,0x000002be,0x00050080, + 0x00000006,0x000002c0,0x000002b6,0x000002bf,0x0003003e,0x000000d6,0x000002c0,0x0004003d, + 0x00000006,0x000002c1,0x000000c3,0x0004003d,0x00000006,0x000002c2,0x00000069,0x00050084, + 0x00000006,0x000002c3,0x000002c2,0x00000021,0x00050080,0x00000006,0x000002c4,0x000002c3, + 0x000000b0,0x00050041,0x0000002a,0x000002c5,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x000002c6,0x000002c5,0x00050041,0x0000002a,0x000002c7,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x000002c8,0x000002c7,0x00050084,0x00000006,0x000002c9,0x000002c6,0x000002c8, + 0x0005008b,0x00000006,0x000002ca,0x000002c4,0x000002c9,0x00050041,0x0000002a,0x000002cb, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x000002cc,0x000002cb,0x00050087,0x00000006, + 0x000002cd,0x000002ca,0x000002cc,0x00050041,0x0000002a,0x000002ce,0x00000028,0x000000f3, + 0x0004003d,0x00000006,0x000002cf,0x000002ce,0x00050084,0x00000006,0x000002d0,0x000002cd, + 0x000002cf,0x00050080,0x00000006,0x000002d1,0x000002c1,0x000002d0,0x0003003e,0x000000e4, + 0x000002d1,0x0004003d,0x00000006,0x000002d2,0x00000069,0x00050084,0x00000006,0x000002d3, + 0x000002d2,0x00000021,0x00050080,0x00000006,0x000002d4,0x000002d3,0x000000b0,0x00050041, + 0x0000002a,0x000002d5,0x00000028,0x000000e9,0x0004003d,0x00000006,0x000002d6,0x000002d5, + 0x00050041,0x0000002a,0x000002d7,0x00000028,0x000000db,0x0004003d,0x00000006,0x000002d8, + 0x000002d7,0x00050084,0x00000006,0x000002d9,0x000002d6,0x000002d8,0x00050087,0x00000006, + 0x000002da,0x000002d4,0x000002d9,0x0003003e,0x000000f8,0x000002da,0x0004003d,0x00000006, + 0x000002db,0x000000e4,0x000500af,0x00000040,0x000002dc,0x000002db,0x0000006a,0x000300f7, + 0x000002de,0x00000000,0x000400fa,0x000002dc,0x000002dd,0x000002de,0x000200f8,0x000002dd, + 0x0004003d,0x00000006,0x000002df,0x000000e4,0x00050041,0x0000002a,0x000002e0,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x000002e1,0x000002e0,0x000500b1,0x00000040,0x000002e2, + 0x000002df,0x000002e1,0x000200f9,0x000002de,0x000200f8,0x000002de,0x000700f5,0x00000040, + 0x000002e3,0x000002dc,0x000002a2,0x000002e2,0x000002dd,0x0004003d,0x00000006,0x000002e4, + 0x000000d6,0x000500af,0x00000040,0x000002e5,0x000002e4,0x0000006a,0x000500a7,0x00000040, + 0x000002e6,0x000002e3,0x000002e5,0x000300f7,0x000002e8,0x00000000,0x000400fa,0x000002e6, + 0x000002e7,0x000002e8,0x000200f8,0x000002e7,0x0004003d,0x00000006,0x000002e9,0x000000d6, + 0x00050041,0x0000002a,0x000002ea,0x00000028,0x00000021,0x0004003d,0x00000006,0x000002eb, + 0x000002ea,0x000500b1,0x00000040,0x000002ec,0x000002e9,0x000002eb,0x000200f9,0x000002e8, + 0x000200f8,0x000002e8,0x000700f5,0x00000040,0x000002ed,0x000002e6,0x000002de,0x000002ec, + 0x000002e7,0x000300f7,0x000002ef,0x00000000,0x000400fa,0x000002ed,0x000002ee,0x000002ef, + 0x000200f8,0x000002ee,0x0004003d,0x00000006,0x000002f0,0x00000024,0x0004003d,0x00000006, + 0x000002f1,0x000000f8,0x00050041,0x0000002a,0x000002f2,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x000002f3,0x000002f2,0x00050041,0x0000002a,0x000002f4,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x000002f5,0x000002f4,0x00050084,0x00000006,0x000002f6,0x000002f3, + 0x000002f5,0x00050084,0x00000006,0x000002f7,0x000002f1,0x000002f6,0x00050080,0x00000006, + 0x000002f8,0x000002f0,0x000002f7,0x0004003d,0x00000006,0x000002f9,0x000000e4,0x00050041, + 0x0000002a,0x000002fa,0x00000028,0x00000021,0x0004003d,0x00000006,0x000002fb,0x000002fa, + 0x00050084,0x00000006,0x000002fc,0x000002f9,0x000002fb,0x00050080,0x00000006,0x000002fd, + 0x000002f8,0x000002fc,0x0004003d,0x00000006,0x000002fe,0x000000d6,0x00050080,0x00000006, + 0x000002ff,0x000002fd,0x000002fe,0x00060041,0x0000012b,0x00000300,0x0000011a,0x0000006a, + 0x000002ff,0x0004003d,0x0000005c,0x00000301,0x00000300,0x00050041,0x0000012e,0x00000302, + 0x00000070,0x00000013,0x0003003e,0x00000302,0x00000301,0x000200f9,0x000002ef,0x000200f8, + 0x000002ef,0x0004003d,0x00000006,0x00000303,0x000000cc,0x0004003d,0x00000006,0x00000304, + 0x00000069,0x00050084,0x00000006,0x00000305,0x00000304,0x00000021,0x00050080,0x00000006, + 0x00000306,0x00000305,0x00000180,0x00050041,0x0000002a,0x00000307,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x00000308,0x00000307,0x0005008b,0x00000006,0x00000309,0x00000306, + 0x00000308,0x00050041,0x0000002a,0x0000030a,0x00000028,0x000000df,0x0004003d,0x00000006, + 0x0000030b,0x0000030a,0x00050084,0x00000006,0x0000030c,0x00000309,0x0000030b,0x00050080, + 0x00000006,0x0000030d,0x00000303,0x0000030c,0x0003003e,0x000000d6,0x0000030d,0x0004003d, + 0x00000006,0x0000030e,0x000000c3,0x0004003d,0x00000006,0x0000030f,0x00000069,0x00050084, + 0x00000006,0x00000310,0x0000030f,0x00000021,0x00050080,0x00000006,0x00000311,0x00000310, + 0x00000180,0x00050041,0x0000002a,0x00000312,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x00000313,0x00000312,0x00050041,0x0000002a,0x00000314,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x00000315,0x00000314,0x00050084,0x00000006,0x00000316,0x00000313,0x00000315, + 0x0005008b,0x00000006,0x00000317,0x00000311,0x00000316,0x00050041,0x0000002a,0x00000318, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x00000319,0x00000318,0x00050087,0x00000006, + 0x0000031a,0x00000317,0x00000319,0x00050041,0x0000002a,0x0000031b,0x00000028,0x000000f3, + 0x0004003d,0x00000006,0x0000031c,0x0000031b,0x00050084,0x00000006,0x0000031d,0x0000031a, + 0x0000031c,0x00050080,0x00000006,0x0000031e,0x0000030e,0x0000031d,0x0003003e,0x000000e4, + 0x0000031e,0x0004003d,0x00000006,0x0000031f,0x00000069,0x00050084,0x00000006,0x00000320, + 0x0000031f,0x00000021,0x00050080,0x00000006,0x00000321,0x00000320,0x00000180,0x00050041, + 0x0000002a,0x00000322,0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000323,0x00000322, + 0x00050041,0x0000002a,0x00000324,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000325, + 0x00000324,0x00050084,0x00000006,0x00000326,0x00000323,0x00000325,0x00050087,0x00000006, + 0x00000327,0x00000321,0x00000326,0x0003003e,0x000000f8,0x00000327,0x0004003d,0x00000006, + 0x00000328,0x000000e4,0x000500af,0x00000040,0x00000329,0x00000328,0x0000006a,0x000300f7, + 0x0000032b,0x00000000,0x000400fa,0x00000329,0x0000032a,0x0000032b,0x000200f8,0x0000032a, + 0x0004003d,0x00000006,0x0000032c,0x000000e4,0x00050041,0x0000002a,0x0000032d,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x0000032e,0x0000032d,0x000500b1,0x00000040,0x0000032f, + 0x0000032c,0x0000032e,0x000200f9,0x0000032b,0x000200f8,0x0000032b,0x000700f5,0x00000040, + 0x00000330,0x00000329,0x000002ef,0x0000032f,0x0000032a,0x0004003d,0x00000006,0x00000331, + 0x000000d6,0x000500af,0x00000040,0x00000332,0x00000331,0x0000006a,0x000500a7,0x00000040, + 0x00000333,0x00000330,0x00000332,0x000300f7,0x00000335,0x00000000,0x000400fa,0x00000333, + 0x00000334,0x00000335,0x000200f8,0x00000334,0x0004003d,0x00000006,0x00000336,0x000000d6, + 0x00050041,0x0000002a,0x00000337,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000338, + 0x00000337,0x000500b1,0x00000040,0x00000339,0x00000336,0x00000338,0x000200f9,0x00000335, + 0x000200f8,0x00000335,0x000700f5,0x00000040,0x0000033a,0x00000333,0x0000032b,0x00000339, + 0x00000334,0x000300f7,0x0000033c,0x00000000,0x000400fa,0x0000033a,0x0000033b,0x0000033c, + 0x000200f8,0x0000033b,0x0004003d,0x00000006,0x0000033d,0x00000024,0x0004003d,0x00000006, + 0x0000033e,0x000000f8,0x00050041,0x0000002a,0x0000033f,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x00000340,0x0000033f,0x00050041,0x0000002a,0x00000341,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x00000342,0x00000341,0x00050084,0x00000006,0x00000343,0x00000340, + 0x00000342,0x00050084,0x00000006,0x00000344,0x0000033e,0x00000343,0x00050080,0x00000006, + 0x00000345,0x0000033d,0x00000344,0x0004003d,0x00000006,0x00000346,0x000000e4,0x00050041, + 0x0000002a,0x00000347,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000348,0x00000347, + 0x00050084,0x00000006,0x00000349,0x00000346,0x00000348,0x00050080,0x00000006,0x0000034a, + 0x00000345,0x00000349,0x0004003d,0x00000006,0x0000034b,0x000000d6,0x00050080,0x00000006, + 0x0000034c,0x0000034a,0x0000034b,0x00060041,0x0000012b,0x0000034d,0x0000011a,0x0000006a, + 0x0000034c,0x0004003d,0x0000005c,0x0000034e,0x0000034d,0x00050041,0x0000012e,0x0000034f, + 0x00000070,0x00000018,0x0003003e,0x0000034f,0x0000034e,0x000200f9,0x0000033c,0x000200f8, + 0x0000033c,0x0004003d,0x00000006,0x00000350,0x000000cc,0x0004003d,0x00000006,0x00000351, + 0x00000069,0x00050084,0x00000006,0x00000352,0x00000351,0x00000021,0x00050080,0x00000006, + 0x00000353,0x00000352,0x00000029,0x00050041,0x0000002a,0x00000354,0x00000028,0x000000db, + 0x0004003d,0x00000006,0x00000355,0x00000354,0x0005008b,0x00000006,0x00000356,0x00000353, + 0x00000355,0x00050041,0x0000002a,0x00000357,0x00000028,0x000000df,0x0004003d,0x00000006, + 0x00000358,0x00000357,0x00050084,0x00000006,0x00000359,0x00000356,0x00000358,0x00050080, + 0x00000006,0x0000035a,0x00000350,0x00000359,0x0003003e,0x000000d6,0x0000035a,0x0004003d, + 0x00000006,0x0000035b,0x000000c3,0x0004003d,0x00000006,0x0000035c,0x00000069,0x00050084, + 0x00000006,0x0000035d,0x0000035c,0x00000021,0x00050080,0x00000006,0x0000035e,0x0000035d, + 0x00000029,0x00050041,0x0000002a,0x0000035f,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x00000360,0x0000035f,0x00050041,0x0000002a,0x00000361,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x00000362,0x00000361,0x00050084,0x00000006,0x00000363,0x00000360,0x00000362, + 0x0005008b,0x00000006,0x00000364,0x0000035e,0x00000363,0x00050041,0x0000002a,0x00000365, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x00000366,0x00000365,0x00050087,0x00000006, + 0x00000367,0x00000364,0x00000366,0x00050041,0x0000002a,0x00000368,0x00000028,0x000000f3, + 0x0004003d,0x00000006,0x00000369,0x00000368,0x00050084,0x00000006,0x0000036a,0x00000367, + 0x00000369,0x00050080,0x00000006,0x0000036b,0x0000035b,0x0000036a,0x0003003e,0x000000e4, + 0x0000036b,0x0004003d,0x00000006,0x0000036c,0x00000069,0x00050084,0x00000006,0x0000036d, + 0x0000036c,0x00000021,0x00050080,0x00000006,0x0000036e,0x0000036d,0x00000029,0x00050041, + 0x0000002a,0x0000036f,0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000370,0x0000036f, + 0x00050041,0x0000002a,0x00000371,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000372, + 0x00000371,0x00050084,0x00000006,0x00000373,0x00000370,0x00000372,0x00050087,0x00000006, + 0x00000374,0x0000036e,0x00000373,0x0003003e,0x000000f8,0x00000374,0x0004003d,0x00000006, + 0x00000375,0x000000e4,0x000500af,0x00000040,0x00000376,0x00000375,0x0000006a,0x000300f7, + 0x00000378,0x00000000,0x000400fa,0x00000376,0x00000377,0x00000378,0x000200f8,0x00000377, + 0x0004003d,0x00000006,0x00000379,0x000000e4,0x00050041,0x0000002a,0x0000037a,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x0000037b,0x0000037a,0x000500b1,0x00000040,0x0000037c, + 0x00000379,0x0000037b,0x000200f9,0x00000378,0x000200f8,0x00000378,0x000700f5,0x00000040, + 0x0000037d,0x00000376,0x0000033c,0x0000037c,0x00000377,0x0004003d,0x00000006,0x0000037e, + 0x000000d6,0x000500af,0x00000040,0x0000037f,0x0000037e,0x0000006a,0x000500a7,0x00000040, + 0x00000380,0x0000037d,0x0000037f,0x000300f7,0x00000382,0x00000000,0x000400fa,0x00000380, + 0x00000381,0x00000382,0x000200f8,0x00000381,0x0004003d,0x00000006,0x00000383,0x000000d6, + 0x00050041,0x0000002a,0x00000384,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000385, + 0x00000384,0x000500b1,0x00000040,0x00000386,0x00000383,0x00000385,0x000200f9,0x00000382, + 0x000200f8,0x00000382,0x000700f5,0x00000040,0x00000387,0x00000380,0x00000378,0x00000386, + 0x00000381,0x000300f7,0x00000389,0x00000000,0x000400fa,0x00000387,0x00000388,0x00000389, + 0x000200f8,0x00000388,0x0004003d,0x00000006,0x0000038a,0x00000024,0x0004003d,0x00000006, + 0x0000038b,0x000000f8,0x00050041,0x0000002a,0x0000038c,0x00000028,0x00000029,0x0004003d, + 0x00000006,0x0000038d,0x0000038c,0x00050041,0x0000002a,0x0000038e,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x0000038f,0x0000038e,0x00050084,0x00000006,0x00000390,0x0000038d, + 0x0000038f,0x00050084,0x00000006,0x00000391,0x0000038b,0x00000390,0x00050080,0x00000006, + 0x00000392,0x0000038a,0x00000391,0x0004003d,0x00000006,0x00000393,0x000000e4,0x00050041, + 0x0000002a,0x00000394,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000395,0x00000394, + 0x00050084,0x00000006,0x00000396,0x00000393,0x00000395,0x00050080,0x00000006,0x00000397, + 0x00000392,0x00000396,0x0004003d,0x00000006,0x00000398,0x000000d6,0x00050080,0x00000006, + 0x00000399,0x00000397,0x00000398,0x00060041,0x0000012b,0x0000039a,0x0000011a,0x0000006a, + 0x00000399,0x0004003d,0x0000005c,0x0000039b,0x0000039a,0x00050041,0x0000012e,0x0000039c, + 0x00000070,0x00000217,0x0003003e,0x0000039c,0x0000039b,0x000200f9,0x00000389,0x000200f8, + 0x00000389,0x0004003d,0x0000005d,0x0000039d,0x00000073,0x0004003d,0x0000005d,0x0000039e, + 0x00000070,0x00050094,0x0000005c,0x0000039f,0x0000039d,0x0000039e,0x00050041,0x0000012e, + 0x000003a0,0x0000005f,0x00000013,0x0004003d,0x0000005c,0x000003a1,0x000003a0,0x00050081, + 0x0000005c,0x000003a2,0x000003a1,0x0000039f,0x00050041,0x0000012e,0x000003a3,0x0000005f, + 0x00000013,0x0003003e,0x000003a3,0x000003a2,0x0004003d,0x0000005d,0x000003a4,0x0000007f, + 0x0004003d,0x0000005d,0x000003a5,0x00000070,0x00050094,0x0000005c,0x000003a6,0x000003a4, + 0x000003a5,0x00050041,0x0000012e,0x000003a7,0x00000062,0x00000013,0x0004003d,0x0000005c, + 0x000003a8,0x000003a7,0x00050081,0x0000005c,0x000003a9,0x000003a8,0x000003a6,0x00050041, + 0x0000012e,0x000003aa,0x00000062,0x00000013,0x0003003e,0x000003aa,0x000003a9,0x0004003d, + 0x0000005d,0x000003ab,0x00000086,0x0004003d,0x0000005d,0x000003ac,0x00000070,0x00050094, + 0x0000005c,0x000003ad,0x000003ab,0x000003ac,0x00050041,0x0000012e,0x000003ae,0x00000063, + 0x00000013,0x0004003d,0x0000005c,0x000003af,0x000003ae,0x00050081,0x0000005c,0x000003b0, + 0x000003af,0x000003ad,0x00050041,0x0000012e,0x000003b1,0x00000063,0x00000013,0x0003003e, + 0x000003b1,0x000003b0,0x0004003d,0x0000005d,0x000003b2,0x0000008d,0x0004003d,0x0000005d, + 0x000003b3,0x00000070,0x00050094,0x0000005c,0x000003b4,0x000003b2,0x000003b3,0x00050041, + 0x0000012e,0x000003b5,0x00000064,0x00000013,0x0004003d,0x0000005c,0x000003b6,0x000003b5, + 0x00050081,0x0000005c,0x000003b7,0x000003b6,0x000003b4,0x00050041,0x0000012e,0x000003b8, + 0x00000064,0x00000013,0x0003003e,0x000003b8,0x000003b7,0x0004003d,0x0000005d,0x000003b9, + 0x00000094,0x0004003d,0x0000005d,0x000003ba,0x00000070,0x00050094,0x0000005c,0x000003bb, + 0x000003b9,0x000003ba,0x00050041,0x0000012e,0x000003bc,0x00000065,0x00000013,0x0004003d, + 0x0000005c,0x000003bd,0x000003bc,0x00050081,0x0000005c,0x000003be,0x000003bd,0x000003bb, + 0x00050041,0x0000012e,0x000003bf,0x00000065,0x00000013,0x0003003e,0x000003bf,0x000003be, + 0x0004003d,0x0000005d,0x000003c0,0x0000009b,0x0004003d,0x0000005d,0x000003c1,0x00000070, + 0x00050094,0x0000005c,0x000003c2,0x000003c0,0x000003c1,0x00050041,0x0000012e,0x000003c3, + 0x00000066,0x00000013,0x0004003d,0x0000005c,0x000003c4,0x000003c3,0x00050081,0x0000005c, + 0x000003c5,0x000003c4,0x000003c2,0x00050041,0x0000012e,0x000003c6,0x00000066,0x00000013, + 0x0003003e,0x000003c6,0x000003c5,0x0004003d,0x0000005d,0x000003c7,0x000000a2,0x0004003d, + 0x0000005d,0x000003c8,0x00000070,0x00050094,0x0000005c,0x000003c9,0x000003c7,0x000003c8, + 0x00050041,0x0000012e,0x000003ca,0x00000067,0x00000013,0x0004003d,0x0000005c,0x000003cb, + 0x000003ca,0x00050081,0x0000005c,0x000003cc,0x000003cb,0x000003c9,0x00050041,0x0000012e, + 0x000003cd,0x00000067,0x00000013,0x0003003e,0x000003cd,0x000003cc,0x0004003d,0x0000005d, + 0x000003ce,0x000000a9,0x0004003d,0x0000005d,0x000003cf,0x00000070,0x00050094,0x0000005c, + 0x000003d0,0x000003ce,0x000003cf,0x00050041,0x0000012e,0x000003d1,0x00000068,0x00000013, + 0x0004003d,0x0000005c,0x000003d2,0x000003d1,0x00050081,0x0000005c,0x000003d3,0x000003d2, + 0x000003d0,0x00050041,0x0000012e,0x000003d4,0x00000068,0x00000013,0x0003003e,0x000003d4, + 0x000003d3,0x0004003d,0x00000006,0x000003d5,0x00000020,0x00050080,0x00000006,0x000003d6, + 0x000003d5,0x00000180,0x00050041,0x0000002a,0x000003d7,0x00000028,0x000000b9,0x0004003d, + 0x00000006,0x000003d8,0x000003d7,0x0005008b,0x00000006,0x000003d9,0x000003d6,0x000003d8, + 0x0003003e,0x000000b6,0x000003d9,0x0004003d,0x00000006,0x000003da,0x00000020,0x00050080, + 0x00000006,0x000003db,0x000003da,0x00000180,0x00050041,0x0000002a,0x000003dc,0x00000028, + 0x000000b9,0x0004003d,0x00000006,0x000003dd,0x000003dc,0x00050087,0x00000006,0x000003de, + 0x000003db,0x000003dd,0x0003003e,0x000000bd,0x000003de,0x0004003d,0x00000006,0x000003df, + 0x000000bd,0x00050041,0x0000002a,0x000003e0,0x00000028,0x000000c5,0x0004003d,0x00000006, + 0x000003e1,0x000003e0,0x00050084,0x00000006,0x000003e2,0x000003df,0x000003e1,0x00050041, + 0x0000002a,0x000003e3,0x00000028,0x0000001d,0x0004003d,0x00000006,0x000003e4,0x000003e3, + 0x00050082,0x00000006,0x000003e5,0x000003e2,0x000003e4,0x0003003e,0x000000c3,0x000003e5, + 0x0004003d,0x00000006,0x000003e6,0x000000b6,0x00050041,0x0000002a,0x000003e7,0x00000028, + 0x000000ce,0x0004003d,0x00000006,0x000003e8,0x000003e7,0x00050084,0x00000006,0x000003e9, + 0x000003e6,0x000003e8,0x00050041,0x0000002a,0x000003ea,0x00000028,0x000000d2,0x0004003d, + 0x00000006,0x000003eb,0x000003ea,0x00050082,0x00000006,0x000003ec,0x000003e9,0x000003eb, + 0x0003003e,0x000000cc,0x000003ec,0x0004003d,0x00000006,0x000003ed,0x000000cc,0x0004003d, + 0x00000006,0x000003ee,0x00000069,0x00050084,0x00000006,0x000003ef,0x000003ee,0x00000021, + 0x00050080,0x00000006,0x000003f0,0x000003ef,0x0000006a,0x00050041,0x0000002a,0x000003f1, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x000003f2,0x000003f1,0x0005008b,0x00000006, + 0x000003f3,0x000003f0,0x000003f2,0x00050041,0x0000002a,0x000003f4,0x00000028,0x000000df, + 0x0004003d,0x00000006,0x000003f5,0x000003f4,0x00050084,0x00000006,0x000003f6,0x000003f3, + 0x000003f5,0x00050080,0x00000006,0x000003f7,0x000003ed,0x000003f6,0x0003003e,0x000000d6, + 0x000003f7,0x0004003d,0x00000006,0x000003f8,0x000000c3,0x0004003d,0x00000006,0x000003f9, + 0x00000069,0x00050084,0x00000006,0x000003fa,0x000003f9,0x00000021,0x00050080,0x00000006, + 0x000003fb,0x000003fa,0x0000006a,0x00050041,0x0000002a,0x000003fc,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x000003fd,0x000003fc,0x00050041,0x0000002a,0x000003fe,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x000003ff,0x000003fe,0x00050084,0x00000006,0x00000400, + 0x000003fd,0x000003ff,0x0005008b,0x00000006,0x00000401,0x000003fb,0x00000400,0x00050041, + 0x0000002a,0x00000402,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000403,0x00000402, + 0x00050087,0x00000006,0x00000404,0x00000401,0x00000403,0x00050041,0x0000002a,0x00000405, + 0x00000028,0x000000f3,0x0004003d,0x00000006,0x00000406,0x00000405,0x00050084,0x00000006, + 0x00000407,0x00000404,0x00000406,0x00050080,0x00000006,0x00000408,0x000003f8,0x00000407, + 0x0003003e,0x000000e4,0x00000408,0x0004003d,0x00000006,0x00000409,0x00000069,0x00050084, + 0x00000006,0x0000040a,0x00000409,0x00000021,0x00050080,0x00000006,0x0000040b,0x0000040a, + 0x0000006a,0x00050041,0x0000002a,0x0000040c,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x0000040d,0x0000040c,0x00050041,0x0000002a,0x0000040e,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x0000040f,0x0000040e,0x00050084,0x00000006,0x00000410,0x0000040d,0x0000040f, + 0x00050087,0x00000006,0x00000411,0x0000040b,0x00000410,0x0003003e,0x000000f8,0x00000411, + 0x0004003d,0x00000006,0x00000412,0x000000e4,0x000500af,0x00000040,0x00000413,0x00000412, + 0x0000006a,0x000300f7,0x00000415,0x00000000,0x000400fa,0x00000413,0x00000414,0x00000415, + 0x000200f8,0x00000414,0x0004003d,0x00000006,0x00000416,0x000000e4,0x00050041,0x0000002a, + 0x00000417,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000418,0x00000417,0x000500b1, + 0x00000040,0x00000419,0x00000416,0x00000418,0x000200f9,0x00000415,0x000200f8,0x00000415, + 0x000700f5,0x00000040,0x0000041a,0x00000413,0x00000389,0x00000419,0x00000414,0x0004003d, + 0x00000006,0x0000041b,0x000000d6,0x000500af,0x00000040,0x0000041c,0x0000041b,0x0000006a, + 0x000500a7,0x00000040,0x0000041d,0x0000041a,0x0000041c,0x000300f7,0x0000041f,0x00000000, + 0x000400fa,0x0000041d,0x0000041e,0x0000041f,0x000200f8,0x0000041e,0x0004003d,0x00000006, + 0x00000420,0x000000d6,0x00050041,0x0000002a,0x00000421,0x00000028,0x00000021,0x0004003d, + 0x00000006,0x00000422,0x00000421,0x000500b1,0x00000040,0x00000423,0x00000420,0x00000422, + 0x000200f9,0x0000041f,0x000200f8,0x0000041f,0x000700f5,0x00000040,0x00000424,0x0000041d, + 0x00000415,0x00000423,0x0000041e,0x000300f7,0x00000426,0x00000000,0x000400fa,0x00000424, + 0x00000425,0x00000426,0x000200f8,0x00000425,0x0004003d,0x00000006,0x00000427,0x00000024, + 0x0004003d,0x00000006,0x00000428,0x000000f8,0x00050041,0x0000002a,0x00000429,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x0000042a,0x00000429,0x00050041,0x0000002a,0x0000042b, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x0000042c,0x0000042b,0x00050084,0x00000006, + 0x0000042d,0x0000042a,0x0000042c,0x00050084,0x00000006,0x0000042e,0x00000428,0x0000042d, + 0x00050080,0x00000006,0x0000042f,0x00000427,0x0000042e,0x0004003d,0x00000006,0x00000430, + 0x000000e4,0x00050041,0x0000002a,0x00000431,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x00000432,0x00000431,0x00050084,0x00000006,0x00000433,0x00000430,0x00000432,0x00050080, + 0x00000006,0x00000434,0x0000042f,0x00000433,0x0004003d,0x00000006,0x00000435,0x000000d6, + 0x00050080,0x00000006,0x00000436,0x00000434,0x00000435,0x00060041,0x0000012b,0x00000437, + 0x0000011a,0x0000006a,0x00000436,0x0004003d,0x0000005c,0x00000438,0x00000437,0x00050041, + 0x0000012e,0x00000439,0x00000071,0x0000000d,0x0003003e,0x00000439,0x00000438,0x000200f9, + 0x00000426,0x000200f8,0x00000426,0x0004003d,0x00000006,0x0000043a,0x000000cc,0x0004003d, + 0x00000006,0x0000043b,0x00000069,0x00050084,0x00000006,0x0000043c,0x0000043b,0x00000021, + 0x00050080,0x00000006,0x0000043d,0x0000043c,0x000000b0,0x00050041,0x0000002a,0x0000043e, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x0000043f,0x0000043e,0x0005008b,0x00000006, + 0x00000440,0x0000043d,0x0000043f,0x00050041,0x0000002a,0x00000441,0x00000028,0x000000df, + 0x0004003d,0x00000006,0x00000442,0x00000441,0x00050084,0x00000006,0x00000443,0x00000440, + 0x00000442,0x00050080,0x00000006,0x00000444,0x0000043a,0x00000443,0x0003003e,0x000000d6, + 0x00000444,0x0004003d,0x00000006,0x00000445,0x000000c3,0x0004003d,0x00000006,0x00000446, + 0x00000069,0x00050084,0x00000006,0x00000447,0x00000446,0x00000021,0x00050080,0x00000006, + 0x00000448,0x00000447,0x000000b0,0x00050041,0x0000002a,0x00000449,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x0000044a,0x00000449,0x00050041,0x0000002a,0x0000044b,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x0000044c,0x0000044b,0x00050084,0x00000006,0x0000044d, + 0x0000044a,0x0000044c,0x0005008b,0x00000006,0x0000044e,0x00000448,0x0000044d,0x00050041, + 0x0000002a,0x0000044f,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000450,0x0000044f, + 0x00050087,0x00000006,0x00000451,0x0000044e,0x00000450,0x00050041,0x0000002a,0x00000452, + 0x00000028,0x000000f3,0x0004003d,0x00000006,0x00000453,0x00000452,0x00050084,0x00000006, + 0x00000454,0x00000451,0x00000453,0x00050080,0x00000006,0x00000455,0x00000445,0x00000454, + 0x0003003e,0x000000e4,0x00000455,0x0004003d,0x00000006,0x00000456,0x00000069,0x00050084, + 0x00000006,0x00000457,0x00000456,0x00000021,0x00050080,0x00000006,0x00000458,0x00000457, + 0x000000b0,0x00050041,0x0000002a,0x00000459,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x0000045a,0x00000459,0x00050041,0x0000002a,0x0000045b,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x0000045c,0x0000045b,0x00050084,0x00000006,0x0000045d,0x0000045a,0x0000045c, + 0x00050087,0x00000006,0x0000045e,0x00000458,0x0000045d,0x0003003e,0x000000f8,0x0000045e, + 0x0004003d,0x00000006,0x0000045f,0x000000e4,0x000500af,0x00000040,0x00000460,0x0000045f, + 0x0000006a,0x000300f7,0x00000462,0x00000000,0x000400fa,0x00000460,0x00000461,0x00000462, + 0x000200f8,0x00000461,0x0004003d,0x00000006,0x00000463,0x000000e4,0x00050041,0x0000002a, + 0x00000464,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000465,0x00000464,0x000500b1, + 0x00000040,0x00000466,0x00000463,0x00000465,0x000200f9,0x00000462,0x000200f8,0x00000462, + 0x000700f5,0x00000040,0x00000467,0x00000460,0x00000426,0x00000466,0x00000461,0x0004003d, + 0x00000006,0x00000468,0x000000d6,0x000500af,0x00000040,0x00000469,0x00000468,0x0000006a, + 0x000500a7,0x00000040,0x0000046a,0x00000467,0x00000469,0x000300f7,0x0000046c,0x00000000, + 0x000400fa,0x0000046a,0x0000046b,0x0000046c,0x000200f8,0x0000046b,0x0004003d,0x00000006, + 0x0000046d,0x000000d6,0x00050041,0x0000002a,0x0000046e,0x00000028,0x00000021,0x0004003d, + 0x00000006,0x0000046f,0x0000046e,0x000500b1,0x00000040,0x00000470,0x0000046d,0x0000046f, + 0x000200f9,0x0000046c,0x000200f8,0x0000046c,0x000700f5,0x00000040,0x00000471,0x0000046a, + 0x00000462,0x00000470,0x0000046b,0x000300f7,0x00000473,0x00000000,0x000400fa,0x00000471, + 0x00000472,0x00000473,0x000200f8,0x00000472,0x0004003d,0x00000006,0x00000474,0x00000024, + 0x0004003d,0x00000006,0x00000475,0x000000f8,0x00050041,0x0000002a,0x00000476,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x00000477,0x00000476,0x00050041,0x0000002a,0x00000478, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x00000479,0x00000478,0x00050084,0x00000006, + 0x0000047a,0x00000477,0x00000479,0x00050084,0x00000006,0x0000047b,0x00000475,0x0000047a, + 0x00050080,0x00000006,0x0000047c,0x00000474,0x0000047b,0x0004003d,0x00000006,0x0000047d, + 0x000000e4,0x00050041,0x0000002a,0x0000047e,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x0000047f,0x0000047e,0x00050084,0x00000006,0x00000480,0x0000047d,0x0000047f,0x00050080, + 0x00000006,0x00000481,0x0000047c,0x00000480,0x0004003d,0x00000006,0x00000482,0x000000d6, + 0x00050080,0x00000006,0x00000483,0x00000481,0x00000482,0x00060041,0x0000012b,0x00000484, + 0x0000011a,0x0000006a,0x00000483,0x0004003d,0x0000005c,0x00000485,0x00000484,0x00050041, + 0x0000012e,0x00000486,0x00000071,0x00000013,0x0003003e,0x00000486,0x00000485,0x000200f9, + 0x00000473,0x000200f8,0x00000473,0x0004003d,0x00000006,0x00000487,0x000000cc,0x0004003d, + 0x00000006,0x00000488,0x00000069,0x00050084,0x00000006,0x00000489,0x00000488,0x00000021, + 0x00050080,0x00000006,0x0000048a,0x00000489,0x00000180,0x00050041,0x0000002a,0x0000048b, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x0000048c,0x0000048b,0x0005008b,0x00000006, + 0x0000048d,0x0000048a,0x0000048c,0x00050041,0x0000002a,0x0000048e,0x00000028,0x000000df, + 0x0004003d,0x00000006,0x0000048f,0x0000048e,0x00050084,0x00000006,0x00000490,0x0000048d, + 0x0000048f,0x00050080,0x00000006,0x00000491,0x00000487,0x00000490,0x0003003e,0x000000d6, + 0x00000491,0x0004003d,0x00000006,0x00000492,0x000000c3,0x0004003d,0x00000006,0x00000493, + 0x00000069,0x00050084,0x00000006,0x00000494,0x00000493,0x00000021,0x00050080,0x00000006, + 0x00000495,0x00000494,0x00000180,0x00050041,0x0000002a,0x00000496,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x00000497,0x00000496,0x00050041,0x0000002a,0x00000498,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x00000499,0x00000498,0x00050084,0x00000006,0x0000049a, + 0x00000497,0x00000499,0x0005008b,0x00000006,0x0000049b,0x00000495,0x0000049a,0x00050041, + 0x0000002a,0x0000049c,0x00000028,0x000000db,0x0004003d,0x00000006,0x0000049d,0x0000049c, + 0x00050087,0x00000006,0x0000049e,0x0000049b,0x0000049d,0x00050041,0x0000002a,0x0000049f, + 0x00000028,0x000000f3,0x0004003d,0x00000006,0x000004a0,0x0000049f,0x00050084,0x00000006, + 0x000004a1,0x0000049e,0x000004a0,0x00050080,0x00000006,0x000004a2,0x00000492,0x000004a1, + 0x0003003e,0x000000e4,0x000004a2,0x0004003d,0x00000006,0x000004a3,0x00000069,0x00050084, + 0x00000006,0x000004a4,0x000004a3,0x00000021,0x00050080,0x00000006,0x000004a5,0x000004a4, + 0x00000180,0x00050041,0x0000002a,0x000004a6,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x000004a7,0x000004a6,0x00050041,0x0000002a,0x000004a8,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x000004a9,0x000004a8,0x00050084,0x00000006,0x000004aa,0x000004a7,0x000004a9, + 0x00050087,0x00000006,0x000004ab,0x000004a5,0x000004aa,0x0003003e,0x000000f8,0x000004ab, + 0x0004003d,0x00000006,0x000004ac,0x000000e4,0x000500af,0x00000040,0x000004ad,0x000004ac, + 0x0000006a,0x000300f7,0x000004af,0x00000000,0x000400fa,0x000004ad,0x000004ae,0x000004af, + 0x000200f8,0x000004ae,0x0004003d,0x00000006,0x000004b0,0x000000e4,0x00050041,0x0000002a, + 0x000004b1,0x00000028,0x00000029,0x0004003d,0x00000006,0x000004b2,0x000004b1,0x000500b1, + 0x00000040,0x000004b3,0x000004b0,0x000004b2,0x000200f9,0x000004af,0x000200f8,0x000004af, + 0x000700f5,0x00000040,0x000004b4,0x000004ad,0x00000473,0x000004b3,0x000004ae,0x0004003d, + 0x00000006,0x000004b5,0x000000d6,0x000500af,0x00000040,0x000004b6,0x000004b5,0x0000006a, + 0x000500a7,0x00000040,0x000004b7,0x000004b4,0x000004b6,0x000300f7,0x000004b9,0x00000000, + 0x000400fa,0x000004b7,0x000004b8,0x000004b9,0x000200f8,0x000004b8,0x0004003d,0x00000006, + 0x000004ba,0x000000d6,0x00050041,0x0000002a,0x000004bb,0x00000028,0x00000021,0x0004003d, + 0x00000006,0x000004bc,0x000004bb,0x000500b1,0x00000040,0x000004bd,0x000004ba,0x000004bc, + 0x000200f9,0x000004b9,0x000200f8,0x000004b9,0x000700f5,0x00000040,0x000004be,0x000004b7, + 0x000004af,0x000004bd,0x000004b8,0x000300f7,0x000004c0,0x00000000,0x000400fa,0x000004be, + 0x000004bf,0x000004c0,0x000200f8,0x000004bf,0x0004003d,0x00000006,0x000004c1,0x00000024, + 0x0004003d,0x00000006,0x000004c2,0x000000f8,0x00050041,0x0000002a,0x000004c3,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x000004c4,0x000004c3,0x00050041,0x0000002a,0x000004c5, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x000004c6,0x000004c5,0x00050084,0x00000006, + 0x000004c7,0x000004c4,0x000004c6,0x00050084,0x00000006,0x000004c8,0x000004c2,0x000004c7, + 0x00050080,0x00000006,0x000004c9,0x000004c1,0x000004c8,0x0004003d,0x00000006,0x000004ca, + 0x000000e4,0x00050041,0x0000002a,0x000004cb,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x000004cc,0x000004cb,0x00050084,0x00000006,0x000004cd,0x000004ca,0x000004cc,0x00050080, + 0x00000006,0x000004ce,0x000004c9,0x000004cd,0x0004003d,0x00000006,0x000004cf,0x000000d6, + 0x00050080,0x00000006,0x000004d0,0x000004ce,0x000004cf,0x00060041,0x0000012b,0x000004d1, + 0x0000011a,0x0000006a,0x000004d0,0x0004003d,0x0000005c,0x000004d2,0x000004d1,0x00050041, + 0x0000012e,0x000004d3,0x00000071,0x00000018,0x0003003e,0x000004d3,0x000004d2,0x000200f9, + 0x000004c0,0x000200f8,0x000004c0,0x0004003d,0x00000006,0x000004d4,0x000000cc,0x0004003d, + 0x00000006,0x000004d5,0x00000069,0x00050084,0x00000006,0x000004d6,0x000004d5,0x00000021, + 0x00050080,0x00000006,0x000004d7,0x000004d6,0x00000029,0x00050041,0x0000002a,0x000004d8, + 0x00000028,0x000000db,0x0004003d,0x00000006,0x000004d9,0x000004d8,0x0005008b,0x00000006, + 0x000004da,0x000004d7,0x000004d9,0x00050041,0x0000002a,0x000004db,0x00000028,0x000000df, + 0x0004003d,0x00000006,0x000004dc,0x000004db,0x00050084,0x00000006,0x000004dd,0x000004da, + 0x000004dc,0x00050080,0x00000006,0x000004de,0x000004d4,0x000004dd,0x0003003e,0x000000d6, + 0x000004de,0x0004003d,0x00000006,0x000004df,0x000000c3,0x0004003d,0x00000006,0x000004e0, + 0x00000069,0x00050084,0x00000006,0x000004e1,0x000004e0,0x00000021,0x00050080,0x00000006, + 0x000004e2,0x000004e1,0x00000029,0x00050041,0x0000002a,0x000004e3,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x000004e4,0x000004e3,0x00050041,0x0000002a,0x000004e5,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x000004e6,0x000004e5,0x00050084,0x00000006,0x000004e7, + 0x000004e4,0x000004e6,0x0005008b,0x00000006,0x000004e8,0x000004e2,0x000004e7,0x00050041, + 0x0000002a,0x000004e9,0x00000028,0x000000db,0x0004003d,0x00000006,0x000004ea,0x000004e9, + 0x00050087,0x00000006,0x000004eb,0x000004e8,0x000004ea,0x00050041,0x0000002a,0x000004ec, + 0x00000028,0x000000f3,0x0004003d,0x00000006,0x000004ed,0x000004ec,0x00050084,0x00000006, + 0x000004ee,0x000004eb,0x000004ed,0x00050080,0x00000006,0x000004ef,0x000004df,0x000004ee, + 0x0003003e,0x000000e4,0x000004ef,0x0004003d,0x00000006,0x000004f0,0x00000069,0x00050084, + 0x00000006,0x000004f1,0x000004f0,0x00000021,0x00050080,0x00000006,0x000004f2,0x000004f1, + 0x00000029,0x00050041,0x0000002a,0x000004f3,0x00000028,0x000000e9,0x0004003d,0x00000006, + 0x000004f4,0x000004f3,0x00050041,0x0000002a,0x000004f5,0x00000028,0x000000db,0x0004003d, + 0x00000006,0x000004f6,0x000004f5,0x00050084,0x00000006,0x000004f7,0x000004f4,0x000004f6, + 0x00050087,0x00000006,0x000004f8,0x000004f2,0x000004f7,0x0003003e,0x000000f8,0x000004f8, + 0x0004003d,0x00000006,0x000004f9,0x000000e4,0x000500af,0x00000040,0x000004fa,0x000004f9, + 0x0000006a,0x000300f7,0x000004fc,0x00000000,0x000400fa,0x000004fa,0x000004fb,0x000004fc, + 0x000200f8,0x000004fb,0x0004003d,0x00000006,0x000004fd,0x000000e4,0x00050041,0x0000002a, + 0x000004fe,0x00000028,0x00000029,0x0004003d,0x00000006,0x000004ff,0x000004fe,0x000500b1, + 0x00000040,0x00000500,0x000004fd,0x000004ff,0x000200f9,0x000004fc,0x000200f8,0x000004fc, + 0x000700f5,0x00000040,0x00000501,0x000004fa,0x000004c0,0x00000500,0x000004fb,0x0004003d, + 0x00000006,0x00000502,0x000000d6,0x000500af,0x00000040,0x00000503,0x00000502,0x0000006a, + 0x000500a7,0x00000040,0x00000504,0x00000501,0x00000503,0x000300f7,0x00000506,0x00000000, + 0x000400fa,0x00000504,0x00000505,0x00000506,0x000200f8,0x00000505,0x0004003d,0x00000006, + 0x00000507,0x000000d6,0x00050041,0x0000002a,0x00000508,0x00000028,0x00000021,0x0004003d, + 0x00000006,0x00000509,0x00000508,0x000500b1,0x00000040,0x0000050a,0x00000507,0x00000509, + 0x000200f9,0x00000506,0x000200f8,0x00000506,0x000700f5,0x00000040,0x0000050b,0x00000504, + 0x000004fc,0x0000050a,0x00000505,0x000300f7,0x0000050d,0x00000000,0x000400fa,0x0000050b, + 0x0000050c,0x0000050d,0x000200f8,0x0000050c,0x0004003d,0x00000006,0x0000050e,0x00000024, + 0x0004003d,0x00000006,0x0000050f,0x000000f8,0x00050041,0x0000002a,0x00000510,0x00000028, + 0x00000029,0x0004003d,0x00000006,0x00000511,0x00000510,0x00050041,0x0000002a,0x00000512, + 0x00000028,0x00000021,0x0004003d,0x00000006,0x00000513,0x00000512,0x00050084,0x00000006, + 0x00000514,0x00000511,0x00000513,0x00050084,0x00000006,0x00000515,0x0000050f,0x00000514, + 0x00050080,0x00000006,0x00000516,0x0000050e,0x00000515,0x0004003d,0x00000006,0x00000517, + 0x000000e4,0x00050041,0x0000002a,0x00000518,0x00000028,0x00000021,0x0004003d,0x00000006, + 0x00000519,0x00000518,0x00050084,0x00000006,0x0000051a,0x00000517,0x00000519,0x00050080, + 0x00000006,0x0000051b,0x00000516,0x0000051a,0x0004003d,0x00000006,0x0000051c,0x000000d6, + 0x00050080,0x00000006,0x0000051d,0x0000051b,0x0000051c,0x00060041,0x0000012b,0x0000051e, + 0x0000011a,0x0000006a,0x0000051d,0x0004003d,0x0000005c,0x0000051f,0x0000051e,0x00050041, + 0x0000012e,0x00000520,0x00000071,0x00000217,0x0003003e,0x00000520,0x0000051f,0x000200f9, + 0x0000050d,0x000200f8,0x0000050d,0x0004003d,0x0000005d,0x00000521,0x00000073,0x0004003d, + 0x0000005d,0x00000522,0x00000071,0x00050094,0x0000005c,0x00000523,0x00000521,0x00000522, + 0x00050041,0x0000012e,0x00000524,0x0000005f,0x00000018,0x0004003d,0x0000005c,0x00000525, + 0x00000524,0x00050081,0x0000005c,0x00000526,0x00000525,0x00000523,0x00050041,0x0000012e, + 0x00000527,0x0000005f,0x00000018,0x0003003e,0x00000527,0x00000526,0x0004003d,0x0000005d, + 0x00000528,0x0000007f,0x0004003d,0x0000005d,0x00000529,0x00000071,0x00050094,0x0000005c, + 0x0000052a,0x00000528,0x00000529,0x00050041,0x0000012e,0x0000052b,0x00000062,0x00000018, + 0x0004003d,0x0000005c,0x0000052c,0x0000052b,0x00050081,0x0000005c,0x0000052d,0x0000052c, + 0x0000052a,0x00050041,0x0000012e,0x0000052e,0x00000062,0x00000018,0x0003003e,0x0000052e, + 0x0000052d,0x0004003d,0x0000005d,0x0000052f,0x00000086,0x0004003d,0x0000005d,0x00000530, + 0x00000071,0x00050094,0x0000005c,0x00000531,0x0000052f,0x00000530,0x00050041,0x0000012e, + 0x00000532,0x00000063,0x00000018,0x0004003d,0x0000005c,0x00000533,0x00000532,0x00050081, + 0x0000005c,0x00000534,0x00000533,0x00000531,0x00050041,0x0000012e,0x00000535,0x00000063, + 0x00000018,0x0003003e,0x00000535,0x00000534,0x0004003d,0x0000005d,0x00000536,0x0000008d, + 0x0004003d,0x0000005d,0x00000537,0x00000071,0x00050094,0x0000005c,0x00000538,0x00000536, + 0x00000537,0x00050041,0x0000012e,0x00000539,0x00000064,0x00000018,0x0004003d,0x0000005c, + 0x0000053a,0x00000539,0x00050081,0x0000005c,0x0000053b,0x0000053a,0x00000538,0x00050041, + 0x0000012e,0x0000053c,0x00000064,0x00000018,0x0003003e,0x0000053c,0x0000053b,0x0004003d, + 0x0000005d,0x0000053d,0x00000094,0x0004003d,0x0000005d,0x0000053e,0x00000071,0x00050094, + 0x0000005c,0x0000053f,0x0000053d,0x0000053e,0x00050041,0x0000012e,0x00000540,0x00000065, + 0x00000018,0x0004003d,0x0000005c,0x00000541,0x00000540,0x00050081,0x0000005c,0x00000542, + 0x00000541,0x0000053f,0x00050041,0x0000012e,0x00000543,0x00000065,0x00000018,0x0003003e, + 0x00000543,0x00000542,0x0004003d,0x0000005d,0x00000544,0x0000009b,0x0004003d,0x0000005d, + 0x00000545,0x00000071,0x00050094,0x0000005c,0x00000546,0x00000544,0x00000545,0x00050041, + 0x0000012e,0x00000547,0x00000066,0x00000018,0x0004003d,0x0000005c,0x00000548,0x00000547, + 0x00050081,0x0000005c,0x00000549,0x00000548,0x00000546,0x00050041,0x0000012e,0x0000054a, + 0x00000066,0x00000018,0x0003003e,0x0000054a,0x00000549,0x0004003d,0x0000005d,0x0000054b, + 0x000000a2,0x0004003d,0x0000005d,0x0000054c,0x00000071,0x00050094,0x0000005c,0x0000054d, + 0x0000054b,0x0000054c,0x00050041,0x0000012e,0x0000054e,0x00000067,0x00000018,0x0004003d, + 0x0000005c,0x0000054f,0x0000054e,0x00050081,0x0000005c,0x00000550,0x0000054f,0x0000054d, + 0x00050041,0x0000012e,0x00000551,0x00000067,0x00000018,0x0003003e,0x00000551,0x00000550, + 0x0004003d,0x0000005d,0x00000552,0x000000a9,0x0004003d,0x0000005d,0x00000553,0x00000071, + 0x00050094,0x0000005c,0x00000554,0x00000552,0x00000553,0x00050041,0x0000012e,0x00000555, + 0x00000068,0x00000018,0x0004003d,0x0000005c,0x00000556,0x00000555,0x00050081,0x0000005c, + 0x00000557,0x00000556,0x00000554,0x00050041,0x0000012e,0x00000558,0x00000068,0x00000018, + 0x0003003e,0x00000558,0x00000557,0x0004003d,0x00000006,0x00000559,0x00000020,0x00050080, + 0x00000006,0x0000055a,0x00000559,0x00000029,0x00050041,0x0000002a,0x0000055b,0x00000028, + 0x000000b9,0x0004003d,0x00000006,0x0000055c,0x0000055b,0x0005008b,0x00000006,0x0000055d, + 0x0000055a,0x0000055c,0x0003003e,0x000000b6,0x0000055d,0x0004003d,0x00000006,0x0000055e, + 0x00000020,0x00050080,0x00000006,0x0000055f,0x0000055e,0x00000029,0x00050041,0x0000002a, + 0x00000560,0x00000028,0x000000b9,0x0004003d,0x00000006,0x00000561,0x00000560,0x00050087, + 0x00000006,0x00000562,0x0000055f,0x00000561,0x0003003e,0x000000bd,0x00000562,0x0004003d, + 0x00000006,0x00000563,0x000000bd,0x00050041,0x0000002a,0x00000564,0x00000028,0x000000c5, + 0x0004003d,0x00000006,0x00000565,0x00000564,0x00050084,0x00000006,0x00000566,0x00000563, + 0x00000565,0x00050041,0x0000002a,0x00000567,0x00000028,0x0000001d,0x0004003d,0x00000006, + 0x00000568,0x00000567,0x00050082,0x00000006,0x00000569,0x00000566,0x00000568,0x0003003e, + 0x000000c3,0x00000569,0x0004003d,0x00000006,0x0000056a,0x000000b6,0x00050041,0x0000002a, + 0x0000056b,0x00000028,0x000000ce,0x0004003d,0x00000006,0x0000056c,0x0000056b,0x00050084, + 0x00000006,0x0000056d,0x0000056a,0x0000056c,0x00050041,0x0000002a,0x0000056e,0x00000028, + 0x000000d2,0x0004003d,0x00000006,0x0000056f,0x0000056e,0x00050082,0x00000006,0x00000570, + 0x0000056d,0x0000056f,0x0003003e,0x000000cc,0x00000570,0x0004003d,0x00000006,0x00000571, + 0x000000cc,0x0004003d,0x00000006,0x00000572,0x00000069,0x00050084,0x00000006,0x00000573, + 0x00000572,0x00000021,0x00050080,0x00000006,0x00000574,0x00000573,0x0000006a,0x00050041, + 0x0000002a,0x00000575,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000576,0x00000575, + 0x0005008b,0x00000006,0x00000577,0x00000574,0x00000576,0x00050041,0x0000002a,0x00000578, + 0x00000028,0x000000df,0x0004003d,0x00000006,0x00000579,0x00000578,0x00050084,0x00000006, + 0x0000057a,0x00000577,0x00000579,0x00050080,0x00000006,0x0000057b,0x00000571,0x0000057a, + 0x0003003e,0x000000d6,0x0000057b,0x0004003d,0x00000006,0x0000057c,0x000000c3,0x0004003d, + 0x00000006,0x0000057d,0x00000069,0x00050084,0x00000006,0x0000057e,0x0000057d,0x00000021, + 0x00050080,0x00000006,0x0000057f,0x0000057e,0x0000006a,0x00050041,0x0000002a,0x00000580, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000581,0x00000580,0x00050041,0x0000002a, + 0x00000582,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000583,0x00000582,0x00050084, + 0x00000006,0x00000584,0x00000581,0x00000583,0x0005008b,0x00000006,0x00000585,0x0000057f, + 0x00000584,0x00050041,0x0000002a,0x00000586,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x00000587,0x00000586,0x00050087,0x00000006,0x00000588,0x00000585,0x00000587,0x00050041, + 0x0000002a,0x00000589,0x00000028,0x000000f3,0x0004003d,0x00000006,0x0000058a,0x00000589, + 0x00050084,0x00000006,0x0000058b,0x00000588,0x0000058a,0x00050080,0x00000006,0x0000058c, + 0x0000057c,0x0000058b,0x0003003e,0x000000e4,0x0000058c,0x0004003d,0x00000006,0x0000058d, + 0x00000069,0x00050084,0x00000006,0x0000058e,0x0000058d,0x00000021,0x00050080,0x00000006, + 0x0000058f,0x0000058e,0x0000006a,0x00050041,0x0000002a,0x00000590,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x00000591,0x00000590,0x00050041,0x0000002a,0x00000592,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x00000593,0x00000592,0x00050084,0x00000006,0x00000594, + 0x00000591,0x00000593,0x00050087,0x00000006,0x00000595,0x0000058f,0x00000594,0x0003003e, + 0x000000f8,0x00000595,0x0004003d,0x00000006,0x00000596,0x000000e4,0x000500af,0x00000040, + 0x00000597,0x00000596,0x0000006a,0x000300f7,0x00000599,0x00000000,0x000400fa,0x00000597, + 0x00000598,0x00000599,0x000200f8,0x00000598,0x0004003d,0x00000006,0x0000059a,0x000000e4, + 0x00050041,0x0000002a,0x0000059b,0x00000028,0x00000029,0x0004003d,0x00000006,0x0000059c, + 0x0000059b,0x000500b1,0x00000040,0x0000059d,0x0000059a,0x0000059c,0x000200f9,0x00000599, + 0x000200f8,0x00000599,0x000700f5,0x00000040,0x0000059e,0x00000597,0x0000050d,0x0000059d, + 0x00000598,0x0004003d,0x00000006,0x0000059f,0x000000d6,0x000500af,0x00000040,0x000005a0, + 0x0000059f,0x0000006a,0x000500a7,0x00000040,0x000005a1,0x0000059e,0x000005a0,0x000300f7, + 0x000005a3,0x00000000,0x000400fa,0x000005a1,0x000005a2,0x000005a3,0x000200f8,0x000005a2, + 0x0004003d,0x00000006,0x000005a4,0x000000d6,0x00050041,0x0000002a,0x000005a5,0x00000028, + 0x00000021,0x0004003d,0x00000006,0x000005a6,0x000005a5,0x000500b1,0x00000040,0x000005a7, + 0x000005a4,0x000005a6,0x000200f9,0x000005a3,0x000200f8,0x000005a3,0x000700f5,0x00000040, + 0x000005a8,0x000005a1,0x00000599,0x000005a7,0x000005a2,0x000300f7,0x000005aa,0x00000000, + 0x000400fa,0x000005a8,0x000005a9,0x000005aa,0x000200f8,0x000005a9,0x0004003d,0x00000006, + 0x000005ab,0x00000024,0x0004003d,0x00000006,0x000005ac,0x000000f8,0x00050041,0x0000002a, + 0x000005ad,0x00000028,0x00000029,0x0004003d,0x00000006,0x000005ae,0x000005ad,0x00050041, + 0x0000002a,0x000005af,0x00000028,0x00000021,0x0004003d,0x00000006,0x000005b0,0x000005af, + 0x00050084,0x00000006,0x000005b1,0x000005ae,0x000005b0,0x00050084,0x00000006,0x000005b2, + 0x000005ac,0x000005b1,0x00050080,0x00000006,0x000005b3,0x000005ab,0x000005b2,0x0004003d, + 0x00000006,0x000005b4,0x000000e4,0x00050041,0x0000002a,0x000005b5,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x000005b6,0x000005b5,0x00050084,0x00000006,0x000005b7,0x000005b4, + 0x000005b6,0x00050080,0x00000006,0x000005b8,0x000005b3,0x000005b7,0x0004003d,0x00000006, + 0x000005b9,0x000000d6,0x00050080,0x00000006,0x000005ba,0x000005b8,0x000005b9,0x00060041, + 0x0000012b,0x000005bb,0x0000011a,0x0000006a,0x000005ba,0x0004003d,0x0000005c,0x000005bc, + 0x000005bb,0x00050041,0x0000012e,0x000005bd,0x00000072,0x0000000d,0x0003003e,0x000005bd, + 0x000005bc,0x000200f9,0x000005aa,0x000200f8,0x000005aa,0x0004003d,0x00000006,0x000005be, + 0x000000cc,0x0004003d,0x00000006,0x000005bf,0x00000069,0x00050084,0x00000006,0x000005c0, + 0x000005bf,0x00000021,0x00050080,0x00000006,0x000005c1,0x000005c0,0x000000b0,0x00050041, + 0x0000002a,0x000005c2,0x00000028,0x000000db,0x0004003d,0x00000006,0x000005c3,0x000005c2, + 0x0005008b,0x00000006,0x000005c4,0x000005c1,0x000005c3,0x00050041,0x0000002a,0x000005c5, + 0x00000028,0x000000df,0x0004003d,0x00000006,0x000005c6,0x000005c5,0x00050084,0x00000006, + 0x000005c7,0x000005c4,0x000005c6,0x00050080,0x00000006,0x000005c8,0x000005be,0x000005c7, + 0x0003003e,0x000000d6,0x000005c8,0x0004003d,0x00000006,0x000005c9,0x000000c3,0x0004003d, + 0x00000006,0x000005ca,0x00000069,0x00050084,0x00000006,0x000005cb,0x000005ca,0x00000021, + 0x00050080,0x00000006,0x000005cc,0x000005cb,0x000000b0,0x00050041,0x0000002a,0x000005cd, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x000005ce,0x000005cd,0x00050041,0x0000002a, + 0x000005cf,0x00000028,0x000000db,0x0004003d,0x00000006,0x000005d0,0x000005cf,0x00050084, + 0x00000006,0x000005d1,0x000005ce,0x000005d0,0x0005008b,0x00000006,0x000005d2,0x000005cc, + 0x000005d1,0x00050041,0x0000002a,0x000005d3,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x000005d4,0x000005d3,0x00050087,0x00000006,0x000005d5,0x000005d2,0x000005d4,0x00050041, + 0x0000002a,0x000005d6,0x00000028,0x000000f3,0x0004003d,0x00000006,0x000005d7,0x000005d6, + 0x00050084,0x00000006,0x000005d8,0x000005d5,0x000005d7,0x00050080,0x00000006,0x000005d9, + 0x000005c9,0x000005d8,0x0003003e,0x000000e4,0x000005d9,0x0004003d,0x00000006,0x000005da, + 0x00000069,0x00050084,0x00000006,0x000005db,0x000005da,0x00000021,0x00050080,0x00000006, + 0x000005dc,0x000005db,0x000000b0,0x00050041,0x0000002a,0x000005dd,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x000005de,0x000005dd,0x00050041,0x0000002a,0x000005df,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x000005e0,0x000005df,0x00050084,0x00000006,0x000005e1, + 0x000005de,0x000005e0,0x00050087,0x00000006,0x000005e2,0x000005dc,0x000005e1,0x0003003e, + 0x000000f8,0x000005e2,0x0004003d,0x00000006,0x000005e3,0x000000e4,0x000500af,0x00000040, + 0x000005e4,0x000005e3,0x0000006a,0x000300f7,0x000005e6,0x00000000,0x000400fa,0x000005e4, + 0x000005e5,0x000005e6,0x000200f8,0x000005e5,0x0004003d,0x00000006,0x000005e7,0x000000e4, + 0x00050041,0x0000002a,0x000005e8,0x00000028,0x00000029,0x0004003d,0x00000006,0x000005e9, + 0x000005e8,0x000500b1,0x00000040,0x000005ea,0x000005e7,0x000005e9,0x000200f9,0x000005e6, + 0x000200f8,0x000005e6,0x000700f5,0x00000040,0x000005eb,0x000005e4,0x000005aa,0x000005ea, + 0x000005e5,0x0004003d,0x00000006,0x000005ec,0x000000d6,0x000500af,0x00000040,0x000005ed, + 0x000005ec,0x0000006a,0x000500a7,0x00000040,0x000005ee,0x000005eb,0x000005ed,0x000300f7, + 0x000005f0,0x00000000,0x000400fa,0x000005ee,0x000005ef,0x000005f0,0x000200f8,0x000005ef, + 0x0004003d,0x00000006,0x000005f1,0x000000d6,0x00050041,0x0000002a,0x000005f2,0x00000028, + 0x00000021,0x0004003d,0x00000006,0x000005f3,0x000005f2,0x000500b1,0x00000040,0x000005f4, + 0x000005f1,0x000005f3,0x000200f9,0x000005f0,0x000200f8,0x000005f0,0x000700f5,0x00000040, + 0x000005f5,0x000005ee,0x000005e6,0x000005f4,0x000005ef,0x000300f7,0x000005f7,0x00000000, + 0x000400fa,0x000005f5,0x000005f6,0x000005f7,0x000200f8,0x000005f6,0x0004003d,0x00000006, + 0x000005f8,0x00000024,0x0004003d,0x00000006,0x000005f9,0x000000f8,0x00050041,0x0000002a, + 0x000005fa,0x00000028,0x00000029,0x0004003d,0x00000006,0x000005fb,0x000005fa,0x00050041, + 0x0000002a,0x000005fc,0x00000028,0x00000021,0x0004003d,0x00000006,0x000005fd,0x000005fc, + 0x00050084,0x00000006,0x000005fe,0x000005fb,0x000005fd,0x00050084,0x00000006,0x000005ff, + 0x000005f9,0x000005fe,0x00050080,0x00000006,0x00000600,0x000005f8,0x000005ff,0x0004003d, + 0x00000006,0x00000601,0x000000e4,0x00050041,0x0000002a,0x00000602,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x00000603,0x00000602,0x00050084,0x00000006,0x00000604,0x00000601, + 0x00000603,0x00050080,0x00000006,0x00000605,0x00000600,0x00000604,0x0004003d,0x00000006, + 0x00000606,0x000000d6,0x00050080,0x00000006,0x00000607,0x00000605,0x00000606,0x00060041, + 0x0000012b,0x00000608,0x0000011a,0x0000006a,0x00000607,0x0004003d,0x0000005c,0x00000609, + 0x00000608,0x00050041,0x0000012e,0x0000060a,0x00000072,0x00000013,0x0003003e,0x0000060a, + 0x00000609,0x000200f9,0x000005f7,0x000200f8,0x000005f7,0x0004003d,0x00000006,0x0000060b, + 0x000000cc,0x0004003d,0x00000006,0x0000060c,0x00000069,0x00050084,0x00000006,0x0000060d, + 0x0000060c,0x00000021,0x00050080,0x00000006,0x0000060e,0x0000060d,0x00000180,0x00050041, + 0x0000002a,0x0000060f,0x00000028,0x000000db,0x0004003d,0x00000006,0x00000610,0x0000060f, + 0x0005008b,0x00000006,0x00000611,0x0000060e,0x00000610,0x00050041,0x0000002a,0x00000612, + 0x00000028,0x000000df,0x0004003d,0x00000006,0x00000613,0x00000612,0x00050084,0x00000006, + 0x00000614,0x00000611,0x00000613,0x00050080,0x00000006,0x00000615,0x0000060b,0x00000614, + 0x0003003e,0x000000d6,0x00000615,0x0004003d,0x00000006,0x00000616,0x000000c3,0x0004003d, + 0x00000006,0x00000617,0x00000069,0x00050084,0x00000006,0x00000618,0x00000617,0x00000021, + 0x00050080,0x00000006,0x00000619,0x00000618,0x00000180,0x00050041,0x0000002a,0x0000061a, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x0000061b,0x0000061a,0x00050041,0x0000002a, + 0x0000061c,0x00000028,0x000000db,0x0004003d,0x00000006,0x0000061d,0x0000061c,0x00050084, + 0x00000006,0x0000061e,0x0000061b,0x0000061d,0x0005008b,0x00000006,0x0000061f,0x00000619, + 0x0000061e,0x00050041,0x0000002a,0x00000620,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x00000621,0x00000620,0x00050087,0x00000006,0x00000622,0x0000061f,0x00000621,0x00050041, + 0x0000002a,0x00000623,0x00000028,0x000000f3,0x0004003d,0x00000006,0x00000624,0x00000623, + 0x00050084,0x00000006,0x00000625,0x00000622,0x00000624,0x00050080,0x00000006,0x00000626, + 0x00000616,0x00000625,0x0003003e,0x000000e4,0x00000626,0x0004003d,0x00000006,0x00000627, + 0x00000069,0x00050084,0x00000006,0x00000628,0x00000627,0x00000021,0x00050080,0x00000006, + 0x00000629,0x00000628,0x00000180,0x00050041,0x0000002a,0x0000062a,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x0000062b,0x0000062a,0x00050041,0x0000002a,0x0000062c,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x0000062d,0x0000062c,0x00050084,0x00000006,0x0000062e, + 0x0000062b,0x0000062d,0x00050087,0x00000006,0x0000062f,0x00000629,0x0000062e,0x0003003e, + 0x000000f8,0x0000062f,0x0004003d,0x00000006,0x00000630,0x000000e4,0x000500af,0x00000040, + 0x00000631,0x00000630,0x0000006a,0x000300f7,0x00000633,0x00000000,0x000400fa,0x00000631, + 0x00000632,0x00000633,0x000200f8,0x00000632,0x0004003d,0x00000006,0x00000634,0x000000e4, + 0x00050041,0x0000002a,0x00000635,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000636, + 0x00000635,0x000500b1,0x00000040,0x00000637,0x00000634,0x00000636,0x000200f9,0x00000633, + 0x000200f8,0x00000633,0x000700f5,0x00000040,0x00000638,0x00000631,0x000005f7,0x00000637, + 0x00000632,0x0004003d,0x00000006,0x00000639,0x000000d6,0x000500af,0x00000040,0x0000063a, + 0x00000639,0x0000006a,0x000500a7,0x00000040,0x0000063b,0x00000638,0x0000063a,0x000300f7, + 0x0000063d,0x00000000,0x000400fa,0x0000063b,0x0000063c,0x0000063d,0x000200f8,0x0000063c, + 0x0004003d,0x00000006,0x0000063e,0x000000d6,0x00050041,0x0000002a,0x0000063f,0x00000028, + 0x00000021,0x0004003d,0x00000006,0x00000640,0x0000063f,0x000500b1,0x00000040,0x00000641, + 0x0000063e,0x00000640,0x000200f9,0x0000063d,0x000200f8,0x0000063d,0x000700f5,0x00000040, + 0x00000642,0x0000063b,0x00000633,0x00000641,0x0000063c,0x000300f7,0x00000644,0x00000000, + 0x000400fa,0x00000642,0x00000643,0x00000644,0x000200f8,0x00000643,0x0004003d,0x00000006, + 0x00000645,0x00000024,0x0004003d,0x00000006,0x00000646,0x000000f8,0x00050041,0x0000002a, + 0x00000647,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000648,0x00000647,0x00050041, + 0x0000002a,0x00000649,0x00000028,0x00000021,0x0004003d,0x00000006,0x0000064a,0x00000649, + 0x00050084,0x00000006,0x0000064b,0x00000648,0x0000064a,0x00050084,0x00000006,0x0000064c, + 0x00000646,0x0000064b,0x00050080,0x00000006,0x0000064d,0x00000645,0x0000064c,0x0004003d, + 0x00000006,0x0000064e,0x000000e4,0x00050041,0x0000002a,0x0000064f,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x00000650,0x0000064f,0x00050084,0x00000006,0x00000651,0x0000064e, + 0x00000650,0x00050080,0x00000006,0x00000652,0x0000064d,0x00000651,0x0004003d,0x00000006, + 0x00000653,0x000000d6,0x00050080,0x00000006,0x00000654,0x00000652,0x00000653,0x00060041, + 0x0000012b,0x00000655,0x0000011a,0x0000006a,0x00000654,0x0004003d,0x0000005c,0x00000656, + 0x00000655,0x00050041,0x0000012e,0x00000657,0x00000072,0x00000018,0x0003003e,0x00000657, + 0x00000656,0x000200f9,0x00000644,0x000200f8,0x00000644,0x0004003d,0x00000006,0x00000658, + 0x000000cc,0x0004003d,0x00000006,0x00000659,0x00000069,0x00050084,0x00000006,0x0000065a, + 0x00000659,0x00000021,0x00050080,0x00000006,0x0000065b,0x0000065a,0x00000029,0x00050041, + 0x0000002a,0x0000065c,0x00000028,0x000000db,0x0004003d,0x00000006,0x0000065d,0x0000065c, + 0x0005008b,0x00000006,0x0000065e,0x0000065b,0x0000065d,0x00050041,0x0000002a,0x0000065f, + 0x00000028,0x000000df,0x0004003d,0x00000006,0x00000660,0x0000065f,0x00050084,0x00000006, + 0x00000661,0x0000065e,0x00000660,0x00050080,0x00000006,0x00000662,0x00000658,0x00000661, + 0x0003003e,0x000000d6,0x00000662,0x0004003d,0x00000006,0x00000663,0x000000c3,0x0004003d, + 0x00000006,0x00000664,0x00000069,0x00050084,0x00000006,0x00000665,0x00000664,0x00000021, + 0x00050080,0x00000006,0x00000666,0x00000665,0x00000029,0x00050041,0x0000002a,0x00000667, + 0x00000028,0x000000e9,0x0004003d,0x00000006,0x00000668,0x00000667,0x00050041,0x0000002a, + 0x00000669,0x00000028,0x000000db,0x0004003d,0x00000006,0x0000066a,0x00000669,0x00050084, + 0x00000006,0x0000066b,0x00000668,0x0000066a,0x0005008b,0x00000006,0x0000066c,0x00000666, + 0x0000066b,0x00050041,0x0000002a,0x0000066d,0x00000028,0x000000db,0x0004003d,0x00000006, + 0x0000066e,0x0000066d,0x00050087,0x00000006,0x0000066f,0x0000066c,0x0000066e,0x00050041, + 0x0000002a,0x00000670,0x00000028,0x000000f3,0x0004003d,0x00000006,0x00000671,0x00000670, + 0x00050084,0x00000006,0x00000672,0x0000066f,0x00000671,0x00050080,0x00000006,0x00000673, + 0x00000663,0x00000672,0x0003003e,0x000000e4,0x00000673,0x0004003d,0x00000006,0x00000674, + 0x00000069,0x00050084,0x00000006,0x00000675,0x00000674,0x00000021,0x00050080,0x00000006, + 0x00000676,0x00000675,0x00000029,0x00050041,0x0000002a,0x00000677,0x00000028,0x000000e9, + 0x0004003d,0x00000006,0x00000678,0x00000677,0x00050041,0x0000002a,0x00000679,0x00000028, + 0x000000db,0x0004003d,0x00000006,0x0000067a,0x00000679,0x00050084,0x00000006,0x0000067b, + 0x00000678,0x0000067a,0x00050087,0x00000006,0x0000067c,0x00000676,0x0000067b,0x0003003e, + 0x000000f8,0x0000067c,0x0004003d,0x00000006,0x0000067d,0x000000e4,0x000500af,0x00000040, + 0x0000067e,0x0000067d,0x0000006a,0x000300f7,0x00000680,0x00000000,0x000400fa,0x0000067e, + 0x0000067f,0x00000680,0x000200f8,0x0000067f,0x0004003d,0x00000006,0x00000681,0x000000e4, + 0x00050041,0x0000002a,0x00000682,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000683, + 0x00000682,0x000500b1,0x00000040,0x00000684,0x00000681,0x00000683,0x000200f9,0x00000680, + 0x000200f8,0x00000680,0x000700f5,0x00000040,0x00000685,0x0000067e,0x00000644,0x00000684, + 0x0000067f,0x0004003d,0x00000006,0x00000686,0x000000d6,0x000500af,0x00000040,0x00000687, + 0x00000686,0x0000006a,0x000500a7,0x00000040,0x00000688,0x00000685,0x00000687,0x000300f7, + 0x0000068a,0x00000000,0x000400fa,0x00000688,0x00000689,0x0000068a,0x000200f8,0x00000689, + 0x0004003d,0x00000006,0x0000068b,0x000000d6,0x00050041,0x0000002a,0x0000068c,0x00000028, + 0x00000021,0x0004003d,0x00000006,0x0000068d,0x0000068c,0x000500b1,0x00000040,0x0000068e, + 0x0000068b,0x0000068d,0x000200f9,0x0000068a,0x000200f8,0x0000068a,0x000700f5,0x00000040, + 0x0000068f,0x00000688,0x00000680,0x0000068e,0x00000689,0x000300f7,0x00000691,0x00000000, + 0x000400fa,0x0000068f,0x00000690,0x00000691,0x000200f8,0x00000690,0x0004003d,0x00000006, + 0x00000692,0x00000024,0x0004003d,0x00000006,0x00000693,0x000000f8,0x00050041,0x0000002a, + 0x00000694,0x00000028,0x00000029,0x0004003d,0x00000006,0x00000695,0x00000694,0x00050041, + 0x0000002a,0x00000696,0x00000028,0x00000021,0x0004003d,0x00000006,0x00000697,0x00000696, + 0x00050084,0x00000006,0x00000698,0x00000695,0x00000697,0x00050084,0x00000006,0x00000699, + 0x00000693,0x00000698,0x00050080,0x00000006,0x0000069a,0x00000692,0x00000699,0x0004003d, + 0x00000006,0x0000069b,0x000000e4,0x00050041,0x0000002a,0x0000069c,0x00000028,0x00000021, + 0x0004003d,0x00000006,0x0000069d,0x0000069c,0x00050084,0x00000006,0x0000069e,0x0000069b, + 0x0000069d,0x00050080,0x00000006,0x0000069f,0x0000069a,0x0000069e,0x0004003d,0x00000006, + 0x000006a0,0x000000d6,0x00050080,0x00000006,0x000006a1,0x0000069f,0x000006a0,0x00060041, + 0x0000012b,0x000006a2,0x0000011a,0x0000006a,0x000006a1,0x0004003d,0x0000005c,0x000006a3, + 0x000006a2,0x00050041,0x0000012e,0x000006a4,0x00000072,0x00000217,0x0003003e,0x000006a4, + 0x000006a3,0x000200f9,0x00000691,0x000200f8,0x00000691,0x0004003d,0x0000005d,0x000006a5, + 0x00000073,0x0004003d,0x0000005d,0x000006a6,0x00000072,0x00050094,0x0000005c,0x000006a7, + 0x000006a5,0x000006a6,0x00050041,0x0000012e,0x000006a8,0x0000005f,0x00000217,0x0004003d, + 0x0000005c,0x000006a9,0x000006a8,0x00050081,0x0000005c,0x000006aa,0x000006a9,0x000006a7, + 0x00050041,0x0000012e,0x000006ab,0x0000005f,0x00000217,0x0003003e,0x000006ab,0x000006aa, + 0x0004003d,0x0000005d,0x000006ac,0x0000007f,0x0004003d,0x0000005d,0x000006ad,0x00000072, + 0x00050094,0x0000005c,0x000006ae,0x000006ac,0x000006ad,0x00050041,0x0000012e,0x000006af, + 0x00000062,0x00000217,0x0004003d,0x0000005c,0x000006b0,0x000006af,0x00050081,0x0000005c, + 0x000006b1,0x000006b0,0x000006ae,0x00050041,0x0000012e,0x000006b2,0x00000062,0x00000217, + 0x0003003e,0x000006b2,0x000006b1,0x0004003d,0x0000005d,0x000006b3,0x00000086,0x0004003d, + 0x0000005d,0x000006b4,0x00000072,0x00050094,0x0000005c,0x000006b5,0x000006b3,0x000006b4, + 0x00050041,0x0000012e,0x000006b6,0x00000063,0x00000217,0x0004003d,0x0000005c,0x000006b7, + 0x000006b6,0x00050081,0x0000005c,0x000006b8,0x000006b7,0x000006b5,0x00050041,0x0000012e, + 0x000006b9,0x00000063,0x00000217,0x0003003e,0x000006b9,0x000006b8,0x0004003d,0x0000005d, + 0x000006ba,0x0000008d,0x0004003d,0x0000005d,0x000006bb,0x00000072,0x00050094,0x0000005c, + 0x000006bc,0x000006ba,0x000006bb,0x00050041,0x0000012e,0x000006bd,0x00000064,0x00000217, + 0x0004003d,0x0000005c,0x000006be,0x000006bd,0x00050081,0x0000005c,0x000006bf,0x000006be, + 0x000006bc,0x00050041,0x0000012e,0x000006c0,0x00000064,0x00000217,0x0003003e,0x000006c0, + 0x000006bf,0x0004003d,0x0000005d,0x000006c1,0x00000094,0x0004003d,0x0000005d,0x000006c2, + 0x00000072,0x00050094,0x0000005c,0x000006c3,0x000006c1,0x000006c2,0x00050041,0x0000012e, + 0x000006c4,0x00000065,0x00000217,0x0004003d,0x0000005c,0x000006c5,0x000006c4,0x00050081, + 0x0000005c,0x000006c6,0x000006c5,0x000006c3,0x00050041,0x0000012e,0x000006c7,0x00000065, + 0x00000217,0x0003003e,0x000006c7,0x000006c6,0x0004003d,0x0000005d,0x000006c8,0x0000009b, + 0x0004003d,0x0000005d,0x000006c9,0x00000072,0x00050094,0x0000005c,0x000006ca,0x000006c8, + 0x000006c9,0x00050041,0x0000012e,0x000006cb,0x00000066,0x00000217,0x0004003d,0x0000005c, + 0x000006cc,0x000006cb,0x00050081,0x0000005c,0x000006cd,0x000006cc,0x000006ca,0x00050041, + 0x0000012e,0x000006ce,0x00000066,0x00000217,0x0003003e,0x000006ce,0x000006cd,0x0004003d, + 0x0000005d,0x000006cf,0x000000a2,0x0004003d,0x0000005d,0x000006d0,0x00000072,0x00050094, + 0x0000005c,0x000006d1,0x000006cf,0x000006d0,0x00050041,0x0000012e,0x000006d2,0x00000067, + 0x00000217,0x0004003d,0x0000005c,0x000006d3,0x000006d2,0x00050081,0x0000005c,0x000006d4, + 0x000006d3,0x000006d1,0x00050041,0x0000012e,0x000006d5,0x00000067,0x00000217,0x0003003e, + 0x000006d5,0x000006d4,0x0004003d,0x0000005d,0x000006d6,0x000000a9,0x0004003d,0x0000005d, + 0x000006d7,0x00000072,0x00050094,0x0000005c,0x000006d8,0x000006d6,0x000006d7,0x00050041, + 0x0000012e,0x000006d9,0x00000068,0x00000217,0x0004003d,0x0000005c,0x000006da,0x000006d9, + 0x00050081,0x0000005c,0x000006db,0x000006da,0x000006d8,0x00050041,0x0000012e,0x000006dc, + 0x00000068,0x00000217,0x0003003e,0x000006dc,0x000006db,0x0004003d,0x00000006,0x000006dd, + 0x00000069,0x00050080,0x00000006,0x000006de,0x000006dd,0x000000b0,0x0003003e,0x00000069, + 0x000006de,0x000200f9,0x0000006e,0x000200f8,0x0000006e,0x0004003d,0x00000006,0x000006df, + 0x00000069,0x0004003d,0x00000006,0x000006e0,0x0000004f,0x000500b1,0x00000040,0x000006e1, + 0x000006df,0x000006e0,0x000400fa,0x000006e1,0x0000006b,0x0000006d,0x000200f8,0x0000006d, + 0x00050041,0x0000000e,0x000006e7,0x0000000c,0x0000000d,0x0004003d,0x00000009,0x000006e8, + 0x000006e7,0x0004007c,0x00000006,0x000006e9,0x000006e8,0x00050084,0x00000006,0x000006ea, + 0x00000180,0x000006e9,0x00060041,0x00000079,0x000006eb,0x000006e6,0x0000006a,0x000006ea, + 0x0004003d,0x0000005d,0x000006ec,0x000006eb,0x0003003e,0x000006e2,0x000006ec,0x0004003d, + 0x0000005d,0x000006ed,0x000006e2,0x0009004f,0x0000005d,0x000006ee,0x000006ed,0x000006ed, + 0x00000000,0x00000000,0x00000000,0x00000000,0x0004003d,0x0000005d,0x000006ef,0x0000005f, + 0x00050081,0x0000005d,0x000006f0,0x000006ef,0x000006ee,0x0003003e,0x0000005f,0x000006f0, + 0x0004003d,0x0000005d,0x000006f1,0x000006e2,0x0009004f,0x0000005d,0x000006f2,0x000006f1, + 0x000006f1,0x00000001,0x00000001,0x00000001,0x00000001,0x0004003d,0x0000005d,0x000006f3, + 0x00000062,0x00050081,0x0000005d,0x000006f4,0x000006f3,0x000006f2,0x0003003e,0x00000062, + 0x000006f4,0x0004003d,0x0000005d,0x000006f5,0x000006e2,0x0009004f,0x0000005d,0x000006f6, + 0x000006f5,0x000006f5,0x00000002,0x00000002,0x00000002,0x00000002,0x0004003d,0x0000005d, + 0x000006f7,0x00000063,0x00050081,0x0000005d,0x000006f8,0x000006f7,0x000006f6,0x0003003e, + 0x00000063,0x000006f8,0x0004003d,0x0000005d,0x000006f9,0x000006e2,0x0009004f,0x0000005d, + 0x000006fa,0x000006f9,0x000006f9,0x00000003,0x00000003,0x00000003,0x00000003,0x0004003d, + 0x0000005d,0x000006fb,0x00000064,0x00050081,0x0000005d,0x000006fc,0x000006fb,0x000006fa, + 0x0003003e,0x00000064,0x000006fc,0x00050041,0x0000000e,0x000006fd,0x0000000c,0x0000000d, + 0x0004003d,0x00000009,0x000006fe,0x000006fd,0x0004007c,0x00000006,0x000006ff,0x000006fe, + 0x00050084,0x00000006,0x00000700,0x00000180,0x000006ff,0x00050080,0x00000006,0x00000701, + 0x00000700,0x000000b0,0x00060041,0x00000079,0x00000702,0x000006e6,0x0000006a,0x00000701, + 0x0004003d,0x0000005d,0x00000703,0x00000702,0x0003003e,0x000006e2,0x00000703,0x0004003d, + 0x0000005d,0x00000704,0x000006e2,0x0009004f,0x0000005d,0x00000705,0x00000704,0x00000704, + 0x00000000,0x00000000,0x00000000,0x00000000,0x0004003d,0x0000005d,0x00000706,0x00000065, + 0x00050081,0x0000005d,0x00000707,0x00000706,0x00000705,0x0003003e,0x00000065,0x00000707, + 0x0004003d,0x0000005d,0x00000708,0x000006e2,0x0009004f,0x0000005d,0x00000709,0x00000708, + 0x00000708,0x00000001,0x00000001,0x00000001,0x00000001,0x0004003d,0x0000005d,0x0000070a, + 0x00000066,0x00050081,0x0000005d,0x0000070b,0x0000070a,0x00000709,0x0003003e,0x00000066, + 0x0000070b,0x0004003d,0x0000005d,0x0000070c,0x000006e2,0x0009004f,0x0000005d,0x0000070d, + 0x0000070c,0x0000070c,0x00000002,0x00000002,0x00000002,0x00000002,0x0004003d,0x0000005d, + 0x0000070e,0x00000067,0x00050081,0x0000005d,0x0000070f,0x0000070e,0x0000070d,0x0003003e, + 0x00000067,0x0000070f,0x0004003d,0x0000005d,0x00000710,0x000006e2,0x0009004f,0x0000005d, + 0x00000711,0x00000710,0x00000710,0x00000003,0x00000003,0x00000003,0x00000003,0x0004003d, + 0x0000005d,0x00000712,0x00000068,0x00050081,0x0000005d,0x00000713,0x00000712,0x00000711, + 0x0003003e,0x00000068,0x00000713,0x0004003d,0x00000006,0x00000718,0x00000035,0x0004003d, + 0x00000006,0x00000719,0x0000001c,0x00050080,0x00000006,0x0000071a,0x00000719,0x0000006a, + 0x00050041,0x0000002a,0x0000071b,0x00000028,0x00000037,0x0004003d,0x00000006,0x0000071c, + 0x0000071b,0x00050084,0x00000006,0x0000071d,0x0000071a,0x0000071c,0x00050087,0x00000006, + 0x0000071e,0x0000071d,0x00000021,0x00050080,0x00000006,0x0000071f,0x00000718,0x0000071e, + 0x0004003d,0x00000006,0x00000720,0x00000012,0x00050080,0x00000006,0x00000721,0x0000071f, + 0x00000720,0x0004003d,0x0000005d,0x00000722,0x0000005f,0x00060041,0x00000079,0x00000723, + 0x00000717,0x0000006a,0x00000721,0x0003003e,0x00000723,0x00000722,0x0004003d,0x00000006, + 0x00000724,0x00000035,0x0004003d,0x00000006,0x00000725,0x0000001c,0x00050080,0x00000006, + 0x00000726,0x00000725,0x000000b0,0x00050041,0x0000002a,0x00000727,0x00000028,0x00000037, + 0x0004003d,0x00000006,0x00000728,0x00000727,0x00050084,0x00000006,0x00000729,0x00000726, + 0x00000728,0x00050087,0x00000006,0x0000072a,0x00000729,0x00000021,0x00050080,0x00000006, + 0x0000072b,0x00000724,0x0000072a,0x0004003d,0x00000006,0x0000072c,0x00000012,0x00050080, + 0x00000006,0x0000072d,0x0000072b,0x0000072c,0x0004003d,0x0000005d,0x0000072e,0x00000062, + 0x00060041,0x00000079,0x0000072f,0x00000717,0x0000006a,0x0000072d,0x0003003e,0x0000072f, + 0x0000072e,0x0004003d,0x00000006,0x00000730,0x00000035,0x0004003d,0x00000006,0x00000731, + 0x0000001c,0x00050080,0x00000006,0x00000732,0x00000731,0x00000180,0x00050041,0x0000002a, + 0x00000733,0x00000028,0x00000037,0x0004003d,0x00000006,0x00000734,0x00000733,0x00050084, + 0x00000006,0x00000735,0x00000732,0x00000734,0x00050087,0x00000006,0x00000736,0x00000735, + 0x00000021,0x00050080,0x00000006,0x00000737,0x00000730,0x00000736,0x0004003d,0x00000006, + 0x00000738,0x00000012,0x00050080,0x00000006,0x00000739,0x00000737,0x00000738,0x0004003d, + 0x0000005d,0x0000073a,0x00000063,0x00060041,0x00000079,0x0000073b,0x00000717,0x0000006a, + 0x00000739,0x0003003e,0x0000073b,0x0000073a,0x0004003d,0x00000006,0x0000073c,0x00000035, + 0x0004003d,0x00000006,0x0000073d,0x0000001c,0x00050080,0x00000006,0x0000073e,0x0000073d, + 0x00000029,0x00050041,0x0000002a,0x0000073f,0x00000028,0x00000037,0x0004003d,0x00000006, + 0x00000740,0x0000073f,0x00050084,0x00000006,0x00000741,0x0000073e,0x00000740,0x00050087, + 0x00000006,0x00000742,0x00000741,0x00000021,0x00050080,0x00000006,0x00000743,0x0000073c, + 0x00000742,0x0004003d,0x00000006,0x00000744,0x00000012,0x00050080,0x00000006,0x00000745, + 0x00000743,0x00000744,0x0004003d,0x0000005d,0x00000746,0x00000064,0x00060041,0x00000079, + 0x00000747,0x00000717,0x0000006a,0x00000745,0x0003003e,0x00000747,0x00000746,0x0004003d, + 0x00000006,0x00000748,0x00000035,0x0004003d,0x00000006,0x00000749,0x0000001c,0x00050080, + 0x00000006,0x0000074a,0x00000749,0x00000021,0x00050041,0x0000002a,0x0000074b,0x00000028, + 0x00000037,0x0004003d,0x00000006,0x0000074c,0x0000074b,0x00050084,0x00000006,0x0000074d, + 0x0000074a,0x0000074c,0x00050087,0x00000006,0x0000074e,0x0000074d,0x00000021,0x00050080, + 0x00000006,0x0000074f,0x00000748,0x0000074e,0x0004003d,0x00000006,0x00000750,0x00000012, + 0x00050080,0x00000006,0x00000751,0x0000074f,0x00000750,0x0004003d,0x0000005d,0x00000752, + 0x00000065,0x00060041,0x00000079,0x00000753,0x00000717,0x0000006a,0x00000751,0x0003003e, + 0x00000753,0x00000752,0x0004003d,0x00000006,0x00000754,0x00000035,0x0004003d,0x00000006, + 0x00000755,0x0000001c,0x00050080,0x00000006,0x00000756,0x00000755,0x000000b9,0x00050041, + 0x0000002a,0x00000757,0x00000028,0x00000037,0x0004003d,0x00000006,0x00000758,0x00000757, + 0x00050084,0x00000006,0x00000759,0x00000756,0x00000758,0x00050087,0x00000006,0x0000075a, + 0x00000759,0x00000021,0x00050080,0x00000006,0x0000075b,0x00000754,0x0000075a,0x0004003d, + 0x00000006,0x0000075c,0x00000012,0x00050080,0x00000006,0x0000075d,0x0000075b,0x0000075c, + 0x0004003d,0x0000005d,0x0000075e,0x00000066,0x00060041,0x00000079,0x0000075f,0x00000717, + 0x0000006a,0x0000075d,0x0003003e,0x0000075f,0x0000075e,0x0004003d,0x00000006,0x00000760, + 0x00000035,0x0004003d,0x00000006,0x00000761,0x0000001c,0x00050080,0x00000006,0x00000762, + 0x00000761,0x000000c5,0x00050041,0x0000002a,0x00000763,0x00000028,0x00000037,0x0004003d, + 0x00000006,0x00000764,0x00000763,0x00050084,0x00000006,0x00000765,0x00000762,0x00000764, + 0x00050087,0x00000006,0x00000766,0x00000765,0x00000021,0x00050080,0x00000006,0x00000767, + 0x00000760,0x00000766,0x0004003d,0x00000006,0x00000768,0x00000012,0x00050080,0x00000006, + 0x00000769,0x00000767,0x00000768,0x0004003d,0x0000005d,0x0000076a,0x00000067,0x00060041, + 0x00000079,0x0000076b,0x00000717,0x0000006a,0x00000769,0x0003003e,0x0000076b,0x0000076a, + 0x0004003d,0x00000006,0x0000076c,0x00000035,0x0004003d,0x00000006,0x0000076d,0x0000001c, + 0x00050080,0x00000006,0x0000076e,0x0000076d,0x000000ce,0x00050041,0x0000002a,0x0000076f, + 0x00000028,0x00000037,0x0004003d,0x00000006,0x00000770,0x0000076f,0x00050084,0x00000006, + 0x00000771,0x0000076e,0x00000770,0x00050087,0x00000006,0x00000772,0x00000771,0x00000021, + 0x00050080,0x00000006,0x00000773,0x0000076c,0x00000772,0x0004003d,0x00000006,0x00000774, + 0x00000012,0x00050080,0x00000006,0x00000775,0x00000773,0x00000774,0x0004003d,0x0000005d, + 0x00000776,0x00000068,0x00060041,0x00000079,0x00000777,0x00000717,0x0000006a,0x00000775, + 0x0003003e,0x00000777,0x00000776,0x000200f9,0x0000004e,0x000200f8,0x0000004e,0x000100fd, + 0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/conv_spv.cpp b/modules/dnn/src/webgpu/shader/conv_spv.cpp new file mode 100644 index 000000000000..ee7cfc5b4eba --- /dev/null +++ b/modules/dnn/src/webgpu/shader/conv_spv.cpp @@ -0,0 +1,251 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int conv_spv[1888] = { + 0x07230203,0x00010000,0x00080009,0x00000123,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00060010,0x00000004, + 0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00030005,0x00000008,0x00007867,0x00080005,0x0000000c, + 0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00030005,0x00000012, + 0x00007967,0x00050005,0x00000017,0x68737570,0x636f6c42,0x0000006b,0x00050006,0x00000017, + 0x00000000,0x685f6e69,0x00000000,0x00050006,0x00000017,0x00000001,0x775f6e69,0x00000000, + 0x00050006,0x00000017,0x00000002,0x5f74756f,0x00000068,0x00050006,0x00000017,0x00000003, + 0x5f74756f,0x00000077,0x00060006,0x00000017,0x00000004,0x69727473,0x685f6564,0x00000000, + 0x00060006,0x00000017,0x00000005,0x69727473,0x775f6564,0x00000000,0x00050006,0x00000017, + 0x00000006,0x5f646170,0x00000068,0x00050006,0x00000017,0x00000007,0x5f646170,0x00000077, + 0x00060006,0x00000017,0x00000008,0x746c6966,0x685f7265,0x00000000,0x00060006,0x00000017, + 0x00000009,0x746c6966,0x775f7265,0x00000000,0x00060006,0x00000017,0x0000000a,0x616c6964, + 0x6e6f6974,0x0000685f,0x00060006,0x00000017,0x0000000b,0x616c6964,0x6e6f6974,0x0000775f, + 0x00060006,0x00000017,0x0000000c,0x6e616863,0x736c656e,0x00000000,0x00050006,0x00000017, + 0x0000000d,0x63746162,0x00000068,0x00060006,0x00000017,0x0000000e,0x5f736168,0x73616962, + 0x00000000,0x00040006,0x00000017,0x0000000f,0x0000004d,0x00040006,0x00000017,0x00000010, + 0x0000004b,0x00040006,0x00000017,0x00000011,0x0000004e,0x00090006,0x00000017,0x00000012, + 0x69736162,0x68735f63,0x72656461,0x7461625f,0x695f6863,0x00007864,0x000a0006,0x00000017, + 0x00000013,0x69736162,0x68735f63,0x72656461,0x7261705f,0x69746974,0x695f6e6f,0x00007864, + 0x000a0006,0x00000017,0x00000014,0x69736162,0x68735f63,0x72656461,0x7261705f,0x69746974, + 0x735f6e6f,0x00657a69,0x00030005,0x00000019,0x00000070,0x00030005,0x00000023,0x00007a67, + 0x00030005,0x00000039,0x006d7573,0x00050005,0x0000003b,0x7074756f,0x795f7475,0x00000000, + 0x00050005,0x00000041,0x7074756f,0x785f7475,0x00000000,0x00040005,0x00000046,0x5f67726f, + 0x00000079,0x00040005,0x00000050,0x5f67726f,0x00000078,0x00050005,0x0000005a,0x67696577, + 0x6f5f7468,0x00006666,0x00050005,0x00000060,0x75706e69,0x666f5f74,0x00000066,0x00030005, + 0x00000075,0x00000063,0x00030005,0x0000007f,0x00000079,0x00030005,0x0000008a,0x00000078, + 0x00040005,0x000000c3,0x75706e49,0x00003074,0x00060006,0x000000c3,0x00000000,0x67616d69, + 0x61645f65,0x00006174,0x00030005,0x000000c5,0x00000000,0x00040005,0x000000d0,0x75706e49, + 0x00003374,0x00060006,0x000000d0,0x00000000,0x67696577,0x645f7468,0x00617461,0x00030005, + 0x000000d2,0x00000000,0x00040005,0x000000fc,0x7366666f,0x00007465,0x00040005,0x00000112, + 0x75706e49,0x00003174,0x00060006,0x00000112,0x00000000,0x73616962,0x7461645f,0x00000061, + 0x00030005,0x00000114,0x00000000,0x00040005,0x0000011b,0x7074754f,0x00007475,0x00090006, + 0x0000011b,0x00000000,0x766e6f63,0x65766c6f,0x6d695f64,0x5f656761,0x61746164,0x00000000, + 0x00030005,0x0000011d,0x00000000,0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00050048, + 0x00000017,0x00000000,0x00000023,0x00000000,0x00050048,0x00000017,0x00000001,0x00000023, + 0x00000004,0x00050048,0x00000017,0x00000002,0x00000023,0x00000008,0x00050048,0x00000017, + 0x00000003,0x00000023,0x0000000c,0x00050048,0x00000017,0x00000004,0x00000023,0x00000010, + 0x00050048,0x00000017,0x00000005,0x00000023,0x00000014,0x00050048,0x00000017,0x00000006, + 0x00000023,0x00000018,0x00050048,0x00000017,0x00000007,0x00000023,0x0000001c,0x00050048, + 0x00000017,0x00000008,0x00000023,0x00000020,0x00050048,0x00000017,0x00000009,0x00000023, + 0x00000024,0x00050048,0x00000017,0x0000000a,0x00000023,0x00000028,0x00050048,0x00000017, + 0x0000000b,0x00000023,0x0000002c,0x00050048,0x00000017,0x0000000c,0x00000023,0x00000030, + 0x00050048,0x00000017,0x0000000d,0x00000023,0x00000034,0x00050048,0x00000017,0x0000000e, + 0x00000023,0x00000038,0x00050048,0x00000017,0x0000000f,0x00000023,0x0000003c,0x00050048, + 0x00000017,0x00000010,0x00000023,0x00000040,0x00050048,0x00000017,0x00000011,0x00000023, + 0x00000044,0x00050048,0x00000017,0x00000012,0x00000023,0x00000048,0x00050048,0x00000017, + 0x00000013,0x00000023,0x0000004c,0x00050048,0x00000017,0x00000014,0x00000023,0x00000050, + 0x00030047,0x00000017,0x00000002,0x00040047,0x00000019,0x00000022,0x00000000,0x00040047, + 0x00000019,0x00000021,0x00000004,0x00040047,0x000000c2,0x00000006,0x00000004,0x00050048, + 0x000000c3,0x00000000,0x00000023,0x00000000,0x00030047,0x000000c3,0x00000003,0x00040047, + 0x000000c5,0x00000022,0x00000000,0x00040047,0x000000c5,0x00000021,0x00000000,0x00040047, + 0x000000cf,0x00000006,0x00000004,0x00050048,0x000000d0,0x00000000,0x00000023,0x00000000, + 0x00030047,0x000000d0,0x00000003,0x00040047,0x000000d2,0x00000022,0x00000000,0x00040047, + 0x000000d2,0x00000021,0x00000002,0x00040047,0x00000111,0x00000006,0x00000004,0x00050048, + 0x00000112,0x00000000,0x00000023,0x00000000,0x00030047,0x00000112,0x00000003,0x00040047, + 0x00000114,0x00000022,0x00000000,0x00040047,0x00000114,0x00000021,0x00000001,0x00040047, + 0x0000011a,0x00000006,0x00000004,0x00050048,0x0000011b,0x00000000,0x00000023,0x00000000, + 0x00030047,0x0000011b,0x00000003,0x00040047,0x0000011d,0x00000022,0x00000000,0x00040047, + 0x0000011d,0x00000021,0x00000003,0x00040047,0x00000122,0x0000000b,0x00000019,0x00020013, + 0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001, + 0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000, + 0x00040017,0x0000000a,0x00000009,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a, + 0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000009,0x0000000d,0x00000000, + 0x00040020,0x0000000e,0x00000001,0x00000009,0x0004002b,0x00000009,0x00000013,0x00000001, + 0x0017001e,0x00000017,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020, + 0x00000018,0x00000002,0x00000017,0x0004003b,0x00000018,0x00000019,0x00000002,0x0004002b, + 0x00000006,0x0000001a,0x00000013,0x00040020,0x0000001b,0x00000002,0x00000006,0x0004002b, + 0x00000006,0x0000001e,0x00000014,0x0004002b,0x00000006,0x00000024,0x00000012,0x00020014, + 0x00000027,0x0004002b,0x00000006,0x00000029,0x0000000f,0x0004002b,0x00000006,0x00000030, + 0x00000011,0x00030016,0x00000037,0x00000020,0x00040020,0x00000038,0x00000007,0x00000037, + 0x0004002b,0x00000037,0x0000003a,0x00000000,0x0004002b,0x00000006,0x0000003d,0x00000003, + 0x0004002b,0x00000006,0x00000048,0x00000004,0x0004002b,0x00000006,0x0000004c,0x00000006, + 0x0004002b,0x00000006,0x00000052,0x00000005,0x0004002b,0x00000006,0x00000056,0x00000007, + 0x0004002b,0x00000006,0x0000005c,0x00000010,0x0004002b,0x00000006,0x00000062,0x00000000, + 0x0004002b,0x00000006,0x00000066,0x00000001,0x0004002b,0x00000006,0x0000006a,0x0000000c, + 0x0004002b,0x00000006,0x00000086,0x00000008,0x0004002b,0x00000006,0x00000091,0x00000009, + 0x0004002b,0x00000006,0x00000097,0x0000000a,0x0004002b,0x00000006,0x000000ad,0x0000000b, + 0x0003001d,0x000000c2,0x00000037,0x0003001e,0x000000c3,0x000000c2,0x00040020,0x000000c4, + 0x00000002,0x000000c3,0x0004003b,0x000000c4,0x000000c5,0x00000002,0x00040020,0x000000cc, + 0x00000002,0x00000037,0x0003001d,0x000000cf,0x00000037,0x0003001e,0x000000d0,0x000000cf, + 0x00040020,0x000000d1,0x00000002,0x000000d0,0x0004003b,0x000000d1,0x000000d2,0x00000002, + 0x0004002b,0x00000006,0x0000010b,0x0000000e,0x0003001d,0x00000111,0x00000037,0x0003001e, + 0x00000112,0x00000111,0x00040020,0x00000113,0x00000002,0x00000112,0x0004003b,0x00000113, + 0x00000114,0x00000002,0x0003001d,0x0000011a,0x00000037,0x0003001e,0x0000011b,0x0000011a, + 0x00040020,0x0000011c,0x00000002,0x0000011b,0x0004003b,0x0000011c,0x0000011d,0x00000002, + 0x0004002b,0x00000009,0x00000121,0x00000100,0x0006002c,0x0000000a,0x00000122,0x00000121, + 0x00000013,0x00000013,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8, + 0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,0x00000007,0x00000012, + 0x00000007,0x0004003b,0x00000007,0x00000023,0x00000007,0x0004003b,0x00000038,0x00000039, + 0x00000007,0x0004003b,0x00000007,0x0000003b,0x00000007,0x0004003b,0x00000007,0x00000041, + 0x00000007,0x0004003b,0x00000007,0x00000046,0x00000007,0x0004003b,0x00000007,0x00000050, + 0x00000007,0x0004003b,0x00000007,0x0000005a,0x00000007,0x0004003b,0x00000007,0x00000060, + 0x00000007,0x0004003b,0x00000007,0x00000075,0x00000007,0x0004003b,0x00000007,0x0000007f, + 0x00000007,0x0004003b,0x00000007,0x0000008a,0x00000007,0x0004003b,0x00000007,0x000000fc, + 0x00000007,0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000009, + 0x00000010,0x0000000f,0x0004007c,0x00000006,0x00000011,0x00000010,0x0003003e,0x00000008, + 0x00000011,0x00050041,0x0000000e,0x00000014,0x0000000c,0x00000013,0x0004003d,0x00000009, + 0x00000015,0x00000014,0x0004007c,0x00000006,0x00000016,0x00000015,0x00050041,0x0000001b, + 0x0000001c,0x00000019,0x0000001a,0x0004003d,0x00000006,0x0000001d,0x0000001c,0x00050041, + 0x0000001b,0x0000001f,0x00000019,0x0000001e,0x0004003d,0x00000006,0x00000020,0x0000001f, + 0x00050084,0x00000006,0x00000021,0x0000001d,0x00000020,0x00050080,0x00000006,0x00000022, + 0x00000016,0x00000021,0x0003003e,0x00000012,0x00000022,0x00050041,0x0000001b,0x00000025, + 0x00000019,0x00000024,0x0004003d,0x00000006,0x00000026,0x00000025,0x0003003e,0x00000023, + 0x00000026,0x0004003d,0x00000006,0x00000028,0x00000008,0x00050041,0x0000001b,0x0000002a, + 0x00000019,0x00000029,0x0004003d,0x00000006,0x0000002b,0x0000002a,0x000500b1,0x00000027, + 0x0000002c,0x00000028,0x0000002b,0x000300f7,0x0000002e,0x00000000,0x000400fa,0x0000002c, + 0x0000002d,0x0000002e,0x000200f8,0x0000002d,0x0004003d,0x00000006,0x0000002f,0x00000012, + 0x00050041,0x0000001b,0x00000031,0x00000019,0x00000030,0x0004003d,0x00000006,0x00000032, + 0x00000031,0x000500b1,0x00000027,0x00000033,0x0000002f,0x00000032,0x000200f9,0x0000002e, + 0x000200f8,0x0000002e,0x000700f5,0x00000027,0x00000034,0x0000002c,0x00000005,0x00000033, + 0x0000002d,0x000300f7,0x00000036,0x00000000,0x000400fa,0x00000034,0x00000035,0x00000036, + 0x000200f8,0x00000035,0x0003003e,0x00000039,0x0000003a,0x0004003d,0x00000006,0x0000003c, + 0x00000008,0x00050041,0x0000001b,0x0000003e,0x00000019,0x0000003d,0x0004003d,0x00000006, + 0x0000003f,0x0000003e,0x00050087,0x00000006,0x00000040,0x0000003c,0x0000003f,0x0003003e, + 0x0000003b,0x00000040,0x0004003d,0x00000006,0x00000042,0x00000008,0x00050041,0x0000001b, + 0x00000043,0x00000019,0x0000003d,0x0004003d,0x00000006,0x00000044,0x00000043,0x0005008b, + 0x00000006,0x00000045,0x00000042,0x00000044,0x0003003e,0x00000041,0x00000045,0x0004003d, + 0x00000006,0x00000047,0x0000003b,0x00050041,0x0000001b,0x00000049,0x00000019,0x00000048, + 0x0004003d,0x00000006,0x0000004a,0x00000049,0x00050084,0x00000006,0x0000004b,0x00000047, + 0x0000004a,0x00050041,0x0000001b,0x0000004d,0x00000019,0x0000004c,0x0004003d,0x00000006, + 0x0000004e,0x0000004d,0x00050082,0x00000006,0x0000004f,0x0000004b,0x0000004e,0x0003003e, + 0x00000046,0x0000004f,0x0004003d,0x00000006,0x00000051,0x00000041,0x00050041,0x0000001b, + 0x00000053,0x00000019,0x00000052,0x0004003d,0x00000006,0x00000054,0x00000053,0x00050084, + 0x00000006,0x00000055,0x00000051,0x00000054,0x00050041,0x0000001b,0x00000057,0x00000019, + 0x00000056,0x0004003d,0x00000006,0x00000058,0x00000057,0x00050082,0x00000006,0x00000059, + 0x00000055,0x00000058,0x0003003e,0x00000050,0x00000059,0x0004003d,0x00000006,0x0000005b, + 0x00000012,0x00050041,0x0000001b,0x0000005d,0x00000019,0x0000005c,0x0004003d,0x00000006, + 0x0000005e,0x0000005d,0x00050084,0x00000006,0x0000005f,0x0000005b,0x0000005e,0x0003003e, + 0x0000005a,0x0000005f,0x0004003d,0x00000006,0x00000061,0x00000023,0x00050041,0x0000001b, + 0x00000063,0x00000019,0x00000062,0x0004003d,0x00000006,0x00000064,0x00000063,0x00050084, + 0x00000006,0x00000065,0x00000061,0x00000064,0x00050041,0x0000001b,0x00000067,0x00000019, + 0x00000066,0x0004003d,0x00000006,0x00000068,0x00000067,0x00050084,0x00000006,0x00000069, + 0x00000065,0x00000068,0x00050041,0x0000001b,0x0000006b,0x00000019,0x0000006a,0x0004003d, + 0x00000006,0x0000006c,0x0000006b,0x00050084,0x00000006,0x0000006d,0x00000069,0x0000006c, + 0x0004003d,0x00000006,0x0000006e,0x00000046,0x00050041,0x0000001b,0x0000006f,0x00000019, + 0x00000066,0x0004003d,0x00000006,0x00000070,0x0000006f,0x00050084,0x00000006,0x00000071, + 0x0000006e,0x00000070,0x0004003d,0x00000006,0x00000072,0x00000050,0x00050080,0x00000006, + 0x00000073,0x00000071,0x00000072,0x00050080,0x00000006,0x00000074,0x0000006d,0x00000073, + 0x0003003e,0x00000060,0x00000074,0x0003003e,0x00000075,0x00000062,0x000200f9,0x00000076, + 0x000200f8,0x00000076,0x000400f6,0x00000078,0x00000079,0x00000000,0x000200f9,0x0000007a, + 0x000200f8,0x0000007a,0x0004003d,0x00000006,0x0000007b,0x00000075,0x00050041,0x0000001b, + 0x0000007c,0x00000019,0x0000006a,0x0004003d,0x00000006,0x0000007d,0x0000007c,0x000500b1, + 0x00000027,0x0000007e,0x0000007b,0x0000007d,0x000400fa,0x0000007e,0x00000077,0x00000078, + 0x000200f8,0x00000077,0x0003003e,0x0000007f,0x00000062,0x000200f9,0x00000080,0x000200f8, + 0x00000080,0x000400f6,0x00000082,0x00000083,0x00000000,0x000200f9,0x00000084,0x000200f8, + 0x00000084,0x0004003d,0x00000006,0x00000085,0x0000007f,0x00050041,0x0000001b,0x00000087, + 0x00000019,0x00000086,0x0004003d,0x00000006,0x00000088,0x00000087,0x000500b1,0x00000027, + 0x00000089,0x00000085,0x00000088,0x000400fa,0x00000089,0x00000081,0x00000082,0x000200f8, + 0x00000081,0x0003003e,0x0000008a,0x00000062,0x000200f9,0x0000008b,0x000200f8,0x0000008b, + 0x000400f6,0x0000008d,0x0000008e,0x00000000,0x000200f9,0x0000008f,0x000200f8,0x0000008f, + 0x0004003d,0x00000006,0x00000090,0x0000008a,0x00050041,0x0000001b,0x00000092,0x00000019, + 0x00000091,0x0004003d,0x00000006,0x00000093,0x00000092,0x000500b1,0x00000027,0x00000094, + 0x00000090,0x00000093,0x000400fa,0x00000094,0x0000008c,0x0000008d,0x000200f8,0x0000008c, + 0x0004003d,0x00000006,0x00000095,0x00000046,0x0004003d,0x00000006,0x00000096,0x0000007f, + 0x00050041,0x0000001b,0x00000098,0x00000019,0x00000097,0x0004003d,0x00000006,0x00000099, + 0x00000098,0x00050084,0x00000006,0x0000009a,0x00000096,0x00000099,0x00050080,0x00000006, + 0x0000009b,0x00000095,0x0000009a,0x000500af,0x00000027,0x0000009c,0x0000009b,0x00000062, + 0x000300f7,0x0000009e,0x00000000,0x000400fa,0x0000009c,0x0000009d,0x0000009e,0x000200f8, + 0x0000009d,0x0004003d,0x00000006,0x0000009f,0x00000046,0x0004003d,0x00000006,0x000000a0, + 0x0000007f,0x00050041,0x0000001b,0x000000a1,0x00000019,0x00000097,0x0004003d,0x00000006, + 0x000000a2,0x000000a1,0x00050084,0x00000006,0x000000a3,0x000000a0,0x000000a2,0x00050080, + 0x00000006,0x000000a4,0x0000009f,0x000000a3,0x00050041,0x0000001b,0x000000a5,0x00000019, + 0x00000062,0x0004003d,0x00000006,0x000000a6,0x000000a5,0x000500b1,0x00000027,0x000000a7, + 0x000000a4,0x000000a6,0x000200f9,0x0000009e,0x000200f8,0x0000009e,0x000700f5,0x00000027, + 0x000000a8,0x0000009c,0x0000008c,0x000000a7,0x0000009d,0x000300f7,0x000000aa,0x00000000, + 0x000400fa,0x000000a8,0x000000a9,0x000000aa,0x000200f8,0x000000a9,0x0004003d,0x00000006, + 0x000000ab,0x00000050,0x0004003d,0x00000006,0x000000ac,0x0000008a,0x00050041,0x0000001b, + 0x000000ae,0x00000019,0x000000ad,0x0004003d,0x00000006,0x000000af,0x000000ae,0x00050084, + 0x00000006,0x000000b0,0x000000ac,0x000000af,0x00050080,0x00000006,0x000000b1,0x000000ab, + 0x000000b0,0x000500af,0x00000027,0x000000b2,0x000000b1,0x00000062,0x000200f9,0x000000aa, + 0x000200f8,0x000000aa,0x000700f5,0x00000027,0x000000b3,0x000000a8,0x0000009e,0x000000b2, + 0x000000a9,0x000300f7,0x000000b5,0x00000000,0x000400fa,0x000000b3,0x000000b4,0x000000b5, + 0x000200f8,0x000000b4,0x0004003d,0x00000006,0x000000b6,0x00000050,0x0004003d,0x00000006, + 0x000000b7,0x0000008a,0x00050041,0x0000001b,0x000000b8,0x00000019,0x000000ad,0x0004003d, + 0x00000006,0x000000b9,0x000000b8,0x00050084,0x00000006,0x000000ba,0x000000b7,0x000000b9, + 0x00050080,0x00000006,0x000000bb,0x000000b6,0x000000ba,0x00050041,0x0000001b,0x000000bc, + 0x00000019,0x00000066,0x0004003d,0x00000006,0x000000bd,0x000000bc,0x000500b1,0x00000027, + 0x000000be,0x000000bb,0x000000bd,0x000200f9,0x000000b5,0x000200f8,0x000000b5,0x000700f5, + 0x00000027,0x000000bf,0x000000b3,0x000000aa,0x000000be,0x000000b4,0x000300f7,0x000000c1, + 0x00000000,0x000400fa,0x000000bf,0x000000c0,0x000000c1,0x000200f8,0x000000c0,0x0004003d, + 0x00000006,0x000000c6,0x00000060,0x0004003d,0x00000006,0x000000c7,0x0000008a,0x00050041, + 0x0000001b,0x000000c8,0x00000019,0x000000ad,0x0004003d,0x00000006,0x000000c9,0x000000c8, + 0x00050084,0x00000006,0x000000ca,0x000000c7,0x000000c9,0x00050080,0x00000006,0x000000cb, + 0x000000c6,0x000000ca,0x00060041,0x000000cc,0x000000cd,0x000000c5,0x00000062,0x000000cb, + 0x0004003d,0x00000037,0x000000ce,0x000000cd,0x0004003d,0x00000006,0x000000d3,0x0000005a, + 0x0004003d,0x00000006,0x000000d4,0x0000008a,0x00050080,0x00000006,0x000000d5,0x000000d3, + 0x000000d4,0x00060041,0x000000cc,0x000000d6,0x000000d2,0x00000062,0x000000d5,0x0004003d, + 0x00000037,0x000000d7,0x000000d6,0x00050085,0x00000037,0x000000d8,0x000000ce,0x000000d7, + 0x0004003d,0x00000037,0x000000d9,0x00000039,0x00050081,0x00000037,0x000000da,0x000000d9, + 0x000000d8,0x0003003e,0x00000039,0x000000da,0x000200f9,0x000000c1,0x000200f8,0x000000c1, + 0x000200f9,0x0000008e,0x000200f8,0x0000008e,0x0004003d,0x00000006,0x000000db,0x0000008a, + 0x00050080,0x00000006,0x000000dc,0x000000db,0x00000066,0x0003003e,0x0000008a,0x000000dc, + 0x000200f9,0x0000008b,0x000200f8,0x0000008d,0x00050041,0x0000001b,0x000000dd,0x00000019, + 0x00000066,0x0004003d,0x00000006,0x000000de,0x000000dd,0x00050041,0x0000001b,0x000000df, + 0x00000019,0x00000097,0x0004003d,0x00000006,0x000000e0,0x000000df,0x00050084,0x00000006, + 0x000000e1,0x000000de,0x000000e0,0x0004003d,0x00000006,0x000000e2,0x00000060,0x00050080, + 0x00000006,0x000000e3,0x000000e2,0x000000e1,0x0003003e,0x00000060,0x000000e3,0x00050041, + 0x0000001b,0x000000e4,0x00000019,0x00000091,0x0004003d,0x00000006,0x000000e5,0x000000e4, + 0x0004003d,0x00000006,0x000000e6,0x0000005a,0x00050080,0x00000006,0x000000e7,0x000000e6, + 0x000000e5,0x0003003e,0x0000005a,0x000000e7,0x000200f9,0x00000083,0x000200f8,0x00000083, + 0x0004003d,0x00000006,0x000000e8,0x0000007f,0x00050080,0x00000006,0x000000e9,0x000000e8, + 0x00000066,0x0003003e,0x0000007f,0x000000e9,0x000200f9,0x00000080,0x000200f8,0x00000082, + 0x00050041,0x0000001b,0x000000ea,0x00000019,0x00000062,0x0004003d,0x00000006,0x000000eb, + 0x000000ea,0x00050041,0x0000001b,0x000000ec,0x00000019,0x00000066,0x0004003d,0x00000006, + 0x000000ed,0x000000ec,0x00050084,0x00000006,0x000000ee,0x000000eb,0x000000ed,0x00050041, + 0x0000001b,0x000000ef,0x00000019,0x00000066,0x0004003d,0x00000006,0x000000f0,0x000000ef, + 0x00050041,0x0000001b,0x000000f1,0x00000019,0x00000086,0x0004003d,0x00000006,0x000000f2, + 0x000000f1,0x00050084,0x00000006,0x000000f3,0x000000f0,0x000000f2,0x00050041,0x0000001b, + 0x000000f4,0x00000019,0x00000097,0x0004003d,0x00000006,0x000000f5,0x000000f4,0x00050084, + 0x00000006,0x000000f6,0x000000f3,0x000000f5,0x00050082,0x00000006,0x000000f7,0x000000ee, + 0x000000f6,0x0004003d,0x00000006,0x000000f8,0x00000060,0x00050080,0x00000006,0x000000f9, + 0x000000f8,0x000000f7,0x0003003e,0x00000060,0x000000f9,0x000200f9,0x00000079,0x000200f8, + 0x00000079,0x0004003d,0x00000006,0x000000fa,0x00000075,0x00050080,0x00000006,0x000000fb, + 0x000000fa,0x00000066,0x0003003e,0x00000075,0x000000fb,0x000200f9,0x00000076,0x000200f8, + 0x00000078,0x0004003d,0x00000006,0x000000fd,0x00000023,0x00050041,0x0000001b,0x000000fe, + 0x00000019,0x00000029,0x0004003d,0x00000006,0x000000ff,0x000000fe,0x00050084,0x00000006, + 0x00000100,0x000000fd,0x000000ff,0x00050041,0x0000001b,0x00000101,0x00000019,0x00000030, + 0x0004003d,0x00000006,0x00000102,0x00000101,0x00050084,0x00000006,0x00000103,0x00000100, + 0x00000102,0x0004003d,0x00000006,0x00000104,0x00000008,0x00050080,0x00000006,0x00000105, + 0x00000103,0x00000104,0x0004003d,0x00000006,0x00000106,0x00000012,0x00050041,0x0000001b, + 0x00000107,0x00000019,0x00000029,0x0004003d,0x00000006,0x00000108,0x00000107,0x00050084, + 0x00000006,0x00000109,0x00000106,0x00000108,0x00050080,0x00000006,0x0000010a,0x00000105, + 0x00000109,0x0003003e,0x000000fc,0x0000010a,0x00050041,0x0000001b,0x0000010c,0x00000019, + 0x0000010b,0x0004003d,0x00000006,0x0000010d,0x0000010c,0x000500aa,0x00000027,0x0000010e, + 0x0000010d,0x00000066,0x000300f7,0x00000110,0x00000000,0x000400fa,0x0000010e,0x0000010f, + 0x00000110,0x000200f8,0x0000010f,0x0004003d,0x00000006,0x00000115,0x00000012,0x00060041, + 0x000000cc,0x00000116,0x00000114,0x00000062,0x00000115,0x0004003d,0x00000037,0x00000117, + 0x00000116,0x0004003d,0x00000037,0x00000118,0x00000039,0x00050081,0x00000037,0x00000119, + 0x00000118,0x00000117,0x0003003e,0x00000039,0x00000119,0x000200f9,0x00000110,0x000200f8, + 0x00000110,0x0004003d,0x00000006,0x0000011e,0x000000fc,0x0004003d,0x00000037,0x0000011f, + 0x00000039,0x00060041,0x000000cc,0x00000120,0x0000011d,0x00000062,0x0000011e,0x0003003e, + 0x00000120,0x0000011f,0x000200f9,0x00000036,0x000200f8,0x00000036,0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/dw_conv.comp b/modules/dnn/src/webgpu/shader/dw_conv.comp new file mode 100644 index 000000000000..a92cf56f172f --- /dev/null +++ b/modules/dnn/src/webgpu/shader/dw_conv.comp @@ -0,0 +1,77 @@ +#version 450 +#define LOCAL_SZ_X 256 + +layout(binding = 0) buffer Input0{ + float in_buffer[]; +}; +layout(binding = 1) buffer Input1 { + float bias_data[]; +}; +layout(binding = 2) buffer Input3{ + float weight_data[]; +}; +layout(binding = 3) buffer Output{ + float out_buffer[]; +}; +layout(binding = 4) uniform pushBlock { + int in_h; + int in_w; + int out_h; + int out_w; + int stride_h; + int stride_w; + int pad_h; + int pad_w; + int filter_h; + int filter_w; + int dilation_h; + int dilation_w; + int channels; + int batch; + int has_bias; + int M; + int K; + int N; + int basic_shader_batch_idx; + int basic_shader_partition_idx; + int basic_shader_partition_size; +} p; +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; + +/* + Each work item compute one output cell +*/ +void main() +{ + int gx = int(gl_GlobalInvocationID.x); + int gy = int(gl_GlobalInvocationID.y); + int gz = int(gl_GlobalInvocationID.z); + if(gx < p.out_w && gy < p.out_h && gz < p.channels) + { + float sum = 0.0f; + + int org_y = gy * p.stride_h - p.pad_h; + int org_x = gx * p.stride_w - p.pad_w; + + int weight_off = gz * p.filter_h * p.filter_w; + int input_off = (p.basic_shader_batch_idx * p.channels + gz) * p.in_h * p.in_w + org_y * p.in_w + org_x; + for(int y = 0; y < p.filter_h; y++) + { + for(int x = 0; x < p.filter_w; x++) + { + if(org_y + y * p.dilation_h >= 0 && org_y + y * p.dilation_h < p.in_h && org_x + x * p.dilation_w >= 0 && org_x + x * p.dilation_w < p.in_w) + { + sum += in_buffer[input_off + x * p.dilation_w] * weight_data[weight_off + x]; + } + } + weight_off += p.filter_w; + input_off += p.in_w * p.dilation_h; + } + + int offset = (p.basic_shader_batch_idx * p.channels + gz) * p.out_h * p.out_w + gy * p.out_w + gx; + if (p.has_bias == 1) + out_buffer[offset] = sum + bias_data[gz]; + else + out_buffer[offset] = sum; + } +} diff --git a/modules/dnn/src/webgpu/shader/dw_conv_spv.cpp b/modules/dnn/src/webgpu/shader/dw_conv_spv.cpp new file mode 100644 index 000000000000..000488acd92e --- /dev/null +++ b/modules/dnn/src/webgpu/shader/dw_conv_spv.cpp @@ -0,0 +1,235 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int dw_conv_spv[1754] = { + 0x07230203,0x00010000,0x00080009,0x0000010b,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00060010,0x00000004, + 0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00030005,0x00000008,0x00007867,0x00080005,0x0000000c, + 0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00030005,0x00000012, + 0x00007967,0x00030005,0x00000017,0x00007a67,0x00050005,0x0000001e,0x68737570,0x636f6c42, + 0x0000006b,0x00050006,0x0000001e,0x00000000,0x685f6e69,0x00000000,0x00050006,0x0000001e, + 0x00000001,0x775f6e69,0x00000000,0x00050006,0x0000001e,0x00000002,0x5f74756f,0x00000068, + 0x00050006,0x0000001e,0x00000003,0x5f74756f,0x00000077,0x00060006,0x0000001e,0x00000004, + 0x69727473,0x685f6564,0x00000000,0x00060006,0x0000001e,0x00000005,0x69727473,0x775f6564, + 0x00000000,0x00050006,0x0000001e,0x00000006,0x5f646170,0x00000068,0x00050006,0x0000001e, + 0x00000007,0x5f646170,0x00000077,0x00060006,0x0000001e,0x00000008,0x746c6966,0x685f7265, + 0x00000000,0x00060006,0x0000001e,0x00000009,0x746c6966,0x775f7265,0x00000000,0x00060006, + 0x0000001e,0x0000000a,0x616c6964,0x6e6f6974,0x0000685f,0x00060006,0x0000001e,0x0000000b, + 0x616c6964,0x6e6f6974,0x0000775f,0x00060006,0x0000001e,0x0000000c,0x6e616863,0x736c656e, + 0x00000000,0x00050006,0x0000001e,0x0000000d,0x63746162,0x00000068,0x00060006,0x0000001e, + 0x0000000e,0x5f736168,0x73616962,0x00000000,0x00040006,0x0000001e,0x0000000f,0x0000004d, + 0x00040006,0x0000001e,0x00000010,0x0000004b,0x00040006,0x0000001e,0x00000011,0x0000004e, + 0x00090006,0x0000001e,0x00000012,0x69736162,0x68735f63,0x72656461,0x7461625f,0x695f6863, + 0x00007864,0x000a0006,0x0000001e,0x00000013,0x69736162,0x68735f63,0x72656461,0x7261705f, + 0x69746974,0x695f6e6f,0x00007864,0x000a0006,0x0000001e,0x00000014,0x69736162,0x68735f63, + 0x72656461,0x7261705f,0x69746974,0x735f6e6f,0x00657a69,0x00030005,0x00000020,0x00000070, + 0x00030005,0x0000003a,0x006d7573,0x00040005,0x0000003c,0x5f67726f,0x00000079,0x00040005, + 0x00000046,0x5f67726f,0x00000078,0x00050005,0x00000050,0x67696577,0x6f5f7468,0x00006666, + 0x00050005,0x0000005a,0x75706e69,0x666f5f74,0x00000066,0x00030005,0x00000072,0x00000079, + 0x00030005,0x0000007c,0x00000078,0x00040005,0x000000b4,0x75706e49,0x00003074,0x00060006, + 0x000000b4,0x00000000,0x625f6e69,0x65666675,0x00000072,0x00030005,0x000000b6,0x00000000, + 0x00040005,0x000000c1,0x75706e49,0x00003374,0x00060006,0x000000c1,0x00000000,0x67696577, + 0x645f7468,0x00617461,0x00030005,0x000000c3,0x00000000,0x00040005,0x000000db,0x7366666f, + 0x00007465,0x00040005,0x000000f7,0x7074754f,0x00007475,0x00060006,0x000000f7,0x00000000, + 0x5f74756f,0x66667562,0x00007265,0x00030005,0x000000f9,0x00000000,0x00040005,0x000000fd, + 0x75706e49,0x00003174,0x00060006,0x000000fd,0x00000000,0x73616962,0x7461645f,0x00000061, + 0x00030005,0x000000ff,0x00000000,0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00050048, + 0x0000001e,0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000001,0x00000023, + 0x00000004,0x00050048,0x0000001e,0x00000002,0x00000023,0x00000008,0x00050048,0x0000001e, + 0x00000003,0x00000023,0x0000000c,0x00050048,0x0000001e,0x00000004,0x00000023,0x00000010, + 0x00050048,0x0000001e,0x00000005,0x00000023,0x00000014,0x00050048,0x0000001e,0x00000006, + 0x00000023,0x00000018,0x00050048,0x0000001e,0x00000007,0x00000023,0x0000001c,0x00050048, + 0x0000001e,0x00000008,0x00000023,0x00000020,0x00050048,0x0000001e,0x00000009,0x00000023, + 0x00000024,0x00050048,0x0000001e,0x0000000a,0x00000023,0x00000028,0x00050048,0x0000001e, + 0x0000000b,0x00000023,0x0000002c,0x00050048,0x0000001e,0x0000000c,0x00000023,0x00000030, + 0x00050048,0x0000001e,0x0000000d,0x00000023,0x00000034,0x00050048,0x0000001e,0x0000000e, + 0x00000023,0x00000038,0x00050048,0x0000001e,0x0000000f,0x00000023,0x0000003c,0x00050048, + 0x0000001e,0x00000010,0x00000023,0x00000040,0x00050048,0x0000001e,0x00000011,0x00000023, + 0x00000044,0x00050048,0x0000001e,0x00000012,0x00000023,0x00000048,0x00050048,0x0000001e, + 0x00000013,0x00000023,0x0000004c,0x00050048,0x0000001e,0x00000014,0x00000023,0x00000050, + 0x00030047,0x0000001e,0x00000002,0x00040047,0x00000020,0x00000022,0x00000000,0x00040047, + 0x00000020,0x00000021,0x00000004,0x00040047,0x000000b3,0x00000006,0x00000004,0x00050048, + 0x000000b4,0x00000000,0x00000023,0x00000000,0x00030047,0x000000b4,0x00000003,0x00040047, + 0x000000b6,0x00000022,0x00000000,0x00040047,0x000000b6,0x00000021,0x00000000,0x00040047, + 0x000000c0,0x00000006,0x00000004,0x00050048,0x000000c1,0x00000000,0x00000023,0x00000000, + 0x00030047,0x000000c1,0x00000003,0x00040047,0x000000c3,0x00000022,0x00000000,0x00040047, + 0x000000c3,0x00000021,0x00000002,0x00040047,0x000000f6,0x00000006,0x00000004,0x00050048, + 0x000000f7,0x00000000,0x00000023,0x00000000,0x00030047,0x000000f7,0x00000003,0x00040047, + 0x000000f9,0x00000022,0x00000000,0x00040047,0x000000f9,0x00000021,0x00000003,0x00040047, + 0x000000fc,0x00000006,0x00000004,0x00050048,0x000000fd,0x00000000,0x00000023,0x00000000, + 0x00030047,0x000000fd,0x00000003,0x00040047,0x000000ff,0x00000022,0x00000000,0x00040047, + 0x000000ff,0x00000021,0x00000001,0x00040047,0x0000010a,0x0000000b,0x00000019,0x00020013, + 0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001, + 0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000, + 0x00040017,0x0000000a,0x00000009,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a, + 0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000009,0x0000000d,0x00000000, + 0x00040020,0x0000000e,0x00000001,0x00000009,0x0004002b,0x00000009,0x00000013,0x00000001, + 0x0004002b,0x00000009,0x00000018,0x00000002,0x00020014,0x0000001c,0x0017001e,0x0000001e, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x0000001f,0x00000002, + 0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000002,0x0004002b,0x00000006,0x00000021, + 0x00000003,0x00040020,0x00000022,0x00000002,0x00000006,0x0004002b,0x00000006,0x00000029, + 0x00000002,0x0004002b,0x00000006,0x00000031,0x0000000c,0x00030016,0x00000038,0x00000020, + 0x00040020,0x00000039,0x00000007,0x00000038,0x0004002b,0x00000038,0x0000003b,0x00000000, + 0x0004002b,0x00000006,0x0000003e,0x00000004,0x0004002b,0x00000006,0x00000042,0x00000006, + 0x0004002b,0x00000006,0x00000048,0x00000005,0x0004002b,0x00000006,0x0000004c,0x00000007, + 0x0004002b,0x00000006,0x00000052,0x00000008,0x0004002b,0x00000006,0x00000056,0x00000009, + 0x0004002b,0x00000006,0x0000005b,0x00000012,0x0004002b,0x00000006,0x00000063,0x00000000, + 0x0004002b,0x00000006,0x00000067,0x00000001,0x0004002b,0x00000006,0x00000088,0x0000000a, + 0x0004002b,0x00000006,0x0000009e,0x0000000b,0x0003001d,0x000000b3,0x00000038,0x0003001e, + 0x000000b4,0x000000b3,0x00040020,0x000000b5,0x00000002,0x000000b4,0x0004003b,0x000000b5, + 0x000000b6,0x00000002,0x00040020,0x000000bd,0x00000002,0x00000038,0x0003001d,0x000000c0, + 0x00000038,0x0003001e,0x000000c1,0x000000c0,0x00040020,0x000000c2,0x00000002,0x000000c1, + 0x0004003b,0x000000c2,0x000000c3,0x00000002,0x0004002b,0x00000006,0x000000f0,0x0000000e, + 0x0003001d,0x000000f6,0x00000038,0x0003001e,0x000000f7,0x000000f6,0x00040020,0x000000f8, + 0x00000002,0x000000f7,0x0004003b,0x000000f8,0x000000f9,0x00000002,0x0003001d,0x000000fc, + 0x00000038,0x0003001e,0x000000fd,0x000000fc,0x00040020,0x000000fe,0x00000002,0x000000fd, + 0x0004003b,0x000000fe,0x000000ff,0x00000002,0x0004002b,0x00000009,0x00000109,0x00000100, + 0x0006002c,0x0000000a,0x0000010a,0x00000109,0x00000013,0x00000013,0x00050036,0x00000002, + 0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008, + 0x00000007,0x0004003b,0x00000007,0x00000012,0x00000007,0x0004003b,0x00000007,0x00000017, + 0x00000007,0x0004003b,0x00000039,0x0000003a,0x00000007,0x0004003b,0x00000007,0x0000003c, + 0x00000007,0x0004003b,0x00000007,0x00000046,0x00000007,0x0004003b,0x00000007,0x00000050, + 0x00000007,0x0004003b,0x00000007,0x0000005a,0x00000007,0x0004003b,0x00000007,0x00000072, + 0x00000007,0x0004003b,0x00000007,0x0000007c,0x00000007,0x0004003b,0x00000007,0x000000db, + 0x00000007,0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000009, + 0x00000010,0x0000000f,0x0004007c,0x00000006,0x00000011,0x00000010,0x0003003e,0x00000008, + 0x00000011,0x00050041,0x0000000e,0x00000014,0x0000000c,0x00000013,0x0004003d,0x00000009, + 0x00000015,0x00000014,0x0004007c,0x00000006,0x00000016,0x00000015,0x0003003e,0x00000012, + 0x00000016,0x00050041,0x0000000e,0x00000019,0x0000000c,0x00000018,0x0004003d,0x00000009, + 0x0000001a,0x00000019,0x0004007c,0x00000006,0x0000001b,0x0000001a,0x0003003e,0x00000017, + 0x0000001b,0x0004003d,0x00000006,0x0000001d,0x00000008,0x00050041,0x00000022,0x00000023, + 0x00000020,0x00000021,0x0004003d,0x00000006,0x00000024,0x00000023,0x000500b1,0x0000001c, + 0x00000025,0x0000001d,0x00000024,0x000300f7,0x00000027,0x00000000,0x000400fa,0x00000025, + 0x00000026,0x00000027,0x000200f8,0x00000026,0x0004003d,0x00000006,0x00000028,0x00000012, + 0x00050041,0x00000022,0x0000002a,0x00000020,0x00000029,0x0004003d,0x00000006,0x0000002b, + 0x0000002a,0x000500b1,0x0000001c,0x0000002c,0x00000028,0x0000002b,0x000200f9,0x00000027, + 0x000200f8,0x00000027,0x000700f5,0x0000001c,0x0000002d,0x00000025,0x00000005,0x0000002c, + 0x00000026,0x000300f7,0x0000002f,0x00000000,0x000400fa,0x0000002d,0x0000002e,0x0000002f, + 0x000200f8,0x0000002e,0x0004003d,0x00000006,0x00000030,0x00000017,0x00050041,0x00000022, + 0x00000032,0x00000020,0x00000031,0x0004003d,0x00000006,0x00000033,0x00000032,0x000500b1, + 0x0000001c,0x00000034,0x00000030,0x00000033,0x000200f9,0x0000002f,0x000200f8,0x0000002f, + 0x000700f5,0x0000001c,0x00000035,0x0000002d,0x00000027,0x00000034,0x0000002e,0x000300f7, + 0x00000037,0x00000000,0x000400fa,0x00000035,0x00000036,0x00000037,0x000200f8,0x00000036, + 0x0003003e,0x0000003a,0x0000003b,0x0004003d,0x00000006,0x0000003d,0x00000012,0x00050041, + 0x00000022,0x0000003f,0x00000020,0x0000003e,0x0004003d,0x00000006,0x00000040,0x0000003f, + 0x00050084,0x00000006,0x00000041,0x0000003d,0x00000040,0x00050041,0x00000022,0x00000043, + 0x00000020,0x00000042,0x0004003d,0x00000006,0x00000044,0x00000043,0x00050082,0x00000006, + 0x00000045,0x00000041,0x00000044,0x0003003e,0x0000003c,0x00000045,0x0004003d,0x00000006, + 0x00000047,0x00000008,0x00050041,0x00000022,0x00000049,0x00000020,0x00000048,0x0004003d, + 0x00000006,0x0000004a,0x00000049,0x00050084,0x00000006,0x0000004b,0x00000047,0x0000004a, + 0x00050041,0x00000022,0x0000004d,0x00000020,0x0000004c,0x0004003d,0x00000006,0x0000004e, + 0x0000004d,0x00050082,0x00000006,0x0000004f,0x0000004b,0x0000004e,0x0003003e,0x00000046, + 0x0000004f,0x0004003d,0x00000006,0x00000051,0x00000017,0x00050041,0x00000022,0x00000053, + 0x00000020,0x00000052,0x0004003d,0x00000006,0x00000054,0x00000053,0x00050084,0x00000006, + 0x00000055,0x00000051,0x00000054,0x00050041,0x00000022,0x00000057,0x00000020,0x00000056, + 0x0004003d,0x00000006,0x00000058,0x00000057,0x00050084,0x00000006,0x00000059,0x00000055, + 0x00000058,0x0003003e,0x00000050,0x00000059,0x00050041,0x00000022,0x0000005c,0x00000020, + 0x0000005b,0x0004003d,0x00000006,0x0000005d,0x0000005c,0x00050041,0x00000022,0x0000005e, + 0x00000020,0x00000031,0x0004003d,0x00000006,0x0000005f,0x0000005e,0x00050084,0x00000006, + 0x00000060,0x0000005d,0x0000005f,0x0004003d,0x00000006,0x00000061,0x00000017,0x00050080, + 0x00000006,0x00000062,0x00000060,0x00000061,0x00050041,0x00000022,0x00000064,0x00000020, + 0x00000063,0x0004003d,0x00000006,0x00000065,0x00000064,0x00050084,0x00000006,0x00000066, + 0x00000062,0x00000065,0x00050041,0x00000022,0x00000068,0x00000020,0x00000067,0x0004003d, + 0x00000006,0x00000069,0x00000068,0x00050084,0x00000006,0x0000006a,0x00000066,0x00000069, + 0x0004003d,0x00000006,0x0000006b,0x0000003c,0x00050041,0x00000022,0x0000006c,0x00000020, + 0x00000067,0x0004003d,0x00000006,0x0000006d,0x0000006c,0x00050084,0x00000006,0x0000006e, + 0x0000006b,0x0000006d,0x00050080,0x00000006,0x0000006f,0x0000006a,0x0000006e,0x0004003d, + 0x00000006,0x00000070,0x00000046,0x00050080,0x00000006,0x00000071,0x0000006f,0x00000070, + 0x0003003e,0x0000005a,0x00000071,0x0003003e,0x00000072,0x00000063,0x000200f9,0x00000073, + 0x000200f8,0x00000073,0x000400f6,0x00000075,0x00000076,0x00000000,0x000200f9,0x00000077, + 0x000200f8,0x00000077,0x0004003d,0x00000006,0x00000078,0x00000072,0x00050041,0x00000022, + 0x00000079,0x00000020,0x00000052,0x0004003d,0x00000006,0x0000007a,0x00000079,0x000500b1, + 0x0000001c,0x0000007b,0x00000078,0x0000007a,0x000400fa,0x0000007b,0x00000074,0x00000075, + 0x000200f8,0x00000074,0x0003003e,0x0000007c,0x00000063,0x000200f9,0x0000007d,0x000200f8, + 0x0000007d,0x000400f6,0x0000007f,0x00000080,0x00000000,0x000200f9,0x00000081,0x000200f8, + 0x00000081,0x0004003d,0x00000006,0x00000082,0x0000007c,0x00050041,0x00000022,0x00000083, + 0x00000020,0x00000056,0x0004003d,0x00000006,0x00000084,0x00000083,0x000500b1,0x0000001c, + 0x00000085,0x00000082,0x00000084,0x000400fa,0x00000085,0x0000007e,0x0000007f,0x000200f8, + 0x0000007e,0x0004003d,0x00000006,0x00000086,0x0000003c,0x0004003d,0x00000006,0x00000087, + 0x00000072,0x00050041,0x00000022,0x00000089,0x00000020,0x00000088,0x0004003d,0x00000006, + 0x0000008a,0x00000089,0x00050084,0x00000006,0x0000008b,0x00000087,0x0000008a,0x00050080, + 0x00000006,0x0000008c,0x00000086,0x0000008b,0x000500af,0x0000001c,0x0000008d,0x0000008c, + 0x00000063,0x000300f7,0x0000008f,0x00000000,0x000400fa,0x0000008d,0x0000008e,0x0000008f, + 0x000200f8,0x0000008e,0x0004003d,0x00000006,0x00000090,0x0000003c,0x0004003d,0x00000006, + 0x00000091,0x00000072,0x00050041,0x00000022,0x00000092,0x00000020,0x00000088,0x0004003d, + 0x00000006,0x00000093,0x00000092,0x00050084,0x00000006,0x00000094,0x00000091,0x00000093, + 0x00050080,0x00000006,0x00000095,0x00000090,0x00000094,0x00050041,0x00000022,0x00000096, + 0x00000020,0x00000063,0x0004003d,0x00000006,0x00000097,0x00000096,0x000500b1,0x0000001c, + 0x00000098,0x00000095,0x00000097,0x000200f9,0x0000008f,0x000200f8,0x0000008f,0x000700f5, + 0x0000001c,0x00000099,0x0000008d,0x0000007e,0x00000098,0x0000008e,0x000300f7,0x0000009b, + 0x00000000,0x000400fa,0x00000099,0x0000009a,0x0000009b,0x000200f8,0x0000009a,0x0004003d, + 0x00000006,0x0000009c,0x00000046,0x0004003d,0x00000006,0x0000009d,0x0000007c,0x00050041, + 0x00000022,0x0000009f,0x00000020,0x0000009e,0x0004003d,0x00000006,0x000000a0,0x0000009f, + 0x00050084,0x00000006,0x000000a1,0x0000009d,0x000000a0,0x00050080,0x00000006,0x000000a2, + 0x0000009c,0x000000a1,0x000500af,0x0000001c,0x000000a3,0x000000a2,0x00000063,0x000200f9, + 0x0000009b,0x000200f8,0x0000009b,0x000700f5,0x0000001c,0x000000a4,0x00000099,0x0000008f, + 0x000000a3,0x0000009a,0x000300f7,0x000000a6,0x00000000,0x000400fa,0x000000a4,0x000000a5, + 0x000000a6,0x000200f8,0x000000a5,0x0004003d,0x00000006,0x000000a7,0x00000046,0x0004003d, + 0x00000006,0x000000a8,0x0000007c,0x00050041,0x00000022,0x000000a9,0x00000020,0x0000009e, + 0x0004003d,0x00000006,0x000000aa,0x000000a9,0x00050084,0x00000006,0x000000ab,0x000000a8, + 0x000000aa,0x00050080,0x00000006,0x000000ac,0x000000a7,0x000000ab,0x00050041,0x00000022, + 0x000000ad,0x00000020,0x00000067,0x0004003d,0x00000006,0x000000ae,0x000000ad,0x000500b1, + 0x0000001c,0x000000af,0x000000ac,0x000000ae,0x000200f9,0x000000a6,0x000200f8,0x000000a6, + 0x000700f5,0x0000001c,0x000000b0,0x000000a4,0x0000009b,0x000000af,0x000000a5,0x000300f7, + 0x000000b2,0x00000000,0x000400fa,0x000000b0,0x000000b1,0x000000b2,0x000200f8,0x000000b1, + 0x0004003d,0x00000006,0x000000b7,0x0000005a,0x0004003d,0x00000006,0x000000b8,0x0000007c, + 0x00050041,0x00000022,0x000000b9,0x00000020,0x0000009e,0x0004003d,0x00000006,0x000000ba, + 0x000000b9,0x00050084,0x00000006,0x000000bb,0x000000b8,0x000000ba,0x00050080,0x00000006, + 0x000000bc,0x000000b7,0x000000bb,0x00060041,0x000000bd,0x000000be,0x000000b6,0x00000063, + 0x000000bc,0x0004003d,0x00000038,0x000000bf,0x000000be,0x0004003d,0x00000006,0x000000c4, + 0x00000050,0x0004003d,0x00000006,0x000000c5,0x0000007c,0x00050080,0x00000006,0x000000c6, + 0x000000c4,0x000000c5,0x00060041,0x000000bd,0x000000c7,0x000000c3,0x00000063,0x000000c6, + 0x0004003d,0x00000038,0x000000c8,0x000000c7,0x00050085,0x00000038,0x000000c9,0x000000bf, + 0x000000c8,0x0004003d,0x00000038,0x000000ca,0x0000003a,0x00050081,0x00000038,0x000000cb, + 0x000000ca,0x000000c9,0x0003003e,0x0000003a,0x000000cb,0x000200f9,0x000000b2,0x000200f8, + 0x000000b2,0x000200f9,0x00000080,0x000200f8,0x00000080,0x0004003d,0x00000006,0x000000cc, + 0x0000007c,0x00050080,0x00000006,0x000000cd,0x000000cc,0x00000067,0x0003003e,0x0000007c, + 0x000000cd,0x000200f9,0x0000007d,0x000200f8,0x0000007f,0x00050041,0x00000022,0x000000ce, + 0x00000020,0x00000056,0x0004003d,0x00000006,0x000000cf,0x000000ce,0x0004003d,0x00000006, + 0x000000d0,0x00000050,0x00050080,0x00000006,0x000000d1,0x000000d0,0x000000cf,0x0003003e, + 0x00000050,0x000000d1,0x00050041,0x00000022,0x000000d2,0x00000020,0x00000067,0x0004003d, + 0x00000006,0x000000d3,0x000000d2,0x00050041,0x00000022,0x000000d4,0x00000020,0x00000088, + 0x0004003d,0x00000006,0x000000d5,0x000000d4,0x00050084,0x00000006,0x000000d6,0x000000d3, + 0x000000d5,0x0004003d,0x00000006,0x000000d7,0x0000005a,0x00050080,0x00000006,0x000000d8, + 0x000000d7,0x000000d6,0x0003003e,0x0000005a,0x000000d8,0x000200f9,0x00000076,0x000200f8, + 0x00000076,0x0004003d,0x00000006,0x000000d9,0x00000072,0x00050080,0x00000006,0x000000da, + 0x000000d9,0x00000067,0x0003003e,0x00000072,0x000000da,0x000200f9,0x00000073,0x000200f8, + 0x00000075,0x00050041,0x00000022,0x000000dc,0x00000020,0x0000005b,0x0004003d,0x00000006, + 0x000000dd,0x000000dc,0x00050041,0x00000022,0x000000de,0x00000020,0x00000031,0x0004003d, + 0x00000006,0x000000df,0x000000de,0x00050084,0x00000006,0x000000e0,0x000000dd,0x000000df, + 0x0004003d,0x00000006,0x000000e1,0x00000017,0x00050080,0x00000006,0x000000e2,0x000000e0, + 0x000000e1,0x00050041,0x00000022,0x000000e3,0x00000020,0x00000029,0x0004003d,0x00000006, + 0x000000e4,0x000000e3,0x00050084,0x00000006,0x000000e5,0x000000e2,0x000000e4,0x00050041, + 0x00000022,0x000000e6,0x00000020,0x00000021,0x0004003d,0x00000006,0x000000e7,0x000000e6, + 0x00050084,0x00000006,0x000000e8,0x000000e5,0x000000e7,0x0004003d,0x00000006,0x000000e9, + 0x00000012,0x00050041,0x00000022,0x000000ea,0x00000020,0x00000021,0x0004003d,0x00000006, + 0x000000eb,0x000000ea,0x00050084,0x00000006,0x000000ec,0x000000e9,0x000000eb,0x00050080, + 0x00000006,0x000000ed,0x000000e8,0x000000ec,0x0004003d,0x00000006,0x000000ee,0x00000008, + 0x00050080,0x00000006,0x000000ef,0x000000ed,0x000000ee,0x0003003e,0x000000db,0x000000ef, + 0x00050041,0x00000022,0x000000f1,0x00000020,0x000000f0,0x0004003d,0x00000006,0x000000f2, + 0x000000f1,0x000500aa,0x0000001c,0x000000f3,0x000000f2,0x00000067,0x000300f7,0x000000f5, + 0x00000000,0x000400fa,0x000000f3,0x000000f4,0x00000105,0x000200f8,0x000000f4,0x0004003d, + 0x00000006,0x000000fa,0x000000db,0x0004003d,0x00000038,0x000000fb,0x0000003a,0x0004003d, + 0x00000006,0x00000100,0x00000017,0x00060041,0x000000bd,0x00000101,0x000000ff,0x00000063, + 0x00000100,0x0004003d,0x00000038,0x00000102,0x00000101,0x00050081,0x00000038,0x00000103, + 0x000000fb,0x00000102,0x00060041,0x000000bd,0x00000104,0x000000f9,0x00000063,0x000000fa, + 0x0003003e,0x00000104,0x00000103,0x000200f9,0x000000f5,0x000200f8,0x00000105,0x0004003d, + 0x00000006,0x00000106,0x000000db,0x0004003d,0x00000038,0x00000107,0x0000003a,0x00060041, + 0x000000bd,0x00000108,0x000000f9,0x00000063,0x00000106,0x0003003e,0x00000108,0x00000107, + 0x000200f9,0x000000f5,0x000200f8,0x000000f5,0x000200f9,0x00000037,0x000200f8,0x00000037, + 0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/lrn.comp b/modules/dnn/src/webgpu/shader/lrn.comp new file mode 100644 index 000000000000..3980638e33d5 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/lrn.comp @@ -0,0 +1,62 @@ +#version 450 +#define LOCAL_SZ_X 256 +layout(binding = 0) buffer Input0{ + float in_buffer[]; +}; +layout(binding = 1) buffer Output{ + float dst_buffer[]; +}; +layout(binding = 2) uniform pushBlock { + int thread_num; + int channels; + int height; + int width; + int filter_len; + int radius; + float alpha; + float bias; + float negative_beta; +} p; +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; +void main() +{ + int gid = int(gl_GlobalInvocationID.x); + int gsz = int(gl_NumWorkGroups.x * gl_WorkGroupSize.x); + for (int index = gid; index < p.thread_num; index += gsz) + { + int x = index % p.width; + int y = (index / p.width) % p.height; + int b = index / (p.width * p.height); + int offset = b * p.channels * p.height * p.width + y * p.width + x; + int channel_off = p.height * p.width; + float scale_val; + int head = 0; + float accum_scale = 0.0f; + int min_val = p.radius < p.channels ? p.radius : p.channels; + while (head < min_val) { + accum_scale += in_buffer[offset + head * channel_off] * in_buffer[offset + head * channel_off]; + ++head; + } + while (head < p.channels) { + accum_scale += in_buffer[offset + head * channel_off] * in_buffer[offset + head * channel_off]; + if (head - p.filter_len >= 0) { + accum_scale -= in_buffer[offset + (head - p.filter_len) * channel_off] + * in_buffer[offset + (head - p.filter_len) * channel_off]; + } + scale_val = p.bias + accum_scale * p.alpha; + dst_buffer[offset + (head - p.radius) * channel_off] = in_buffer[offset + (head - p.radius) * channel_off] * pow(scale_val, p.negative_beta); + ++head; + } + int pos = head - min_val; + while (pos >= 0 && pos < p.channels) { + if (head - p.filter_len >= 0) { + accum_scale -= in_buffer[offset + (head - p.filter_len) * channel_off] + * in_buffer[offset + (head - p.filter_len) * channel_off]; + } + scale_val = p.bias + accum_scale * p.alpha; + dst_buffer[offset + pos * channel_off] = in_buffer[offset + pos * channel_off] * pow(scale_val, p.negative_beta); + ++head; + ++pos; + } + } +} diff --git a/modules/dnn/src/webgpu/shader/lrn_spv.cpp b/modules/dnn/src/webgpu/shader/lrn_spv.cpp new file mode 100644 index 000000000000..d3b320a72515 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/lrn_spv.cpp @@ -0,0 +1,246 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int lrn_spv[1841] = { + 0x07230203,0x00010000,0x00080009,0x00000143,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0007000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00000013,0x00060010, + 0x00000004,0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2, + 0x00040005,0x00000004,0x6e69616d,0x00000000,0x00030005,0x00000008,0x00646967,0x00080005, + 0x0000000c,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00030005, + 0x00000012,0x007a7367,0x00070005,0x00000013,0x4e5f6c67,0x6f576d75,0x72476b72,0x7370756f, + 0x00000000,0x00040005,0x00000019,0x65646e69,0x00000078,0x00050005,0x00000022,0x68737570, + 0x636f6c42,0x0000006b,0x00060006,0x00000022,0x00000000,0x65726874,0x6e5f6461,0x00006d75, + 0x00060006,0x00000022,0x00000001,0x6e616863,0x736c656e,0x00000000,0x00050006,0x00000022, + 0x00000002,0x67696568,0x00007468,0x00050006,0x00000022,0x00000003,0x74646977,0x00000068, + 0x00060006,0x00000022,0x00000004,0x746c6966,0x6c5f7265,0x00006e65,0x00050006,0x00000022, + 0x00000005,0x69646172,0x00007375,0x00050006,0x00000022,0x00000006,0x68706c61,0x00000061, + 0x00050006,0x00000022,0x00000007,0x73616962,0x00000000,0x00070006,0x00000022,0x00000008, + 0x6167656e,0x65766974,0x7465625f,0x00000061,0x00030005,0x00000024,0x00000070,0x00030005, + 0x0000002b,0x00000078,0x00030005,0x00000031,0x00000079,0x00030005,0x0000003a,0x00000062, + 0x00040005,0x00000042,0x7366666f,0x00007465,0x00050005,0x00000055,0x6e616863,0x5f6c656e, + 0x0066666f,0x00040005,0x0000005b,0x64616568,0x00000000,0x00050005,0x0000005d,0x75636361, + 0x63735f6d,0x00656c61,0x00040005,0x0000005f,0x5f6e696d,0x006c6176,0x00040005,0x00000078, + 0x75706e49,0x00003074,0x00060006,0x00000078,0x00000000,0x625f6e69,0x65666675,0x00000072, + 0x00030005,0x0000007a,0x00000000,0x00050005,0x000000c8,0x6c616373,0x61765f65,0x0000006c, + 0x00040005,0x000000d3,0x7074754f,0x00007475,0x00060006,0x000000d3,0x00000000,0x5f747364, + 0x66667562,0x00007265,0x00030005,0x000000d5,0x00000000,0x00030005,0x000000f1,0x00736f70, + 0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00040047,0x00000013,0x0000000b,0x00000018, + 0x00050048,0x00000022,0x00000000,0x00000023,0x00000000,0x00050048,0x00000022,0x00000001, + 0x00000023,0x00000004,0x00050048,0x00000022,0x00000002,0x00000023,0x00000008,0x00050048, + 0x00000022,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000022,0x00000004,0x00000023, + 0x00000010,0x00050048,0x00000022,0x00000005,0x00000023,0x00000014,0x00050048,0x00000022, + 0x00000006,0x00000023,0x00000018,0x00050048,0x00000022,0x00000007,0x00000023,0x0000001c, + 0x00050048,0x00000022,0x00000008,0x00000023,0x00000020,0x00030047,0x00000022,0x00000002, + 0x00040047,0x00000024,0x00000022,0x00000000,0x00040047,0x00000024,0x00000021,0x00000002, + 0x00040047,0x00000077,0x00000006,0x00000004,0x00050048,0x00000078,0x00000000,0x00000023, + 0x00000000,0x00030047,0x00000078,0x00000003,0x00040047,0x0000007a,0x00000022,0x00000000, + 0x00040047,0x0000007a,0x00000021,0x00000000,0x00040047,0x000000d2,0x00000006,0x00000004, + 0x00050048,0x000000d3,0x00000000,0x00000023,0x00000000,0x00030047,0x000000d3,0x00000003, + 0x00040047,0x000000d5,0x00000022,0x00000000,0x00040047,0x000000d5,0x00000021,0x00000001, + 0x00040047,0x00000142,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003, + 0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,0x00000007, + 0x00000006,0x00040015,0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,0x00000009, + 0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a,0x0004003b,0x0000000b,0x0000000c, + 0x00000001,0x0004002b,0x00000009,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000001, + 0x00000009,0x0004003b,0x0000000b,0x00000013,0x00000001,0x0004002b,0x00000009,0x00000016, + 0x00000100,0x00030016,0x00000021,0x00000020,0x000b001e,0x00000022,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000021,0x00000021,0x00000021,0x00040020, + 0x00000023,0x00000002,0x00000022,0x0004003b,0x00000023,0x00000024,0x00000002,0x0004002b, + 0x00000006,0x00000025,0x00000000,0x00040020,0x00000026,0x00000002,0x00000006,0x00020014, + 0x00000029,0x0004002b,0x00000006,0x0000002d,0x00000003,0x0004002b,0x00000006,0x00000036, + 0x00000002,0x0004002b,0x00000006,0x00000044,0x00000001,0x00040020,0x0000005c,0x00000007, + 0x00000021,0x0004002b,0x00000021,0x0000005e,0x00000000,0x0004002b,0x00000006,0x00000060, + 0x00000005,0x0003001d,0x00000077,0x00000021,0x0003001e,0x00000078,0x00000077,0x00040020, + 0x00000079,0x00000002,0x00000078,0x0004003b,0x00000079,0x0000007a,0x00000002,0x00040020, + 0x00000080,0x00000002,0x00000021,0x0004002b,0x00000006,0x000000aa,0x00000004,0x0004002b, + 0x00000006,0x000000c9,0x00000007,0x0004002b,0x00000006,0x000000cd,0x00000006,0x0003001d, + 0x000000d2,0x00000021,0x0003001e,0x000000d3,0x000000d2,0x00040020,0x000000d4,0x00000002, + 0x000000d3,0x0004003b,0x000000d4,0x000000d5,0x00000002,0x0004002b,0x00000006,0x000000e9, + 0x00000008,0x0004002b,0x00000009,0x00000141,0x00000001,0x0006002c,0x0000000a,0x00000142, + 0x00000016,0x00000141,0x00000141,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003, + 0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,0x00000007, + 0x00000012,0x00000007,0x0004003b,0x00000007,0x00000019,0x00000007,0x0004003b,0x00000007, + 0x0000002b,0x00000007,0x0004003b,0x00000007,0x00000031,0x00000007,0x0004003b,0x00000007, + 0x0000003a,0x00000007,0x0004003b,0x00000007,0x00000042,0x00000007,0x0004003b,0x00000007, + 0x00000055,0x00000007,0x0004003b,0x00000007,0x0000005b,0x00000007,0x0004003b,0x0000005c, + 0x0000005d,0x00000007,0x0004003b,0x00000007,0x0000005f,0x00000007,0x0004003b,0x00000007, + 0x00000066,0x00000007,0x0004003b,0x0000005c,0x000000c8,0x00000007,0x0004003b,0x00000007, + 0x000000f1,0x00000007,0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d, + 0x00000009,0x00000010,0x0000000f,0x0004007c,0x00000006,0x00000011,0x00000010,0x0003003e, + 0x00000008,0x00000011,0x00050041,0x0000000e,0x00000014,0x00000013,0x0000000d,0x0004003d, + 0x00000009,0x00000015,0x00000014,0x00050084,0x00000009,0x00000017,0x00000015,0x00000016, + 0x0004007c,0x00000006,0x00000018,0x00000017,0x0003003e,0x00000012,0x00000018,0x0004003d, + 0x00000006,0x0000001a,0x00000008,0x0003003e,0x00000019,0x0000001a,0x000200f9,0x0000001b, + 0x000200f8,0x0000001b,0x000400f6,0x0000001d,0x0000001e,0x00000000,0x000200f9,0x0000001f, + 0x000200f8,0x0000001f,0x0004003d,0x00000006,0x00000020,0x00000019,0x00050041,0x00000026, + 0x00000027,0x00000024,0x00000025,0x0004003d,0x00000006,0x00000028,0x00000027,0x000500b1, + 0x00000029,0x0000002a,0x00000020,0x00000028,0x000400fa,0x0000002a,0x0000001c,0x0000001d, + 0x000200f8,0x0000001c,0x0004003d,0x00000006,0x0000002c,0x00000019,0x00050041,0x00000026, + 0x0000002e,0x00000024,0x0000002d,0x0004003d,0x00000006,0x0000002f,0x0000002e,0x0005008b, + 0x00000006,0x00000030,0x0000002c,0x0000002f,0x0003003e,0x0000002b,0x00000030,0x0004003d, + 0x00000006,0x00000032,0x00000019,0x00050041,0x00000026,0x00000033,0x00000024,0x0000002d, + 0x0004003d,0x00000006,0x00000034,0x00000033,0x00050087,0x00000006,0x00000035,0x00000032, + 0x00000034,0x00050041,0x00000026,0x00000037,0x00000024,0x00000036,0x0004003d,0x00000006, + 0x00000038,0x00000037,0x0005008b,0x00000006,0x00000039,0x00000035,0x00000038,0x0003003e, + 0x00000031,0x00000039,0x0004003d,0x00000006,0x0000003b,0x00000019,0x00050041,0x00000026, + 0x0000003c,0x00000024,0x0000002d,0x0004003d,0x00000006,0x0000003d,0x0000003c,0x00050041, + 0x00000026,0x0000003e,0x00000024,0x00000036,0x0004003d,0x00000006,0x0000003f,0x0000003e, + 0x00050084,0x00000006,0x00000040,0x0000003d,0x0000003f,0x00050087,0x00000006,0x00000041, + 0x0000003b,0x00000040,0x0003003e,0x0000003a,0x00000041,0x0004003d,0x00000006,0x00000043, + 0x0000003a,0x00050041,0x00000026,0x00000045,0x00000024,0x00000044,0x0004003d,0x00000006, + 0x00000046,0x00000045,0x00050084,0x00000006,0x00000047,0x00000043,0x00000046,0x00050041, + 0x00000026,0x00000048,0x00000024,0x00000036,0x0004003d,0x00000006,0x00000049,0x00000048, + 0x00050084,0x00000006,0x0000004a,0x00000047,0x00000049,0x00050041,0x00000026,0x0000004b, + 0x00000024,0x0000002d,0x0004003d,0x00000006,0x0000004c,0x0000004b,0x00050084,0x00000006, + 0x0000004d,0x0000004a,0x0000004c,0x0004003d,0x00000006,0x0000004e,0x00000031,0x00050041, + 0x00000026,0x0000004f,0x00000024,0x0000002d,0x0004003d,0x00000006,0x00000050,0x0000004f, + 0x00050084,0x00000006,0x00000051,0x0000004e,0x00000050,0x00050080,0x00000006,0x00000052, + 0x0000004d,0x00000051,0x0004003d,0x00000006,0x00000053,0x0000002b,0x00050080,0x00000006, + 0x00000054,0x00000052,0x00000053,0x0003003e,0x00000042,0x00000054,0x00050041,0x00000026, + 0x00000056,0x00000024,0x00000036,0x0004003d,0x00000006,0x00000057,0x00000056,0x00050041, + 0x00000026,0x00000058,0x00000024,0x0000002d,0x0004003d,0x00000006,0x00000059,0x00000058, + 0x00050084,0x00000006,0x0000005a,0x00000057,0x00000059,0x0003003e,0x00000055,0x0000005a, + 0x0003003e,0x0000005b,0x00000025,0x0003003e,0x0000005d,0x0000005e,0x00050041,0x00000026, + 0x00000061,0x00000024,0x00000060,0x0004003d,0x00000006,0x00000062,0x00000061,0x00050041, + 0x00000026,0x00000063,0x00000024,0x00000044,0x0004003d,0x00000006,0x00000064,0x00000063, + 0x000500b1,0x00000029,0x00000065,0x00000062,0x00000064,0x000300f7,0x00000068,0x00000000, + 0x000400fa,0x00000065,0x00000067,0x0000006b,0x000200f8,0x00000067,0x00050041,0x00000026, + 0x00000069,0x00000024,0x00000060,0x0004003d,0x00000006,0x0000006a,0x00000069,0x0003003e, + 0x00000066,0x0000006a,0x000200f9,0x00000068,0x000200f8,0x0000006b,0x00050041,0x00000026, + 0x0000006c,0x00000024,0x00000044,0x0004003d,0x00000006,0x0000006d,0x0000006c,0x0003003e, + 0x00000066,0x0000006d,0x000200f9,0x00000068,0x000200f8,0x00000068,0x0004003d,0x00000006, + 0x0000006e,0x00000066,0x0003003e,0x0000005f,0x0000006e,0x000200f9,0x0000006f,0x000200f8, + 0x0000006f,0x000400f6,0x00000071,0x00000072,0x00000000,0x000200f9,0x00000073,0x000200f8, + 0x00000073,0x0004003d,0x00000006,0x00000074,0x0000005b,0x0004003d,0x00000006,0x00000075, + 0x0000005f,0x000500b1,0x00000029,0x00000076,0x00000074,0x00000075,0x000400fa,0x00000076, + 0x00000070,0x00000071,0x000200f8,0x00000070,0x0004003d,0x00000006,0x0000007b,0x00000042, + 0x0004003d,0x00000006,0x0000007c,0x0000005b,0x0004003d,0x00000006,0x0000007d,0x00000055, + 0x00050084,0x00000006,0x0000007e,0x0000007c,0x0000007d,0x00050080,0x00000006,0x0000007f, + 0x0000007b,0x0000007e,0x00060041,0x00000080,0x00000081,0x0000007a,0x00000025,0x0000007f, + 0x0004003d,0x00000021,0x00000082,0x00000081,0x0004003d,0x00000006,0x00000083,0x00000042, + 0x0004003d,0x00000006,0x00000084,0x0000005b,0x0004003d,0x00000006,0x00000085,0x00000055, + 0x00050084,0x00000006,0x00000086,0x00000084,0x00000085,0x00050080,0x00000006,0x00000087, + 0x00000083,0x00000086,0x00060041,0x00000080,0x00000088,0x0000007a,0x00000025,0x00000087, + 0x0004003d,0x00000021,0x00000089,0x00000088,0x00050085,0x00000021,0x0000008a,0x00000082, + 0x00000089,0x0004003d,0x00000021,0x0000008b,0x0000005d,0x00050081,0x00000021,0x0000008c, + 0x0000008b,0x0000008a,0x0003003e,0x0000005d,0x0000008c,0x0004003d,0x00000006,0x0000008d, + 0x0000005b,0x00050080,0x00000006,0x0000008e,0x0000008d,0x00000044,0x0003003e,0x0000005b, + 0x0000008e,0x000200f9,0x00000072,0x000200f8,0x00000072,0x000200f9,0x0000006f,0x000200f8, + 0x00000071,0x000200f9,0x0000008f,0x000200f8,0x0000008f,0x000400f6,0x00000091,0x00000092, + 0x00000000,0x000200f9,0x00000093,0x000200f8,0x00000093,0x0004003d,0x00000006,0x00000094, + 0x0000005b,0x00050041,0x00000026,0x00000095,0x00000024,0x00000044,0x0004003d,0x00000006, + 0x00000096,0x00000095,0x000500b1,0x00000029,0x00000097,0x00000094,0x00000096,0x000400fa, + 0x00000097,0x00000090,0x00000091,0x000200f8,0x00000090,0x0004003d,0x00000006,0x00000098, + 0x00000042,0x0004003d,0x00000006,0x00000099,0x0000005b,0x0004003d,0x00000006,0x0000009a, + 0x00000055,0x00050084,0x00000006,0x0000009b,0x00000099,0x0000009a,0x00050080,0x00000006, + 0x0000009c,0x00000098,0x0000009b,0x00060041,0x00000080,0x0000009d,0x0000007a,0x00000025, + 0x0000009c,0x0004003d,0x00000021,0x0000009e,0x0000009d,0x0004003d,0x00000006,0x0000009f, + 0x00000042,0x0004003d,0x00000006,0x000000a0,0x0000005b,0x0004003d,0x00000006,0x000000a1, + 0x00000055,0x00050084,0x00000006,0x000000a2,0x000000a0,0x000000a1,0x00050080,0x00000006, + 0x000000a3,0x0000009f,0x000000a2,0x00060041,0x00000080,0x000000a4,0x0000007a,0x00000025, + 0x000000a3,0x0004003d,0x00000021,0x000000a5,0x000000a4,0x00050085,0x00000021,0x000000a6, + 0x0000009e,0x000000a5,0x0004003d,0x00000021,0x000000a7,0x0000005d,0x00050081,0x00000021, + 0x000000a8,0x000000a7,0x000000a6,0x0003003e,0x0000005d,0x000000a8,0x0004003d,0x00000006, + 0x000000a9,0x0000005b,0x00050041,0x00000026,0x000000ab,0x00000024,0x000000aa,0x0004003d, + 0x00000006,0x000000ac,0x000000ab,0x00050082,0x00000006,0x000000ad,0x000000a9,0x000000ac, + 0x000500af,0x00000029,0x000000ae,0x000000ad,0x00000025,0x000300f7,0x000000b0,0x00000000, + 0x000400fa,0x000000ae,0x000000af,0x000000b0,0x000200f8,0x000000af,0x0004003d,0x00000006, + 0x000000b1,0x00000042,0x0004003d,0x00000006,0x000000b2,0x0000005b,0x00050041,0x00000026, + 0x000000b3,0x00000024,0x000000aa,0x0004003d,0x00000006,0x000000b4,0x000000b3,0x00050082, + 0x00000006,0x000000b5,0x000000b2,0x000000b4,0x0004003d,0x00000006,0x000000b6,0x00000055, + 0x00050084,0x00000006,0x000000b7,0x000000b5,0x000000b6,0x00050080,0x00000006,0x000000b8, + 0x000000b1,0x000000b7,0x00060041,0x00000080,0x000000b9,0x0000007a,0x00000025,0x000000b8, + 0x0004003d,0x00000021,0x000000ba,0x000000b9,0x0004003d,0x00000006,0x000000bb,0x00000042, + 0x0004003d,0x00000006,0x000000bc,0x0000005b,0x00050041,0x00000026,0x000000bd,0x00000024, + 0x000000aa,0x0004003d,0x00000006,0x000000be,0x000000bd,0x00050082,0x00000006,0x000000bf, + 0x000000bc,0x000000be,0x0004003d,0x00000006,0x000000c0,0x00000055,0x00050084,0x00000006, + 0x000000c1,0x000000bf,0x000000c0,0x00050080,0x00000006,0x000000c2,0x000000bb,0x000000c1, + 0x00060041,0x00000080,0x000000c3,0x0000007a,0x00000025,0x000000c2,0x0004003d,0x00000021, + 0x000000c4,0x000000c3,0x00050085,0x00000021,0x000000c5,0x000000ba,0x000000c4,0x0004003d, + 0x00000021,0x000000c6,0x0000005d,0x00050083,0x00000021,0x000000c7,0x000000c6,0x000000c5, + 0x0003003e,0x0000005d,0x000000c7,0x000200f9,0x000000b0,0x000200f8,0x000000b0,0x00050041, + 0x00000080,0x000000ca,0x00000024,0x000000c9,0x0004003d,0x00000021,0x000000cb,0x000000ca, + 0x0004003d,0x00000021,0x000000cc,0x0000005d,0x00050041,0x00000080,0x000000ce,0x00000024, + 0x000000cd,0x0004003d,0x00000021,0x000000cf,0x000000ce,0x00050085,0x00000021,0x000000d0, + 0x000000cc,0x000000cf,0x00050081,0x00000021,0x000000d1,0x000000cb,0x000000d0,0x0003003e, + 0x000000c8,0x000000d1,0x0004003d,0x00000006,0x000000d6,0x00000042,0x0004003d,0x00000006, + 0x000000d7,0x0000005b,0x00050041,0x00000026,0x000000d8,0x00000024,0x00000060,0x0004003d, + 0x00000006,0x000000d9,0x000000d8,0x00050082,0x00000006,0x000000da,0x000000d7,0x000000d9, + 0x0004003d,0x00000006,0x000000db,0x00000055,0x00050084,0x00000006,0x000000dc,0x000000da, + 0x000000db,0x00050080,0x00000006,0x000000dd,0x000000d6,0x000000dc,0x0004003d,0x00000006, + 0x000000de,0x00000042,0x0004003d,0x00000006,0x000000df,0x0000005b,0x00050041,0x00000026, + 0x000000e0,0x00000024,0x00000060,0x0004003d,0x00000006,0x000000e1,0x000000e0,0x00050082, + 0x00000006,0x000000e2,0x000000df,0x000000e1,0x0004003d,0x00000006,0x000000e3,0x00000055, + 0x00050084,0x00000006,0x000000e4,0x000000e2,0x000000e3,0x00050080,0x00000006,0x000000e5, + 0x000000de,0x000000e4,0x00060041,0x00000080,0x000000e6,0x0000007a,0x00000025,0x000000e5, + 0x0004003d,0x00000021,0x000000e7,0x000000e6,0x0004003d,0x00000021,0x000000e8,0x000000c8, + 0x00050041,0x00000080,0x000000ea,0x00000024,0x000000e9,0x0004003d,0x00000021,0x000000eb, + 0x000000ea,0x0007000c,0x00000021,0x000000ec,0x00000001,0x0000001a,0x000000e8,0x000000eb, + 0x00050085,0x00000021,0x000000ed,0x000000e7,0x000000ec,0x00060041,0x00000080,0x000000ee, + 0x000000d5,0x00000025,0x000000dd,0x0003003e,0x000000ee,0x000000ed,0x0004003d,0x00000006, + 0x000000ef,0x0000005b,0x00050080,0x00000006,0x000000f0,0x000000ef,0x00000044,0x0003003e, + 0x0000005b,0x000000f0,0x000200f9,0x00000092,0x000200f8,0x00000092,0x000200f9,0x0000008f, + 0x000200f8,0x00000091,0x0004003d,0x00000006,0x000000f2,0x0000005b,0x0004003d,0x00000006, + 0x000000f3,0x0000005f,0x00050082,0x00000006,0x000000f4,0x000000f2,0x000000f3,0x0003003e, + 0x000000f1,0x000000f4,0x000200f9,0x000000f5,0x000200f8,0x000000f5,0x000400f6,0x000000f7, + 0x000000f8,0x00000000,0x000200f9,0x000000f9,0x000200f8,0x000000f9,0x0004003d,0x00000006, + 0x000000fa,0x000000f1,0x000500af,0x00000029,0x000000fb,0x000000fa,0x00000025,0x000300f7, + 0x000000fd,0x00000000,0x000400fa,0x000000fb,0x000000fc,0x000000fd,0x000200f8,0x000000fc, + 0x0004003d,0x00000006,0x000000fe,0x000000f1,0x00050041,0x00000026,0x000000ff,0x00000024, + 0x00000044,0x0004003d,0x00000006,0x00000100,0x000000ff,0x000500b1,0x00000029,0x00000101, + 0x000000fe,0x00000100,0x000200f9,0x000000fd,0x000200f8,0x000000fd,0x000700f5,0x00000029, + 0x00000102,0x000000fb,0x000000f9,0x00000101,0x000000fc,0x000400fa,0x00000102,0x000000f6, + 0x000000f7,0x000200f8,0x000000f6,0x0004003d,0x00000006,0x00000103,0x0000005b,0x00050041, + 0x00000026,0x00000104,0x00000024,0x000000aa,0x0004003d,0x00000006,0x00000105,0x00000104, + 0x00050082,0x00000006,0x00000106,0x00000103,0x00000105,0x000500af,0x00000029,0x00000107, + 0x00000106,0x00000025,0x000300f7,0x00000109,0x00000000,0x000400fa,0x00000107,0x00000108, + 0x00000109,0x000200f8,0x00000108,0x0004003d,0x00000006,0x0000010a,0x00000042,0x0004003d, + 0x00000006,0x0000010b,0x0000005b,0x00050041,0x00000026,0x0000010c,0x00000024,0x000000aa, + 0x0004003d,0x00000006,0x0000010d,0x0000010c,0x00050082,0x00000006,0x0000010e,0x0000010b, + 0x0000010d,0x0004003d,0x00000006,0x0000010f,0x00000055,0x00050084,0x00000006,0x00000110, + 0x0000010e,0x0000010f,0x00050080,0x00000006,0x00000111,0x0000010a,0x00000110,0x00060041, + 0x00000080,0x00000112,0x0000007a,0x00000025,0x00000111,0x0004003d,0x00000021,0x00000113, + 0x00000112,0x0004003d,0x00000006,0x00000114,0x00000042,0x0004003d,0x00000006,0x00000115, + 0x0000005b,0x00050041,0x00000026,0x00000116,0x00000024,0x000000aa,0x0004003d,0x00000006, + 0x00000117,0x00000116,0x00050082,0x00000006,0x00000118,0x00000115,0x00000117,0x0004003d, + 0x00000006,0x00000119,0x00000055,0x00050084,0x00000006,0x0000011a,0x00000118,0x00000119, + 0x00050080,0x00000006,0x0000011b,0x00000114,0x0000011a,0x00060041,0x00000080,0x0000011c, + 0x0000007a,0x00000025,0x0000011b,0x0004003d,0x00000021,0x0000011d,0x0000011c,0x00050085, + 0x00000021,0x0000011e,0x00000113,0x0000011d,0x0004003d,0x00000021,0x0000011f,0x0000005d, + 0x00050083,0x00000021,0x00000120,0x0000011f,0x0000011e,0x0003003e,0x0000005d,0x00000120, + 0x000200f9,0x00000109,0x000200f8,0x00000109,0x00050041,0x00000080,0x00000121,0x00000024, + 0x000000c9,0x0004003d,0x00000021,0x00000122,0x00000121,0x0004003d,0x00000021,0x00000123, + 0x0000005d,0x00050041,0x00000080,0x00000124,0x00000024,0x000000cd,0x0004003d,0x00000021, + 0x00000125,0x00000124,0x00050085,0x00000021,0x00000126,0x00000123,0x00000125,0x00050081, + 0x00000021,0x00000127,0x00000122,0x00000126,0x0003003e,0x000000c8,0x00000127,0x0004003d, + 0x00000006,0x00000128,0x00000042,0x0004003d,0x00000006,0x00000129,0x000000f1,0x0004003d, + 0x00000006,0x0000012a,0x00000055,0x00050084,0x00000006,0x0000012b,0x00000129,0x0000012a, + 0x00050080,0x00000006,0x0000012c,0x00000128,0x0000012b,0x0004003d,0x00000006,0x0000012d, + 0x00000042,0x0004003d,0x00000006,0x0000012e,0x000000f1,0x0004003d,0x00000006,0x0000012f, + 0x00000055,0x00050084,0x00000006,0x00000130,0x0000012e,0x0000012f,0x00050080,0x00000006, + 0x00000131,0x0000012d,0x00000130,0x00060041,0x00000080,0x00000132,0x0000007a,0x00000025, + 0x00000131,0x0004003d,0x00000021,0x00000133,0x00000132,0x0004003d,0x00000021,0x00000134, + 0x000000c8,0x00050041,0x00000080,0x00000135,0x00000024,0x000000e9,0x0004003d,0x00000021, + 0x00000136,0x00000135,0x0007000c,0x00000021,0x00000137,0x00000001,0x0000001a,0x00000134, + 0x00000136,0x00050085,0x00000021,0x00000138,0x00000133,0x00000137,0x00060041,0x00000080, + 0x00000139,0x000000d5,0x00000025,0x0000012c,0x0003003e,0x00000139,0x00000138,0x0004003d, + 0x00000006,0x0000013a,0x0000005b,0x00050080,0x00000006,0x0000013b,0x0000013a,0x00000044, + 0x0003003e,0x0000005b,0x0000013b,0x0004003d,0x00000006,0x0000013c,0x000000f1,0x00050080, + 0x00000006,0x0000013d,0x0000013c,0x00000044,0x0003003e,0x000000f1,0x0000013d,0x000200f9, + 0x000000f8,0x000200f8,0x000000f8,0x000200f9,0x000000f5,0x000200f8,0x000000f7,0x000200f9, + 0x0000001e,0x000200f8,0x0000001e,0x0004003d,0x00000006,0x0000013e,0x00000012,0x0004003d, + 0x00000006,0x0000013f,0x00000019,0x00050080,0x00000006,0x00000140,0x0000013f,0x0000013e, + 0x0003003e,0x00000019,0x00000140,0x000200f9,0x0000001b,0x000200f8,0x0000001d,0x000100fd, + 0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/max_pool.comp b/modules/dnn/src/webgpu/shader/max_pool.comp new file mode 100644 index 000000000000..b1877b8d3551 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/max_pool.comp @@ -0,0 +1,64 @@ +#version 450 +#define LOCAL_SZ_X 256 + +layout(binding = 0) buffer Input0{ + float in_buffer[]; +}; + +layout(binding = 1) buffer Output{ + float out_buffer[]; +}; + +layout(binding = 2) buffer Mask{ + float mask_buffer[]; +}; +layout(binding = 3) uniform pushBlock { + int channels; + int in_h; + int in_w; + int out_h; + int out_w; + int padding_h; + int padding_w; + int filter_h; + int filter_w; + int stride_h; + int stride_w; + int total; + int need_mask; +} p; + +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; + +void main() +{ + int global_size = int(gl_WorkGroupSize.x * gl_NumWorkGroups.x); + int gid = int(gl_GlobalInvocationID.x); + for (int index = gid; index < p.total; index += global_size) + { + const int pw = index % p.out_w; + const int ph = (index / p.out_w) % p.out_h; + const int c = (index / p.out_w / p.out_h) % p.channels; + const int n = index / p.out_w / p.out_h / p.channels; + int hstart = ph * p.stride_h - p.padding_h; + int wstart = pw * p.stride_w - p.padding_w; + const int hend = min(hstart + p.filter_h, p.in_h); + const int wend = min(wstart + p.filter_w, p.in_w); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + float maxval = -1./0.; + int maxidx = -1; + int off = (n * p.channels + c) * p.in_h * p.in_w; + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + if (in_buffer[off + h * p.in_w + w] > maxval) { + maxidx = h * p.in_w + w; + maxval = in_buffer[off + maxidx]; + } + } + } + out_buffer[index] = maxval; + if (p.need_mask == 1) + mask_buffer[index] = maxidx; + } +} diff --git a/modules/dnn/src/webgpu/shader/max_pool_spv.cpp b/modules/dnn/src/webgpu/shader/max_pool_spv.cpp new file mode 100644 index 000000000000..86d7e3e6e4a8 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/max_pool_spv.cpp @@ -0,0 +1,196 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int max_pool_spv[1445] = { + 0x07230203,0x00010000,0x00080009,0x000000df,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0007000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000015,0x00060010, + 0x00000004,0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2, + 0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x626f6c67,0x735f6c61, + 0x00657a69,0x00070005,0x0000000d,0x4e5f6c67,0x6f576d75,0x72476b72,0x7370756f,0x00000000, + 0x00030005,0x00000014,0x00646967,0x00080005,0x00000015,0x475f6c67,0x61626f6c,0x766e496c, + 0x7461636f,0x496e6f69,0x00000044,0x00040005,0x00000019,0x65646e69,0x00000078,0x00050005, + 0x00000021,0x68737570,0x636f6c42,0x0000006b,0x00060006,0x00000021,0x00000000,0x6e616863, + 0x736c656e,0x00000000,0x00050006,0x00000021,0x00000001,0x685f6e69,0x00000000,0x00050006, + 0x00000021,0x00000002,0x775f6e69,0x00000000,0x00050006,0x00000021,0x00000003,0x5f74756f, + 0x00000068,0x00050006,0x00000021,0x00000004,0x5f74756f,0x00000077,0x00060006,0x00000021, + 0x00000005,0x64646170,0x5f676e69,0x00000068,0x00060006,0x00000021,0x00000006,0x64646170, + 0x5f676e69,0x00000077,0x00060006,0x00000021,0x00000007,0x746c6966,0x685f7265,0x00000000, + 0x00060006,0x00000021,0x00000008,0x746c6966,0x775f7265,0x00000000,0x00060006,0x00000021, + 0x00000009,0x69727473,0x685f6564,0x00000000,0x00060006,0x00000021,0x0000000a,0x69727473, + 0x775f6564,0x00000000,0x00050006,0x00000021,0x0000000b,0x61746f74,0x0000006c,0x00060006, + 0x00000021,0x0000000c,0x6465656e,0x73616d5f,0x0000006b,0x00030005,0x00000023,0x00000070, + 0x00030005,0x0000002a,0x00007770,0x00030005,0x00000030,0x00006870,0x00030005,0x00000039, + 0x00000063,0x00030005,0x00000045,0x0000006e,0x00040005,0x00000050,0x61747368,0x00007472, + 0x00040005,0x0000005a,0x61747377,0x00007472,0x00040005,0x00000064,0x646e6568,0x00000000, + 0x00040005,0x0000006e,0x646e6577,0x00000000,0x00040005,0x0000007e,0x7678616d,0x00006c61, + 0x00040005,0x00000080,0x6978616d,0x00007864,0x00030005,0x00000082,0x0066666f,0x00030005, + 0x0000008f,0x00000068,0x00030005,0x00000099,0x00000077,0x00040005,0x000000a4,0x75706e49, + 0x00003074,0x00060006,0x000000a4,0x00000000,0x625f6e69,0x65666675,0x00000072,0x00030005, + 0x000000a6,0x00000000,0x00040005,0x000000c6,0x7074754f,0x00007475,0x00060006,0x000000c6, + 0x00000000,0x5f74756f,0x66667562,0x00007265,0x00030005,0x000000c8,0x00000000,0x00040005, + 0x000000d3,0x6b73614d,0x00000000,0x00060006,0x000000d3,0x00000000,0x6b73616d,0x6675625f, + 0x00726566,0x00030005,0x000000d5,0x00000000,0x00040047,0x0000000d,0x0000000b,0x00000018, + 0x00040047,0x00000015,0x0000000b,0x0000001c,0x00050048,0x00000021,0x00000000,0x00000023, + 0x00000000,0x00050048,0x00000021,0x00000001,0x00000023,0x00000004,0x00050048,0x00000021, + 0x00000002,0x00000023,0x00000008,0x00050048,0x00000021,0x00000003,0x00000023,0x0000000c, + 0x00050048,0x00000021,0x00000004,0x00000023,0x00000010,0x00050048,0x00000021,0x00000005, + 0x00000023,0x00000014,0x00050048,0x00000021,0x00000006,0x00000023,0x00000018,0x00050048, + 0x00000021,0x00000007,0x00000023,0x0000001c,0x00050048,0x00000021,0x00000008,0x00000023, + 0x00000020,0x00050048,0x00000021,0x00000009,0x00000023,0x00000024,0x00050048,0x00000021, + 0x0000000a,0x00000023,0x00000028,0x00050048,0x00000021,0x0000000b,0x00000023,0x0000002c, + 0x00050048,0x00000021,0x0000000c,0x00000023,0x00000030,0x00030047,0x00000021,0x00000002, + 0x00040047,0x00000023,0x00000022,0x00000000,0x00040047,0x00000023,0x00000021,0x00000003, + 0x00040047,0x000000a3,0x00000006,0x00000004,0x00050048,0x000000a4,0x00000000,0x00000023, + 0x00000000,0x00030047,0x000000a4,0x00000003,0x00040047,0x000000a6,0x00000022,0x00000000, + 0x00040047,0x000000a6,0x00000021,0x00000000,0x00040047,0x000000c5,0x00000006,0x00000004, + 0x00050048,0x000000c6,0x00000000,0x00000023,0x00000000,0x00030047,0x000000c6,0x00000003, + 0x00040047,0x000000c8,0x00000022,0x00000000,0x00040047,0x000000c8,0x00000021,0x00000001, + 0x00040047,0x000000d2,0x00000006,0x00000004,0x00050048,0x000000d3,0x00000000,0x00000023, + 0x00000000,0x00030047,0x000000d3,0x00000003,0x00040047,0x000000d5,0x00000022,0x00000000, + 0x00040047,0x000000d5,0x00000021,0x00000002,0x00040047,0x000000de,0x0000000b,0x00000019, + 0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020, + 0x00000001,0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020, + 0x00000000,0x0004002b,0x00000009,0x0000000a,0x00000100,0x00040017,0x0000000b,0x00000009, + 0x00000003,0x00040020,0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d, + 0x00000001,0x0004002b,0x00000009,0x0000000e,0x00000000,0x00040020,0x0000000f,0x00000001, + 0x00000009,0x0004003b,0x0000000c,0x00000015,0x00000001,0x000f001e,0x00000021,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x00000022,0x00000002,0x00000021, + 0x0004003b,0x00000022,0x00000023,0x00000002,0x0004002b,0x00000006,0x00000024,0x0000000b, + 0x00040020,0x00000025,0x00000002,0x00000006,0x00020014,0x00000028,0x0004002b,0x00000006, + 0x0000002c,0x00000004,0x0004002b,0x00000006,0x00000035,0x00000003,0x0004002b,0x00000006, + 0x00000041,0x00000000,0x0004002b,0x00000006,0x00000052,0x00000009,0x0004002b,0x00000006, + 0x00000056,0x00000005,0x0004002b,0x00000006,0x0000005c,0x0000000a,0x0004002b,0x00000006, + 0x00000060,0x00000006,0x0004002b,0x00000006,0x00000066,0x00000007,0x0004002b,0x00000006, + 0x0000006a,0x00000001,0x0004002b,0x00000006,0x00000070,0x00000008,0x0004002b,0x00000006, + 0x00000074,0x00000002,0x00030016,0x0000007c,0x00000020,0x00040020,0x0000007d,0x00000007, + 0x0000007c,0x0004002b,0x0000007c,0x0000007f,0xff800000,0x0004002b,0x00000006,0x00000081, + 0xffffffff,0x0003001d,0x000000a3,0x0000007c,0x0003001e,0x000000a4,0x000000a3,0x00040020, + 0x000000a5,0x00000002,0x000000a4,0x0004003b,0x000000a5,0x000000a6,0x00000002,0x00040020, + 0x000000af,0x00000002,0x0000007c,0x0003001d,0x000000c5,0x0000007c,0x0003001e,0x000000c6, + 0x000000c5,0x00040020,0x000000c7,0x00000002,0x000000c6,0x0004003b,0x000000c7,0x000000c8, + 0x00000002,0x0004002b,0x00000006,0x000000cc,0x0000000c,0x0003001d,0x000000d2,0x0000007c, + 0x0003001e,0x000000d3,0x000000d2,0x00040020,0x000000d4,0x00000002,0x000000d3,0x0004003b, + 0x000000d4,0x000000d5,0x00000002,0x0004002b,0x00000009,0x000000dd,0x00000001,0x0006002c, + 0x0000000b,0x000000de,0x0000000a,0x000000dd,0x000000dd,0x00050036,0x00000002,0x00000004, + 0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007, + 0x0004003b,0x00000007,0x00000014,0x00000007,0x0004003b,0x00000007,0x00000019,0x00000007, + 0x0004003b,0x00000007,0x0000002a,0x00000007,0x0004003b,0x00000007,0x00000030,0x00000007, + 0x0004003b,0x00000007,0x00000039,0x00000007,0x0004003b,0x00000007,0x00000045,0x00000007, + 0x0004003b,0x00000007,0x00000050,0x00000007,0x0004003b,0x00000007,0x0000005a,0x00000007, + 0x0004003b,0x00000007,0x00000064,0x00000007,0x0004003b,0x00000007,0x0000006e,0x00000007, + 0x0004003b,0x0000007d,0x0000007e,0x00000007,0x0004003b,0x00000007,0x00000080,0x00000007, + 0x0004003b,0x00000007,0x00000082,0x00000007,0x0004003b,0x00000007,0x0000008f,0x00000007, + 0x0004003b,0x00000007,0x00000099,0x00000007,0x00050041,0x0000000f,0x00000010,0x0000000d, + 0x0000000e,0x0004003d,0x00000009,0x00000011,0x00000010,0x00050084,0x00000009,0x00000012, + 0x0000000a,0x00000011,0x0004007c,0x00000006,0x00000013,0x00000012,0x0003003e,0x00000008, + 0x00000013,0x00050041,0x0000000f,0x00000016,0x00000015,0x0000000e,0x0004003d,0x00000009, + 0x00000017,0x00000016,0x0004007c,0x00000006,0x00000018,0x00000017,0x0003003e,0x00000014, + 0x00000018,0x0004003d,0x00000006,0x0000001a,0x00000014,0x0003003e,0x00000019,0x0000001a, + 0x000200f9,0x0000001b,0x000200f8,0x0000001b,0x000400f6,0x0000001d,0x0000001e,0x00000000, + 0x000200f9,0x0000001f,0x000200f8,0x0000001f,0x0004003d,0x00000006,0x00000020,0x00000019, + 0x00050041,0x00000025,0x00000026,0x00000023,0x00000024,0x0004003d,0x00000006,0x00000027, + 0x00000026,0x000500b1,0x00000028,0x00000029,0x00000020,0x00000027,0x000400fa,0x00000029, + 0x0000001c,0x0000001d,0x000200f8,0x0000001c,0x0004003d,0x00000006,0x0000002b,0x00000019, + 0x00050041,0x00000025,0x0000002d,0x00000023,0x0000002c,0x0004003d,0x00000006,0x0000002e, + 0x0000002d,0x0005008b,0x00000006,0x0000002f,0x0000002b,0x0000002e,0x0003003e,0x0000002a, + 0x0000002f,0x0004003d,0x00000006,0x00000031,0x00000019,0x00050041,0x00000025,0x00000032, + 0x00000023,0x0000002c,0x0004003d,0x00000006,0x00000033,0x00000032,0x00050087,0x00000006, + 0x00000034,0x00000031,0x00000033,0x00050041,0x00000025,0x00000036,0x00000023,0x00000035, + 0x0004003d,0x00000006,0x00000037,0x00000036,0x0005008b,0x00000006,0x00000038,0x00000034, + 0x00000037,0x0003003e,0x00000030,0x00000038,0x0004003d,0x00000006,0x0000003a,0x00000019, + 0x00050041,0x00000025,0x0000003b,0x00000023,0x0000002c,0x0004003d,0x00000006,0x0000003c, + 0x0000003b,0x00050087,0x00000006,0x0000003d,0x0000003a,0x0000003c,0x00050041,0x00000025, + 0x0000003e,0x00000023,0x00000035,0x0004003d,0x00000006,0x0000003f,0x0000003e,0x00050087, + 0x00000006,0x00000040,0x0000003d,0x0000003f,0x00050041,0x00000025,0x00000042,0x00000023, + 0x00000041,0x0004003d,0x00000006,0x00000043,0x00000042,0x0005008b,0x00000006,0x00000044, + 0x00000040,0x00000043,0x0003003e,0x00000039,0x00000044,0x0004003d,0x00000006,0x00000046, + 0x00000019,0x00050041,0x00000025,0x00000047,0x00000023,0x0000002c,0x0004003d,0x00000006, + 0x00000048,0x00000047,0x00050087,0x00000006,0x00000049,0x00000046,0x00000048,0x00050041, + 0x00000025,0x0000004a,0x00000023,0x00000035,0x0004003d,0x00000006,0x0000004b,0x0000004a, + 0x00050087,0x00000006,0x0000004c,0x00000049,0x0000004b,0x00050041,0x00000025,0x0000004d, + 0x00000023,0x00000041,0x0004003d,0x00000006,0x0000004e,0x0000004d,0x00050087,0x00000006, + 0x0000004f,0x0000004c,0x0000004e,0x0003003e,0x00000045,0x0000004f,0x0004003d,0x00000006, + 0x00000051,0x00000030,0x00050041,0x00000025,0x00000053,0x00000023,0x00000052,0x0004003d, + 0x00000006,0x00000054,0x00000053,0x00050084,0x00000006,0x00000055,0x00000051,0x00000054, + 0x00050041,0x00000025,0x00000057,0x00000023,0x00000056,0x0004003d,0x00000006,0x00000058, + 0x00000057,0x00050082,0x00000006,0x00000059,0x00000055,0x00000058,0x0003003e,0x00000050, + 0x00000059,0x0004003d,0x00000006,0x0000005b,0x0000002a,0x00050041,0x00000025,0x0000005d, + 0x00000023,0x0000005c,0x0004003d,0x00000006,0x0000005e,0x0000005d,0x00050084,0x00000006, + 0x0000005f,0x0000005b,0x0000005e,0x00050041,0x00000025,0x00000061,0x00000023,0x00000060, + 0x0004003d,0x00000006,0x00000062,0x00000061,0x00050082,0x00000006,0x00000063,0x0000005f, + 0x00000062,0x0003003e,0x0000005a,0x00000063,0x0004003d,0x00000006,0x00000065,0x00000050, + 0x00050041,0x00000025,0x00000067,0x00000023,0x00000066,0x0004003d,0x00000006,0x00000068, + 0x00000067,0x00050080,0x00000006,0x00000069,0x00000065,0x00000068,0x00050041,0x00000025, + 0x0000006b,0x00000023,0x0000006a,0x0004003d,0x00000006,0x0000006c,0x0000006b,0x0007000c, + 0x00000006,0x0000006d,0x00000001,0x00000027,0x00000069,0x0000006c,0x0003003e,0x00000064, + 0x0000006d,0x0004003d,0x00000006,0x0000006f,0x0000005a,0x00050041,0x00000025,0x00000071, + 0x00000023,0x00000070,0x0004003d,0x00000006,0x00000072,0x00000071,0x00050080,0x00000006, + 0x00000073,0x0000006f,0x00000072,0x00050041,0x00000025,0x00000075,0x00000023,0x00000074, + 0x0004003d,0x00000006,0x00000076,0x00000075,0x0007000c,0x00000006,0x00000077,0x00000001, + 0x00000027,0x00000073,0x00000076,0x0003003e,0x0000006e,0x00000077,0x0004003d,0x00000006, + 0x00000078,0x00000050,0x0007000c,0x00000006,0x00000079,0x00000001,0x0000002a,0x00000078, + 0x00000041,0x0003003e,0x00000050,0x00000079,0x0004003d,0x00000006,0x0000007a,0x0000005a, + 0x0007000c,0x00000006,0x0000007b,0x00000001,0x0000002a,0x0000007a,0x00000041,0x0003003e, + 0x0000005a,0x0000007b,0x0003003e,0x0000007e,0x0000007f,0x0003003e,0x00000080,0x00000081, + 0x0004003d,0x00000006,0x00000083,0x00000045,0x00050041,0x00000025,0x00000084,0x00000023, + 0x00000041,0x0004003d,0x00000006,0x00000085,0x00000084,0x00050084,0x00000006,0x00000086, + 0x00000083,0x00000085,0x0004003d,0x00000006,0x00000087,0x00000039,0x00050080,0x00000006, + 0x00000088,0x00000086,0x00000087,0x00050041,0x00000025,0x00000089,0x00000023,0x0000006a, + 0x0004003d,0x00000006,0x0000008a,0x00000089,0x00050084,0x00000006,0x0000008b,0x00000088, + 0x0000008a,0x00050041,0x00000025,0x0000008c,0x00000023,0x00000074,0x0004003d,0x00000006, + 0x0000008d,0x0000008c,0x00050084,0x00000006,0x0000008e,0x0000008b,0x0000008d,0x0003003e, + 0x00000082,0x0000008e,0x0004003d,0x00000006,0x00000090,0x00000050,0x0003003e,0x0000008f, + 0x00000090,0x000200f9,0x00000091,0x000200f8,0x00000091,0x000400f6,0x00000093,0x00000094, + 0x00000000,0x000200f9,0x00000095,0x000200f8,0x00000095,0x0004003d,0x00000006,0x00000096, + 0x0000008f,0x0004003d,0x00000006,0x00000097,0x00000064,0x000500b1,0x00000028,0x00000098, + 0x00000096,0x00000097,0x000400fa,0x00000098,0x00000092,0x00000093,0x000200f8,0x00000092, + 0x0004003d,0x00000006,0x0000009a,0x0000005a,0x0003003e,0x00000099,0x0000009a,0x000200f9, + 0x0000009b,0x000200f8,0x0000009b,0x000400f6,0x0000009d,0x0000009e,0x00000000,0x000200f9, + 0x0000009f,0x000200f8,0x0000009f,0x0004003d,0x00000006,0x000000a0,0x00000099,0x0004003d, + 0x00000006,0x000000a1,0x0000006e,0x000500b1,0x00000028,0x000000a2,0x000000a0,0x000000a1, + 0x000400fa,0x000000a2,0x0000009c,0x0000009d,0x000200f8,0x0000009c,0x0004003d,0x00000006, + 0x000000a7,0x00000082,0x0004003d,0x00000006,0x000000a8,0x0000008f,0x00050041,0x00000025, + 0x000000a9,0x00000023,0x00000074,0x0004003d,0x00000006,0x000000aa,0x000000a9,0x00050084, + 0x00000006,0x000000ab,0x000000a8,0x000000aa,0x00050080,0x00000006,0x000000ac,0x000000a7, + 0x000000ab,0x0004003d,0x00000006,0x000000ad,0x00000099,0x00050080,0x00000006,0x000000ae, + 0x000000ac,0x000000ad,0x00060041,0x000000af,0x000000b0,0x000000a6,0x00000041,0x000000ae, + 0x0004003d,0x0000007c,0x000000b1,0x000000b0,0x0004003d,0x0000007c,0x000000b2,0x0000007e, + 0x000500ba,0x00000028,0x000000b3,0x000000b1,0x000000b2,0x000300f7,0x000000b5,0x00000000, + 0x000400fa,0x000000b3,0x000000b4,0x000000b5,0x000200f8,0x000000b4,0x0004003d,0x00000006, + 0x000000b6,0x0000008f,0x00050041,0x00000025,0x000000b7,0x00000023,0x00000074,0x0004003d, + 0x00000006,0x000000b8,0x000000b7,0x00050084,0x00000006,0x000000b9,0x000000b6,0x000000b8, + 0x0004003d,0x00000006,0x000000ba,0x00000099,0x00050080,0x00000006,0x000000bb,0x000000b9, + 0x000000ba,0x0003003e,0x00000080,0x000000bb,0x0004003d,0x00000006,0x000000bc,0x00000082, + 0x0004003d,0x00000006,0x000000bd,0x00000080,0x00050080,0x00000006,0x000000be,0x000000bc, + 0x000000bd,0x00060041,0x000000af,0x000000bf,0x000000a6,0x00000041,0x000000be,0x0004003d, + 0x0000007c,0x000000c0,0x000000bf,0x0003003e,0x0000007e,0x000000c0,0x000200f9,0x000000b5, + 0x000200f8,0x000000b5,0x000200f9,0x0000009e,0x000200f8,0x0000009e,0x0004003d,0x00000006, + 0x000000c1,0x00000099,0x00050080,0x00000006,0x000000c2,0x000000c1,0x0000006a,0x0003003e, + 0x00000099,0x000000c2,0x000200f9,0x0000009b,0x000200f8,0x0000009d,0x000200f9,0x00000094, + 0x000200f8,0x00000094,0x0004003d,0x00000006,0x000000c3,0x0000008f,0x00050080,0x00000006, + 0x000000c4,0x000000c3,0x0000006a,0x0003003e,0x0000008f,0x000000c4,0x000200f9,0x00000091, + 0x000200f8,0x00000093,0x0004003d,0x00000006,0x000000c9,0x00000019,0x0004003d,0x0000007c, + 0x000000ca,0x0000007e,0x00060041,0x000000af,0x000000cb,0x000000c8,0x00000041,0x000000c9, + 0x0003003e,0x000000cb,0x000000ca,0x00050041,0x00000025,0x000000cd,0x00000023,0x000000cc, + 0x0004003d,0x00000006,0x000000ce,0x000000cd,0x000500aa,0x00000028,0x000000cf,0x000000ce, + 0x0000006a,0x000300f7,0x000000d1,0x00000000,0x000400fa,0x000000cf,0x000000d0,0x000000d1, + 0x000200f8,0x000000d0,0x0004003d,0x00000006,0x000000d6,0x00000019,0x0004003d,0x00000006, + 0x000000d7,0x00000080,0x0004006f,0x0000007c,0x000000d8,0x000000d7,0x00060041,0x000000af, + 0x000000d9,0x000000d5,0x00000041,0x000000d6,0x0003003e,0x000000d9,0x000000d8,0x000200f9, + 0x000000d1,0x000200f8,0x000000d1,0x000200f9,0x0000001e,0x000200f8,0x0000001e,0x0004003d, + 0x00000006,0x000000da,0x00000008,0x0004003d,0x00000006,0x000000db,0x00000019,0x00050080, + 0x00000006,0x000000dc,0x000000db,0x000000da,0x0003003e,0x00000019,0x000000dc,0x000200f9, + 0x0000001b,0x000200f8,0x0000001d,0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/permute.comp b/modules/dnn/src/webgpu/shader/permute.comp new file mode 100644 index 000000000000..a5e1aceb164c --- /dev/null +++ b/modules/dnn/src/webgpu/shader/permute.comp @@ -0,0 +1,42 @@ +#version 450 +#define LOCAL_SZ_X 256 + +layout(binding = 0) buffer Input0{ + float in_buffer[]; +}; +layout(binding = 1) buffer Input1{ + int permute_order[]; +}; +layout(binding = 2) buffer Input2{ + int old_stride[]; +}; +layout(binding = 3) buffer Input3{ + int new_stride[]; +}; +layout(binding = 4) buffer Output{ + float out_buffer[]; +}; +layout(binding = 5) uniform pushBlock { + int nthreads; + int num_axes; + int global_size; +} p; +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; + +void main() +{ + for (int i = int(gl_GlobalInvocationID.x); i < p.nthreads; i += p.global_size) + { + int old_pos = 0; + int new_pos = i; + + for (int j = 0; j < p.num_axes; ++j) + { + int order = permute_order[j]; + old_pos += (new_pos / new_stride[j]) * old_stride[order]; + new_pos %= new_stride[j]; + } + + out_buffer[i] = in_buffer[old_pos]; + } +} diff --git a/modules/dnn/src/webgpu/shader/permute_spv.cpp b/modules/dnn/src/webgpu/shader/permute_spv.cpp new file mode 100644 index 000000000000..3392c3fad115 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/permute_spv.cpp @@ -0,0 +1,109 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int permute_spv[749] = { + 0x07230203,0x00010000,0x00080009,0x00000068,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00060010,0x00000004, + 0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00030005,0x00000008,0x00000069,0x00080005,0x0000000c, + 0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00050005,0x00000018, + 0x68737570,0x636f6c42,0x0000006b,0x00060006,0x00000018,0x00000000,0x7268746e,0x73646165, + 0x00000000,0x00060006,0x00000018,0x00000001,0x5f6d756e,0x73657861,0x00000000,0x00060006, + 0x00000018,0x00000002,0x626f6c67,0x735f6c61,0x00657a69,0x00030005,0x0000001a,0x00000070, + 0x00040005,0x00000021,0x5f646c6f,0x00736f70,0x00040005,0x00000022,0x5f77656e,0x00736f70, + 0x00030005,0x00000024,0x0000006a,0x00040005,0x0000002f,0x6564726f,0x00000072,0x00040005, + 0x00000031,0x75706e49,0x00003174,0x00070006,0x00000031,0x00000000,0x6d726570,0x5f657475, + 0x6564726f,0x00000072,0x00030005,0x00000033,0x00000000,0x00040005,0x00000039,0x75706e49, + 0x00003374,0x00060006,0x00000039,0x00000000,0x5f77656e,0x69727473,0x00006564,0x00030005, + 0x0000003b,0x00000000,0x00040005,0x00000041,0x75706e49,0x00003274,0x00060006,0x00000041, + 0x00000000,0x5f646c6f,0x69727473,0x00006564,0x00030005,0x00000043,0x00000000,0x00040005, + 0x00000053,0x7074754f,0x00007475,0x00060006,0x00000053,0x00000000,0x5f74756f,0x66667562, + 0x00007265,0x00030005,0x00000055,0x00000000,0x00040005,0x00000058,0x75706e49,0x00003074, + 0x00060006,0x00000058,0x00000000,0x625f6e69,0x65666675,0x00000072,0x00030005,0x0000005a, + 0x00000000,0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00050048,0x00000018,0x00000000, + 0x00000023,0x00000000,0x00050048,0x00000018,0x00000001,0x00000023,0x00000004,0x00050048, + 0x00000018,0x00000002,0x00000023,0x00000008,0x00030047,0x00000018,0x00000002,0x00040047, + 0x0000001a,0x00000022,0x00000000,0x00040047,0x0000001a,0x00000021,0x00000005,0x00040047, + 0x00000030,0x00000006,0x00000004,0x00050048,0x00000031,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000031,0x00000003,0x00040047,0x00000033,0x00000022,0x00000000,0x00040047, + 0x00000033,0x00000021,0x00000001,0x00040047,0x00000038,0x00000006,0x00000004,0x00050048, + 0x00000039,0x00000000,0x00000023,0x00000000,0x00030047,0x00000039,0x00000003,0x00040047, + 0x0000003b,0x00000022,0x00000000,0x00040047,0x0000003b,0x00000021,0x00000003,0x00040047, + 0x00000040,0x00000006,0x00000004,0x00050048,0x00000041,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000041,0x00000003,0x00040047,0x00000043,0x00000022,0x00000000,0x00040047, + 0x00000043,0x00000021,0x00000002,0x00040047,0x00000052,0x00000006,0x00000004,0x00050048, + 0x00000053,0x00000000,0x00000023,0x00000000,0x00030047,0x00000053,0x00000003,0x00040047, + 0x00000055,0x00000022,0x00000000,0x00040047,0x00000055,0x00000021,0x00000004,0x00040047, + 0x00000057,0x00000006,0x00000004,0x00050048,0x00000058,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000058,0x00000003,0x00040047,0x0000005a,0x00000022,0x00000000,0x00040047, + 0x0000005a,0x00000021,0x00000000,0x00040047,0x00000067,0x0000000b,0x00000019,0x00020013, + 0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001, + 0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000, + 0x00040017,0x0000000a,0x00000009,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a, + 0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000009,0x0000000d,0x00000000, + 0x00040020,0x0000000e,0x00000001,0x00000009,0x0005001e,0x00000018,0x00000006,0x00000006, + 0x00000006,0x00040020,0x00000019,0x00000002,0x00000018,0x0004003b,0x00000019,0x0000001a, + 0x00000002,0x0004002b,0x00000006,0x0000001b,0x00000000,0x00040020,0x0000001c,0x00000002, + 0x00000006,0x00020014,0x0000001f,0x0004002b,0x00000006,0x0000002b,0x00000001,0x0003001d, + 0x00000030,0x00000006,0x0003001e,0x00000031,0x00000030,0x00040020,0x00000032,0x00000002, + 0x00000031,0x0004003b,0x00000032,0x00000033,0x00000002,0x0003001d,0x00000038,0x00000006, + 0x0003001e,0x00000039,0x00000038,0x00040020,0x0000003a,0x00000002,0x00000039,0x0004003b, + 0x0000003a,0x0000003b,0x00000002,0x0003001d,0x00000040,0x00000006,0x0003001e,0x00000041, + 0x00000040,0x00040020,0x00000042,0x00000002,0x00000041,0x0004003b,0x00000042,0x00000043, + 0x00000002,0x00030016,0x00000051,0x00000020,0x0003001d,0x00000052,0x00000051,0x0003001e, + 0x00000053,0x00000052,0x00040020,0x00000054,0x00000002,0x00000053,0x0004003b,0x00000054, + 0x00000055,0x00000002,0x0003001d,0x00000057,0x00000051,0x0003001e,0x00000058,0x00000057, + 0x00040020,0x00000059,0x00000002,0x00000058,0x0004003b,0x00000059,0x0000005a,0x00000002, + 0x00040020,0x0000005c,0x00000002,0x00000051,0x0004002b,0x00000006,0x00000060,0x00000002, + 0x0004002b,0x00000009,0x00000065,0x00000100,0x0004002b,0x00000009,0x00000066,0x00000001, + 0x0006002c,0x0000000a,0x00000067,0x00000065,0x00000066,0x00000066,0x00050036,0x00000002, + 0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008, + 0x00000007,0x0004003b,0x00000007,0x00000021,0x00000007,0x0004003b,0x00000007,0x00000022, + 0x00000007,0x0004003b,0x00000007,0x00000024,0x00000007,0x0004003b,0x00000007,0x0000002f, + 0x00000007,0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000009, + 0x00000010,0x0000000f,0x0004007c,0x00000006,0x00000011,0x00000010,0x0003003e,0x00000008, + 0x00000011,0x000200f9,0x00000012,0x000200f8,0x00000012,0x000400f6,0x00000014,0x00000015, + 0x00000000,0x000200f9,0x00000016,0x000200f8,0x00000016,0x0004003d,0x00000006,0x00000017, + 0x00000008,0x00050041,0x0000001c,0x0000001d,0x0000001a,0x0000001b,0x0004003d,0x00000006, + 0x0000001e,0x0000001d,0x000500b1,0x0000001f,0x00000020,0x00000017,0x0000001e,0x000400fa, + 0x00000020,0x00000013,0x00000014,0x000200f8,0x00000013,0x0003003e,0x00000021,0x0000001b, + 0x0004003d,0x00000006,0x00000023,0x00000008,0x0003003e,0x00000022,0x00000023,0x0003003e, + 0x00000024,0x0000001b,0x000200f9,0x00000025,0x000200f8,0x00000025,0x000400f6,0x00000027, + 0x00000028,0x00000000,0x000200f9,0x00000029,0x000200f8,0x00000029,0x0004003d,0x00000006, + 0x0000002a,0x00000024,0x00050041,0x0000001c,0x0000002c,0x0000001a,0x0000002b,0x0004003d, + 0x00000006,0x0000002d,0x0000002c,0x000500b1,0x0000001f,0x0000002e,0x0000002a,0x0000002d, + 0x000400fa,0x0000002e,0x00000026,0x00000027,0x000200f8,0x00000026,0x0004003d,0x00000006, + 0x00000034,0x00000024,0x00060041,0x0000001c,0x00000035,0x00000033,0x0000001b,0x00000034, + 0x0004003d,0x00000006,0x00000036,0x00000035,0x0003003e,0x0000002f,0x00000036,0x0004003d, + 0x00000006,0x00000037,0x00000022,0x0004003d,0x00000006,0x0000003c,0x00000024,0x00060041, + 0x0000001c,0x0000003d,0x0000003b,0x0000001b,0x0000003c,0x0004003d,0x00000006,0x0000003e, + 0x0000003d,0x00050087,0x00000006,0x0000003f,0x00000037,0x0000003e,0x0004003d,0x00000006, + 0x00000044,0x0000002f,0x00060041,0x0000001c,0x00000045,0x00000043,0x0000001b,0x00000044, + 0x0004003d,0x00000006,0x00000046,0x00000045,0x00050084,0x00000006,0x00000047,0x0000003f, + 0x00000046,0x0004003d,0x00000006,0x00000048,0x00000021,0x00050080,0x00000006,0x00000049, + 0x00000048,0x00000047,0x0003003e,0x00000021,0x00000049,0x0004003d,0x00000006,0x0000004a, + 0x00000024,0x00060041,0x0000001c,0x0000004b,0x0000003b,0x0000001b,0x0000004a,0x0004003d, + 0x00000006,0x0000004c,0x0000004b,0x0004003d,0x00000006,0x0000004d,0x00000022,0x0005008b, + 0x00000006,0x0000004e,0x0000004d,0x0000004c,0x0003003e,0x00000022,0x0000004e,0x000200f9, + 0x00000028,0x000200f8,0x00000028,0x0004003d,0x00000006,0x0000004f,0x00000024,0x00050080, + 0x00000006,0x00000050,0x0000004f,0x0000002b,0x0003003e,0x00000024,0x00000050,0x000200f9, + 0x00000025,0x000200f8,0x00000027,0x0004003d,0x00000006,0x00000056,0x00000008,0x0004003d, + 0x00000006,0x0000005b,0x00000021,0x00060041,0x0000005c,0x0000005d,0x0000005a,0x0000001b, + 0x0000005b,0x0004003d,0x00000051,0x0000005e,0x0000005d,0x00060041,0x0000005c,0x0000005f, + 0x00000055,0x0000001b,0x00000056,0x0003003e,0x0000005f,0x0000005e,0x000200f9,0x00000015, + 0x000200f8,0x00000015,0x00050041,0x0000001c,0x00000061,0x0000001a,0x00000060,0x0004003d, + 0x00000006,0x00000062,0x00000061,0x0004003d,0x00000006,0x00000063,0x00000008,0x00050080, + 0x00000006,0x00000064,0x00000063,0x00000062,0x0003003e,0x00000008,0x00000064,0x000200f9, + 0x00000012,0x000200f8,0x00000014,0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/prior_box.comp b/modules/dnn/src/webgpu/shader/prior_box.comp new file mode 100644 index 000000000000..c313130a6ec8 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/prior_box.comp @@ -0,0 +1,77 @@ +#version 450 +#define LOCAL_SZ_X 256 + +layout(binding = 0) buffer Input0{ + float offset_x[]; +}; +layout(binding = 1) buffer Input1{ + float offset_y[]; +}; +layout(binding = 2) buffer Input2{ + float widths[]; +}; +layout(binding = 3) buffer Input3{ + float heights[]; +}; +layout(binding = 4) buffer Input4{ + vec4 variance[]; +}; +layout(binding = 5) buffer Output{ + vec4 out_buffer[]; +}; +layout(binding = 6) uniform pushBlock { + int global_size; + int nthreads; + float step_x; + float step_y; + int offset_x_size; + int width_size; + int layer_w; + int image_h; + int image_w; + int clip; + int variance_off; +} p; + +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; + +void main() +{ + for (int index = int(gl_GlobalInvocationID.x); index < p.nthreads; index += p.global_size) + { + int w = index % p.layer_w; + int h = index / p.layer_w; + int output_offset = index * p.offset_x_size * p.width_size; + + float box_w, box_h; + vec4 outer; + for (int i = 0; i < p.width_size; ++i) + { + box_w = widths[i]; + box_h = heights[i]; + for (int j = 0; j < p.offset_x_size; ++j) + { + float center_x = (w + offset_x[j]) * p.step_x; + float center_y = (h + offset_y[j]) * p.step_y; + + outer.x = (center_x - box_w * 0.5f) / p.image_w; // xmin + outer.y = (center_y - box_h * 0.5f) / p.image_h; // ymin + outer.z = (center_x + box_w * 0.5f) / p.image_w; // xmax + outer.w = (center_y + box_h * 0.5f) / p.image_h; // ymax + + // clip + if (p.clip == 1) + { + vec4 start = vec4(0.f, 0.f, 0.f, 0.f); + vec4 end = vec4(1.f, 1.f, 1.f, 1.f); + outer = min(max(outer, start), end); + } + + //set variance + out_buffer[p.variance_off + output_offset] = variance[0]; + out_buffer[output_offset] = outer; + output_offset++; + } + } + } +} diff --git a/modules/dnn/src/webgpu/shader/prior_box_spv.cpp b/modules/dnn/src/webgpu/shader/prior_box_spv.cpp new file mode 100644 index 000000000000..ba038577ebfc --- /dev/null +++ b/modules/dnn/src/webgpu/shader/prior_box_spv.cpp @@ -0,0 +1,198 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int prior_box_spv[1460] = { + 0x07230203,0x00010000,0x00080009,0x000000da,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00060010,0x00000004, + 0x00000011,0x00000100,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005, + 0x00000004,0x6e69616d,0x00000000,0x00040005,0x00000008,0x65646e69,0x00000078,0x00080005, + 0x0000000c,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00050005, + 0x00000019,0x68737570,0x636f6c42,0x0000006b,0x00060006,0x00000019,0x00000000,0x626f6c67, + 0x735f6c61,0x00657a69,0x00060006,0x00000019,0x00000001,0x7268746e,0x73646165,0x00000000, + 0x00050006,0x00000019,0x00000002,0x70657473,0x0000785f,0x00050006,0x00000019,0x00000003, + 0x70657473,0x0000795f,0x00070006,0x00000019,0x00000004,0x7366666f,0x785f7465,0x7a69735f, + 0x00000065,0x00060006,0x00000019,0x00000005,0x74646977,0x69735f68,0x0000657a,0x00050006, + 0x00000019,0x00000006,0x6579616c,0x00775f72,0x00050006,0x00000019,0x00000007,0x67616d69, + 0x00685f65,0x00050006,0x00000019,0x00000008,0x67616d69,0x00775f65,0x00050006,0x00000019, + 0x00000009,0x70696c63,0x00000000,0x00070006,0x00000019,0x0000000a,0x69726176,0x65636e61, + 0x66666f5f,0x00000000,0x00030005,0x0000001b,0x00000070,0x00030005,0x00000022,0x00000077, + 0x00030005,0x00000028,0x00000068,0x00060005,0x0000002d,0x7074756f,0x6f5f7475,0x65736666, + 0x00000074,0x00030005,0x00000037,0x00000069,0x00040005,0x00000043,0x5f786f62,0x00000077, + 0x00040005,0x00000045,0x75706e49,0x00003274,0x00050006,0x00000045,0x00000000,0x74646977, + 0x00007368,0x00030005,0x00000047,0x00000000,0x00040005,0x0000004c,0x5f786f62,0x00000068, + 0x00040005,0x0000004e,0x75706e49,0x00003374,0x00050006,0x0000004e,0x00000000,0x67696568, + 0x00737468,0x00030005,0x00000050,0x00000000,0x00030005,0x00000054,0x0000006a,0x00050005, + 0x0000005e,0x746e6563,0x785f7265,0x00000000,0x00040005,0x00000062,0x75706e49,0x00003074, + 0x00060006,0x00000062,0x00000000,0x7366666f,0x785f7465,0x00000000,0x00030005,0x00000064, + 0x00000000,0x00050005,0x0000006d,0x746e6563,0x795f7265,0x00000000,0x00040005,0x00000071, + 0x75706e49,0x00003174,0x00060006,0x00000071,0x00000000,0x7366666f,0x795f7465,0x00000000, + 0x00030005,0x00000073,0x00000000,0x00040005,0x0000007e,0x6574756f,0x00000072,0x00040005, + 0x000000af,0x72617473,0x00000074,0x00030005,0x000000b2,0x00646e65,0x00040005,0x000000bb, + 0x7074754f,0x00007475,0x00060006,0x000000bb,0x00000000,0x5f74756f,0x66667562,0x00007265, + 0x00030005,0x000000bd,0x00000000,0x00040005,0x000000c4,0x75706e49,0x00003474,0x00060006, + 0x000000c4,0x00000000,0x69726176,0x65636e61,0x00000000,0x00030005,0x000000c6,0x00000000, + 0x00040047,0x0000000c,0x0000000b,0x0000001c,0x00050048,0x00000019,0x00000000,0x00000023, + 0x00000000,0x00050048,0x00000019,0x00000001,0x00000023,0x00000004,0x00050048,0x00000019, + 0x00000002,0x00000023,0x00000008,0x00050048,0x00000019,0x00000003,0x00000023,0x0000000c, + 0x00050048,0x00000019,0x00000004,0x00000023,0x00000010,0x00050048,0x00000019,0x00000005, + 0x00000023,0x00000014,0x00050048,0x00000019,0x00000006,0x00000023,0x00000018,0x00050048, + 0x00000019,0x00000007,0x00000023,0x0000001c,0x00050048,0x00000019,0x00000008,0x00000023, + 0x00000020,0x00050048,0x00000019,0x00000009,0x00000023,0x00000024,0x00050048,0x00000019, + 0x0000000a,0x00000023,0x00000028,0x00030047,0x00000019,0x00000002,0x00040047,0x0000001b, + 0x00000022,0x00000000,0x00040047,0x0000001b,0x00000021,0x00000006,0x00040047,0x00000044, + 0x00000006,0x00000004,0x00050048,0x00000045,0x00000000,0x00000023,0x00000000,0x00030047, + 0x00000045,0x00000003,0x00040047,0x00000047,0x00000022,0x00000000,0x00040047,0x00000047, + 0x00000021,0x00000002,0x00040047,0x0000004d,0x00000006,0x00000004,0x00050048,0x0000004e, + 0x00000000,0x00000023,0x00000000,0x00030047,0x0000004e,0x00000003,0x00040047,0x00000050, + 0x00000022,0x00000000,0x00040047,0x00000050,0x00000021,0x00000003,0x00040047,0x00000061, + 0x00000006,0x00000004,0x00050048,0x00000062,0x00000000,0x00000023,0x00000000,0x00030047, + 0x00000062,0x00000003,0x00040047,0x00000064,0x00000022,0x00000000,0x00040047,0x00000064, + 0x00000021,0x00000000,0x00040047,0x00000070,0x00000006,0x00000004,0x00050048,0x00000071, + 0x00000000,0x00000023,0x00000000,0x00030047,0x00000071,0x00000003,0x00040047,0x00000073, + 0x00000022,0x00000000,0x00040047,0x00000073,0x00000021,0x00000001,0x00040047,0x000000ba, + 0x00000006,0x00000010,0x00050048,0x000000bb,0x00000000,0x00000023,0x00000000,0x00030047, + 0x000000bb,0x00000003,0x00040047,0x000000bd,0x00000022,0x00000000,0x00040047,0x000000bd, + 0x00000021,0x00000005,0x00040047,0x000000c3,0x00000006,0x00000010,0x00050048,0x000000c4, + 0x00000000,0x00000023,0x00000000,0x00030047,0x000000c4,0x00000003,0x00040047,0x000000c6, + 0x00000022,0x00000000,0x00040047,0x000000c6,0x00000021,0x00000004,0x00040047,0x000000d9, + 0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015, + 0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,0x00000007,0x00000006,0x00040015, + 0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,0x00000009,0x00000003,0x00040020, + 0x0000000b,0x00000001,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b, + 0x00000009,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000001,0x00000009,0x00030016, + 0x00000018,0x00000020,0x000d001e,0x00000019,0x00000006,0x00000006,0x00000018,0x00000018, + 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020, + 0x0000001a,0x00000002,0x00000019,0x0004003b,0x0000001a,0x0000001b,0x00000002,0x0004002b, + 0x00000006,0x0000001c,0x00000001,0x00040020,0x0000001d,0x00000002,0x00000006,0x00020014, + 0x00000020,0x0004002b,0x00000006,0x00000024,0x00000006,0x0004002b,0x00000006,0x0000002f, + 0x00000004,0x0004002b,0x00000006,0x00000033,0x00000005,0x0004002b,0x00000006,0x00000038, + 0x00000000,0x00040020,0x00000042,0x00000007,0x00000018,0x0003001d,0x00000044,0x00000018, + 0x0003001e,0x00000045,0x00000044,0x00040020,0x00000046,0x00000002,0x00000045,0x0004003b, + 0x00000046,0x00000047,0x00000002,0x00040020,0x00000049,0x00000002,0x00000018,0x0003001d, + 0x0000004d,0x00000018,0x0003001e,0x0000004e,0x0000004d,0x00040020,0x0000004f,0x00000002, + 0x0000004e,0x0004003b,0x0000004f,0x00000050,0x00000002,0x0003001d,0x00000061,0x00000018, + 0x0003001e,0x00000062,0x00000061,0x00040020,0x00000063,0x00000002,0x00000062,0x0004003b, + 0x00000063,0x00000064,0x00000002,0x0004002b,0x00000006,0x00000069,0x00000002,0x0003001d, + 0x00000070,0x00000018,0x0003001e,0x00000071,0x00000070,0x00040020,0x00000072,0x00000002, + 0x00000071,0x0004003b,0x00000072,0x00000073,0x00000002,0x0004002b,0x00000006,0x00000078, + 0x00000003,0x00040017,0x0000007c,0x00000018,0x00000004,0x00040020,0x0000007d,0x00000007, + 0x0000007c,0x0004002b,0x00000018,0x00000081,0x3f000000,0x0004002b,0x00000006,0x00000084, + 0x00000008,0x0004002b,0x00000006,0x0000008e,0x00000007,0x0004002b,0x00000009,0x00000093, + 0x00000001,0x0004002b,0x00000009,0x0000009d,0x00000002,0x0004002b,0x00000009,0x000000a7, + 0x00000003,0x0004002b,0x00000006,0x000000a9,0x00000009,0x0004002b,0x00000018,0x000000b0, + 0x00000000,0x0007002c,0x0000007c,0x000000b1,0x000000b0,0x000000b0,0x000000b0,0x000000b0, + 0x0004002b,0x00000018,0x000000b3,0x3f800000,0x0007002c,0x0000007c,0x000000b4,0x000000b3, + 0x000000b3,0x000000b3,0x000000b3,0x0003001d,0x000000ba,0x0000007c,0x0003001e,0x000000bb, + 0x000000ba,0x00040020,0x000000bc,0x00000002,0x000000bb,0x0004003b,0x000000bc,0x000000bd, + 0x00000002,0x0004002b,0x00000006,0x000000be,0x0000000a,0x0003001d,0x000000c3,0x0000007c, + 0x0003001e,0x000000c4,0x000000c3,0x00040020,0x000000c5,0x00000002,0x000000c4,0x0004003b, + 0x000000c5,0x000000c6,0x00000002,0x00040020,0x000000c7,0x00000002,0x0000007c,0x0004002b, + 0x00000009,0x000000d8,0x00000100,0x0006002c,0x0000000a,0x000000d9,0x000000d8,0x00000093, + 0x00000093,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005, + 0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,0x00000007,0x00000022,0x00000007, + 0x0004003b,0x00000007,0x00000028,0x00000007,0x0004003b,0x00000007,0x0000002d,0x00000007, + 0x0004003b,0x00000007,0x00000037,0x00000007,0x0004003b,0x00000042,0x00000043,0x00000007, + 0x0004003b,0x00000042,0x0000004c,0x00000007,0x0004003b,0x00000007,0x00000054,0x00000007, + 0x0004003b,0x00000042,0x0000005e,0x00000007,0x0004003b,0x00000042,0x0000006d,0x00000007, + 0x0004003b,0x0000007d,0x0000007e,0x00000007,0x0004003b,0x0000007d,0x000000af,0x00000007, + 0x0004003b,0x0000007d,0x000000b2,0x00000007,0x00050041,0x0000000e,0x0000000f,0x0000000c, + 0x0000000d,0x0004003d,0x00000009,0x00000010,0x0000000f,0x0004007c,0x00000006,0x00000011, + 0x00000010,0x0003003e,0x00000008,0x00000011,0x000200f9,0x00000012,0x000200f8,0x00000012, + 0x000400f6,0x00000014,0x00000015,0x00000000,0x000200f9,0x00000016,0x000200f8,0x00000016, + 0x0004003d,0x00000006,0x00000017,0x00000008,0x00050041,0x0000001d,0x0000001e,0x0000001b, + 0x0000001c,0x0004003d,0x00000006,0x0000001f,0x0000001e,0x000500b1,0x00000020,0x00000021, + 0x00000017,0x0000001f,0x000400fa,0x00000021,0x00000013,0x00000014,0x000200f8,0x00000013, + 0x0004003d,0x00000006,0x00000023,0x00000008,0x00050041,0x0000001d,0x00000025,0x0000001b, + 0x00000024,0x0004003d,0x00000006,0x00000026,0x00000025,0x0005008b,0x00000006,0x00000027, + 0x00000023,0x00000026,0x0003003e,0x00000022,0x00000027,0x0004003d,0x00000006,0x00000029, + 0x00000008,0x00050041,0x0000001d,0x0000002a,0x0000001b,0x00000024,0x0004003d,0x00000006, + 0x0000002b,0x0000002a,0x00050087,0x00000006,0x0000002c,0x00000029,0x0000002b,0x0003003e, + 0x00000028,0x0000002c,0x0004003d,0x00000006,0x0000002e,0x00000008,0x00050041,0x0000001d, + 0x00000030,0x0000001b,0x0000002f,0x0004003d,0x00000006,0x00000031,0x00000030,0x00050084, + 0x00000006,0x00000032,0x0000002e,0x00000031,0x00050041,0x0000001d,0x00000034,0x0000001b, + 0x00000033,0x0004003d,0x00000006,0x00000035,0x00000034,0x00050084,0x00000006,0x00000036, + 0x00000032,0x00000035,0x0003003e,0x0000002d,0x00000036,0x0003003e,0x00000037,0x00000038, + 0x000200f9,0x00000039,0x000200f8,0x00000039,0x000400f6,0x0000003b,0x0000003c,0x00000000, + 0x000200f9,0x0000003d,0x000200f8,0x0000003d,0x0004003d,0x00000006,0x0000003e,0x00000037, + 0x00050041,0x0000001d,0x0000003f,0x0000001b,0x00000033,0x0004003d,0x00000006,0x00000040, + 0x0000003f,0x000500b1,0x00000020,0x00000041,0x0000003e,0x00000040,0x000400fa,0x00000041, + 0x0000003a,0x0000003b,0x000200f8,0x0000003a,0x0004003d,0x00000006,0x00000048,0x00000037, + 0x00060041,0x00000049,0x0000004a,0x00000047,0x00000038,0x00000048,0x0004003d,0x00000018, + 0x0000004b,0x0000004a,0x0003003e,0x00000043,0x0000004b,0x0004003d,0x00000006,0x00000051, + 0x00000037,0x00060041,0x00000049,0x00000052,0x00000050,0x00000038,0x00000051,0x0004003d, + 0x00000018,0x00000053,0x00000052,0x0003003e,0x0000004c,0x00000053,0x0003003e,0x00000054, + 0x00000038,0x000200f9,0x00000055,0x000200f8,0x00000055,0x000400f6,0x00000057,0x00000058, + 0x00000000,0x000200f9,0x00000059,0x000200f8,0x00000059,0x0004003d,0x00000006,0x0000005a, + 0x00000054,0x00050041,0x0000001d,0x0000005b,0x0000001b,0x0000002f,0x0004003d,0x00000006, + 0x0000005c,0x0000005b,0x000500b1,0x00000020,0x0000005d,0x0000005a,0x0000005c,0x000400fa, + 0x0000005d,0x00000056,0x00000057,0x000200f8,0x00000056,0x0004003d,0x00000006,0x0000005f, + 0x00000022,0x0004006f,0x00000018,0x00000060,0x0000005f,0x0004003d,0x00000006,0x00000065, + 0x00000054,0x00060041,0x00000049,0x00000066,0x00000064,0x00000038,0x00000065,0x0004003d, + 0x00000018,0x00000067,0x00000066,0x00050081,0x00000018,0x00000068,0x00000060,0x00000067, + 0x00050041,0x00000049,0x0000006a,0x0000001b,0x00000069,0x0004003d,0x00000018,0x0000006b, + 0x0000006a,0x00050085,0x00000018,0x0000006c,0x00000068,0x0000006b,0x0003003e,0x0000005e, + 0x0000006c,0x0004003d,0x00000006,0x0000006e,0x00000028,0x0004006f,0x00000018,0x0000006f, + 0x0000006e,0x0004003d,0x00000006,0x00000074,0x00000054,0x00060041,0x00000049,0x00000075, + 0x00000073,0x00000038,0x00000074,0x0004003d,0x00000018,0x00000076,0x00000075,0x00050081, + 0x00000018,0x00000077,0x0000006f,0x00000076,0x00050041,0x00000049,0x00000079,0x0000001b, + 0x00000078,0x0004003d,0x00000018,0x0000007a,0x00000079,0x00050085,0x00000018,0x0000007b, + 0x00000077,0x0000007a,0x0003003e,0x0000006d,0x0000007b,0x0004003d,0x00000018,0x0000007f, + 0x0000005e,0x0004003d,0x00000018,0x00000080,0x00000043,0x00050085,0x00000018,0x00000082, + 0x00000080,0x00000081,0x00050083,0x00000018,0x00000083,0x0000007f,0x00000082,0x00050041, + 0x0000001d,0x00000085,0x0000001b,0x00000084,0x0004003d,0x00000006,0x00000086,0x00000085, + 0x0004006f,0x00000018,0x00000087,0x00000086,0x00050088,0x00000018,0x00000088,0x00000083, + 0x00000087,0x00050041,0x00000042,0x00000089,0x0000007e,0x0000000d,0x0003003e,0x00000089, + 0x00000088,0x0004003d,0x00000018,0x0000008a,0x0000006d,0x0004003d,0x00000018,0x0000008b, + 0x0000004c,0x00050085,0x00000018,0x0000008c,0x0000008b,0x00000081,0x00050083,0x00000018, + 0x0000008d,0x0000008a,0x0000008c,0x00050041,0x0000001d,0x0000008f,0x0000001b,0x0000008e, + 0x0004003d,0x00000006,0x00000090,0x0000008f,0x0004006f,0x00000018,0x00000091,0x00000090, + 0x00050088,0x00000018,0x00000092,0x0000008d,0x00000091,0x00050041,0x00000042,0x00000094, + 0x0000007e,0x00000093,0x0003003e,0x00000094,0x00000092,0x0004003d,0x00000018,0x00000095, + 0x0000005e,0x0004003d,0x00000018,0x00000096,0x00000043,0x00050085,0x00000018,0x00000097, + 0x00000096,0x00000081,0x00050081,0x00000018,0x00000098,0x00000095,0x00000097,0x00050041, + 0x0000001d,0x00000099,0x0000001b,0x00000084,0x0004003d,0x00000006,0x0000009a,0x00000099, + 0x0004006f,0x00000018,0x0000009b,0x0000009a,0x00050088,0x00000018,0x0000009c,0x00000098, + 0x0000009b,0x00050041,0x00000042,0x0000009e,0x0000007e,0x0000009d,0x0003003e,0x0000009e, + 0x0000009c,0x0004003d,0x00000018,0x0000009f,0x0000006d,0x0004003d,0x00000018,0x000000a0, + 0x0000004c,0x00050085,0x00000018,0x000000a1,0x000000a0,0x00000081,0x00050081,0x00000018, + 0x000000a2,0x0000009f,0x000000a1,0x00050041,0x0000001d,0x000000a3,0x0000001b,0x0000008e, + 0x0004003d,0x00000006,0x000000a4,0x000000a3,0x0004006f,0x00000018,0x000000a5,0x000000a4, + 0x00050088,0x00000018,0x000000a6,0x000000a2,0x000000a5,0x00050041,0x00000042,0x000000a8, + 0x0000007e,0x000000a7,0x0003003e,0x000000a8,0x000000a6,0x00050041,0x0000001d,0x000000aa, + 0x0000001b,0x000000a9,0x0004003d,0x00000006,0x000000ab,0x000000aa,0x000500aa,0x00000020, + 0x000000ac,0x000000ab,0x0000001c,0x000300f7,0x000000ae,0x00000000,0x000400fa,0x000000ac, + 0x000000ad,0x000000ae,0x000200f8,0x000000ad,0x0003003e,0x000000af,0x000000b1,0x0003003e, + 0x000000b2,0x000000b4,0x0004003d,0x0000007c,0x000000b5,0x0000007e,0x0004003d,0x0000007c, + 0x000000b6,0x000000af,0x0007000c,0x0000007c,0x000000b7,0x00000001,0x00000028,0x000000b5, + 0x000000b6,0x0004003d,0x0000007c,0x000000b8,0x000000b2,0x0007000c,0x0000007c,0x000000b9, + 0x00000001,0x00000025,0x000000b7,0x000000b8,0x0003003e,0x0000007e,0x000000b9,0x000200f9, + 0x000000ae,0x000200f8,0x000000ae,0x00050041,0x0000001d,0x000000bf,0x0000001b,0x000000be, + 0x0004003d,0x00000006,0x000000c0,0x000000bf,0x0004003d,0x00000006,0x000000c1,0x0000002d, + 0x00050080,0x00000006,0x000000c2,0x000000c0,0x000000c1,0x00060041,0x000000c7,0x000000c8, + 0x000000c6,0x00000038,0x00000038,0x0004003d,0x0000007c,0x000000c9,0x000000c8,0x00060041, + 0x000000c7,0x000000ca,0x000000bd,0x00000038,0x000000c2,0x0003003e,0x000000ca,0x000000c9, + 0x0004003d,0x00000006,0x000000cb,0x0000002d,0x0004003d,0x0000007c,0x000000cc,0x0000007e, + 0x00060041,0x000000c7,0x000000cd,0x000000bd,0x00000038,0x000000cb,0x0003003e,0x000000cd, + 0x000000cc,0x0004003d,0x00000006,0x000000ce,0x0000002d,0x00050080,0x00000006,0x000000cf, + 0x000000ce,0x0000001c,0x0003003e,0x0000002d,0x000000cf,0x000200f9,0x00000058,0x000200f8, + 0x00000058,0x0004003d,0x00000006,0x000000d0,0x00000054,0x00050080,0x00000006,0x000000d1, + 0x000000d0,0x0000001c,0x0003003e,0x00000054,0x000000d1,0x000200f9,0x00000055,0x000200f8, + 0x00000057,0x000200f9,0x0000003c,0x000200f8,0x0000003c,0x0004003d,0x00000006,0x000000d2, + 0x00000037,0x00050080,0x00000006,0x000000d3,0x000000d2,0x0000001c,0x0003003e,0x00000037, + 0x000000d3,0x000200f9,0x00000039,0x000200f8,0x0000003b,0x000200f9,0x00000015,0x000200f8, + 0x00000015,0x00050041,0x0000001d,0x000000d4,0x0000001b,0x00000038,0x0004003d,0x00000006, + 0x000000d5,0x000000d4,0x0004003d,0x00000006,0x000000d6,0x00000008,0x00050080,0x00000006, + 0x000000d7,0x000000d6,0x000000d5,0x0003003e,0x00000008,0x000000d7,0x000200f9,0x00000012, + 0x000200f8,0x00000014,0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/relu.comp b/modules/dnn/src/webgpu/shader/relu.comp new file mode 100644 index 000000000000..2f6d215f6390 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/relu.comp @@ -0,0 +1,23 @@ +#version 450 +#define LOCAL_SZ_X 32 + +layout(binding = 0) buffer inbuf{ + float in_buffer[]; +}; + +layout(binding = 1) buffer outbuf{ + float out_buffer[]; +}; +layout(binding = 2) uniform pushBlock { + int total; + float slope; +} p; +layout(local_size_x = LOCAL_SZ_X, local_size_y = 1, local_size_z = 1) in; +void main() +{ + for (int i = int(gl_GlobalInvocationID.x); i < p.total; i += int(gl_NumWorkGroups.x * gl_WorkGroupSize.x)) + { + float in_val = in_buffer[i]; + out_buffer[i] = in_val >= 0.f ? in_val : p.slope * in_val; + } +} diff --git a/modules/dnn/src/webgpu/shader/relu_spv.cpp b/modules/dnn/src/webgpu/shader/relu_spv.cpp new file mode 100644 index 000000000000..d66875d643e0 --- /dev/null +++ b/modules/dnn/src/webgpu/shader/relu_spv.cpp @@ -0,0 +1,78 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../../precomp.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +extern const unsigned int relu_spv[498] = { + 0x07230203,0x00010000,0x00080009,0x0000004a,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0007000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000c,0x00000040,0x00060010, + 0x00000004,0x00000011,0x00000020,0x00000001,0x00000001,0x00030003,0x00000002,0x000001c2, + 0x00040005,0x00000004,0x6e69616d,0x00000000,0x00030005,0x00000008,0x00000069,0x00080005, + 0x0000000c,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00050005, + 0x00000019,0x68737570,0x636f6c42,0x0000006b,0x00050006,0x00000019,0x00000000,0x61746f74, + 0x0000006c,0x00050006,0x00000019,0x00000001,0x706f6c73,0x00000065,0x00030005,0x0000001b, + 0x00000070,0x00040005,0x00000023,0x765f6e69,0x00006c61,0x00040005,0x00000025,0x75626e69, + 0x00000066,0x00060006,0x00000025,0x00000000,0x625f6e69,0x65666675,0x00000072,0x00030005, + 0x00000027,0x00000000,0x00040005,0x0000002d,0x6274756f,0x00006675,0x00060006,0x0000002d, + 0x00000000,0x5f74756f,0x66667562,0x00007265,0x00030005,0x0000002f,0x00000000,0x00070005, + 0x00000040,0x4e5f6c67,0x6f576d75,0x72476b72,0x7370756f,0x00000000,0x00040047,0x0000000c, + 0x0000000b,0x0000001c,0x00050048,0x00000019,0x00000000,0x00000023,0x00000000,0x00050048, + 0x00000019,0x00000001,0x00000023,0x00000004,0x00030047,0x00000019,0x00000002,0x00040047, + 0x0000001b,0x00000022,0x00000000,0x00040047,0x0000001b,0x00000021,0x00000002,0x00040047, + 0x00000024,0x00000006,0x00000004,0x00050048,0x00000025,0x00000000,0x00000023,0x00000000, + 0x00030047,0x00000025,0x00000003,0x00040047,0x00000027,0x00000022,0x00000000,0x00040047, + 0x00000027,0x00000021,0x00000000,0x00040047,0x0000002c,0x00000006,0x00000004,0x00050048, + 0x0000002d,0x00000000,0x00000023,0x00000000,0x00030047,0x0000002d,0x00000003,0x00040047, + 0x0000002f,0x00000022,0x00000000,0x00040047,0x0000002f,0x00000021,0x00000001,0x00040047, + 0x00000040,0x0000000b,0x00000018,0x00040047,0x00000049,0x0000000b,0x00000019,0x00020013, + 0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001, + 0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000, + 0x00040017,0x0000000a,0x00000009,0x00000003,0x00040020,0x0000000b,0x00000001,0x0000000a, + 0x0004003b,0x0000000b,0x0000000c,0x00000001,0x0004002b,0x00000009,0x0000000d,0x00000000, + 0x00040020,0x0000000e,0x00000001,0x00000009,0x00030016,0x00000018,0x00000020,0x0004001e, + 0x00000019,0x00000006,0x00000018,0x00040020,0x0000001a,0x00000002,0x00000019,0x0004003b, + 0x0000001a,0x0000001b,0x00000002,0x0004002b,0x00000006,0x0000001c,0x00000000,0x00040020, + 0x0000001d,0x00000002,0x00000006,0x00020014,0x00000020,0x00040020,0x00000022,0x00000007, + 0x00000018,0x0003001d,0x00000024,0x00000018,0x0003001e,0x00000025,0x00000024,0x00040020, + 0x00000026,0x00000002,0x00000025,0x0004003b,0x00000026,0x00000027,0x00000002,0x00040020, + 0x00000029,0x00000002,0x00000018,0x0003001d,0x0000002c,0x00000018,0x0003001e,0x0000002d, + 0x0000002c,0x00040020,0x0000002e,0x00000002,0x0000002d,0x0004003b,0x0000002e,0x0000002f, + 0x00000002,0x0004002b,0x00000018,0x00000032,0x00000000,0x0004002b,0x00000006,0x00000039, + 0x00000001,0x0004003b,0x0000000b,0x00000040,0x00000001,0x0004002b,0x00000009,0x00000043, + 0x00000020,0x0004002b,0x00000009,0x00000048,0x00000001,0x0006002c,0x0000000a,0x00000049, + 0x00000043,0x00000048,0x00000048,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003, + 0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,0x00000022, + 0x00000023,0x00000007,0x0004003b,0x00000022,0x00000034,0x00000007,0x00050041,0x0000000e, + 0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000009,0x00000010,0x0000000f,0x0004007c, + 0x00000006,0x00000011,0x00000010,0x0003003e,0x00000008,0x00000011,0x000200f9,0x00000012, + 0x000200f8,0x00000012,0x000400f6,0x00000014,0x00000015,0x00000000,0x000200f9,0x00000016, + 0x000200f8,0x00000016,0x0004003d,0x00000006,0x00000017,0x00000008,0x00050041,0x0000001d, + 0x0000001e,0x0000001b,0x0000001c,0x0004003d,0x00000006,0x0000001f,0x0000001e,0x000500b1, + 0x00000020,0x00000021,0x00000017,0x0000001f,0x000400fa,0x00000021,0x00000013,0x00000014, + 0x000200f8,0x00000013,0x0004003d,0x00000006,0x00000028,0x00000008,0x00060041,0x00000029, + 0x0000002a,0x00000027,0x0000001c,0x00000028,0x0004003d,0x00000018,0x0000002b,0x0000002a, + 0x0003003e,0x00000023,0x0000002b,0x0004003d,0x00000006,0x00000030,0x00000008,0x0004003d, + 0x00000018,0x00000031,0x00000023,0x000500be,0x00000020,0x00000033,0x00000031,0x00000032, + 0x000300f7,0x00000036,0x00000000,0x000400fa,0x00000033,0x00000035,0x00000038,0x000200f8, + 0x00000035,0x0004003d,0x00000018,0x00000037,0x00000023,0x0003003e,0x00000034,0x00000037, + 0x000200f9,0x00000036,0x000200f8,0x00000038,0x00050041,0x00000029,0x0000003a,0x0000001b, + 0x00000039,0x0004003d,0x00000018,0x0000003b,0x0000003a,0x0004003d,0x00000018,0x0000003c, + 0x00000023,0x00050085,0x00000018,0x0000003d,0x0000003b,0x0000003c,0x0003003e,0x00000034, + 0x0000003d,0x000200f9,0x00000036,0x000200f8,0x00000036,0x0004003d,0x00000018,0x0000003e, + 0x00000034,0x00060041,0x00000029,0x0000003f,0x0000002f,0x0000001c,0x00000030,0x0003003e, + 0x0000003f,0x0000003e,0x000200f9,0x00000015,0x000200f8,0x00000015,0x00050041,0x0000000e, + 0x00000041,0x00000040,0x0000000d,0x0004003d,0x00000009,0x00000042,0x00000041,0x00050084, + 0x00000009,0x00000044,0x00000042,0x00000043,0x0004007c,0x00000006,0x00000045,0x00000044, + 0x0004003d,0x00000006,0x00000046,0x00000008,0x00050080,0x00000006,0x00000047,0x00000046, + 0x00000045,0x0003003e,0x00000008,0x00000047,0x000200f9,0x00000012,0x000200f8,0x00000014, + 0x000100fd,0x00010038 +}; + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/shader/spv_shader.hpp b/modules/dnn/src/webgpu/shader/spv_shader.hpp index 9a2d3b31035d..7440ff4dbbff 100644 --- a/modules/dnn/src/webgpu/shader/spv_shader.hpp +++ b/modules/dnn/src/webgpu/shader/spv_shader.hpp @@ -11,7 +11,17 @@ namespace cv { namespace dnn { namespace webgpu { +extern const unsigned int lrn_spv[1841]; +extern const unsigned int permute_spv[749]; +extern const unsigned int dw_conv_spv[1754]; +extern const unsigned int conv_spv[1888]; +extern const unsigned int relu_spv[498]; extern const unsigned int softmax_spv[1500]; +extern const unsigned int avg_pool_spv[1538]; +extern const unsigned int conv48_spv[10161]; +extern const unsigned int concat_spv[541]; +extern const unsigned int prior_box_spv[1460]; +extern const unsigned int max_pool_spv[1445]; }}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/buffer.cpp b/modules/dnn/src/webgpu/src/buffer.cpp index 77fb4f4dcdaa..58b33845aa90 100644 --- a/modules/dnn/src/webgpu/src/buffer.cpp +++ b/modules/dnn/src/webgpu/src/buffer.cpp @@ -1,10 +1,13 @@ -#include "../include/buffer.hpp" +#include #include "../dawn/dawnUtils.hpp" +#include "../../precomp.hpp" #include "common.hpp" -#include +#include "internal.hpp" +#include "../include/buffer.hpp" + namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU Buffer::Buffer(std::shared_ptr device) { device_ = device; @@ -72,6 +75,6 @@ const void* Buffer::MapReadAsyncAndWait() return mappedData; } -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} //namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/common.hpp b/modules/dnn/src/webgpu/src/common.hpp index c0db85896e0a..a22a5d2b2083 100644 --- a/modules/dnn/src/webgpu/src/common.hpp +++ b/modules/dnn/src/webgpu/src/common.hpp @@ -11,33 +11,65 @@ #include #include #include -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU #include -// #endif +#endif // HAVE_WEBGPU #include "opencv2/core/utils/logger.hpp" #include "../shader/spv_shader.hpp" -#include "../../precomp.hpp" #include "../include/wgpucom.hpp" -#include "context.hpp" namespace cv { namespace dnn { namespace webgpu { - -// #ifdef HAVE_WEBGPU - +#ifdef HAVE_WEBGPU extern std::shared_ptr wDevice; extern std::shared_ptr wQueue; extern cv::Mutex wContextMtx; enum ShapeIdx { - kShapeIdxBatch = 0, - kShapeIdxChannel, - kShapeIdxHeight, - kShapeIdxWidth, + wShapeIdxBatch = 0, + wShapeIdxChannel, + wShapeIdxHeight, + wShapeIdxWidth, }; +#define _CHECK_RESULT(f) \ +{ \ + if (f != 0) \ + { \ + CV_LOG_ERROR(NULL, "check failed, result = " << (int)f); \ + CV_Error(Error::StsError, "check failed"); \ + } \ +} + +#define WGPU_CHECK_BOOL_RET_VAL(val, ret) \ +{ \ + bool res = (val); \ + if (!res) \ + { \ + CV_LOG_WARNING(NULL, "Check bool failed"); \ + return ret; \ + } \ +} + +#define WGPU_CHECK_POINTER_RET_VOID(p) \ +{ \ + if (NULL == (p)) \ + { \ + CV_LOG_WARNING(NULL, "Check pointer failed"); \ + return; \ + } \ +} + +#define WGPU_CHECK_POINTER_RET_VAL(p, val) \ +{ \ + if (NULL == (p)) \ + { \ + CV_LOG_WARNING(NULL, "Check pointer failed"); \ + return (val); \ + } \ +} -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU -}}} // namespace cv::dnn::vkcom +}}} // namespace cv::dnn::webgpu #endif // OPENCV_DNN_WEBGPU_COMMON_HPP \ No newline at end of file diff --git a/modules/dnn/src/webgpu/src/context.cpp b/modules/dnn/src/webgpu/src/context.cpp index 8791e9fa6525..d45d9d62f8c9 100644 --- a/modules/dnn/src/webgpu/src/context.cpp +++ b/modules/dnn/src/webgpu/src/context.cpp @@ -1,11 +1,10 @@ #include "../../precomp.hpp" #include "common.hpp" #include "context.hpp" -#include #include "../dawn/dawnUtils.hpp" -#include + namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU std::shared_ptr wCtx; std::shared_ptr wDevice; @@ -48,6 +47,6 @@ Context::~Context() wQueue->Release(); } -// #endif +#endif // HAVE_WEBGPU }}} // namespace cv::dnn::webgpu \ No newline at end of file diff --git a/modules/dnn/src/webgpu/src/context.hpp b/modules/dnn/src/webgpu/src/context.hpp index 1588fab79192..cd1bc25d257a 100644 --- a/modules/dnn/src/webgpu/src/context.hpp +++ b/modules/dnn/src/webgpu/src/context.hpp @@ -2,9 +2,9 @@ #define OPENCV_DNN_WEBGPU_CONTEXT_HPP namespace cv { namespace dnn { namespace webgpu { +#ifdef HAVE_WEBGPU class Context { -// #ifdef HAVE_WEBGPU public: Context(); @@ -13,7 +13,7 @@ class Context void createContext(); -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/internal.cpp b/modules/dnn/src/webgpu/src/internal.cpp index a888810de1a5..233ea417e4ed 100644 --- a/modules/dnn/src/webgpu/src/internal.cpp +++ b/modules/dnn/src/webgpu/src/internal.cpp @@ -11,7 +11,7 @@ namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU // std::vector compile(const std::string& name, // shaderc_shader_kind kind, @@ -47,27 +47,19 @@ namespace cv { namespace dnn { namespace webgpu { void bindTensor(Tensor& tensor, uint32_t binding, std::vector& bgEntries) { - wgpu::BindGroupEntry bgEntry = {}; - bgEntry.binding = binding; - bgEntry.buffer = * tensor.getBuffer()->getWebGPUBuffer(); - bgEntry.offset = 0; - bgEntry.size = tensor.size(); - bgEntry.sampler = nullptr; - bgEntry.textureView = nullptr; - bgEntries.push_back(bgEntry); + if(bgEntries.size() < binding) + CV_Error(Error::StsBadArg, "Binding buffer num does not match"); + bgEntries.at(binding).buffer = * tensor.getBuffer()->getWebGPUBuffer(); + bgEntries.at(binding).size = tensor.size(); } void bindUniform(Buffer& buffer, uint32_t binding, std::vector& bgEntries) { - wgpu::BindGroupEntry bgEntry = {}; - bgEntry.binding = binding; - bgEntry.buffer = * buffer.getWebGPUBuffer(); - bgEntry.offset = 0; - bgEntry.size = buffer.getSize(); - bgEntry.sampler = nullptr; - bgEntry.textureView = nullptr; - bgEntries.push_back(bgEntry); + if(bgEntries.size() < binding) + CV_Error(Error::StsBadArg, "Binding buffer num does not match"); + bgEntries.at(binding).buffer = * buffer.getWebGPUBuffer(); + bgEntries.at(binding).size = buffer.getSize(); } void computeConvOutputShapeAndPadding(const PaddingMode& padding_mode, @@ -157,7 +149,7 @@ void computePoolOutputShape(const PaddingMode& padding_mode, } } -// #endif +#endif // HAVE_WEBGPU }}} //namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/internal.hpp b/modules/dnn/src/webgpu/src/internal.hpp index 94b1bf316fb3..61c22d0db55c 100644 --- a/modules/dnn/src/webgpu/src/internal.hpp +++ b/modules/dnn/src/webgpu/src/internal.hpp @@ -14,7 +14,7 @@ typedef int shaderc_shader_kind; namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU std::vector compile(const std::string& name, shaderc_shader_kind kind, const std::string& data); @@ -76,7 +76,7 @@ inline int shapeCount(const Shape& shape, int start = -1, int end = -1) } return elems; } -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} //namespace::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_base.cpp b/modules/dnn/src/webgpu/src/op_base.cpp index ac104d3da555..5312c2278cf5 100644 --- a/modules/dnn/src/webgpu/src/op_base.cpp +++ b/modules/dnn/src/webgpu/src/op_base.cpp @@ -6,7 +6,7 @@ #include namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU OpBase::OpBase() { createContext(); @@ -28,8 +28,7 @@ OpBase::~OpBase() pipeline_layout_.Release(); cmd_buffer_.Release(); } -// the wgpu::BindingType has to be specified -// UniformBuffer | StorageBuffer | ReadOnlyStorageBuffer | MapReadBuffer + void OpBase::createBindGroupLayout(int buffer_num) { if(buffer_num <= 0) @@ -42,17 +41,29 @@ void OpBase::createBindGroupLayout(int buffer_num) entry.type = wgpu::BindingType::StorageBuffer; entriesInitializer.push_back(entry); } - if(needsUniform) { - wgpu::BindGroupLayoutEntry entry = {}; - entry.binding = buffer_num; - entry.visibility = wgpu::ShaderStage::Compute; - entry.type = wgpu::BindingType::UniformBuffer; - entriesInitializer.push_back(entry); - } + // unfirom buffer + wgpu::BindGroupLayoutEntry entry = {}; + entry.binding = buffer_num; + entry.visibility = wgpu::ShaderStage::Compute; + entry.type = wgpu::BindingType::UniformBuffer; + entriesInitializer.push_back(entry); + wgpu::BindGroupLayoutDescriptor descriptor; descriptor.entryCount = entriesInitializer.size(); descriptor.entries = entriesInitializer.data(); bindgrouplayout_ = device_->CreateBindGroupLayout(&descriptor); + + for(int i = 0; i <= buffer_num; i++) + { + wgpu::BindGroupEntry bgEntry = {}; + bgEntry.binding = i; + bgEntry.buffer = nullptr; + bgEntry.offset = 0; + bgEntry.size = 0; + bgEntry.sampler = nullptr; + bgEntry.textureView = nullptr; + bgEntries.push_back(bgEntry); + } } void OpBase::createBindGroup() @@ -113,28 +124,12 @@ void OpBase::createCommandBuffer() cmd_buffer_ = encoder.Finish(); } -wgpu::FenceCompletionStatus OpBase::WaitForCompletedValue( - wgpu::Fence fence, uint64_t completedValue) -{ - if (fence.GetCompletedValue() < completedValue) - { - device_->Tick(); - usleep(100); - } - if(fence.GetCompletedValue() != completedValue) - { - return wgpu::FenceCompletionStatus::Error; - } - - return wgpu::FenceCompletionStatus::Success; -} - void OpBase::runCommandBuffer() { cv::AutoLock lock(wContextMtx); wQueue->Submit(1, &cmd_buffer_); } -// #endif //HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} // namsspace cv::dnn::webgpu \ No newline at end of file diff --git a/modules/dnn/src/webgpu/src/op_concat.cpp b/modules/dnn/src/webgpu/src/op_concat.cpp new file mode 100644 index 000000000000..75cb314c7c4e --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_concat.cpp @@ -0,0 +1,137 @@ +#include "../../precomp.hpp" +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_concat.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +#define LOCAL_SZ_X 256 + +struct ConcatParam { + int out_concat_axis; + int accumulated_concat_axis; + int concat_size; + int total_concat_size; + int thread_num; +}; + +OpConcat::OpConcat(const int axis) +{ + init(axis); + type_ = "Concat"; +} +OpConcat::~OpConcat() +{ + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} +bool OpConcat::init(const int axis) +{ + axis_ = axis; +#define BUFFER_NUM 2 + OpBase::createBindGroupLayout(BUFFER_NUM); + return true; +} + +void OpConcat::reshapeOutTensor(std::vector& in, Tensor& out) +{ + int sum_axis = 0; + + for (int i = 0; i < in.size(); ++i) + { + sum_axis += in[i]->dimSize(axis_); + } + + Shape shape = in[0]->getShape(); + shape[axis_] = sum_axis; + out.reshape(NULL, shape); +} + +bool OpConcat::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + return forward(ins, outs[0]); +} + +bool OpConcat::forward(std::vector& ins, Tensor& out) +{ + int input_num = ins.size(); + Tensor& first_tensor = ins[0]; + int sum_axis = first_tensor.dimSize(axis_); + int dim_num = first_tensor.dimNum(); + for (int i = 1; i < input_num; ++i) + { + Tensor& tensor = ins[i]; + assert(tensor.dimNum() == dim_num); + for (int d = 0; d < dim_num; ++d) + { + if (d == axis_) + { + sum_axis += tensor.dimSize(axis_);; + } + else + { + assert(first_tensor.dimSize(d) == tensor.dimSize(d)); + } + } + } + + assert(out.dimSize(axis_) == sum_axis); + for (int d = 0; d < dim_num; ++d) + { + if (d != axis_) + { + assert(out.dimSize(d) == first_tensor.dimSize(d)); + } + } + out_concat_axis_ = sum_axis; + concat_size_ = out.count(axis_ + 1); + if(pipeline_ == nullptr) + { + config_.local_size_x = LOCAL_SZ_X; + config_.block_height = 1; + config_.block_width = 1; + config_.block_depth = 1; + createShaderModule(concat_spv, sizeof(concat_spv)/sizeof(uint32_t)); + createComputePipeline(); + } + + accumulated_concat_axis_ = 0; + for (int i = 0; i < input_num; i++) + { + bindTensor(ins[i], 0, bgEntries); + bindTensor(out, 1, bgEntries); + total_concat_size_ = ins[i].count(axis_); + thread_num_ = ins[i].count(); + computeGroupCount(); + ConcatParam param = {out_concat_axis_, + accumulated_concat_axis_, + concat_size_, + total_concat_size_, + thread_num_}; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(ConcatParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(ConcatParam)); + bindUniform(* uniformBuffer_, BUFFER_NUM, bgEntries); + createBindGroup(); + createCommandBuffer(); + runCommandBuffer(); + accumulated_concat_axis_ += ins[i].dimSize(axis_); + } + return true; +} + +bool OpConcat::computeGroupCount() +{ + group_x_ = alignSize(thread_num_, config_.local_size_x) / config_.local_size_x; + group_y_ = 1; + group_z_ = 1; + + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_conv.cpp b/modules/dnn/src/webgpu/src/op_conv.cpp new file mode 100644 index 000000000000..cb01088208f0 --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_conv.cpp @@ -0,0 +1,297 @@ +#include "../../precomp.hpp" +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_softmax.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +#define DEFAULT_LOCAL_SZ 256 +#define MAX_COMPUTE_GFLOPS 10 + +#define MAX_GROUP_COUNT_X 65535 +#define MAX_GROUP_COUNT_Y 65535 +#define MAX_GROUP_COUNT_Z 65535 + +struct ShaderConstant { + int lsz_x; + int lsz_y; + int lsz_z; + int in_h; + int in_w; + int out_w; + int stride_h; + int stride_w; + int pad_h; + int pad_w; + int filter_h; + int filter_w; + int channels; + int batch; + int m; + int k; + int n; + int tail_m; + int dilation_h; + int dilation_w; +}; + +struct ShaderParam { + int in_h; + int in_w; + int out_h; + int out_w; + int stride_h; + int stride_w; + int pad_h; + int pad_w; + int filter_h; + int filter_w; + int dilation_h; + int dilation_w; + int channels; + int batch; + int has_bias; + int M; + int K; + int N; + int basic_shader_batch_idx; + int basic_shader_partition_idx; + int basic_shader_partition_size; +}; + +OpConv::OpConv(const int out_channel, const bool has_bias, + const int* filter_size, const int* pad, + const int* stride, const int* dilation, + const int activation, const int group, + const int padding_mode) +{ + init(out_channel, has_bias, filter_size, pad, + stride, dilation, activation, group, padding_mode); + type_ = "Conv"; +} + +OpConv::~OpConv() +{ + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} + +void OpConv::reshapeOutTensor(Tensor& in, Tensor& out) +{ + Shape in_shape = in.getShape(); + batch_ = in_shape[wShapeIdxBatch]; + in_height_ = in_shape[wShapeIdxHeight]; + in_width_ = in_shape[wShapeIdxWidth]; + computeConvOutputShapeAndPadding(padding_mode_, padding_top_, padding_left_, + in_height_, in_width_, + filter_height_, filter_width_, + dilation_height_, dilation_width_, + stride_height_, stride_width_, + out_height_, out_width_); + Shape shape = {batch_, out_channel_, out_height_, out_width_}; + out.reshape(NULL, shape); +} + +bool OpConv::init(const int out_channel, const bool has_bias, + const int* filter_size, const int* pad, + const int* stride, const int* dilation, + const int activation, const int group, + const int padding_mode) +{ + out_channel_ = out_channel; + filter_height_ = filter_size[0]; + filter_width_ = filter_size[1]; + padding_top_ = pad[0]; + padding_left_ = pad[1]; + stride_height_ = stride[0]; + stride_width_ = stride[1]; + dilation_height_ = dilation[0]; + dilation_width_ = dilation[1]; + padding_mode_ = (PaddingMode)padding_mode; + has_bias_ = has_bias ? 1 : 0; + activation_ = activation; + group_ = group; + + #define BUFFER_NUM 4 + OpBase::createBindGroupLayout(BUFFER_NUM); + return true; +} + +bool OpConv::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + std::vector shape = {1}; + Tensor bias(0, shape); + + if (has_bias_) + { + assert(blobs.size() == 2); + bias = blobs[1]; + } + + return forward(ins[0], blobs[0], bias, outs[0]); +} + +bool OpConv::forward(Tensor& in, Tensor& filter_weights, Tensor& bias, Tensor& out) +{ + Shape in_shape = in.getShape(); + Shape out_shape = out.getShape(); + batch_ = in_shape[wShapeIdxBatch]; + in_height_ = in_shape[wShapeIdxHeight]; + in_width_ = in_shape[wShapeIdxWidth]; + in_channel_= in_shape[wShapeIdxChannel]; + out_height_ = out_shape[wShapeIdxHeight]; + out_width_ = out_shape[wShapeIdxWidth]; + int M = out_height_ * out_width_; + int K = filter_height_ * filter_width_ * in_channel_; + int N = out_channel_; + if(pipeline_ == nullptr) + { + config_.local_size_x = DEFAULT_LOCAL_SZ; + config_.local_size_y = 1; + config_.local_size_z = 1; + config_.block_height = 1; + config_.block_width = 1; + config_.block_depth = 1; + if ((N % 8 == 0) && (K % 4 == 0) && (M % 4) == 0) + { + assert(group_ == 1); // TODO: support group > 1 + config_.shader_type = wConvShaderType48; + config_.local_size_x = 1; + config_.local_size_y = DEFAULT_LOCAL_SZ; + config_.local_size_z = 1; + config_.block_height = 4; + config_.block_width = 8; + createShaderModule(conv48_spv, sizeof(conv48_spv)/sizeof(uint32_t)); + } + else if (out_channel_ == in_channel_ && in_channel_ == group_) + { + config_.shader_type = wConvShaderTypeDepthWise; + createShaderModule(dw_conv_spv, sizeof(dw_conv_spv)/sizeof(uint32_t)); + } + else + { + assert(group_ == 1); // TODO: support group > 1 + config_.shader_type = wConvShaderTypeBasic; + createShaderModule(conv_spv, sizeof(conv_spv)/sizeof(uint32_t)); + } + createComputePipeline(); + computeGroupCount(); + } + + bindTensor(in, 0, bgEntries); + bindTensor(bias, 1, bgEntries); + bindTensor(filter_weights, 2, bgEntries); + bindTensor(out, 3, bgEntries); + + if (config_.shader_type == wConvShaderTypeBasic || config_.shader_type == wConvShaderTypeDepthWise) + { + ShaderParam param = {in_height_, in_width_, + out_height_, out_width_, + stride_height_, stride_width_, + padding_top_, padding_left_, + filter_height_, filter_width_, + dilation_height_, dilation_width_, + in_channel_, batch_, has_bias_, + M, K, N, 0, 0, 0}; + int partition_num = 1; + if (config_.shader_type == wConvShaderTypeBasic) + { + param.basic_shader_partition_size = group_y_; + partition_num = (int)ceil(1.0 * out_channel_ / group_y_); + } + + for (int b = 0; b < batch_; b++) + { + param.basic_shader_batch_idx = b; + for (int n = 0; n < partition_num; n++) + { + param.basic_shader_partition_idx = n; + } + } + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(ShaderParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(ShaderParam)); + } else if(config_.shader_type == wConvShaderType48) + { + ShaderConstant shader_constant; + shader_constant.lsz_x = config_.local_size_x; + shader_constant.lsz_y = config_.local_size_y; + shader_constant.lsz_z = config_.local_size_z; + shader_constant.in_h = in_height_; + shader_constant.in_w = in_width_; + shader_constant.out_w = out_width_; + shader_constant.stride_h = stride_height_; + shader_constant.stride_w = stride_width_; + shader_constant.pad_h = padding_top_; + shader_constant.pad_w = padding_left_; + shader_constant.filter_h = filter_height_; + shader_constant.filter_w = filter_width_; + shader_constant.channels = in_channel_; + shader_constant.batch = batch_; + shader_constant.m = M; + shader_constant.k = K; + shader_constant.n = N; + shader_constant.tail_m = M % 4; + shader_constant.dilation_h = dilation_height_; + shader_constant.dilation_w = dilation_width_; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(&shader_constant, sizeof(ShaderConstant)); + else uniformBuffer_->setBufferData(&shader_constant, sizeof(ShaderConstant)); + } + + bindUniform(*uniformBuffer_, 4, bgEntries); + + createBindGroup(); + createCommandBuffer(); + runCommandBuffer(); + return true; +} + +bool OpConv::computeGroupCount() +{ + if (config_.shader_type == wConvShaderTypeDepthWise) + { + group_x_ = alignSize(out_width_, config_.local_size_x) / config_.local_size_x; + group_y_ = alignSize(out_height_, config_.local_size_y) / config_.local_size_y; + group_z_ = alignSize(in_channel_, config_.local_size_z) / config_.local_size_z; + return true; + } + + int M = out_height_ * out_width_; + int N = out_channel_; + + if (config_.shader_type == wConvShaderTypeBasic) + { + + group_x_ = alignSize(out_height_ * out_width_, config_.local_size_x) / config_.local_size_x; + float GFLOPS = (2.0 * filter_height_ * filter_width_ * in_channel_ + 1) * + (out_channel_ * out_height_ * out_width_) / 1000 / 1000 / 1000; + CV_Assert(config_.local_size_y == 1); + group_y_ = std::min(MAX_GROUP_COUNT_Y, (int)floor(MAX_COMPUTE_GFLOPS / (GFLOPS / out_channel_))); + group_z_ = 1; + } + else if (config_.shader_type == wConvShaderType48) + { + assert(config_.block_width == 8 && + config_.block_height == 4 && + config_.block_depth == 1 && + config_.local_size_z == 1); + group_x_ = N / config_.block_width; + group_y_ = alignSize(alignSize(M, 4) / 4, config_.local_size_y) / config_.local_size_y; + group_z_ = batch_; + } + else + CV_Assert(0); + + CV_Assert(group_x_ <= MAX_GROUP_COUNT_X); + CV_Assert(group_y_ <= MAX_GROUP_COUNT_Y); + CV_Assert(group_z_ <= MAX_GROUP_COUNT_Z); + + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_lrn.cpp b/modules/dnn/src/webgpu/src/op_lrn.cpp new file mode 100644 index 000000000000..0eea2faf796e --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_lrn.cpp @@ -0,0 +1,115 @@ +#include "../../precomp.hpp" +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_lrn.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +#define LOCAL_SZ_X 256 +#define LOCAL_SZ_Y 1 +#define LOCAL_SZ_Z 1 + +struct LRNParam { + int thread_num; + int channels; + int height; + int width; + int filter_len; + int radius; + float alpha; + float bias; + float negative_beta; +}; + +OpLRN::OpLRN(const int radius, const float bias, + const float alpha, const float beta, + const bool norm_by_size) +{ + init(radius, bias, alpha, beta, norm_by_size); + type_ = "LRN"; +} + +OpLRN::~OpLRN() +{ + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} +void OpLRN::reshapeOutTensor(Tensor& in, Tensor& out) +{ + Shape shape = in.getShape(); + out.reshape(NULL, shape); +} + +bool OpLRN::init(const int radius, const float bias, + const float alpha, const float beta, + const bool norm_by_size) +{ + radius_ = radius; + filter_len_ = 2 * radius_ + 1; + bias_ = bias; + alpha_ = alpha; + beta_ = beta; + norm_by_size_ = norm_by_size; + OpBase::createBindGroupLayout(2); + return true; +} + +bool OpLRN::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + return forward(ins[0], outs[0]); +} + +bool OpLRN::forward(Tensor& in, Tensor& out) +{ + Shape in_shape = in.getShape(); + batch_ = in_shape[wShapeIdxBatch]; + height_ = in_shape[wShapeIdxHeight]; + width_ = in_shape[wShapeIdxWidth]; + channels_= in_shape[wShapeIdxChannel]; + thread_num_ = batch_ * height_ * width_; + if(pipeline_ == nullptr) + { + config_.local_size_x = LOCAL_SZ_X; + config_.local_size_y = LOCAL_SZ_Y; + config_.local_size_z = LOCAL_SZ_Z; + config_.block_height = 1; + config_.block_width = 1; + config_.block_depth = 1; + config_.shader_type = kLRNShaderTypeBasic; + createShaderModule(lrn_spv, sizeof(lrn_spv)/sizeof(uint32_t)); + createComputePipeline(); + computeGroupCount(); + } + + bindTensor(in, 0, bgEntries); + bindTensor(out,1, bgEntries); + LRNParam param = {batch_ * height_ * width_, + channels_, height_, width_, + filter_len_, radius_, + alpha_ / (norm_by_size_ ? filter_len_ : 1), + bias_, -1 * beta_}; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(LRNParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(LRNParam)); + bindUniform(* uniformBuffer_, 2, bgEntries); + createBindGroup(); + createCommandBuffer(); + runCommandBuffer();; + return true; +} + +bool OpLRN::computeGroupCount() +{ + group_x_ = alignSize(thread_num_, config_.local_size_x) / config_.local_size_x; + group_y_ = 1; + group_z_ = 1; + + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::vkcom diff --git a/modules/dnn/src/webgpu/src/op_permute.cpp b/modules/dnn/src/webgpu/src/op_permute.cpp new file mode 100644 index 000000000000..818bfd86b7bf --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_permute.cpp @@ -0,0 +1,184 @@ +#include "../../precomp.hpp" +#include +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_permute.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +struct PermuteParam { + int global_size; + int num_axes; + int nthreads; +}; + +static bool needForPermutation(std::vector& order) +{ + for (int i = 0; i < order.size(); ++i) + { + if (order[i] != i) + return true; + } + return false; +} + +OpPermute::OpPermute(std::vector& order) +{ + order_.assign(order.begin(), order.end()); + dims_ = order.size(); + need_permute_ = needForPermutation(order_); + type_ = "Permute"; + if (need_permute_) + createBindGroupLayout(5); +} + +OpPermute::~OpPermute() +{ + if(tensor_new_stride_) + delete tensor_new_stride_; + if(tensor_old_stride_) + delete tensor_old_stride_; + if(tensor_order_) + delete tensor_order_; + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} + +void OpPermute::reshapeOutTensor(std::vector& ins, std::vector& outs) +{ + assert(!ins.empty()); + assert(ins.size() == outs.size()); + + if (need_permute_) + { + assert(dims_ == ins[0]->dimNum()); + + Shape shape_before = ins[0]->getShape(); + Shape shape_after; + for (size_t i = 0; i < dims_; i++) + { + shape_after.push_back(shape_before[order_[i]]); + } + + for (size_t i = 0; i < ins.size(); i++) + { + assert(ins[i]->dimNum() == 4); + assert(ins[i]->dimSize(2) == shape_before[2] && ins[i]->dimSize(3) == shape_before[3]); + assert(ins[i]->count() == shapeCount(shape_after)); + outs[i].reshape(NULL, shape_after); + } + } + else + { + for(int i = 0; i < ins.size(); i++) + { + Shape in_shape = ins[i]->getShape(); + outs[i].reshape(NULL, in_shape); + } + } +} + +void OpPermute::prepareStrides(const Shape &shape_before, const Shape &shape_after) +{ + assert(shape_before.size() == dims_); + assert(shape_after.size() == dims_); + + old_stride_.resize(dims_); + new_stride_.resize(dims_); + + old_stride_[dims_ - 1] = 1; + new_stride_[dims_ - 1] = 1; + + for(int i = dims_ - 2; i >= 0; i--) + { + old_stride_[i] = old_stride_[i + 1] * shape_before[i + 1]; + new_stride_[i] = new_stride_[i + 1] * shape_after[i + 1]; + } + + Shape shape(1, old_stride_.size()); + if(! tensor_old_stride_) + tensor_old_stride_ = new Tensor(old_stride_.data(), shape, wFormatInt32); + else + tensor_old_stride_->reshape((const char*)old_stride_.data(), shape, wFormatInt32); + if(! tensor_new_stride_) + tensor_new_stride_ = new Tensor(new_stride_.data(), shape, wFormatInt32); + else + tensor_new_stride_->reshape((const char*)new_stride_.data(), shape, wFormatInt32); +} + +bool OpPermute::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + return forward(ins, outs); +} + +bool OpPermute::forward(std::vector& ins, std::vector& outs) +{ + int num_ins = ins.size(); + in_shape_ = ins[0].getShape(); + out_shape_ = outs[0].getShape(); + if (!need_permute_) + { + for (int i = 0; i < num_ins; i++) + { + assert(outs[i].count() == ins[i].count()); + if (outs[i].getBuffer() != ins[i].getBuffer()) + ins[i].copyTo(outs[i]); + } + return true; + } + + if (pipeline_ == nullptr) + { + createShaderModule(permute_spv, sizeof(permute_spv)/sizeof(uint32_t)); + createComputePipeline(); + } + + prepareStrides(ins[0].getShape(), outs[0].getShape()); + std::vectorshape(1, order_.size()); + if(! tensor_order_) + tensor_order_ = new Tensor(order_.data(), shape, wFormatInt32); + else + tensor_order_->reshape((const char*)order_.data(), shape, wFormatInt32); + bindTensor(ins[0], 0, bgEntries); + bindTensor(* tensor_order_, 1, bgEntries); + bindTensor(* tensor_old_stride_, 2, bgEntries); + bindTensor(* tensor_new_stride_, 3, bgEntries); + bindTensor(outs[0], 4, bgEntries); + + nthreads_ = ins[0].count(); +#define LOCAL_SZ_X 256 + global_size_ = alignSize(nthreads_, LOCAL_SZ_X); + computeGroupCount(); + + PermuteParam param = {global_size_, dims_, nthreads_}; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(PermuteParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(PermuteParam)); + bindUniform(* uniformBuffer_, 5, bgEntries); + + for (int i = 0; i < num_ins; i++) + { + bindTensor(ins[i], 0, bgEntries); + bindTensor(outs[i], 4, bgEntries); + + createBindGroup(); + createCommandBuffer(); + runCommandBuffer(); + } + return true; +} + +bool OpPermute::computeGroupCount() +{ + group_x_ = global_size_ / LOCAL_SZ_X; + group_y_ = 1; + group_z_ = 1; + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_pool.cpp b/modules/dnn/src/webgpu/src/op_pool.cpp new file mode 100644 index 000000000000..86cbfbbea7e1 --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_pool.cpp @@ -0,0 +1,163 @@ +#include "../../precomp.hpp" +#include +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_pool.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +#define LOCAL_SZ_X 256 +#define LOCAL_SZ_Y 1 +#define LOCAL_SZ_Z 1 + +struct PoolParam { + int channels; + int in_height; + int in_width; + int out_height; + int out_width; + int padding_top; + int padding_left; + int filter_h; + int filter_w; + int stride_h; + int stride_w; + int total; + int mask_or_padded_area; +}; + +OpPool::OpPool(const int* filter_size, const int* pad, const int* stride, + const int padding_mode, const PoolType type, + const bool avg_pool_padded_area) +{ + init(filter_size, pad, stride, padding_mode, type, avg_pool_padded_area); + type_ = "Pool"; +} + +OpPool::~OpPool() +{ + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} + +bool OpPool::init(const int* filter_size, const int* pad, const int* stride, + const int padding_mode, const PoolType type, bool avg_pool_padded_area) +{ + WGPU_CHECK_BOOL_RET_VAL(padding_mode >= 0 && padding_mode < wPaddingModeNum, false); + WGPU_CHECK_POINTER_RET_VAL(filter_size, false); + WGPU_CHECK_POINTER_RET_VAL(pad, false); + WGPU_CHECK_POINTER_RET_VAL(stride, false); + + filter_height_ = filter_size[0]; + filter_width_ = filter_size[1]; + padding_top_ = pad[0]; + padding_left_ = pad[1]; + padding_mode_ = (PaddingMode)padding_mode; + stride_height_ = stride[0]; + stride_width_ = stride[1]; + pool_type_ = type; + avg_pool_padded_area_ = avg_pool_padded_area ? 1 : 0; + + if (pool_type_ == wPoolTypeAvg) + createBindGroupLayout(2); + else if (pool_type_ == wPoolTypeMax) + createBindGroupLayout(3); + else + assert(0); + return true; +} + +void OpPool::reshapeOutTensor(Tensor& in, Tensor& out) +{ + Shape in_shape = in.getShape(); + batch_ = in_shape[wShapeIdxBatch]; + channels_ = in_shape[wShapeIdxChannel]; + in_height_ = in_shape[wShapeIdxHeight]; + in_width_ = in_shape[wShapeIdxWidth]; + computePoolOutputShape(padding_mode_, padding_top_, padding_left_, + in_height_, in_width_, + filter_height_, filter_width_, + stride_height_, stride_width_, + out_height_, out_width_); + Shape out_shape = {batch_, channels_, out_height_, out_width_}; + out.reshape(NULL, out_shape); +} + +bool OpPool::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + Tensor& inpMat = ins[0]; + Tensor& outMat = outs[0]; + Tensor maskMat = outs.size() > 1 ? outs[1] : Tensor(); + return forward(inpMat, outMat, maskMat); +} + +bool OpPool::forward(Tensor& in, Tensor& out, Tensor& mask) +{ + Shape in_shape = in.getShape(); + Shape out_shape = out.getShape(); + batch_ = in_shape[wShapeIdxBatch]; + channels_ = in_shape[wShapeIdxChannel]; + in_height_ = in_shape[wShapeIdxHeight]; + in_width_ = in_shape[wShapeIdxWidth]; + out_height_ = out_shape[wShapeIdxHeight]; + out_width_ = out_shape[wShapeIdxWidth]; + need_mask_ = mask.isEmpty() ? 0 : 1; + + if (pipeline_ == nullptr) + { + config_.local_size_x = LOCAL_SZ_X; + config_.local_size_y = LOCAL_SZ_Y; + config_.local_size_z = LOCAL_SZ_Z; + config_.block_height = 1; + config_.block_width = 1; + config_.block_depth = 1; + if (pool_type_ == wPoolTypeAvg) + createShaderModule(avg_pool_spv, sizeof(avg_pool_spv)/sizeof(uint32_t)); + else + createShaderModule(max_pool_spv, sizeof(max_pool_spv)/sizeof(uint32_t)); + createComputePipeline(); + computeGroupCount(); + } + + bindTensor(in, 0, bgEntries); + bindTensor(out, 1, bgEntries); + if (need_mask_) + bindTensor(mask, 2, bgEntries); + else + { + std::vector shape = {1,1}; + mask.reshape(NULL, shape); + bindTensor(mask, 2, bgEntries); + } + PoolParam param = {channels_, + in_height_, in_width_, + out_height_, out_width_, + padding_top_, padding_left_, + filter_height_, filter_width_, + stride_height_, stride_width_, out.count(), + pool_type_ == wPoolTypeAvg ? avg_pool_padded_area_ : need_mask_}; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(PoolParam)); + else uniformBuffer_->setBufferData(& param, sizeof(PoolParam)); + bindUniform(*uniformBuffer_, pool_type_ == wPoolTypeAvg ? 2 : 3, bgEntries); + createBindGroup(); + createCommandBuffer(); + runCommandBuffer(); + return true; +} + +bool OpPool::computeGroupCount() +{ +#define GLOBAL_SIZE (128 * 128) + group_x_ = alignSize(GLOBAL_SIZE, config_.local_size_x) / config_.local_size_x; + group_y_ = 1; + group_z_ = 1; + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_prior_box.cpp b/modules/dnn/src/webgpu/src/op_prior_box.cpp new file mode 100644 index 000000000000..d87ba9d98600 --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_prior_box.cpp @@ -0,0 +1,177 @@ +#include "../../precomp.hpp" +#include +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_prior_box.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +#define LOCAL_SZ_X 256 +struct PriorBoxParam { + int global_size; + int nthreads; + float step_x; + float step_y; + int offsets_x_size; + int width_size; + int layer_w; + int image_h; + int image_w; + int clip; + int variance_off; +}; + +OpPriorBox::OpPriorBox(float step_x, + float step_y, + bool clip, + int num_priors, + std::vector& variance, + std::vector& offsets_x, + std::vector& offsets_y, + std::vector& box_widths, + std::vector& box_heights) +{ + step_x_ = step_x; + step_y_ = step_y; + clip_ = clip; + num_priors_ = num_priors; + variance_ = variance; + offsets_x_ = offsets_x; + offsets_y_ = offsets_y; + box_widths_ = box_widths; + box_heights_ = box_heights; + type_ = "PriorBox"; +#define BUFFER_NUM 6 + OpBase::createBindGroupLayout(BUFFER_NUM); +} + +OpPriorBox::~OpPriorBox() +{ + if(tensor_offsets_x_) + delete tensor_offsets_x_; + if(tensor_offsets_y_) + delete tensor_offsets_y_; + if(tensor_widths_) + delete tensor_widths_; + if(tensor_heights_) + delete tensor_heights_; + if(tensor_variance_) + delete tensor_variance_; + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} + +void OpPriorBox::reshapeOutTensor(std::vector& ins, Tensor& out) +{ + assert(!ins.empty()); + + Shape in_shape = ins[0]->getShape(); + int layer_h = in_shape[wShapeIdxHeight]; + int layer_w = in_shape[wShapeIdxWidth]; + int out_num = 1; + int out_channel = 2; + Shape out_shape = {out_num, out_channel, layer_h * layer_w * num_priors_ * 4}; + out.reshape(NULL, out_shape); +} + +bool OpPriorBox::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + return forward(ins, outs[0]); +} + +bool OpPriorBox::forward(std::vector& ins, Tensor& out) +{ + assert(ins.size() == 2); + Shape in_shape = ins[0].getShape(); + Shape img_shape = ins[1].getShape(); + + in_h_ = in_shape[wShapeIdxHeight]; + in_w_ = in_shape[wShapeIdxWidth]; + img_h_ = img_shape[wShapeIdxHeight]; + img_w_ = img_shape[wShapeIdxWidth]; + out_channel_ = out.dimSize(1); + out_channel_size_ = out.dimSize(2); + nthreads_ = in_h_ * in_w_; + global_size_ = alignSize(nthreads_, LOCAL_SZ_X); + + if (pipeline_ == nullptr) + { + createShaderModule(prior_box_spv, sizeof(prior_box_spv)/sizeof(uint32_t)); + createComputePipeline(); + computeGroupCount(); + } + + std::vectorshape; + shape.push_back(offsets_x_.size()); + if(! tensor_offsets_x_) + tensor_offsets_x_ = new Tensor(offsets_x_.data(), shape); + else + tensor_offsets_x_->reshape((const char*)offsets_x_.data(), shape); + if(! tensor_offsets_y_) + tensor_offsets_y_ = new Tensor(offsets_y_.data(), shape); + else + tensor_offsets_y_->reshape((const char*)offsets_y_.data(), shape); + shape[0] = box_widths_.size(); + if(! tensor_widths_) + tensor_widths_ = new Tensor(box_widths_.data(), shape); + else + tensor_widths_->reshape((const char*)box_widths_.data(), shape); + if(! tensor_heights_) + tensor_heights_ = new Tensor(box_heights_.data(), shape); + else + tensor_heights_->reshape((const char*)box_heights_.data(), shape); + float variance[4] = {variance_[0], variance_[0], variance_[0], variance_[0]}; + if (variance_.size() > 1) + { + assert(variance_.size() == 4); + for (int i = 1; i < variance_.size(); i++) + variance[i] = variance_[i]; + } + shape[0] = 4; + if(! tensor_variance_) + tensor_variance_ = new Tensor(variance, shape); + else + tensor_variance_->reshape((const char*)variance, shape); + + bindTensor(* tensor_offsets_x_, 0, bgEntries); + bindTensor(* tensor_offsets_y_, 1, bgEntries); + bindTensor(* tensor_widths_, 2, bgEntries); + bindTensor(* tensor_heights_, 3, bgEntries); + bindTensor(* tensor_variance_, 4, bgEntries); + bindTensor(out, 5, bgEntries); + + PriorBoxParam param = {global_size_, + nthreads_, + step_x_, + step_y_, + (int)offsets_x_.size(), + (int)box_widths_.size(), + in_w_, + img_h_, + img_w_, + clip_ ? 1 : 0, + out_channel_size_ / 4}; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(PriorBoxParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(PriorBoxParam)); + bindUniform(* uniformBuffer_, 6, bgEntries); + createBindGroup(); + createCommandBuffer(); + runCommandBuffer(); + return true; +} + +bool OpPriorBox::computeGroupCount() +{ + group_x_ = global_size_ / LOCAL_SZ_X; + group_y_ = 1; + group_z_ = 1; + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_relu.cpp b/modules/dnn/src/webgpu/src/op_relu.cpp new file mode 100644 index 000000000000..3fb417907b29 --- /dev/null +++ b/modules/dnn/src/webgpu/src/op_relu.cpp @@ -0,0 +1,77 @@ +#include "../../precomp.hpp" +#include "common.hpp" +#include "internal.hpp" +#include "../include/op_relu.hpp" + +namespace cv { namespace dnn { namespace webgpu { + +#ifdef HAVE_WEBGPU + +#define LOCAL_SZ_X 32 + +struct ReLUParam { + int total; + float slope; +}; + +OpReLU::OpReLU(const float slope) : slope_(slope) +{ + OpBase::createBindGroupLayout(2); + type_ = "ReLU"; +} + +OpReLU::~OpReLU() +{ + if (uniformBuffer_) + uniformBuffer_->getWebGPUBuffer()->Release(); +} + +void OpReLU::reshapeOutTensor(Tensor& in, Tensor& out) +{ + Shape shape = in.getShape(); + out.reshape(NULL, shape); +} + +bool OpReLU::forward(std::vector& ins, + std::vector& blobs, + std::vector& outs) +{ + return forward(ins[0], outs[0]); +} + +bool OpReLU::forward(Tensor& in, Tensor& out) +{ + if (pipeline_ == nullptr) + { + total_ = in.count(); +#define maxComputeWorkGroupCount 65535 + computeGroupCount(); + createShaderModule(relu_spv, sizeof(relu_spv)/sizeof(uint32_t)); + createComputePipeline(); + } + + bindTensor(in, 0, bgEntries); + bindTensor(out, 1, bgEntries); + ReLUParam param = { total_, slope_ }; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(ReLUParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(ReLUParam)); + bindUniform(* uniformBuffer_, 2, bgEntries); + createBindGroup(); + createCommandBuffer(); + runCommandBuffer(); + return true; +} + +bool OpReLU::computeGroupCount() +{ + group_x_ = alignSize(total_, LOCAL_SZ_X) / LOCAL_SZ_X; + if (group_x_ > maxComputeWorkGroupCount) + group_x_ = maxComputeWorkGroupCount; + group_y_ = 1; + group_z_ = 1; + return true; +} + +#endif // HAVE_WEBGPU + +}}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/op_softmax.cpp b/modules/dnn/src/webgpu/src/op_softmax.cpp index 94f0245b0a42..6baf60d980a0 100644 --- a/modules/dnn/src/webgpu/src/op_softmax.cpp +++ b/modules/dnn/src/webgpu/src/op_softmax.cpp @@ -5,7 +5,7 @@ namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU #define LOCAL_SZ_X 256 #define LOCAL_SZ_Y 1 @@ -23,7 +23,6 @@ OpSoftmax::OpSoftmax(const int axis, const bool log_softmax) { init(axis, log_softmax); type_ = "Softmax"; - needsUniform = true; } OpSoftmax::~OpSoftmax() @@ -32,7 +31,7 @@ OpSoftmax::~OpSoftmax() delete max_tensor_; if (sum_tensor_) delete sum_tensor_; - if(uniformBuffer_) + if (uniformBuffer_) uniformBuffer_->getWebGPUBuffer()->Release(); } @@ -83,18 +82,17 @@ bool OpSoftmax::forward(Tensor& in, Tensor& out) max_tensor_ = new Tensor(NULL, shape); sum_tensor_ = new Tensor(NULL, shape); } - if(needsUniform) - { - SoftmaxParam param = {channel_size_, outer_size_, channels_, - log_softmax_ == true ? 1 : 0}; - uniformBuffer_ = new Buffer(¶m, sizeof(SoftmaxParam)); - } + + SoftmaxParam param = {channel_size_, outer_size_, channels_, + log_softmax_ == true ? 1 : 0}; + if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(SoftmaxParam)); + else uniformBuffer_->setBufferData(¶m, sizeof(SoftmaxParam)); bindTensor(in, 0, bgEntries); bindTensor(*max_tensor_, 1, bgEntries); bindTensor(*sum_tensor_, 2, bgEntries); bindTensor(out, 3, bgEntries); - bindUniform(* uniformBuffer_, 4, bgEntries); + bindUniform(*uniformBuffer_, 4, bgEntries); createBindGroup(); createCommandBuffer(); @@ -110,6 +108,6 @@ bool OpSoftmax::computeGroupCount() return true; } -// #endif // HAVE_WEBGPU +#endif // HAVE_WEBGPU }}} // namespace cv::dnn::webgpu diff --git a/modules/dnn/src/webgpu/src/tensor.cpp b/modules/dnn/src/webgpu/src/tensor.cpp index e9dd135216a5..b12b6d92d337 100644 --- a/modules/dnn/src/webgpu/src/tensor.cpp +++ b/modules/dnn/src/webgpu/src/tensor.cpp @@ -1,9 +1,9 @@ -#include "../include/tensor.hpp" +#include "../../precomp.hpp" #include "common.hpp" #include "internal.hpp" #include namespace cv { namespace dnn { namespace webgpu { -// #ifdef HAVE_WEBGPU +#ifdef HAVE_WEBGPU Tensor::Tensor(Format fmt) : size_in_byte_(0), format_(fmt) { createContext(); @@ -101,6 +101,6 @@ void Tensor::copyTo(Tensor & dst) dst.reshape(buffer_->MapReadAsyncAndWait(), shape_, true, format_); } -// #endif //HAVE_WEBGPU +#endif //HAVE_WEBGPU }}} //namespace cv::dnn:webgpu \ No newline at end of file diff --git a/modules/dnn/src/webgpu/src/webgpu_cpp.cpp b/modules/dnn/src/webgpu/src/webgpu_cpp.cpp index fd324184007c..08a3ca722ed9 100644 --- a/modules/dnn/src/webgpu/src/webgpu_cpp.cpp +++ b/modules/dnn/src/webgpu/src/webgpu_cpp.cpp @@ -1,9 +1,5 @@ - #include "dawn/webgpu_cpp.h" - namespace wgpu { - - static_assert(sizeof(AdapterType) == sizeof(WGPUAdapterType), "sizeof mismatch for AdapterType"); static_assert(alignof(AdapterType) == alignof(WGPUAdapterType), "alignof mismatch for AdapterType"); @@ -1742,5 +1738,4 @@ namespace wgpu { Proc GetProcAddress(Device const& device, const char* procName) { return reinterpret_cast(wgpuGetProcAddress(device.Get(), procName)); } - -} +} \ No newline at end of file diff --git a/modules/dnn/test/test_backends.cpp b/modules/dnn/test/test_backends.cpp index 23a804c92a40..d2276adef938 100644 --- a/modules/dnn/test/test_backends.cpp +++ b/modules/dnn/test/test_backends.cpp @@ -518,6 +518,6 @@ TEST_P(DNNTestNetwork, FastNeuralStyle_eccv16) expectNoFallbacksFromCUDA(net); } -INSTANTIATE_TEST_CASE_P(/*nothing*/, DNNTestNetwork, dnnBackendsAndTargets(true, true, false, true, true)); +INSTANTIATE_TEST_CASE_P(/*nothing*/, DNNTestNetwork, dnnBackendsAndTargets(true, true, false, true, true, true)); }} // namespace diff --git a/modules/dnn/test/test_common.hpp b/modules/dnn/test/test_common.hpp index 3bc8fc3a8950..ecd411e01550 100644 --- a/modules/dnn/test/test_common.hpp +++ b/modules/dnn/test/test_common.hpp @@ -37,6 +37,7 @@ #define CV_TEST_TAG_DNN_SKIP_IE_MYRIAD CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_2, CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_X #define CV_TEST_TAG_DNN_SKIP_VULKAN "dnn_skip_vulkan" +#define CV_TEST_TAG_DNN_SKIP_WGPU "dnn_skip_webgpu" #define CV_TEST_TAG_DNN_SKIP_CUDA "dnn_skip_cuda" #define CV_TEST_TAG_DNN_SKIP_CUDA_FP16 "dnn_skip_cuda_fp16" @@ -124,6 +125,7 @@ testing::internal::ParamGenerator< tuple > dnnBackendsAndTarget bool withHalide = false, bool withCpuOCV = true, bool withVkCom = true, + bool withWGPU = true, bool withCUDA = true, bool withNgraph = true ); diff --git a/modules/dnn/test/test_common.impl.hpp b/modules/dnn/test/test_common.impl.hpp index 9293e07f0ea6..82eb66a9d843 100644 --- a/modules/dnn/test/test_common.impl.hpp +++ b/modules/dnn/test/test_common.impl.hpp @@ -195,6 +195,7 @@ testing::internal::ParamGenerator< tuple > dnnBackendsAndTarget bool withHalide /*= false*/, bool withCpuOCV /*= true*/, bool withVkCom /*= true*/, + bool withWGPU /*= true*/, bool withCUDA /*= true*/, bool withNgraph /*= true*/ ) @@ -243,6 +244,13 @@ testing::internal::ParamGenerator< tuple > dnnBackendsAndTarget targets.push_back(make_tuple(DNN_BACKEND_VKCOM, *i)); } + if(withWGPU) + { + available = getAvailableTargets(DNN_BACKEND_WGPU); + for (std::vector< Target >::const_iterator i = available.begin(); i != available.end(); ++i) + targets.push_back(make_tuple(DNN_BACKEND_WGPU, *i)); + } + #ifdef HAVE_CUDA if(withCUDA) { @@ -415,6 +423,12 @@ void initDNNTests() ); #endif +#ifdef HAVE_WEBGPU + registerGlobalSkipTag( + CV_TEST_TAG_DNN_SKIP_WGPU + ); +#endif // HAVE_WEBGPU + #ifdef HAVE_CUDA registerGlobalSkipTag( CV_TEST_TAG_DNN_SKIP_CUDA, CV_TEST_TAG_DNN_SKIP_CUDA_FP32, CV_TEST_TAG_DNN_SKIP_CUDA_FP16 diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp index 2dce3e4fe48f..9f59743b622f 100644 --- a/modules/dnn/test/test_layers.cpp +++ b/modules/dnn/test/test_layers.cpp @@ -1629,6 +1629,208 @@ TEST(Layer_Test_PoolingIndices, Accuracy) normAssert(indices, outputs[1].reshape(1, 5)); } +TEST(WGPU_Test_Conv, Accuracy) +{ + Net nets[2]; + for (int i = 0; i < 2; ++i) + { + nets[i].setInputsNames(std::vector(1, format("input_%d", i))); + + LayerParams lp; + lp.set("kernel_size", 1); + lp.set("num_output", 1); + lp.set("bias_term", false); + lp.type = "Convolution"; + lp.name = format("testConv_%d", i); + lp.blobs.push_back(Mat({1, 1, 1, 1}, CV_32F, Scalar(1 + i))); + nets[i].addLayerToPrev(lp.name, lp.type, lp); + nets[i].setPreferableBackend(DNN_BACKEND_WGPU); + nets[i].setPreferableTarget(DNN_TARGET_WGPU); + nets[i].setInput(Mat({1, 1, 2, 3}, CV_32FC1, Scalar(1))); + } + Mat out_1 = nets[0].forward(); + Mat out_2 = nets[1].forward(); + // After the second model is initialized we try to receive an output from the first network again. + out_1 = nets[0].forward(); + normAssert(2 * out_1, out_2); +} + +TEST(WGPU_Test_Softmax, Accuracy) +{ + float inp[] = {1, 2, 3, 4, 5, 6, 7, 8}; + float outExp[] = {0.032059, 0.087144, 0.236883, 0.643914, 0.032059, 0.087144, 0.236883, 0.643914}; + LayerParams lp; + Net netSoftmax, netBase; + Mat in(2, 4, CV_32F, inp), outValue(2, 4, CV_32F, outExp); + Mat out, outBase; + lp.set("axis", 1); + lp.set("log_softmax", false); + + netSoftmax.addLayerToPrev("softmaxLayer", "Softmax", lp); + netSoftmax.setPreferableBackend(DNN_BACKEND_WGPU); + netSoftmax.setPreferableTarget(DNN_TARGET_WGPU); + netSoftmax.setInput(in); + out = netSoftmax.forward(); + + netBase.addLayerToPrev("softmaxLayer", "Softmax", lp); + netBase.setPreferableBackend(DNN_BACKEND_OPENCV); + netBase.setPreferableTarget(DNN_TARGET_CPU); + netBase.setInput(in); + outBase = netBase.forward(); + + normAssert(outValue, out); + normAssert(outValue, outBase); + normAssert(out, outBase); +} + +TEST(WGPU_Test_Relu, Accuracy) +{ + Net net; + { + LayerParams lp; + lp.set("kernel_size", 1); + lp.set("num_output", 1); + lp.set("bias_term", false); + lp.type = "Convolution"; + lp.name = "testConv"; + + int weightsShape[] = {1, 1, 1, 1}; + Mat weights(4, &weightsShape[0], CV_32F, Scalar(1)); + lp.blobs.push_back(weights); + net.addLayerToPrev(lp.name, lp.type, lp); + } + { + LayerParams lp; + lp.type = "ReLU"; + lp.name = "testReLU"; + net.addLayerToPrev(lp.name, lp.type, lp); + } + int sz[] = {1, 1, 2, 3}; + Mat input(4, &sz[0], CV_32F); + randu(input, -1.0, -0.1); + net.setInput(input); + net.setPreferableBackend(DNN_BACKEND_WGPU); + net.setPreferableTarget(DNN_TARGET_WGPU); + Mat output = net.forward("testConv"); + normAssert(input, output); +} + +TEST(WGPU_Test_Concat, Accuracy) +{ + // Test case + // input + // | + // v + // some_layer + // | | + // v v + // concat + Net net; + int interLayer; + { + LayerParams lp; + lp.type = "AbsVal"; + lp.name = "someLayer"; + interLayer = net.addLayerToPrev(lp.name, lp.type, lp); + } + { + LayerParams lp; + lp.set("axis", 1); + lp.type = "Concat"; + lp.name = "testConcat"; + int id = net.addLayer(lp.name, lp.type, lp); + net.connect(interLayer, 0, id, 0); + net.connect(interLayer, 0, id, 1); + } + int shape[] = {1, 2, 3, 4}; + Mat input(4, shape, CV_32F); + randu(input, 0.0f, 1.0f); // [0, 1] to make AbsVal an identity transformation. + + net.setInput(input); + net.setPreferableBackend(DNN_BACKEND_WGPU); + net.setPreferableTarget(DNN_TARGET_WGPU); + Mat out = net.forward(); + + normAssert(slice(out, Range::all(), Range(0, 2), Range::all(), Range::all()), input); + normAssert(slice(out, Range::all(), Range(2, 4), Range::all(), Range::all()), input); +} + +TEST(WGPU_Test_AvgPool, Accuracy) +{ + LayerParams lp; + lp.name = "testAvePool"; + lp.type = "Pooling"; + lp.set("kernel_size", 2); + lp.set("stride", 2); + lp.set("pool", "AVE"); + + Net net, net0; + net.addLayerToPrev(lp.name, lp.type, lp); + // 1 2 | 3 + // 4 5 | 6 + // ----+-- + // 7 8 | 9 + Mat inp = (Mat_(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); + Mat ref = (Mat_(2, 2) << (1 + 2 + 4 + 5) / 4.f, (3 + 6) / 2.f, (7 + 8) / 2.f, 9); + Mat tmp = blobFromImage(inp); + net.setInput(blobFromImage(inp)); + net.setPreferableBackend(DNN_BACKEND_WGPU); + net.setPreferableTarget(DNN_TARGET_WGPU); + Mat out = net.forward(); + + net0.addLayerToPrev(lp.name, lp.type, lp); + net0.setInput(blobFromImage(inp)); + net0.setPreferableBackend(DNN_BACKEND_OPENCV); + net0.setPreferableTarget(DNN_TARGET_CPU); + Mat out0 = net.forward(); + normAssert(out, blobFromImage(ref)); + normAssert(out, out0); +} + +TEST(WGPU_Test_MaxPool, Accuracy) +{ + Net net; + + LayerParams lp; + lp.set("pool", "max"); + lp.set("kernel_w", 2); + lp.set("kernel_h", 2); + lp.set("stride_w", 2); + lp.set("stride_h", 2); + lp.set("pad_w", 0); + lp.set("pad_h", 0); + lp.name = "testLayer.name"; // This test also checks that OpenCV lets use names with dots. + lp.type = "Pooling"; + net.addLayerToPrev(lp.name, lp.type, lp); + + Mat inp(10, 10, CV_8U); + randu(inp, 0, 255); + + Mat maxValues(5, 5, CV_32F, Scalar(-1)), indices(5, 5, CV_32F, Scalar(-1)); + for (int y = 0; y < 10; ++y) + { + int dstY = y / 2; + for (int x = 0; x < 10; ++x) + { + int dstX = x / 2; + uint8_t val = inp.at(y, x); + if ((float)inp.at(y, x) > maxValues.at(dstY, dstX)) + { + maxValues.at(dstY, dstX) = val; + indices.at(dstY, dstX) = y * 10 + x; + } + } + } + net.setPreferableBackend(DNN_BACKEND_WGPU); + net.setPreferableTarget(DNN_TARGET_WGPU); + net.setInput(blobFromImage(inp)); + + std::vector outputs; + net.forward(outputs, lp.name); + normAssert(maxValues, outputs[0].reshape(1, 5)); + normAssert(indices, outputs[1].reshape(1, 5)); +} + typedef testing::TestWithParam > > Layer_Test_ShuffleChannel; TEST_P(Layer_Test_ShuffleChannel, Accuracy) { diff --git a/modules/dnn/test/test_misc.cpp b/modules/dnn/test/test_misc.cpp index a1480b0e8b3a..a3c66d59a990 100644 --- a/modules/dnn/test/test_misc.cpp +++ b/modules/dnn/test/test_misc.cpp @@ -251,6 +251,8 @@ TEST_P(setInput, normalization) applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); if (backend == DNN_BACKEND_VKCOM && dtype != CV_32F) applyTestTag(CV_TEST_TAG_DNN_SKIP_VULKAN); + if (backend == DNN_BACKEND_WGPU && dtype != CV_32F) + applyTestTag(CV_TEST_TAG_DNN_SKIP_WGPU); Mat inp(5, 5, CV_8UC3); randu(inp, 0, 255); From 34cb2613e35556c0ae7a2641acd4926efeea40dd Mon Sep 17 00:00:00 2001 From: NALLEIN Date: Thu, 23 Jul 2020 13:40:20 +0800 Subject: [PATCH 02/11] Add ops --- modules/dnn/src/webgpu/include/buffer.hpp | 4 ++-- modules/dnn/src/webgpu/include/op_conv.hpp | 2 +- modules/dnn/src/webgpu/include/op_permute.hpp | 6 +++--- modules/dnn/src/webgpu/include/op_prior_box.hpp | 10 +++++----- modules/dnn/src/webgpu/src/buffer.cpp | 4 +--- modules/dnn/src/webgpu/src/op_concat.cpp | 5 ++--- modules/dnn/src/webgpu/src/op_conv.cpp | 4 +--- modules/dnn/src/webgpu/src/op_lrn.cpp | 2 +- modules/dnn/src/webgpu/src/op_prior_box.cpp | 3 +-- modules/dnn/src/webgpu/src/op_relu.cpp | 2 +- modules/dnn/test/test_common.impl.hpp | 4 ++-- 11 files changed, 20 insertions(+), 26 deletions(-) diff --git a/modules/dnn/src/webgpu/include/buffer.hpp b/modules/dnn/src/webgpu/include/buffer.hpp index 67bcdffaeabf..055a335430c7 100644 --- a/modules/dnn/src/webgpu/include/buffer.hpp +++ b/modules/dnn/src/webgpu/include/buffer.hpp @@ -21,7 +21,7 @@ class Buffer wgpu::BufferUsage usage = wgpu::BufferUsage::Uniform | wgpu::BufferUsage::CopyDst); ~Buffer() { - buffer_.Release(); + if(buffer_) buffer_.Release(); if(gpuReadBuffer_) gpuReadBuffer_.Release(); } wgpu::Buffer * getWebGPUBuffer() { return & buffer_; } @@ -42,7 +42,7 @@ class Buffer Buffer(); std::shared_ptr device_; wgpu::Buffer buffer_; - wgpu::Buffer gpuReadBuffer_ = nullptr; + wgpu::Buffer gpuReadBuffer_; wgpu::BufferUsage usage_; size_t size_; const void * mappedData = nullptr; diff --git a/modules/dnn/src/webgpu/include/op_conv.hpp b/modules/dnn/src/webgpu/include/op_conv.hpp index ddf4626bff7b..10216b7c7810 100644 --- a/modules/dnn/src/webgpu/include/op_conv.hpp +++ b/modules/dnn/src/webgpu/include/op_conv.hpp @@ -67,7 +67,7 @@ class OpConv : public OpBase PaddingMode padding_mode_; int group_; int has_bias_; - Tensor* swizzled_weights; + Tensor* swizzled_weights = nullptr; ConvShaderConfig config_; bool dwconv_; Buffer* uniformBuffer_ = nullptr; diff --git a/modules/dnn/src/webgpu/include/op_permute.hpp b/modules/dnn/src/webgpu/include/op_permute.hpp index eba016b4b9db..615e1dd81a18 100644 --- a/modules/dnn/src/webgpu/include/op_permute.hpp +++ b/modules/dnn/src/webgpu/include/op_permute.hpp @@ -25,9 +25,9 @@ class OpPermute: public OpBase int global_size_; int nthreads_; int dims_; - Tensor* tensor_order_; - Tensor* tensor_old_stride_; - Tensor* tensor_new_stride_; + Tensor* tensor_order_ = nullptr; + Tensor* tensor_old_stride_ = nullptr; + Tensor* tensor_new_stride_ = nullptr; std::vector old_stride_; std::vector new_stride_; Shape in_shape_; diff --git a/modules/dnn/src/webgpu/include/op_prior_box.hpp b/modules/dnn/src/webgpu/include/op_prior_box.hpp index 940d0837abe9..1fbad594e20a 100644 --- a/modules/dnn/src/webgpu/include/op_prior_box.hpp +++ b/modules/dnn/src/webgpu/include/op_prior_box.hpp @@ -44,11 +44,11 @@ class OpPriorBox: public OpBase int in_w_; int out_channel_; int out_channel_size_; - Tensor* tensor_offsets_x_; - Tensor* tensor_offsets_y_; - Tensor* tensor_widths_; - Tensor* tensor_heights_; - Tensor* tensor_variance_; + Tensor* tensor_offsets_x_= nullptr; + Tensor* tensor_offsets_y_= nullptr; + Tensor* tensor_widths_= nullptr; + Tensor* tensor_heights_= nullptr; + Tensor* tensor_variance_= nullptr; Buffer* uniformBuffer_ = nullptr; }; diff --git a/modules/dnn/src/webgpu/src/buffer.cpp b/modules/dnn/src/webgpu/src/buffer.cpp index 58b33845aa90..58148194dd37 100644 --- a/modules/dnn/src/webgpu/src/buffer.cpp +++ b/modules/dnn/src/webgpu/src/buffer.cpp @@ -62,15 +62,13 @@ const void* Buffer::MapReadAsyncAndWait() encoder.CopyBufferToBuffer(buffer_, 0, gpuReadBuffer_, 0, size_); wgpu::CommandBuffer cmdBuffer = encoder.Finish(); - encoder.Release(); wQueue->Submit(1, &cmdBuffer); + encoder.Release(); cmdBuffer.Release(); gpuReadBuffer_.MapReadAsync(BufferMapReadCallback, this); - usleep(100); while(mappedData == nullptr) { device_->Tick(); - usleep(100); } return mappedData; } diff --git a/modules/dnn/src/webgpu/src/op_concat.cpp b/modules/dnn/src/webgpu/src/op_concat.cpp index 75cb314c7c4e..e35fccf93b0e 100644 --- a/modules/dnn/src/webgpu/src/op_concat.cpp +++ b/modules/dnn/src/webgpu/src/op_concat.cpp @@ -30,8 +30,7 @@ OpConcat::~OpConcat() bool OpConcat::init(const int axis) { axis_ = axis; -#define BUFFER_NUM 2 - OpBase::createBindGroupLayout(BUFFER_NUM); + createBindGroupLayout(2); return true; } @@ -114,7 +113,7 @@ bool OpConcat::forward(std::vector& ins, Tensor& out) thread_num_}; if(! uniformBuffer_) uniformBuffer_ = new Buffer(¶m, sizeof(ConcatParam)); else uniformBuffer_->setBufferData(¶m, sizeof(ConcatParam)); - bindUniform(* uniformBuffer_, BUFFER_NUM, bgEntries); + bindUniform(* uniformBuffer_, 2, bgEntries); createBindGroup(); createCommandBuffer(); runCommandBuffer(); diff --git a/modules/dnn/src/webgpu/src/op_conv.cpp b/modules/dnn/src/webgpu/src/op_conv.cpp index cb01088208f0..d62450ce606f 100644 --- a/modules/dnn/src/webgpu/src/op_conv.cpp +++ b/modules/dnn/src/webgpu/src/op_conv.cpp @@ -113,9 +113,7 @@ bool OpConv::init(const int out_channel, const bool has_bias, has_bias_ = has_bias ? 1 : 0; activation_ = activation; group_ = group; - - #define BUFFER_NUM 4 - OpBase::createBindGroupLayout(BUFFER_NUM); + createBindGroupLayout(4); return true; } diff --git a/modules/dnn/src/webgpu/src/op_lrn.cpp b/modules/dnn/src/webgpu/src/op_lrn.cpp index 0eea2faf796e..e1ec93883c86 100644 --- a/modules/dnn/src/webgpu/src/op_lrn.cpp +++ b/modules/dnn/src/webgpu/src/op_lrn.cpp @@ -52,7 +52,7 @@ bool OpLRN::init(const int radius, const float bias, alpha_ = alpha; beta_ = beta; norm_by_size_ = norm_by_size; - OpBase::createBindGroupLayout(2); + createBindGroupLayout(2); return true; } diff --git a/modules/dnn/src/webgpu/src/op_prior_box.cpp b/modules/dnn/src/webgpu/src/op_prior_box.cpp index d87ba9d98600..81759ac8e6b8 100644 --- a/modules/dnn/src/webgpu/src/op_prior_box.cpp +++ b/modules/dnn/src/webgpu/src/op_prior_box.cpp @@ -43,8 +43,7 @@ OpPriorBox::OpPriorBox(float step_x, box_widths_ = box_widths; box_heights_ = box_heights; type_ = "PriorBox"; -#define BUFFER_NUM 6 - OpBase::createBindGroupLayout(BUFFER_NUM); + createBindGroupLayout(6); } OpPriorBox::~OpPriorBox() diff --git a/modules/dnn/src/webgpu/src/op_relu.cpp b/modules/dnn/src/webgpu/src/op_relu.cpp index 3fb417907b29..3b6f333ecdd7 100644 --- a/modules/dnn/src/webgpu/src/op_relu.cpp +++ b/modules/dnn/src/webgpu/src/op_relu.cpp @@ -16,7 +16,7 @@ struct ReLUParam { OpReLU::OpReLU(const float slope) : slope_(slope) { - OpBase::createBindGroupLayout(2); + createBindGroupLayout(2); type_ = "ReLU"; } diff --git a/modules/dnn/test/test_common.impl.hpp b/modules/dnn/test/test_common.impl.hpp index 82eb66a9d843..3c46a8b02522 100644 --- a/modules/dnn/test/test_common.impl.hpp +++ b/modules/dnn/test/test_common.impl.hpp @@ -25,7 +25,7 @@ void PrintTo(const cv::dnn::Backend& v, std::ostream* os) case DNN_BACKEND_HALIDE: *os << "HALIDE"; return; case DNN_BACKEND_INFERENCE_ENGINE: *os << "DLIE*"; return; case DNN_BACKEND_VKCOM: *os << "VKCOM"; return; - case DNN_BACKEND_WGPU: *os << "WGPU"; return; + case DNN_BACKEND_WGPU: *os << "WEBGPU"; return; case DNN_BACKEND_OPENCV: *os << "OCV"; return; case DNN_BACKEND_CUDA: *os << "CUDA"; return; case DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019: *os << "DLIE"; return; @@ -42,7 +42,7 @@ void PrintTo(const cv::dnn::Target& v, std::ostream* os) case DNN_TARGET_OPENCL_FP16: *os << "OCL_FP16"; return; case DNN_TARGET_MYRIAD: *os << "MYRIAD"; return; case DNN_TARGET_VULKAN: *os << "VULKAN"; return; - case DNN_TARGET_WGPU: *os << "WGPU"; return; + case DNN_TARGET_WGPU: *os << "DAWN"; return; case DNN_TARGET_FPGA: *os << "FPGA"; return; case DNN_TARGET_CUDA: *os << "CUDA"; return; case DNN_TARGET_CUDA_FP16: *os << "CUDA_FP16"; return; From da2827f0798d45995593a3d373f91228c1fd8872 Mon Sep 17 00:00:00 2001 From: NALLEIN Date: Sat, 25 Jul 2020 21:28:47 +0800 Subject: [PATCH 03/11] Delete unnecessary functions --- 3rdparty/include/webgpu/lib/libshaderc.so | Bin 55216776 -> 0 bytes 3rdparty/include/webgpu/lib/webgpu_cpp.cpp | 1746 -------------------- modules/dnn/src/op_webgpu.cpp | 3 +- modules/dnn/src/webgpu/dawn/dawnUtils.cpp | 63 +- modules/dnn/src/webgpu/dawn/dawnUtils.hpp | 32 +- modules/dnn/src/webgpu/include/tensor.hpp | 3 +- modules/dnn/src/webgpu/src/buffer.cpp | 3 + modules/dnn/src/webgpu/src/common.hpp | 9 - modules/dnn/src/webgpu/src/tensor.cpp | 15 +- modules/dnn/src/webgpu/src/webgpu_cpp.cpp | 2 +- 10 files changed, 20 insertions(+), 1856 deletions(-) delete mode 100755 3rdparty/include/webgpu/lib/libshaderc.so delete mode 100644 3rdparty/include/webgpu/lib/webgpu_cpp.cpp diff --git a/3rdparty/include/webgpu/lib/libshaderc.so b/3rdparty/include/webgpu/lib/libshaderc.so deleted file mode 100755 index 956a15386775fe853530a4d1e7f171d8a1ddb6b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55216776 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�h|RA67i6draOL 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

M`)toH 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%0AR;bv z;#$vd7ANR;%E;^^pg@^%)7XcCU~8+GTboSV9pY+b_f2B#p{Q)@tSca}O?~}wu zvqp%ErzBuu72k}G46K|`7T1&pnqG*X;SAZj7k%fUX>Wx`j95TFs zq>I))gELd8iM^Axgc6o-8eG`Yf4_qN#{H#BD;lyc+R(6p-+ec`yY2GC5{Q%TSjJew zV+z?6Zz?DnBa&?CDd7-j20Z_fb?D8-1%%Byw_t)n>-NLy^Mxb%o#20@U}^U7#o^A5 z*rfc#DuWMdm3;WHy7}#~V_aZr=}p-{7 z4t2>D#;q~(s*r8e&W&tFoB>dh?*!}Bzz{Je^NU+r8BX)M!_(=6C;O59unOd_*VN%t zcA!56X335T-7C$zp;ATBvj9a5$7tBZM$5v%OS}B{_htS<`g34ZWvK^FgiQq*k^pDOHQH%z)Mml!DJ~TRh~BM ziW!&1NY|HWIGqMdSXf(Y?0RLteB7H*3Ttb*2B_>+O)nHpNBkP9J1p30>4Gn7opQcr z=v^SG%^?OurwyXi&xw>Jez5oe)|L!+?AD`=`_^noYipdY!n7zbDpAof?@%Wj0QzDo z(d02hb4kr1a}L43Nj&uYe7q`z9k94lJk>zSJ%{`VJ5{XJ4lWLLF;DS>QW-x3E1Zwq zW>RfjoL_IEP_wY4$>n}1wiuU+K*tSn8~`1sAV6l?B9&5D;wt>6FUAK`N5-igJ8z_c z5q#53b^dQyrwtK@qXz6oiHF-uKtuGqXJlIOr0!y(CZwSV5CzkIMMq4W#UH6resjnx zERP@DsRNZf*s)ZzYT;`lzLdUW35ig!YY;s!(eCvKwmB}WkMwm{X;2UlVu2YR5AEAi zbZEF20@6cf!q08@`mjLQnM#Oz@P_=05Vi-j5N$9Qwh7mp>_{lBm9|1HQaIO__;pWk zd5MC8-f zEiEmXiP2n9!vNKa*YhBvB#Rm-D^p|_LO>hqIwd&ar+05)(<_|@w*(B-9~=}?f$@N4 zr=STBii68oI0gdlwjnjm&4vy6kKVc2lxoP*>+`eM*JioF+w0^Pg|)d9pkaZ13Gzw* z!eq4{HSgpkNs>A^x>hU=4@0`(8}w#{kY%c){MTxI0%squ;5_W?o@HS&>D{IJSmD+1W0qE+J(^L>VLg zmHp|?Le5A*BXC!@Is!xr<|%6EKU3r4VbTsy0H!vtly|-GXJWhMA1Hqg2M7sbiP)2ss#3GwcuS9IQ9Fbj(BO$J&Mn-`YS8@V+gK0Sp#A{+k z$b}KyUD|+rdd8%V0;$8?!_*ER!~n%A;nv2RTijR58`HXV?RX?>#DKzxS|K zqcr)wC*AgSn|80+|7%eT_|yLA;YJ9O)Talxca-)Y($wN|l;)kIG2JzC(i-b_y&8t; z8Aq>>K9Xm+k@#X`?7t}GmEkaKcGArP}WGCREzn&MChqb;9Hbj$OI7GHFJUk zPIC@Jo5_ePvVRE>J2nDC%*_gsn4L5JyQe@RNwh`hKvecdQ6-WMV6&b1+t)7 zh#z!&`D-})ngpsctRacSC^#g=?Gk#2zRSVaDTkyHm$zzI4BQ%!kgDJr@pBjEi2Fxp z*Kb0D^t&z$2@&Py1Bu%WpQN&<;q3@;Dh(FucUwNLzRT<~f|DmY7+#rLAN3{22P6e~ z1kI_5TzF6spR3SqWHm*p8p=17XxL@?kn?d^kw64}tGvhV*BAaK$yw|RxypQzV5HUO zXqSgm$qoPR=&c0_A9#IOFkmrYBj|v=%&!ydT|$_$N@3BlsJW-E97&R{e`yd-wqMrH zDy9d>)|Rf#v$^2BC^h}0x{EEHmFO^gg*Iwbx&ENLH#vRqr>}@ly!>;T&QJzAc3A*7 z?5Yc!@VQ{{aFWDA#X6DtS>m$o%>VY#05yrs1^H!j24WDvsR5ynWRtO+hO(jrATZQn zmL(a-BLiSIh$bk!^mzdnoSq7xQo=(mDo-o>8=v@n0Aumm3)N301qTa_fIOIA;5>25 zt42AYF_U8kHTlv;jxIna2IktTF6SiPZ486)1!{OaJm!X;Xmnkz$c=4K*FhD>!Uh&oi&`ZTA z!tWNM));cwHPbgYXf}Kj&}V~nf%jHIF=?}HB}h>g-lc2RJ4Me61hZmyv5e&(?w;eM zXY}VBbXvvQ27?7@a@B!J0AW1sFujh@8z#a^=UhOWfMU9dGT{~g%JVFvbsY5`TO+~u}DI42FWBTn8lE4 z?l|_{1yu&av%tvtQskEQ8z4qn1Qt_vC$uDToz5(OjeR|7mLd0A&EF1QG0VJc*d)Wc zu((QS{$Dt32}+-$ie=Jk3irXUo9p!}Wy_Xk$&`xHMhQf33e|^b*zmVg+6Qz6kq?e_ zV6eV5piel1c-+A%a;NS8u)ewbW98}BR;xp$Un3*a^4HJT4_2z})s^xZOliEvV1Xiy zm$!Fz0gI*-X~P%Qk3R@9y0N~$<*3x+*}>{czDlI^NTZ#>d3FVYmxyh*uQ{wZoLu8r zU`ajc87BrSm>BW+R4O`B6rLYHv1wk%Te z%=EX&e`Yb0ln5=t0I8-Rve@5}dO%`%qD?*}@cd^1q*@zL8%v3!h?NG{OCutDr7gV6De}-c3Q-k9WfW=A z%#!WoLK2dNoHt5|1AJ{6De04J;P^6RGQ8HfL_ll}Ou&-m05T3xuB7Sr%M_Hwt&&hH zHaP5_V>Vx-vc&W&t>9Ya2m1#|BtdGFELG`C%z1nQMCT%9Vk5q}qWV?SliTJdXpysX zn86bIP!N3{Ag!z_ZMuf>ZDvVa6+SjgwLz#a%Ef4EVxrEgSf3G!iq&?@2SmWdOM>G=U zJK#%wp%M(!aG1-R$9PXS>Df?R^Hn8ilNMUp**t!V#DCrK6m35_4AZ&W1j&pn<3yZpFETRh{upHKt&GQlJLA*^*)@x*s8ummxRvrp686}qyGZ!5JiHyR@ zzSzzRx3m67q3N6G#*O`*{UX|?CMx^S7k=bLwoX12Eo!n6fgf~}_x|-Gqr^IjTd(W$%7I(IuZN1pU{XWtqNxlv^?RY4zIpPp13mhOm z*esT!g4dXgWp~X0;wj|x!v3{FZS0$UX%jAwU6+z`l$c8Zj#&SGgi1}{N$J$XC{m!r zHg=$pbRCY*(!$PqQzLUd^A+~Y+!toxC+8H$%?Ha3WQ%ouf^UDX%BPp`-+0S0pQ&#q z9EOM?zTub24PNMk5>PZBF?)(~9F{gtbj5poF?Cy#%wQ4kL9py3PCwh-ea6YkBE8Xh zAD2_khqH?(OJ7xsigrGUwGk5j)#xDhVwGYSX@JWp zF%LQTw}J9L1?qPX@MOqn1M{T@Nhp%U@dQs!2Ec}FKv-I?*QH-`^t65@;)5gtCmBCI z*r>MWI;O`E*m}-6R(IGnMNC05al)hh>3qKQi~3J1^YDKDeYEj0{~7WNmhyUZ%$~db zV2*w+BC*_vb5Z;G;PHmFDohA!c#&95#w8`$w=%ZK@-{oe;y{U3${NLD2-1n54pL&# z3Rw&*eS+n!W$utbZHok$67={F^1{pbt?kg$(9%|pJ9xSTF%6E#V2R;&*X){GoXRc= z5%SC&oeNDwx&7w9X2b)}VHmlDbM+nTHr~9yP2yo(VYNWA<-N;sBow$PkM=nI&%&uV zC>>Y%xe*$TQji1&Dm*95xC~<)0&ngF3lK@V+4K+=HhEcRWct~1pLnY$O}BAnLR{^) zd0|`Ba$Zk_FEOSfWPxmijyv=;2Dl)3rHgbzim9suyfBNFLEv1QU{r`t1Y73pIV+=b z$dndIGvh(LwEc4H1e+CJ%tPpu3Xs8q6joSMBpTB6QC4^;XjaSOEK?dX=3)Iwc@uHA1D60=dEQ1ylbyJTDVr_sVrq&=zQq6cvv33ALhv zU7UQuFvjAMZ+VM1N%(&kg>|eMn$|vxgq_l}rNzh2@eg6CBS!b&`RLCSN{ci;QgRf{ z!Z6jZh!e~^q%9M==zz}LbpEpj%QIAy($*jwjk9e%=hP)*vNf=+Urm&SA1dD4dxI5@&FR_M>K<(;^3eOaVy%+LMY5Ua zxMq+y|{oCb-RktSFGrcVy7x_$L>LAxU(Eqaa#Dr3ac$=BfdR0RK*;1LC+w zyTzVy8y+;nqb(#>B(pGDte?+Lyd<84&kV=4;ttuA2FVc>|ZP;VPmaw^GOz z2lXs;$p6e18M~<91ID|{(({qVar&V5o|oD#R|grEdR&kYKU%~cLP>>!Mc`y#JZ(b;K_#K&f$>-zqd;8r_7E?&BVO9TZpx@6@$~>bq;j(ie$$z| zRtY<^_ps<^=W9O=+tdBAlyEkZ$OO5g9~sem)A!T!_sM8<uXJYX3WCr(SNa9#pwJtifbQO#jA4=J?lyeWKOpk?6S`ut!srG6 zThF1o{sFtB9iz1MCoE`IDp0I_;eCgo%51~^Xa-?_j<-T&%Y!}kGVHQX7!>Gcpw%W% zKP>+Pjz(ugLsb$v>1}qrl&?|k)qB%pBGEWJ!%rl|V3+1vZ-+9g4J}In5KvOx^})aA zsr+5CR4Y#dp?zIY(J>aA8#S{lu>nQk$h_+!+QL_99qdExWRC#uQO`}GEV5jDtYqUq z1suy@;iZ9Gd}Oh3Pm9#Az3hUa0#HvBLQCWt>mebSC2Pu9=y7kvS8IKT&w)wPav_P> z8&2$;fj&na^VvTohf{cZ*cUV<2h@O3EKG>5cN|{jBl9a1~d1cLTRWWC-*_q$`Dd+J%IPc2$=_tSgoq-pSD(*?uQ0{*yac9i-K$5WrctiLB! zGeH0d;X2$)Y67V&2GzpnKa6T=d*0M!h7jNjbb0HVB}%SDIB-iEEXDpWFQ#Y>@G&wF z`kAkE)(Ck(1r@V>^#$&WCjwu;6&;cgt(n>99yAIeTn{YnYg)bo<uPgfS2-PFWz zknNb67<^00@s)-aH5#5o;b7!AI9xV@D^reoObdkb6Nk6DLQ9QPmd;vJ=n@JFJJcx6 zp31L(fh!*Dok!c31%%mmZzVZ-=ft3dPg6R`wZVhP-tk~fRh(kwHMKDM;WH?(bUF{h zVbN|qNVyn!6G2S=ZEI`CxJkojpeizdHw-S5%j??@gn*u5*YVm;9+TxVejZr>llta_ zjbx_zrIQnUXE=};zm}OjAGTp)DWbbdm5Icx9)E%BLGr5?fp^Mo*$1C*CM>o&mf<-& z8XJc`F(+CENT$O)N1o(!R1b-3CWZOnw}TZky0S6W)?Ua-m9=d)8+j$tgnVu>>Tl4x zBZV_4VIY1e*%2i1~SKpCXbg+e*OUF#g3x33`F&Xmi#DPv_@AO~Hi;!owv~68BbaxLL_mWL;u?a=c~hVj1iOD~-rBi6Hw`R*Qp zFUAj(3y3DZDdC=8fePNb!tU~BGDb8pp8>$8PR}ecF&nBFo#8$yoc1_UZ)OkPt0dPK1to+wz)0k!!xAMT9Hv z4e@E;z=QRJe%FMn5}r2PGp7(0PQSPPH;Y}qC)ra(<5-|m3jpesK9M?Z z?nBMksLSyU)myyvT+mxwF~%F>-@F{&r8v6Cb^i+I1O`oxwe*c$t^(wKOx99K%s@u- z4d9{=UThBbgp__zJw3mz9z6Y<5Tsw;3qjh=rYEi2!*4iaPgdHQ`GAw^ZjnRJF8ywi zK2LW+N_Oj&=TxuWNLAOVS9eKJXB9PVh_rNGuaW`uGVCS?(XU=UybRtTrP`PE-3jv$Cjo$dT9Un8Vyn)4<=i|)Nh`yQ zDaDC(t4jW(M!>#)f_n##`zg;nt)-rWtaX=DPYyY&s6S5y0gcV8(+VGI}0*% zb6V+yuW6%207=!77PVb%D(%gDu3x@krMy?57hTw=|dOkPBN&sK@r*Gi-a##`;?Hva1taxRc+c866j zkECz>B)85HKqp0?D#(+)_(7ZHM~aQ zbk{wRAQ?GlBxZbMA95}n!|vQ1iy@A`va>g(O>8v?^U$-&6eswb4;Ff(IjsWvHm|g| zFFb1lGB)Rxgz1~t0KSQ;3U5dCntuup!|1L-aX$8{)*&x#6f>4y0Uu)rwi%2j zie`|!;8!-eXCV#@X9qi269>kkA1D@q?}GlLkyvAYSnDaPC+7%%NdwFjZ@|Bjj`}Xq z?K%PaE-tp@iQ? zm5Dn@97l4BJhHW}2aIHXLI`?GFnRQ3-kEr25c?`QF2QC@-pkZfo3k-) zOori6N%V~twmJdC>`C&VN+N)17R>`M+x*crC8(S$6OqdTBo@vL%tkvAm$=9Apvm=f zz@!(c23pH&2-h| zPbrURZ}!{>Cm6P?5VI1{nNtPji8~d2L{W^7%=zhu0iU#kNod|mRY|-Rc!cQ;x!iOf z2=}kH_V$OnFF?qKud$I$DWE01`@kRtf~ZTLAf}8KJOb4UPXEeC#XmPh7kTXK?(wxj zNln?Eoiy>sOK3y6&jn0Qx@ymamy#_`Zp>_*=FC1et5D1-Ds<1xiFSa&x^XX3jh4Kr zef@_PylDWzuaSzFxUx}FQbR&-@Vc~@F{-xVn`;e7jUwq3$S1gzJnXI203mQct>(D{6Ad;RfK7Rj*-A)}r0^<3 z&nX8+`ta5jJSr6IG(5&i=ShB}iV zJrnD<+`jy}+8JS~c`YW456C(px71CbmO3bJ$IDN?GNkA7*C0MQHR5nGnolOOn*5$j zuHb16e%MsAnNknyWYyd~MUAtf=*0~4!-0h^=GV`W+wCQ&pLMCmfZ2`2nzeO>+jckl)Q|?FDW7VzWuiHlby9l)B&T;TdthGo?c%|UHT;is0KJ0 zNY&NNYG^3dm1?;BHE7nA>d^jza$Q{k<+=*06})Rxyt&voe7d#1x3~Vs0Js@nSQ-R4~s%mT*zQA8g`;OE}3rxxkxZA0sTQ z^GHf$fnt%M7W63&&;+98Gm1svXB{U!o=bw?DmgXm$>_}CLakG{j72dRo!o%d7W5xY zf1NDGIx8$oTdoCJopWNG&pHTYb1ZUfwxF}{ycT}oQnee#7RKlO`Q@8SR8 zZ4KB|96CT!>d8Bqme>ne6>t>DC947y%o-!`17Qy`8lL4t?-Ltd=A3=5Zkl}DfZdvz#i^s%+*_?%Ss@S3@ljR7Jj6J~J$ zh!}Eyb1Mv+8LDSDxJ;7!hRuK-9Io7)0&hvCJ^5BA*`t9wBNj16zX!s>%zU^c6Sqw( zEBRzXE{%g1Q(u;*>0URwIGI>HX*v(rCPpZN1-vwF)NHwkhN%CM3CN1tL^3VHw+u}H zF%J|S>Ktb$rZ1V(j9!Cf@A;D4gVWPfjLk5GkKD22%l8QXjmKWFJ9Fe0$f>2!f*&dYk{UAn;k67W;Dat^Qh!)58G+FlO*JiD-AqV@?y``iK_ zq!8fEGMXbc`b33PiU(6ibmVAJ3sb59WLMYl4H} zJA2BQR@<8z)s@Za)rwHyU;fLZeM`6NaPAFAs_@^q(+K`O)LB$y;)PpsMT*L-vq0ZY z_TOBBM=tTU;1FQe)BOI7#!M+^$N(H#i_J01MYr=>?R>y(g zS6_&CKHOV;HCSHy-2mwXE+a)OT3%Y=?90h|F|||10zp$RK6^Yn#(_>0a;aL@Vhz{; zwVLKJAd_EIuL5Ih>q09|Vx2|d!kNtowP_W?7?0E3fR9CJ19$*@2!aKKarii@Doa%C z_@80cJjHoZoS}$wC?j%31M5jLhT?6A`%@3)65$&Zg`p+;K=4n|i&C}n3o|Fd>`_rx zm42h>jqh!#8u)ZFk+au|aMM54#OU1v z_|Lq!$pt~rynu5E093d$C*(gSOraHEa}3Tj#+jb?TrKY@5U0_@HI=zKWfXw&S75) z&-XcQ(n@3I5EQLeH9$kpEj-)4`df%gECE0DF@P1mz|@-KV3bQF2|k_mSe#pO-}L62 zxWt^hWYF90vqciKV06hMzM_l z-9xP9N2Xn2P?_8QzIrrB!)A3iOKC$|qs_@%^r_t>z3Q2{1B(P@)0Ec1Q2IUwH{qZ? zv?sA9QkX!w5L+TcGvLDeO|Ha%)+zsQR1Hy27DU99i0FgrSQ^(u8@SORqOc|XOGI$( z;uvOcH~2x^4TGeMht1SHYs`-!2Xb!C=aZXf5^Wx_=F2p-I&P$4k5DTq%$6*xs(&@xykDOo|A+i2LC8NFHuq3<%T0Sk+tb=Rrr_O!s zS^tfMdCO317uwidChb|?!czz7f>3uPqWBIj3b>R_pU7NF!sJ*eNLnMK7!47i%&^GtLO zIe9m2$H6IwpMwI$rmOu?RM{5?xR3`Q3Gjq12V5}8oHG!tA&^S>KXdZ-rN)|x@tTjx zeooeKmwW5=dIyrdJuQ`W_aRU-$?E(sda~g%tj$N}t_l4ps^qeY@_(7cH$wG(&9M4y zTeV^sUN9|wp&cjQ?u)?}w*J{_pMc>+6M+E{;Z6_{Q`?a|7ZB8#>)0s`2JHYgA;l3( zvWsyueBPQNRLm|$&Gi?XM+bj=xplNNJm6~QNP4elTYE9FtjGqrdj4?9-i4-o?DfDs z{hf{YqNQPq6aD!c$$RK_>n4w}TOp2!WG#zJxCXTKOBUm>fd~Con%N^UJ4d%ul&`8& zkga#@Jl#Grc)bI!>>*AB;*1hYC^{%MJ^}FomCoJ?bI8~o$nX9e?8r|!Fo|2i&KZyK zoA`%1C!Mu&+OM3z8r_rXWZuXrOo2_n9b=_3jLw{~_nc!NtHVoC%X^=5miGq_t}qLu zIy_}FhdM2fk~e6owqp()Dj z@&)caW5hl}`C^4v21Slqxn)dN?9a`T*~Aw7-qHE(&Eoei>Kj|&yuhb_;}fWuX38>j z9*vOCj?C?*AzKZ7W%K6H_98l;@`)xB^y>=d7UT2&@D->kQX}MuJST*xmd8cN)kaT^ zXE*74;>r@Y{)mVdX`cu66wL-P9XUmdY0-ezVwaZ=89NeT!H^AH zdYql1S^1t#Fyxg~m)A49K>`YI?IBDfDqY=5a9J8`(Kue0T4j#x(u4C#Uu{wWJOvD! zsZA!=#&782KId=j@LBuDYbX1B0oCs`uG|hXqccVvc4*1Jl@9yp_WK3VY!+?(P^8*8 zyRfgNWYbZQT+@~~dc$=#EGFo+0>xUSTA-5bCMk2$Nva>NTKSX#nPAri&lr#P$1nmmUv|6T%h%^czq>Vwq9x)eFWdw~#rojx=&-+{QuZg8ab;}8ee*7gYb zK|Te&GJE^B-;HFu)WX^e-V&8C9on{_h6X<_Dad}E+Zq%^GLt;d*ZE)u}dl-(a z&nBmx0;m~tjh+=}Gto^cy-y*+N+}_ls_+FU_$)I5VMfRjZoxYg*Q1pbT%vG1nw2qp z@K2xpAOHLR=Hep9xoR$9>T7G;=NE*;m*G{v<#8j3u7}H)c1_RmXnCCmS}QavYT_lA zH?tDV6i((!`s?;5{q>{kbCQj>^;03}n77%9;po@aKrVv^HV+yAIC7*+ZYT3=6==ce zC^7Qo8m#s0PD}o;)0*T1>(teF6(h)^P?7|Io16u_DY>AQ4#rVLtzcLUkz%i*V@_VG zk+eHsnsQ05szS0rqbAd%x1`&|{HO__mg@8KBq9H4di}HP87G=E+^SLx(om^uhgqs9 zUR*k_T{>I15%yWD-7J|!#^y780(j%an@a$4#ICHhVug-R({(X9wSWv(15llmrlC30 z(Yap{i!Trdb@B0V$FTjVb`8hN537*RQiukvQ)1njpN#2mmgOa0T=Q@y#GjULGE%3i zU4aYQ&5nNQ0o>o{##9E}^zn#ye8_ZhZ+w67zUgzb2=s7l0RzzH+&1y-;c+TOH?)K) z3#Q_*1$_Fj+EkKeg@eOU#F7-0i1s zFdU9ZduIvbe`<(-%X9Q%YBm{S!iFDAuG9%z8wfv8HIWU|Ut9P$+kOF=OtjQgYT*;H%dEf}%V&{^lnx^c*PuovPDsYNp2kIJG zLI@%-lx0a!4u0=gSQvhoR|RFQH~+k>l61iz!~wXz_l@h4{4P%i`&J z8IQm|bEz%Y!lC(XFsB@NYirW|*xqJ;1BvN*cE;-lj7U3hrmx{c{F#&ME%Q^~vNoWY zvu-xIw7>s8&a_#@;2E5ahTRc0MI&MmMP}CmXxiOq7|#>*zgvuhRC%%~VgIC%1G9<& zu5K5z=n1Wlsx}bSO)+EO`fU?iR~9pHQLmWY?H02@4y})>SgUQi(QljGEo*C!8;qxP z$Z-?HZGhX$H*BzSGvkf8X>WXFG>bRrMt-B!cpJi5-=IhNjXTCT^+Q7(Z`dT1{jh=U zej{$$H|%%!jb`NI8!DChVZXa?G?P%gk@}%GTK(vSlGwN)atk|83N;V;K%ef8DAC3P z&yEujkOz+!vFgfl!_WFT2t6iK`DX!?=ZmvKKq%gUWt1m^!R#XR&NJB)v0!cqVnf(k zonImag=m*>vhRTvY|v-6B}%C!EM^-!es|l`lv4DBREhuytyVXsm@_Zs{%oyMPIXhe z@(^?fDT+nIaYQ%p_sV#6%&angW)<8{S%}dUWTjh=7^1r}3$u7}M9>hZ z0@dL2_Z;Bg@Ji7hyzeuDD-=0$=L9^Eo*ZycVhbYqrl%4PIKVa$g2D1!-73<6VT0hz zXoc}n@I!{``9I|pFK^_PO%)R#L=o|vJ7i*m|3mCdckBgSxX*?&e_Z}Jy16#CFINQ* zq?#o309xEcIdBWtk>enonua;trt4rSo%;)vbTE+V*-(ie<;bv$w|JCq2ooOH=_V}7 zt$7I{1isJjc)zp%b^>s#E3L(-8~AU>*fK;K7-R9^6mAU;rN{;`jKE6eziBRN+!C$t z=0iT0OSX~)R9EQAC(9%`Md|bsydf@031-DO;sH}XdH;KAIhg`tkb_VT$x&gWBp3oo zl1GG?iXqm%NWXpSr7MO$ZXiJJZtW}Psl&OBj>7|=AMX{X1m2pZ$tqT?0oms8@&h>f z;LGs?0vrsbym`KbMQjr{tLf=!g&$LvQICybtg>rPcFJsbiiXadv?$|InL0Jd^P?e5#&&H|~b_&{wMaf#u ztVy&Qc)HnS9<HQ>}-kj`_+uwZO^+#E+N44GTkr)CP+Z0^%VCl~fySx%(tt znoD+iNfoC~*cwX5v)JjTSAvD3SwWr7Hp*aqR-6>AoC%q1jn`%oXbC`j85<|QZJ7V>BIco=+c>=`G9Oa5At4-cB^`5{r2 z_V6U1*sAsq_73^Zh3Bz7dQT4QhB~vF?D#7}1ZV)Tg9qlx{CwwjwFv!R?ETE(dlLD5V?Z+d4@U^eSsS2%BT&tir{1QyZu3RpzrfCf zl-?LzIV~7rxFp*smVU$HGAou)*9YBW2e9p7LhOvQ;|W8maUumbz{V)C??as#5`9d^ z#|iV(>9KSD&c61vZU;JZvC%CpJ?4LGM0}N4Gq)ce$C;7;0;R_|W*A;iIDY$>a|n{* z0RP7?uMN!l|9t-C|NZOVkZI?)-~GpV`RlL#J18JhQ=0(f)X|)T z+c55tDYK2yFe7kk;Oqy2-e7aPN!y{+x)ATh)un1=UJ zu(YOU#M5TUiq%X!qzFZ&^Oh*&bT~O}GDa5v1XSOi_b~Ehzla>vJr17NQsvN*ZPYn2_Y2w= z82|ePu_U`zz&zOA!I|1Iq2hXmax89`2RURPzaSRM;B*8FHYOLEG#tu5MW?D~(cM2ms6uiG*+O*yF(6_cQy%M6aSYb6aIGKLLf$(#ogZe21m^zyL}2!CFd8bb z%?>B5957yj{kgdP(0gNO@b`VQ`m-h7?;NzeTbL|iBO`D%3ht_!Cor|g>WcskB4beFl#>^huN zM41tg?HXTdL_%CfL|=)%T^*I@ zB=O4`zojJ)W!6zDZvOLcgKT_{-s(W|Lc;&5dku|=Qu1(gExI1#$mCFb_XQguMZ4eu z&mKys(J8}?J|(LxeArZRAmFQqh}IwMfaf)rN2E##Od?g112vywQ2b1BOnS2C>1^8& zV^x$W(lXBx<&~*u!_cqlzo=I@L2`tBVw3`3IZ5uL8N@0eiAEaF7pSSmgB0o#rkUO* zAA7esTZt6;ax1-O0r!<9Xlh;et#cP~d@DPAtZMX*} zES0Rm9;6da!Zokb{w!+oEq`rksI~eEOso?f*ZcTLnSEWIhE$?LvKhYL$;iYPDdfd$ zDY0Q~$0XTmLk$Gis&uuu2`lZ>1AYWo=8ecnJ}5prBYDD>!pw8n30h-YAp0`=c9bd* zlcMGxN1?WGas8%#?Q_HK57nb*p1nNx3T<0z^9kqf>bnB zDM+N|(yG8Rh;a?W+3$TlH0`gOH?}R(XnQHg76=Nxk;Jw`I)nmL6CkQvSE$XDf>nNL z_Tj8!6=6q(5uUb2ukQ!JwT}X^~rPb6CH$DC{d#m$t?@Ei1!@)-&xA5TE zR`jw*gU*{mgd1}*3l@%Z5EdM9vsQ#dPX_=ANv5IkI#-aY-Rtg{4!kqIB-_N&Tk0HE zu>@$B`{jtXx}kFLD&k~dg9r|Eup!zuF!xXRKF*K_=?Ho7kX7z6@=OH>IRG4~{G_*l zotue~c&`>&Ah?XMKA#Z#tSZuE4~rmS5hI~_vp9!aL|2tKF@8j_4jVU95SJBKb{v@I zL0SQFdYz9L!PM6leYP`FiyIb3WISn+wGyP2*V?B{g*=&tLF+0$-QGp$6M4iEJx#$R z^5U#3ErRe|ES3RNo$L{yOqx{VFblQ@bJ{#0?;o@&#Evnx{PnX1^bwR z)#lgioW{3K92;+UsH-yvURX&Da_xUnY(YLiOl;9#Ms8hOOZU|zr;&3sOF#E ztjK^mvk^xZ9{_PB^mnIotd2hP-{cxBH4}H>@4PZB`#c-=KWDs!UH!*K)cc067*4o6 zlP#24`YF4eh5so~NO~Hf|42eeu!3Slj1is{zo0u+$)U2j->e?ldeX$EyFD=er#AQi zHku5ha4^vEi>I*IHy;+l!n*LAhw<}KsO=yAmvn3XhPhXl*Xs;>hAc-;*5|?VLa>wI zX`i74d&%}7YkCISJRN_A|k0d^R?y znZC`;P-pnekFQY=ZBc9UEF+^DOi&;w5`DIyuY*tFNq`zf!HejMWyeaUny|!7?beg_YfJl z%Bzi?<*&Z7qOM5u7!m%&ZYwxrDl+u<*NOcsKvRb>l|y=ZSWo)H$;}v_&a35cwdr_g zbUOu2-wFWkp{RKfkG_#)hQgF%>9JC^9@RI~kqLte$M4#V^Vy4099M8duIJ^u-61HN zCt@qjs<`WNAJK?10ggH0ZNEPP!>RIuI-JXH2xOE z&**#Rl>8LrpgMIuPtATypX#=~Adw^-o}|#k9zfN;%-*vBNCb~J=F-5_$$k+TLq3M= zzMpKbN%SS%Ac>_AD-kuzHa;yeb{fKzo!+;jUqn*G#p~5ifg9U7Z1W)D(iV{rywZES ztter5F~8v+1?|IHX4IWD5s`!eS0?cz-0&D6?!mab z+|*2TIYObd{8B+P2)~TT4?(EP<(04gud4Hvt??PK1pV8sxNKSv(_TIVVI&Zlod8B!kk!rp(IH(k5QJ&S80q(aR6n@$%qbW54e8< zTrP)2mmw!2W*PXq({Im&ytamJe}luJ3^`{UZpxHQhIr;~7DCeTR>AUW)kq<1AW0tiBMyS2Z*wtb(ciB!)(W{SL3)DB0i}-^;`!WFihYI{hCXOaY+e6(C z(-s6$uDck3I4$v_B|nKtYICR~i`P6I1p+lsU8DKNz}w5}%0jA8flM?Y0>53IHO1qX z%Cb4)>t2|4Q8Xbz%c~f~1kv=d@~el{=W;O;6<@N%%p4hjoiS~KrS)udvZk?-hNm%fmk|oD~Hn!fr#ppoAYa|j7$aM5CfsLSLPF*8&6-Hv<&D3o5jdg zuyH<4jg{Wk8erJwj=$my*lE?^d*W0w7&KCEt8l-s{Ht$+RYuGtN$yD;Z~T>~hy!Zcg7o z$g#h#RJ(9*=U0bXYCGU`9VBT0|Ml^osqE^66vbu`(M=R*=hs!?-%`15(KV}q935)S zk)WB6$plCi7Jj)GAQybocp~C$UkUaooA;LK)A5bFRkG!E8Rhoy0lls)s7KZpxw@#z zPW*eyI!_o#w>7#s-P+axY9@obX-WNCld-GD>+~!tA>q>QwQVNXTYFQ{_+CBL(Owrz zkb+jBYhXDv{=A9nEy7lT=ybz&cD+i_%YFLJ>up4Uv~w zZT1Eh1zRn2c+uQ~O%o0BHowNEjXqGc%RjuWHbfJx^{Fr3jM?SvS@fCT4z8L}pFL~J z(TKVAJxSm7_Gu*h75ex#6*7}^3iew#zu;>6G%wM_`2}+udvHQ_i(C!CO@-g3yd}vO zZFs;Z)v;YgmQwj88Hb1S9uE4$bP{9sd+{pa+ti4M-^?k-3ED3AS@l;w{l=+`#+Wlt z7$DzZ^*3xBA=Z2`>6vGE6S_&rvYC(g$ed?#RiFE!9_rPElKY?eP45b0&4N@fAY?o$*DZzWMF>MO4jaGZ@NX!0z&7ZLDwM<(6Hjsz-2n3WyCO zkIAW*u^BsM8_zZeS|~3<_!#9ZZNUruP)<3I{WGzHU|a0`uOuFd=Z%$&LGZqm6NQF_l(*tsB`1T2J^m zfiTWuk7anE+z#t-9OLXvP(g0vA)OvLYZ6W?`(!}GKNoI5E*up(x^Soh;lT_ZAqnD_ zF3=F(fY)+JwIpkLOdC=#m~(YDKOm$Ft3}4J^c-PH=1}Nhjc*e}#9)DMn43g6`(e09 ziA;~nEK*a;sJQUvAjYD`HL$HKA;{@#a-e;&}wS?I~{?uxi$$k zbNtHPZCWF`y17F#=9|%nqp+dQg78)Q$#2XB+;f*+QFAbPgaQvcwU%Zo7=bb*{4_Ts zl)G7|XWWl>utMIjb~#4GB%8ia;(9VaYlqB24YHuHdBWMD4_m9yD!2*F)HD2ck0mH{ zxxC1KVH*;&qvZ1HlvVfG5loM-v=C&C)*8Z*G!R$OIuH?h!v}J4db;RRetf4g{U6_C zX%L~N0ToJ9M9bW3UB5N-9+@6fCl0zww1Lpti3HC^88?n`R*7D8f9aZ)-Sjt=RBe*X zZWrnEv4kbYr zF&EL{?7N>(zzHyeJBaX0k<&>Z@PZ8}19qoL_?D}av%3e^d}JEglxR88Jzr5|@w{>c zCL?roWQz1*rpUH$CKzyxGXI`)9aF$Jq%#Z4-19E@?EMl$7Hsnp{+tqSFCtzegI1%2^Q?%5HYreO%(+idb5GkN0}9DY z?O3=)h?;<4hE6k~1^<|kgb1P4IDphIaxkk3=CXKz2Et<@pm)0}KxJbb`2@qD_8{?= zX*Q5!yEkbiny*_Zd00?#Ypy4sX};yXVUeO~E&3_X7^`ft%S*o+zF@Q>*J;oh^lW?! z*VdFqHmD2zI8y%<)W8MC+VD*-b3>pOjaM2(9#d${n@e~uD5GV{9s_R4^5pWj@W`Jv*mJ(;qg@YQ;mys)oHG=-!%4u&ZrvIq?$qkkY4BS!yD4R18RWn zP{>})q4#r7Nt*uLz=KG#mIl03V*5ZRg{`gZV?{0}?fa|e0HXFE?a#$eNiKP{`sme@ zlql5kQ$x^G!^%^JqOt_gMjeKok{jk^)qiJ^B}AAWx@yDt3{xuz#tZikE4;sQPc4TvP5U4!l2KFQqi1Kr!{1UCC zn)tmAb)Gi5PbpN(5P9}^k8NIUTQnGqwv%{={g^VymKxKpzSIJdPo4@w*+&i8T{8sl zKh2DTKG#rE;Z&?nY26!gD*<&sWW-QJZBE}^wV^uJ`sYHgntI%btE;{52VHx+3IhZTTViJ@EgM6dEoCyA8+v5OYk2B>()Q%SA zU*Ak_2yS_6AC~D2`Ffj3=C`tlXx0Qz+PHuQ)wjgs;j0KZhB|t=J*x3jynQY3S0!x> zoR2A_5`9RSv8ogVNGrU-BCRAW(k@O48#{v)(u;1B!ve=)i&y}kilwj(Od?7HN)MA< zme>roq@Vx-C^Tpz*+JY$CCMYX(q=!~#!H-2TroLfs~b%YFZWsa4@g1k2(~i(Ghv-& zS9S51xAbT+b`Ry52G}_KI3;7j|yb3puZU7?>Ljf{VMd zs}NlCq^u`xqk&Cy6da`xwW3a#*cy-~7bQ|@4qqDtzowD0#!qoCil38>i}UMUVr5)h z0PHl6l7HZwn%~QLmSdg~gf#kAa~x8nP?Lz=#XkKoxj@)&XjqIX>~(~SHn~`;FL_t= z+&fq;hNd&|y<4}?-FswTo69-2G zqn+KNJG!Z{g{v_`ng*49LKeIAW^=F;B{@PcCY1Hl11;v?H%TNCVI@dF9Z(B^E0pmcXepaj)K%~IYiA3 zj<)?p7ypxb-gt{@6dH1Y^e@*6b%Z!6{=*L_$F_+}LSx4|HtNHa%0DbHmX1(^@nN3f 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¸S=Yyv<(Y8FjBA$Mvf`dK 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%0Dn3{KHA=ZYOS?718E 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