正在显示
26 个修改的文件
包含
0 行增加
和
4419 行删除
livekit-android-sdk/src/main/java/io/livekit/android/room/track/video/OpenCVVideoProcessor.kt
已删除
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright 2024 LiveKit, Inc. | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package io.livekit.android.room.track.video | ||
| 18 | -import livekit.org.webrtc.VideoFrame | ||
| 19 | -import java.nio.ByteBuffer | ||
| 20 | -// Native OpenCV implementation via JNI | ||
| 21 | - | ||
| 22 | -class OpenCVVideoProcessor : ChainVideoProcessor() { | ||
| 23 | - | ||
| 24 | - companion object { | ||
| 25 | - init { | ||
| 26 | - System.loadLibrary("rvmncnn") | ||
| 27 | - } | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | - private external fun processI420(y: ByteArray, u: ByteArray, v: ByteArray, width: Int, height: Int, rotation: Int, timestamp: Long): Array<ByteArray> | ||
| 31 | - | ||
| 32 | - override fun onFrameCaptured(frame: VideoFrame) { | ||
| 33 | - val buffer = frame.buffer | ||
| 34 | - if (buffer !is VideoFrame.I420Buffer) { | ||
| 35 | - continueChain(frame) | ||
| 36 | - return | ||
| 37 | - } | ||
| 38 | - | ||
| 39 | - val yArray = ByteArray(buffer.strideY * buffer.height) | ||
| 40 | - buffer.dataY.get(yArray) | ||
| 41 | - val uArray = ByteArray(buffer.strideU * (buffer.height + 1) / 2) | ||
| 42 | - buffer.dataU.get(uArray) | ||
| 43 | - val vArray = ByteArray(buffer.strideV * (buffer.height + 1) / 2) | ||
| 44 | - buffer.dataV.get(vArray) | ||
| 45 | - | ||
| 46 | - val result = processI420(yArray, uArray, vArray, buffer.width, buffer.height, frame.rotation, frame.timestampNs) | ||
| 47 | - | ||
| 48 | - val newY = ByteBuffer.wrap(result[0]) | ||
| 49 | - val newU = ByteBuffer.wrap(result[1]) | ||
| 50 | - val newV = ByteBuffer.wrap(result[2]) | ||
| 51 | - | ||
| 52 | - val newBuffer = livekit.org.webrtc.JavaI420Buffer.wrap(buffer.width, buffer.height, newY, buffer.width, newU, buffer.width / 2, newV, buffer.width / 2, null) | ||
| 53 | - | ||
| 54 | - val newFrame = VideoFrame(newBuffer, frame.rotation, frame.timestampNs) | ||
| 55 | - continueChain(newFrame) | ||
| 56 | - } | ||
| 57 | -} |
| 1 | -cmake_minimum_required(VERSION 3.10) | ||
| 2 | - | ||
| 3 | -set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.11.0-android/sdk/native/jni) | ||
| 4 | -find_package(OpenCV REQUIRED core imgproc) | ||
| 5 | - | ||
| 6 | -set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20250503-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn) | ||
| 7 | -find_package(ncnn REQUIRED) | ||
| 8 | - | ||
| 9 | -add_library(rvmncnn SHARED rvmncnn.cpp rvm.cpp ndkcamera.cpp opencv_processor.cpp) | ||
| 10 | - | ||
| 11 | -target_link_libraries(rvmncnn ncnn ${OpenCV_LIBS} camera2ndk mediandk) |
| 1 | -# 背景图片替换功能使用说明 | ||
| 2 | - | ||
| 3 | -## 功能概述 | ||
| 4 | -此修改允许将Robust Video Matting (RVM)的背景从单一颜色替换为指定的图片。 | ||
| 5 | - | ||
| 6 | -## 使用方式 | ||
| 7 | - | ||
| 8 | -### 1. Java/Kotlin层调用 | ||
| 9 | -```java | ||
| 10 | -// 设置背景图片 | ||
| 11 | -Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background); | ||
| 12 | -RVMNcnn.setBackgroundImage(backgroundBitmap); | ||
| 13 | - | ||
| 14 | -// 清除背景图片,恢复默认颜色 | ||
| 15 | -RVMNcnn.setBackgroundImage(null); | ||
| 16 | -``` | ||
| 17 | - | ||
| 18 | -### 2. JNI接口 | ||
| 19 | -新增JNI函数: | ||
| 20 | -- `Java_org_example_project_RVMNcnn_setBackgroundImage(JNIEnv* env, jobject thiz, jobject bitmap)` | ||
| 21 | - | ||
| 22 | -### 3. C++层API | ||
| 23 | -新增RVM类方法: | ||
| 24 | -- `void set_background_image(const cv::Mat& background)` - 设置背景图片 | ||
| 25 | -- `void clear_background_image()` - 清除背景图片,使用默认颜色 | ||
| 26 | - | ||
| 27 | -## 技术细节 | ||
| 28 | - | ||
| 29 | -### 背景图片处理 | ||
| 30 | -- 支持RGBA_8888和RGB_565格式的Bitmap | ||
| 31 | -- 自动转换为OpenCV BGR格式 | ||
| 32 | -- 支持任意尺寸的图片,会自动缩放适配 | ||
| 33 | -- 如果未设置背景图片,使用默认颜色RGB(120, 255, 155) | ||
| 34 | - | ||
| 35 | -### 混合算法 | ||
| 36 | -使用alpha混合公式: | ||
| 37 | -``` | ||
| 38 | -result = foreground * alpha + background * (1 - alpha) | ||
| 39 | -``` | ||
| 40 | - | ||
| 41 | -### 性能考虑 | ||
| 42 | -- 背景图片会在设置时进行一次格式转换和缩放 | ||
| 43 | -- 每帧渲染时进行实时像素采样 | ||
| 44 | -- 建议使用与输入视频分辨率相近的背景图片以获得最佳性能 | ||
| 45 | - | ||
| 46 | -## 注意事项 | ||
| 47 | -1. 背景图片应该是RGB或RGBA格式的8位图像 | ||
| 48 | -2. 图片尺寸不需要与输入视频完全一致,会自动适配 | ||
| 49 | -3. 设置null可以恢复默认的背景颜色 | ||
| 50 | -4. 背景图片会在RVM实例销毁时自动释放 |
| 1 | -// | ||
| 2 | -// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. | ||
| 3 | -// Copyright (C) 2013 LunarG, Inc. | ||
| 4 | -// | ||
| 5 | -// All rights reserved. | ||
| 6 | -// | ||
| 7 | -// Redistribution and use in source and binary forms, with or without | ||
| 8 | -// modification, are permitted provided that the following conditions | ||
| 9 | -// are met: | ||
| 10 | -// | ||
| 11 | -// Redistributions of source code must retain the above copyright | ||
| 12 | -// notice, this list of conditions and the following disclaimer. | ||
| 13 | -// | ||
| 14 | -// Redistributions in binary form must reproduce the above | ||
| 15 | -// copyright notice, this list of conditions and the following | ||
| 16 | -// disclaimer in the documentation and/or other materials provided | ||
| 17 | -// with the distribution. | ||
| 18 | -// | ||
| 19 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 20 | -// contributors may be used to endorse or promote products derived | ||
| 21 | -// from this software without specific prior written permission. | ||
| 22 | -// | ||
| 23 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 24 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 25 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 26 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 27 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 28 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 29 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 30 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 31 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 32 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 33 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 34 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 35 | -// | ||
| 36 | - | ||
| 37 | -#ifndef _RESOURCE_LIMITS_INCLUDED_ | ||
| 38 | -#define _RESOURCE_LIMITS_INCLUDED_ | ||
| 39 | - | ||
| 40 | -struct TLimits { | ||
| 41 | - bool nonInductiveForLoops; | ||
| 42 | - bool whileLoops; | ||
| 43 | - bool doWhileLoops; | ||
| 44 | - bool generalUniformIndexing; | ||
| 45 | - bool generalAttributeMatrixVectorIndexing; | ||
| 46 | - bool generalVaryingIndexing; | ||
| 47 | - bool generalSamplerIndexing; | ||
| 48 | - bool generalVariableIndexing; | ||
| 49 | - bool generalConstantMatrixVectorIndexing; | ||
| 50 | -}; | ||
| 51 | - | ||
| 52 | -struct TBuiltInResource { | ||
| 53 | - int maxLights; | ||
| 54 | - int maxClipPlanes; | ||
| 55 | - int maxTextureUnits; | ||
| 56 | - int maxTextureCoords; | ||
| 57 | - int maxVertexAttribs; | ||
| 58 | - int maxVertexUniformComponents; | ||
| 59 | - int maxVaryingFloats; | ||
| 60 | - int maxVertexTextureImageUnits; | ||
| 61 | - int maxCombinedTextureImageUnits; | ||
| 62 | - int maxTextureImageUnits; | ||
| 63 | - int maxFragmentUniformComponents; | ||
| 64 | - int maxDrawBuffers; | ||
| 65 | - int maxVertexUniformVectors; | ||
| 66 | - int maxVaryingVectors; | ||
| 67 | - int maxFragmentUniformVectors; | ||
| 68 | - int maxVertexOutputVectors; | ||
| 69 | - int maxFragmentInputVectors; | ||
| 70 | - int minProgramTexelOffset; | ||
| 71 | - int maxProgramTexelOffset; | ||
| 72 | - int maxClipDistances; | ||
| 73 | - int maxComputeWorkGroupCountX; | ||
| 74 | - int maxComputeWorkGroupCountY; | ||
| 75 | - int maxComputeWorkGroupCountZ; | ||
| 76 | - int maxComputeWorkGroupSizeX; | ||
| 77 | - int maxComputeWorkGroupSizeY; | ||
| 78 | - int maxComputeWorkGroupSizeZ; | ||
| 79 | - int maxComputeUniformComponents; | ||
| 80 | - int maxComputeTextureImageUnits; | ||
| 81 | - int maxComputeImageUniforms; | ||
| 82 | - int maxComputeAtomicCounters; | ||
| 83 | - int maxComputeAtomicCounterBuffers; | ||
| 84 | - int maxVaryingComponents; | ||
| 85 | - int maxVertexOutputComponents; | ||
| 86 | - int maxGeometryInputComponents; | ||
| 87 | - int maxGeometryOutputComponents; | ||
| 88 | - int maxFragmentInputComponents; | ||
| 89 | - int maxImageUnits; | ||
| 90 | - int maxCombinedImageUnitsAndFragmentOutputs; | ||
| 91 | - int maxCombinedShaderOutputResources; | ||
| 92 | - int maxImageSamples; | ||
| 93 | - int maxVertexImageUniforms; | ||
| 94 | - int maxTessControlImageUniforms; | ||
| 95 | - int maxTessEvaluationImageUniforms; | ||
| 96 | - int maxGeometryImageUniforms; | ||
| 97 | - int maxFragmentImageUniforms; | ||
| 98 | - int maxCombinedImageUniforms; | ||
| 99 | - int maxGeometryTextureImageUnits; | ||
| 100 | - int maxGeometryOutputVertices; | ||
| 101 | - int maxGeometryTotalOutputComponents; | ||
| 102 | - int maxGeometryUniformComponents; | ||
| 103 | - int maxGeometryVaryingComponents; | ||
| 104 | - int maxTessControlInputComponents; | ||
| 105 | - int maxTessControlOutputComponents; | ||
| 106 | - int maxTessControlTextureImageUnits; | ||
| 107 | - int maxTessControlUniformComponents; | ||
| 108 | - int maxTessControlTotalOutputComponents; | ||
| 109 | - int maxTessEvaluationInputComponents; | ||
| 110 | - int maxTessEvaluationOutputComponents; | ||
| 111 | - int maxTessEvaluationTextureImageUnits; | ||
| 112 | - int maxTessEvaluationUniformComponents; | ||
| 113 | - int maxTessPatchComponents; | ||
| 114 | - int maxPatchVertices; | ||
| 115 | - int maxTessGenLevel; | ||
| 116 | - int maxViewports; | ||
| 117 | - int maxVertexAtomicCounters; | ||
| 118 | - int maxTessControlAtomicCounters; | ||
| 119 | - int maxTessEvaluationAtomicCounters; | ||
| 120 | - int maxGeometryAtomicCounters; | ||
| 121 | - int maxFragmentAtomicCounters; | ||
| 122 | - int maxCombinedAtomicCounters; | ||
| 123 | - int maxAtomicCounterBindings; | ||
| 124 | - int maxVertexAtomicCounterBuffers; | ||
| 125 | - int maxTessControlAtomicCounterBuffers; | ||
| 126 | - int maxTessEvaluationAtomicCounterBuffers; | ||
| 127 | - int maxGeometryAtomicCounterBuffers; | ||
| 128 | - int maxFragmentAtomicCounterBuffers; | ||
| 129 | - int maxCombinedAtomicCounterBuffers; | ||
| 130 | - int maxAtomicCounterBufferSize; | ||
| 131 | - int maxTransformFeedbackBuffers; | ||
| 132 | - int maxTransformFeedbackInterleavedComponents; | ||
| 133 | - int maxCullDistances; | ||
| 134 | - int maxCombinedClipAndCullDistances; | ||
| 135 | - int maxSamples; | ||
| 136 | - int maxMeshOutputVerticesNV; | ||
| 137 | - int maxMeshOutputPrimitivesNV; | ||
| 138 | - int maxMeshWorkGroupSizeX_NV; | ||
| 139 | - int maxMeshWorkGroupSizeY_NV; | ||
| 140 | - int maxMeshWorkGroupSizeZ_NV; | ||
| 141 | - int maxTaskWorkGroupSizeX_NV; | ||
| 142 | - int maxTaskWorkGroupSizeY_NV; | ||
| 143 | - int maxTaskWorkGroupSizeZ_NV; | ||
| 144 | - int maxMeshViewCountNV; | ||
| 145 | - int maxMeshOutputVerticesEXT; | ||
| 146 | - int maxMeshOutputPrimitivesEXT; | ||
| 147 | - int maxMeshWorkGroupSizeX_EXT; | ||
| 148 | - int maxMeshWorkGroupSizeY_EXT; | ||
| 149 | - int maxMeshWorkGroupSizeZ_EXT; | ||
| 150 | - int maxTaskWorkGroupSizeX_EXT; | ||
| 151 | - int maxTaskWorkGroupSizeY_EXT; | ||
| 152 | - int maxTaskWorkGroupSizeZ_EXT; | ||
| 153 | - int maxMeshViewCountEXT; | ||
| 154 | - int maxDualSourceDrawBuffersEXT; | ||
| 155 | - | ||
| 156 | - TLimits limits; | ||
| 157 | -}; | ||
| 158 | - | ||
| 159 | -#endif // _RESOURCE_LIMITS_INCLUDED_ |
| 1 | -/** | ||
| 2 | - This code is based on the glslang_c_interface implementation by Viktor Latypov | ||
| 3 | -**/ | ||
| 4 | - | ||
| 5 | -/** | ||
| 6 | -BSD 2-Clause License | ||
| 7 | - | ||
| 8 | -Copyright (c) 2019, Viktor Latypov | ||
| 9 | -All rights reserved. | ||
| 10 | - | ||
| 11 | -Redistribution and use in source and binary forms, with or without | ||
| 12 | -modification, are permitted provided that the following conditions are met: | ||
| 13 | - | ||
| 14 | -1. Redistributions of source code must retain the above copyright notice, this | ||
| 15 | - list of conditions and the following disclaimer. | ||
| 16 | - | ||
| 17 | -2. Redistributions in binary form must reproduce the above copyright notice, | ||
| 18 | - this list of conditions and the following disclaimer in the documentation | ||
| 19 | - and/or other materials provided with the distribution. | ||
| 20 | - | ||
| 21 | -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 22 | -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 23 | -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 24 | -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 25 | -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 26 | -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 27 | -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 28 | -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 29 | -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 30 | -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 31 | -**/ | ||
| 32 | - | ||
| 33 | -#ifndef GLSLANG_C_IFACE_H_INCLUDED | ||
| 34 | -#define GLSLANG_C_IFACE_H_INCLUDED | ||
| 35 | - | ||
| 36 | -#include <stdbool.h> | ||
| 37 | -#include <stdlib.h> | ||
| 38 | - | ||
| 39 | -#include "glslang_c_shader_types.h" | ||
| 40 | -#include "visibility.h" | ||
| 41 | - | ||
| 42 | -typedef struct glslang_shader_s glslang_shader_t; | ||
| 43 | -typedef struct glslang_program_s glslang_program_t; | ||
| 44 | -typedef struct glslang_mapper_s glslang_mapper_t; | ||
| 45 | -typedef struct glslang_resolver_s glslang_resolver_t; | ||
| 46 | - | ||
| 47 | -/* Version counterpart */ | ||
| 48 | -typedef struct glslang_version_s { | ||
| 49 | - int major; | ||
| 50 | - int minor; | ||
| 51 | - int patch; | ||
| 52 | - const char* flavor; | ||
| 53 | -} glslang_version_t; | ||
| 54 | - | ||
| 55 | -/* TLimits counterpart */ | ||
| 56 | -typedef struct glslang_limits_s { | ||
| 57 | - bool non_inductive_for_loops; | ||
| 58 | - bool while_loops; | ||
| 59 | - bool do_while_loops; | ||
| 60 | - bool general_uniform_indexing; | ||
| 61 | - bool general_attribute_matrix_vector_indexing; | ||
| 62 | - bool general_varying_indexing; | ||
| 63 | - bool general_sampler_indexing; | ||
| 64 | - bool general_variable_indexing; | ||
| 65 | - bool general_constant_matrix_vector_indexing; | ||
| 66 | -} glslang_limits_t; | ||
| 67 | - | ||
| 68 | -/* TBuiltInResource counterpart */ | ||
| 69 | -typedef struct glslang_resource_s { | ||
| 70 | - int max_lights; | ||
| 71 | - int max_clip_planes; | ||
| 72 | - int max_texture_units; | ||
| 73 | - int max_texture_coords; | ||
| 74 | - int max_vertex_attribs; | ||
| 75 | - int max_vertex_uniform_components; | ||
| 76 | - int max_varying_floats; | ||
| 77 | - int max_vertex_texture_image_units; | ||
| 78 | - int max_combined_texture_image_units; | ||
| 79 | - int max_texture_image_units; | ||
| 80 | - int max_fragment_uniform_components; | ||
| 81 | - int max_draw_buffers; | ||
| 82 | - int max_vertex_uniform_vectors; | ||
| 83 | - int max_varying_vectors; | ||
| 84 | - int max_fragment_uniform_vectors; | ||
| 85 | - int max_vertex_output_vectors; | ||
| 86 | - int max_fragment_input_vectors; | ||
| 87 | - int min_program_texel_offset; | ||
| 88 | - int max_program_texel_offset; | ||
| 89 | - int max_clip_distances; | ||
| 90 | - int max_compute_work_group_count_x; | ||
| 91 | - int max_compute_work_group_count_y; | ||
| 92 | - int max_compute_work_group_count_z; | ||
| 93 | - int max_compute_work_group_size_x; | ||
| 94 | - int max_compute_work_group_size_y; | ||
| 95 | - int max_compute_work_group_size_z; | ||
| 96 | - int max_compute_uniform_components; | ||
| 97 | - int max_compute_texture_image_units; | ||
| 98 | - int max_compute_image_uniforms; | ||
| 99 | - int max_compute_atomic_counters; | ||
| 100 | - int max_compute_atomic_counter_buffers; | ||
| 101 | - int max_varying_components; | ||
| 102 | - int max_vertex_output_components; | ||
| 103 | - int max_geometry_input_components; | ||
| 104 | - int max_geometry_output_components; | ||
| 105 | - int max_fragment_input_components; | ||
| 106 | - int max_image_units; | ||
| 107 | - int max_combined_image_units_and_fragment_outputs; | ||
| 108 | - int max_combined_shader_output_resources; | ||
| 109 | - int max_image_samples; | ||
| 110 | - int max_vertex_image_uniforms; | ||
| 111 | - int max_tess_control_image_uniforms; | ||
| 112 | - int max_tess_evaluation_image_uniforms; | ||
| 113 | - int max_geometry_image_uniforms; | ||
| 114 | - int max_fragment_image_uniforms; | ||
| 115 | - int max_combined_image_uniforms; | ||
| 116 | - int max_geometry_texture_image_units; | ||
| 117 | - int max_geometry_output_vertices; | ||
| 118 | - int max_geometry_total_output_components; | ||
| 119 | - int max_geometry_uniform_components; | ||
| 120 | - int max_geometry_varying_components; | ||
| 121 | - int max_tess_control_input_components; | ||
| 122 | - int max_tess_control_output_components; | ||
| 123 | - int max_tess_control_texture_image_units; | ||
| 124 | - int max_tess_control_uniform_components; | ||
| 125 | - int max_tess_control_total_output_components; | ||
| 126 | - int max_tess_evaluation_input_components; | ||
| 127 | - int max_tess_evaluation_output_components; | ||
| 128 | - int max_tess_evaluation_texture_image_units; | ||
| 129 | - int max_tess_evaluation_uniform_components; | ||
| 130 | - int max_tess_patch_components; | ||
| 131 | - int max_patch_vertices; | ||
| 132 | - int max_tess_gen_level; | ||
| 133 | - int max_viewports; | ||
| 134 | - int max_vertex_atomic_counters; | ||
| 135 | - int max_tess_control_atomic_counters; | ||
| 136 | - int max_tess_evaluation_atomic_counters; | ||
| 137 | - int max_geometry_atomic_counters; | ||
| 138 | - int max_fragment_atomic_counters; | ||
| 139 | - int max_combined_atomic_counters; | ||
| 140 | - int max_atomic_counter_bindings; | ||
| 141 | - int max_vertex_atomic_counter_buffers; | ||
| 142 | - int max_tess_control_atomic_counter_buffers; | ||
| 143 | - int max_tess_evaluation_atomic_counter_buffers; | ||
| 144 | - int max_geometry_atomic_counter_buffers; | ||
| 145 | - int max_fragment_atomic_counter_buffers; | ||
| 146 | - int max_combined_atomic_counter_buffers; | ||
| 147 | - int max_atomic_counter_buffer_size; | ||
| 148 | - int max_transform_feedback_buffers; | ||
| 149 | - int max_transform_feedback_interleaved_components; | ||
| 150 | - int max_cull_distances; | ||
| 151 | - int max_combined_clip_and_cull_distances; | ||
| 152 | - int max_samples; | ||
| 153 | - int max_mesh_output_vertices_nv; | ||
| 154 | - int max_mesh_output_primitives_nv; | ||
| 155 | - int max_mesh_work_group_size_x_nv; | ||
| 156 | - int max_mesh_work_group_size_y_nv; | ||
| 157 | - int max_mesh_work_group_size_z_nv; | ||
| 158 | - int max_task_work_group_size_x_nv; | ||
| 159 | - int max_task_work_group_size_y_nv; | ||
| 160 | - int max_task_work_group_size_z_nv; | ||
| 161 | - int max_mesh_view_count_nv; | ||
| 162 | - int max_mesh_output_vertices_ext; | ||
| 163 | - int max_mesh_output_primitives_ext; | ||
| 164 | - int max_mesh_work_group_size_x_ext; | ||
| 165 | - int max_mesh_work_group_size_y_ext; | ||
| 166 | - int max_mesh_work_group_size_z_ext; | ||
| 167 | - int max_task_work_group_size_x_ext; | ||
| 168 | - int max_task_work_group_size_y_ext; | ||
| 169 | - int max_task_work_group_size_z_ext; | ||
| 170 | - int max_mesh_view_count_ext; | ||
| 171 | - union | ||
| 172 | - { | ||
| 173 | - int max_dual_source_draw_buffers_ext; | ||
| 174 | - | ||
| 175 | - /* Incorrectly capitalized name retained for backward compatibility */ | ||
| 176 | - int maxDualSourceDrawBuffersEXT; | ||
| 177 | - }; | ||
| 178 | - | ||
| 179 | - glslang_limits_t limits; | ||
| 180 | -} glslang_resource_t; | ||
| 181 | - | ||
| 182 | -/* Inclusion result structure allocated by C include_local/include_system callbacks */ | ||
| 183 | -typedef struct glsl_include_result_s { | ||
| 184 | - /* Header file name or NULL if inclusion failed */ | ||
| 185 | - const char* header_name; | ||
| 186 | - | ||
| 187 | - /* Header contents or NULL */ | ||
| 188 | - const char* header_data; | ||
| 189 | - size_t header_length; | ||
| 190 | - | ||
| 191 | -} glsl_include_result_t; | ||
| 192 | - | ||
| 193 | -/* Callback for local file inclusion */ | ||
| 194 | -typedef glsl_include_result_t* (*glsl_include_local_func)(void* ctx, const char* header_name, const char* includer_name, | ||
| 195 | - size_t include_depth); | ||
| 196 | - | ||
| 197 | -/* Callback for system file inclusion */ | ||
| 198 | -typedef glsl_include_result_t* (*glsl_include_system_func)(void* ctx, const char* header_name, | ||
| 199 | - const char* includer_name, size_t include_depth); | ||
| 200 | - | ||
| 201 | -/* Callback for include result destruction */ | ||
| 202 | -typedef int (*glsl_free_include_result_func)(void* ctx, glsl_include_result_t* result); | ||
| 203 | - | ||
| 204 | -/* Collection of callbacks for GLSL preprocessor */ | ||
| 205 | -typedef struct glsl_include_callbacks_s { | ||
| 206 | - glsl_include_system_func include_system; | ||
| 207 | - glsl_include_local_func include_local; | ||
| 208 | - glsl_free_include_result_func free_include_result; | ||
| 209 | -} glsl_include_callbacks_t; | ||
| 210 | - | ||
| 211 | -typedef struct glslang_input_s { | ||
| 212 | - glslang_source_t language; | ||
| 213 | - glslang_stage_t stage; | ||
| 214 | - glslang_client_t client; | ||
| 215 | - glslang_target_client_version_t client_version; | ||
| 216 | - glslang_target_language_t target_language; | ||
| 217 | - glslang_target_language_version_t target_language_version; | ||
| 218 | - /** Shader source code */ | ||
| 219 | - const char* code; | ||
| 220 | - int default_version; | ||
| 221 | - glslang_profile_t default_profile; | ||
| 222 | - int force_default_version_and_profile; | ||
| 223 | - int forward_compatible; | ||
| 224 | - glslang_messages_t messages; | ||
| 225 | - const glslang_resource_t* resource; | ||
| 226 | - glsl_include_callbacks_t callbacks; | ||
| 227 | - void* callbacks_ctx; | ||
| 228 | -} glslang_input_t; | ||
| 229 | - | ||
| 230 | -/* SpvOptions counterpart */ | ||
| 231 | -typedef struct glslang_spv_options_s { | ||
| 232 | - bool generate_debug_info; | ||
| 233 | - bool strip_debug_info; | ||
| 234 | - bool disable_optimizer; | ||
| 235 | - bool optimize_size; | ||
| 236 | - bool disassemble; | ||
| 237 | - bool validate; | ||
| 238 | - bool emit_nonsemantic_shader_debug_info; | ||
| 239 | - bool emit_nonsemantic_shader_debug_source; | ||
| 240 | - bool compile_only; | ||
| 241 | - bool optimize_allow_expanded_id_bound; | ||
| 242 | -} glslang_spv_options_t; | ||
| 243 | - | ||
| 244 | -#ifdef __cplusplus | ||
| 245 | -extern "C" { | ||
| 246 | -#endif | ||
| 247 | - | ||
| 248 | -GLSLANG_EXPORT void glslang_get_version(glslang_version_t* version); | ||
| 249 | - | ||
| 250 | -GLSLANG_EXPORT int glslang_initialize_process(void); | ||
| 251 | -GLSLANG_EXPORT void glslang_finalize_process(void); | ||
| 252 | - | ||
| 253 | -GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input); | ||
| 254 | -GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader); | ||
| 255 | -GLSLANG_EXPORT void glslang_shader_set_preamble(glslang_shader_t* shader, const char* s); | ||
| 256 | -GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base); | ||
| 257 | -GLSLANG_EXPORT void glslang_shader_shift_binding_for_set(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base, unsigned int set); | ||
| 258 | -GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options); // glslang_shader_options_t | ||
| 259 | -GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version); | ||
| 260 | -GLSLANG_EXPORT void glslang_shader_set_default_uniform_block_set_and_binding(glslang_shader_t* shader, unsigned int set, unsigned int binding); | ||
| 261 | -GLSLANG_EXPORT void glslang_shader_set_default_uniform_block_name(glslang_shader_t* shader, const char *name); | ||
| 262 | -GLSLANG_EXPORT void glslang_shader_set_resource_set_binding(glslang_shader_t* shader, const char *const *bindings, unsigned int num_bindings); | ||
| 263 | -GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input); | ||
| 264 | -GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input); | ||
| 265 | -GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader); | ||
| 266 | -GLSLANG_EXPORT void glslang_shader_set_preprocessed_code(glslang_shader_t* shader, const char* code); | ||
| 267 | -GLSLANG_EXPORT const char* glslang_shader_get_info_log(glslang_shader_t* shader); | ||
| 268 | -GLSLANG_EXPORT const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader); | ||
| 269 | - | ||
| 270 | -GLSLANG_EXPORT glslang_program_t* glslang_program_create(void); | ||
| 271 | -GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program); | ||
| 272 | -GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader); | ||
| 273 | -GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t | ||
| 274 | -GLSLANG_EXPORT void glslang_program_add_source_text(glslang_program_t* program, glslang_stage_t stage, const char* text, size_t len); | ||
| 275 | -GLSLANG_EXPORT void glslang_program_set_source_file(glslang_program_t* program, glslang_stage_t stage, const char* file); | ||
| 276 | -GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program); | ||
| 277 | -GLSLANG_EXPORT int glslang_program_map_io_with_resolver_and_mapper(glslang_program_t* program, glslang_resolver_t* resolver, glslang_mapper_t* mapper); | ||
| 278 | -GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage); | ||
| 279 | -GLSLANG_EXPORT void glslang_program_SPIRV_generate_with_options(glslang_program_t* program, glslang_stage_t stage, glslang_spv_options_t* spv_options); | ||
| 280 | -GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program); | ||
| 281 | -GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*); | ||
| 282 | -GLSLANG_EXPORT unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program); | ||
| 283 | -GLSLANG_EXPORT const char* glslang_program_SPIRV_get_messages(glslang_program_t* program); | ||
| 284 | -GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program); | ||
| 285 | -GLSLANG_EXPORT const char* glslang_program_get_info_debug_log(glslang_program_t* program); | ||
| 286 | - | ||
| 287 | -GLSLANG_EXPORT glslang_mapper_t* glslang_glsl_mapper_create(void); | ||
| 288 | -GLSLANG_EXPORT void glslang_glsl_mapper_delete(glslang_mapper_t* mapper); | ||
| 289 | - | ||
| 290 | -GLSLANG_EXPORT glslang_resolver_t* glslang_glsl_resolver_create(glslang_program_t* program, glslang_stage_t stage); | ||
| 291 | -GLSLANG_EXPORT void glslang_glsl_resolver_delete(glslang_resolver_t* resolver); | ||
| 292 | - | ||
| 293 | -#ifdef __cplusplus | ||
| 294 | -} | ||
| 295 | -#endif | ||
| 296 | - | ||
| 297 | -#endif /* #ifdef GLSLANG_C_IFACE_INCLUDED */ |
| 1 | -/** | ||
| 2 | - This code is based on the glslang_c_interface implementation by Viktor Latypov | ||
| 3 | -**/ | ||
| 4 | - | ||
| 5 | -/** | ||
| 6 | -BSD 2-Clause License | ||
| 7 | - | ||
| 8 | -Copyright (c) 2019, Viktor Latypov | ||
| 9 | -All rights reserved. | ||
| 10 | - | ||
| 11 | -Redistribution and use in source and binary forms, with or without | ||
| 12 | -modification, are permitted provided that the following conditions are met: | ||
| 13 | - | ||
| 14 | -1. Redistributions of source code must retain the above copyright notice, this | ||
| 15 | - list of conditions and the following disclaimer. | ||
| 16 | - | ||
| 17 | -2. Redistributions in binary form must reproduce the above copyright notice, | ||
| 18 | - this list of conditions and the following disclaimer in the documentation | ||
| 19 | - and/or other materials provided with the distribution. | ||
| 20 | - | ||
| 21 | -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 22 | -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 23 | -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 24 | -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 25 | -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 26 | -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 27 | -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 28 | -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 29 | -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 30 | -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 31 | -**/ | ||
| 32 | - | ||
| 33 | -#ifndef C_SHADER_TYPES_H_INCLUDED | ||
| 34 | -#define C_SHADER_TYPES_H_INCLUDED | ||
| 35 | - | ||
| 36 | -#define LAST_ELEMENT_MARKER(x) x | ||
| 37 | - | ||
| 38 | -/* EShLanguage counterpart */ | ||
| 39 | -typedef enum { | ||
| 40 | - GLSLANG_STAGE_VERTEX, | ||
| 41 | - GLSLANG_STAGE_TESSCONTROL, | ||
| 42 | - GLSLANG_STAGE_TESSEVALUATION, | ||
| 43 | - GLSLANG_STAGE_GEOMETRY, | ||
| 44 | - GLSLANG_STAGE_FRAGMENT, | ||
| 45 | - GLSLANG_STAGE_COMPUTE, | ||
| 46 | - GLSLANG_STAGE_RAYGEN, | ||
| 47 | - GLSLANG_STAGE_RAYGEN_NV = GLSLANG_STAGE_RAYGEN, | ||
| 48 | - GLSLANG_STAGE_INTERSECT, | ||
| 49 | - GLSLANG_STAGE_INTERSECT_NV = GLSLANG_STAGE_INTERSECT, | ||
| 50 | - GLSLANG_STAGE_ANYHIT, | ||
| 51 | - GLSLANG_STAGE_ANYHIT_NV = GLSLANG_STAGE_ANYHIT, | ||
| 52 | - GLSLANG_STAGE_CLOSESTHIT, | ||
| 53 | - GLSLANG_STAGE_CLOSESTHIT_NV = GLSLANG_STAGE_CLOSESTHIT, | ||
| 54 | - GLSLANG_STAGE_MISS, | ||
| 55 | - GLSLANG_STAGE_MISS_NV = GLSLANG_STAGE_MISS, | ||
| 56 | - GLSLANG_STAGE_CALLABLE, | ||
| 57 | - GLSLANG_STAGE_CALLABLE_NV = GLSLANG_STAGE_CALLABLE, | ||
| 58 | - GLSLANG_STAGE_TASK, | ||
| 59 | - GLSLANG_STAGE_TASK_NV = GLSLANG_STAGE_TASK, | ||
| 60 | - GLSLANG_STAGE_MESH, | ||
| 61 | - GLSLANG_STAGE_MESH_NV = GLSLANG_STAGE_MESH, | ||
| 62 | - LAST_ELEMENT_MARKER(GLSLANG_STAGE_COUNT), | ||
| 63 | -} glslang_stage_t; // would be better as stage, but this is ancient now | ||
| 64 | - | ||
| 65 | -/* EShLanguageMask counterpart */ | ||
| 66 | -typedef enum { | ||
| 67 | - GLSLANG_STAGE_VERTEX_MASK = (1 << GLSLANG_STAGE_VERTEX), | ||
| 68 | - GLSLANG_STAGE_TESSCONTROL_MASK = (1 << GLSLANG_STAGE_TESSCONTROL), | ||
| 69 | - GLSLANG_STAGE_TESSEVALUATION_MASK = (1 << GLSLANG_STAGE_TESSEVALUATION), | ||
| 70 | - GLSLANG_STAGE_GEOMETRY_MASK = (1 << GLSLANG_STAGE_GEOMETRY), | ||
| 71 | - GLSLANG_STAGE_FRAGMENT_MASK = (1 << GLSLANG_STAGE_FRAGMENT), | ||
| 72 | - GLSLANG_STAGE_COMPUTE_MASK = (1 << GLSLANG_STAGE_COMPUTE), | ||
| 73 | - GLSLANG_STAGE_RAYGEN_MASK = (1 << GLSLANG_STAGE_RAYGEN), | ||
| 74 | - GLSLANG_STAGE_RAYGEN_NV_MASK = GLSLANG_STAGE_RAYGEN_MASK, | ||
| 75 | - GLSLANG_STAGE_INTERSECT_MASK = (1 << GLSLANG_STAGE_INTERSECT), | ||
| 76 | - GLSLANG_STAGE_INTERSECT_NV_MASK = GLSLANG_STAGE_INTERSECT_MASK, | ||
| 77 | - GLSLANG_STAGE_ANYHIT_MASK = (1 << GLSLANG_STAGE_ANYHIT), | ||
| 78 | - GLSLANG_STAGE_ANYHIT_NV_MASK = GLSLANG_STAGE_ANYHIT_MASK, | ||
| 79 | - GLSLANG_STAGE_CLOSESTHIT_MASK = (1 << GLSLANG_STAGE_CLOSESTHIT), | ||
| 80 | - GLSLANG_STAGE_CLOSESTHIT_NV_MASK = GLSLANG_STAGE_CLOSESTHIT_MASK, | ||
| 81 | - GLSLANG_STAGE_MISS_MASK = (1 << GLSLANG_STAGE_MISS), | ||
| 82 | - GLSLANG_STAGE_MISS_NV_MASK = GLSLANG_STAGE_MISS_MASK, | ||
| 83 | - GLSLANG_STAGE_CALLABLE_MASK = (1 << GLSLANG_STAGE_CALLABLE), | ||
| 84 | - GLSLANG_STAGE_CALLABLE_NV_MASK = GLSLANG_STAGE_CALLABLE_MASK, | ||
| 85 | - GLSLANG_STAGE_TASK_MASK = (1 << GLSLANG_STAGE_TASK), | ||
| 86 | - GLSLANG_STAGE_TASK_NV_MASK = GLSLANG_STAGE_TASK_MASK, | ||
| 87 | - GLSLANG_STAGE_MESH_MASK = (1 << GLSLANG_STAGE_MESH), | ||
| 88 | - GLSLANG_STAGE_MESH_NV_MASK = GLSLANG_STAGE_MESH_MASK, | ||
| 89 | - LAST_ELEMENT_MARKER(GLSLANG_STAGE_MASK_COUNT), | ||
| 90 | -} glslang_stage_mask_t; | ||
| 91 | - | ||
| 92 | -/* EShSource counterpart */ | ||
| 93 | -typedef enum { | ||
| 94 | - GLSLANG_SOURCE_NONE, | ||
| 95 | - GLSLANG_SOURCE_GLSL, | ||
| 96 | - GLSLANG_SOURCE_HLSL, | ||
| 97 | - LAST_ELEMENT_MARKER(GLSLANG_SOURCE_COUNT), | ||
| 98 | -} glslang_source_t; | ||
| 99 | - | ||
| 100 | -/* EShClient counterpart */ | ||
| 101 | -typedef enum { | ||
| 102 | - GLSLANG_CLIENT_NONE, | ||
| 103 | - GLSLANG_CLIENT_VULKAN, | ||
| 104 | - GLSLANG_CLIENT_OPENGL, | ||
| 105 | - LAST_ELEMENT_MARKER(GLSLANG_CLIENT_COUNT), | ||
| 106 | -} glslang_client_t; | ||
| 107 | - | ||
| 108 | -/* EShTargetLanguage counterpart */ | ||
| 109 | -typedef enum { | ||
| 110 | - GLSLANG_TARGET_NONE, | ||
| 111 | - GLSLANG_TARGET_SPV, | ||
| 112 | - LAST_ELEMENT_MARKER(GLSLANG_TARGET_COUNT), | ||
| 113 | -} glslang_target_language_t; | ||
| 114 | - | ||
| 115 | -/* SH_TARGET_ClientVersion counterpart */ | ||
| 116 | -typedef enum { | ||
| 117 | - GLSLANG_TARGET_VULKAN_1_0 = (1 << 22), | ||
| 118 | - GLSLANG_TARGET_VULKAN_1_1 = (1 << 22) | (1 << 12), | ||
| 119 | - GLSLANG_TARGET_VULKAN_1_2 = (1 << 22) | (2 << 12), | ||
| 120 | - GLSLANG_TARGET_VULKAN_1_3 = (1 << 22) | (3 << 12), | ||
| 121 | - GLSLANG_TARGET_VULKAN_1_4 = (1 << 22) | (4 << 12), | ||
| 122 | - GLSLANG_TARGET_OPENGL_450 = 450, | ||
| 123 | - LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 6), | ||
| 124 | -} glslang_target_client_version_t; | ||
| 125 | - | ||
| 126 | -/* SH_TARGET_LanguageVersion counterpart */ | ||
| 127 | -typedef enum { | ||
| 128 | - GLSLANG_TARGET_SPV_1_0 = (1 << 16), | ||
| 129 | - GLSLANG_TARGET_SPV_1_1 = (1 << 16) | (1 << 8), | ||
| 130 | - GLSLANG_TARGET_SPV_1_2 = (1 << 16) | (2 << 8), | ||
| 131 | - GLSLANG_TARGET_SPV_1_3 = (1 << 16) | (3 << 8), | ||
| 132 | - GLSLANG_TARGET_SPV_1_4 = (1 << 16) | (4 << 8), | ||
| 133 | - GLSLANG_TARGET_SPV_1_5 = (1 << 16) | (5 << 8), | ||
| 134 | - GLSLANG_TARGET_SPV_1_6 = (1 << 16) | (6 << 8), | ||
| 135 | - LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 7), | ||
| 136 | -} glslang_target_language_version_t; | ||
| 137 | - | ||
| 138 | -/* EShExecutable counterpart */ | ||
| 139 | -typedef enum { GLSLANG_EX_VERTEX_FRAGMENT, GLSLANG_EX_FRAGMENT } glslang_executable_t; | ||
| 140 | - | ||
| 141 | -// EShOptimizationLevel counterpart | ||
| 142 | -// This enum is not used in the current C interface, but could be added at a later date. | ||
| 143 | -// GLSLANG_OPT_NONE is the current default. | ||
| 144 | -typedef enum { | ||
| 145 | - GLSLANG_OPT_NO_GENERATION, | ||
| 146 | - GLSLANG_OPT_NONE, | ||
| 147 | - GLSLANG_OPT_SIMPLE, | ||
| 148 | - GLSLANG_OPT_FULL, | ||
| 149 | - LAST_ELEMENT_MARKER(GLSLANG_OPT_LEVEL_COUNT), | ||
| 150 | -} glslang_optimization_level_t; | ||
| 151 | - | ||
| 152 | -/* EShTextureSamplerTransformMode counterpart */ | ||
| 153 | -typedef enum { | ||
| 154 | - GLSLANG_TEX_SAMP_TRANS_KEEP, | ||
| 155 | - GLSLANG_TEX_SAMP_TRANS_UPGRADE_TEXTURE_REMOVE_SAMPLER, | ||
| 156 | - LAST_ELEMENT_MARKER(GLSLANG_TEX_SAMP_TRANS_COUNT), | ||
| 157 | -} glslang_texture_sampler_transform_mode_t; | ||
| 158 | - | ||
| 159 | -/* EShMessages counterpart */ | ||
| 160 | -typedef enum { | ||
| 161 | - GLSLANG_MSG_DEFAULT_BIT = 0, | ||
| 162 | - GLSLANG_MSG_RELAXED_ERRORS_BIT = (1 << 0), | ||
| 163 | - GLSLANG_MSG_SUPPRESS_WARNINGS_BIT = (1 << 1), | ||
| 164 | - GLSLANG_MSG_AST_BIT = (1 << 2), | ||
| 165 | - GLSLANG_MSG_SPV_RULES_BIT = (1 << 3), | ||
| 166 | - GLSLANG_MSG_VULKAN_RULES_BIT = (1 << 4), | ||
| 167 | - GLSLANG_MSG_ONLY_PREPROCESSOR_BIT = (1 << 5), | ||
| 168 | - GLSLANG_MSG_READ_HLSL_BIT = (1 << 6), | ||
| 169 | - GLSLANG_MSG_CASCADING_ERRORS_BIT = (1 << 7), | ||
| 170 | - GLSLANG_MSG_KEEP_UNCALLED_BIT = (1 << 8), | ||
| 171 | - GLSLANG_MSG_HLSL_OFFSETS_BIT = (1 << 9), | ||
| 172 | - GLSLANG_MSG_DEBUG_INFO_BIT = (1 << 10), | ||
| 173 | - GLSLANG_MSG_HLSL_ENABLE_16BIT_TYPES_BIT = (1 << 11), | ||
| 174 | - GLSLANG_MSG_HLSL_LEGALIZATION_BIT = (1 << 12), | ||
| 175 | - GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13), | ||
| 176 | - GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14), | ||
| 177 | - GLSLANG_MSG_ENHANCED = (1 << 15), | ||
| 178 | - GLSLANG_MSG_ABSOLUTE_PATH = (1 << 16), | ||
| 179 | - GLSLANG_MSG_DISPLAY_ERROR_COLUMN = (1 << 17), | ||
| 180 | - GLSLANG_MSG_LINK_TIME_OPTIMIZATION_BIT = (1 << 18), | ||
| 181 | - LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT), | ||
| 182 | -} glslang_messages_t; | ||
| 183 | - | ||
| 184 | -/* EShReflectionOptions counterpart */ | ||
| 185 | -typedef enum { | ||
| 186 | - GLSLANG_REFLECTION_DEFAULT_BIT = 0, | ||
| 187 | - GLSLANG_REFLECTION_STRICT_ARRAY_SUFFIX_BIT = (1 << 0), | ||
| 188 | - GLSLANG_REFLECTION_BASIC_ARRAY_SUFFIX_BIT = (1 << 1), | ||
| 189 | - GLSLANG_REFLECTION_INTERMEDIATE_IOO_BIT = (1 << 2), | ||
| 190 | - GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3), | ||
| 191 | - GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4), | ||
| 192 | - GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5), | ||
| 193 | - GLSLANG_REFLECTION_ALL_IO_VARIABLES_BIT = (1 << 6), | ||
| 194 | - GLSLANG_REFLECTION_SHARED_STD140_SSBO_BIT = (1 << 7), | ||
| 195 | - GLSLANG_REFLECTION_SHARED_STD140_UBO_BIT = (1 << 8), | ||
| 196 | - LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT), | ||
| 197 | -} glslang_reflection_options_t; | ||
| 198 | - | ||
| 199 | -/* EProfile counterpart (from Versions.h) */ | ||
| 200 | -typedef enum { | ||
| 201 | - GLSLANG_BAD_PROFILE = 0, | ||
| 202 | - GLSLANG_NO_PROFILE = (1 << 0), | ||
| 203 | - GLSLANG_CORE_PROFILE = (1 << 1), | ||
| 204 | - GLSLANG_COMPATIBILITY_PROFILE = (1 << 2), | ||
| 205 | - GLSLANG_ES_PROFILE = (1 << 3), | ||
| 206 | - LAST_ELEMENT_MARKER(GLSLANG_PROFILE_COUNT), | ||
| 207 | -} glslang_profile_t; | ||
| 208 | - | ||
| 209 | -/* Shader options */ | ||
| 210 | -typedef enum { | ||
| 211 | - GLSLANG_SHADER_DEFAULT_BIT = 0, | ||
| 212 | - GLSLANG_SHADER_AUTO_MAP_BINDINGS = (1 << 0), | ||
| 213 | - GLSLANG_SHADER_AUTO_MAP_LOCATIONS = (1 << 1), | ||
| 214 | - GLSLANG_SHADER_VULKAN_RULES_RELAXED = (1 << 2), | ||
| 215 | - LAST_ELEMENT_MARKER(GLSLANG_SHADER_COUNT), | ||
| 216 | -} glslang_shader_options_t; | ||
| 217 | - | ||
| 218 | -/* TResourceType counterpart */ | ||
| 219 | -typedef enum { | ||
| 220 | - GLSLANG_RESOURCE_TYPE_SAMPLER, | ||
| 221 | - GLSLANG_RESOURCE_TYPE_TEXTURE, | ||
| 222 | - GLSLANG_RESOURCE_TYPE_IMAGE, | ||
| 223 | - GLSLANG_RESOURCE_TYPE_UBO, | ||
| 224 | - GLSLANG_RESOURCE_TYPE_SSBO, | ||
| 225 | - GLSLANG_RESOURCE_TYPE_UAV, | ||
| 226 | - LAST_ELEMENT_MARKER(GLSLANG_RESOURCE_TYPE_COUNT), | ||
| 227 | -} glslang_resource_type_t; | ||
| 228 | - | ||
| 229 | -#undef LAST_ELEMENT_MARKER | ||
| 230 | - | ||
| 231 | -#endif |
| 1 | -// | ||
| 2 | -// Copyright (C) 2023 LunarG, Inc. | ||
| 3 | -// | ||
| 4 | -// All rights reserved. | ||
| 5 | -// | ||
| 6 | -// Redistribution and use in source and binary forms, with or without | ||
| 7 | -// modification, are permitted provided that the following conditions | ||
| 8 | -// are met: | ||
| 9 | -// | ||
| 10 | -// Redistributions of source code must retain the above copyright | ||
| 11 | -// notice, this list of conditions and the following disclaimer. | ||
| 12 | -// | ||
| 13 | -// Redistributions in binary form must reproduce the above | ||
| 14 | -// copyright notice, this list of conditions and the following | ||
| 15 | -// disclaimer in the documentation and/or other materials provided | ||
| 16 | -// with the distribution. | ||
| 17 | -// | ||
| 18 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 19 | -// contributors may be used to endorse or promote products derived | ||
| 20 | -// from this software without specific prior written permission. | ||
| 21 | -// | ||
| 22 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 25 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 26 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 27 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 28 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 29 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 30 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 31 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 32 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 33 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 34 | -// | ||
| 35 | -#ifdef GLSLANG_IS_SHARED_LIBRARY | ||
| 36 | - #ifdef _WIN32 | ||
| 37 | - #ifdef GLSLANG_EXPORTING | ||
| 38 | - #define GLSLANG_EXPORT __declspec(dllexport) | ||
| 39 | - #else | ||
| 40 | - #define GLSLANG_EXPORT __declspec(dllimport) | ||
| 41 | - #endif | ||
| 42 | - #elif __GNUC__ >= 4 | ||
| 43 | - #define GLSLANG_EXPORT __attribute__((visibility("default"))) | ||
| 44 | - #endif | ||
| 45 | -#endif // GLSLANG_IS_SHARED_LIBRARY | ||
| 46 | - | ||
| 47 | -#ifndef GLSLANG_EXPORT | ||
| 48 | -#define GLSLANG_EXPORT | ||
| 49 | -#endif | ||
| 50 | - | ||
| 51 | -// Symbols marked with this macro are only meant for public use by the test suite | ||
| 52 | -// and do not appear in publicly installed headers. They are not considered to be | ||
| 53 | -// part of the glslang library ABI. | ||
| 54 | -#define GLSLANG_EXPORT_FOR_TESTS GLSLANG_EXPORT |
| 1 | -// | ||
| 2 | -// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. | ||
| 3 | -// Copyright (C) 2012-2013 LunarG, Inc. | ||
| 4 | -// Copyright (C) 2017, 2022-2024 Arm Limited. | ||
| 5 | -// Copyright (C) 2015-2018 Google, Inc. | ||
| 6 | -// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. | ||
| 7 | -// Modifications Copyright (C) 2024 Valve Corporation. | ||
| 8 | -// | ||
| 9 | -// All rights reserved. | ||
| 10 | -// | ||
| 11 | -// Redistribution and use in source and binary forms, with or without | ||
| 12 | -// modification, are permitted provided that the following conditions | ||
| 13 | -// are met: | ||
| 14 | -// | ||
| 15 | -// Redistributions of source code must retain the above copyright | ||
| 16 | -// notice, this list of conditions and the following disclaimer. | ||
| 17 | -// | ||
| 18 | -// Redistributions in binary form must reproduce the above | ||
| 19 | -// copyright notice, this list of conditions and the following | ||
| 20 | -// disclaimer in the documentation and/or other materials provided | ||
| 21 | -// with the distribution. | ||
| 22 | -// | ||
| 23 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 24 | -// contributors may be used to endorse or promote products derived | ||
| 25 | -// from this software without specific prior written permission. | ||
| 26 | -// | ||
| 27 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 28 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 29 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 30 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 31 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 32 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 33 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 34 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 35 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 36 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 37 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 38 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 39 | -// | ||
| 40 | - | ||
| 41 | -#ifndef _VERSIONS_INCLUDED_ | ||
| 42 | -#define _VERSIONS_INCLUDED_ | ||
| 43 | - | ||
| 44 | -#define LAST_ELEMENT_MARKER(x) x | ||
| 45 | - | ||
| 46 | -// | ||
| 47 | -// Help manage multiple profiles, versions, extensions etc. | ||
| 48 | -// | ||
| 49 | - | ||
| 50 | -// | ||
| 51 | -// Profiles are set up for masking operations, so queries can be done on multiple | ||
| 52 | -// profiles at the same time. | ||
| 53 | -// | ||
| 54 | -// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible | ||
| 55 | -// defects from mixing the two different forms. | ||
| 56 | -// | ||
| 57 | -typedef enum : unsigned { | ||
| 58 | - EBadProfile = 0, | ||
| 59 | - ENoProfile = (1 << 0), // only for desktop, before profiles showed up | ||
| 60 | - ECoreProfile = (1 << 1), | ||
| 61 | - ECompatibilityProfile = (1 << 2), | ||
| 62 | - EEsProfile = (1 << 3), | ||
| 63 | - LAST_ELEMENT_MARKER(EProfileCount), | ||
| 64 | -} EProfile; | ||
| 65 | - | ||
| 66 | -namespace glslang { | ||
| 67 | - | ||
| 68 | -// | ||
| 69 | -// Map from profile enum to externally readable text name. | ||
| 70 | -// | ||
| 71 | -inline const char* ProfileName(EProfile profile) | ||
| 72 | -{ | ||
| 73 | - switch (profile) { | ||
| 74 | - case ENoProfile: return "none"; | ||
| 75 | - case ECoreProfile: return "core"; | ||
| 76 | - case ECompatibilityProfile: return "compatibility"; | ||
| 77 | - case EEsProfile: return "es"; | ||
| 78 | - default: return "unknown profile"; | ||
| 79 | - } | ||
| 80 | -} | ||
| 81 | - | ||
| 82 | -// | ||
| 83 | -// What source rules, validation rules, target language, etc. are needed or | ||
| 84 | -// desired for SPIR-V? | ||
| 85 | -// | ||
| 86 | -// 0 means a target or rule set is not enabled (ignore rules from that entity). | ||
| 87 | -// Non-0 means to apply semantic rules arising from that version of its rule set. | ||
| 88 | -// The union of all requested rule sets will be applied. | ||
| 89 | -// | ||
| 90 | -struct SpvVersion { | ||
| 91 | - SpvVersion() : spv(0), vulkanGlsl(0), vulkan(0), openGl(0), vulkanRelaxed(false) {} | ||
| 92 | - unsigned int spv; // the version of SPIR-V to target, as defined by "word 1" of the SPIR-V binary header | ||
| 93 | - int vulkanGlsl; // the version of GLSL semantics for Vulkan, from GL_KHR_vulkan_glsl, for "#define VULKAN XXX" | ||
| 94 | - int vulkan; // the version of Vulkan, for which SPIR-V execution environment rules to use | ||
| 95 | - int openGl; // the version of GLSL semantics for OpenGL, from GL_ARB_gl_spirv, for "#define GL_SPIRV XXX" | ||
| 96 | - bool vulkanRelaxed; // relax changes to GLSL for Vulkan, allowing some GL-specific to be compiled to Vulkan SPIR-V target | ||
| 97 | -}; | ||
| 98 | - | ||
| 99 | -// | ||
| 100 | -// The behaviors from the GLSL "#extension extension_name : behavior" | ||
| 101 | -// | ||
| 102 | -typedef enum { | ||
| 103 | - EBhMissing = 0, | ||
| 104 | - EBhRequire, | ||
| 105 | - EBhEnable, | ||
| 106 | - EBhWarn, | ||
| 107 | - EBhDisable, | ||
| 108 | - EBhDisablePartial // use as initial state of an extension that is only partially implemented | ||
| 109 | -} TExtensionBehavior; | ||
| 110 | - | ||
| 111 | -// | ||
| 112 | -// Symbolic names for extensions. Strings may be directly used when calling the | ||
| 113 | -// functions, but better to have the compiler do spelling checks. | ||
| 114 | -// | ||
| 115 | -const char* const E_GL_OES_texture_3D = "GL_OES_texture_3D"; | ||
| 116 | -const char* const E_GL_OES_standard_derivatives = "GL_OES_standard_derivatives"; | ||
| 117 | -const char* const E_GL_EXT_frag_depth = "GL_EXT_frag_depth"; | ||
| 118 | -const char* const E_GL_OES_EGL_image_external = "GL_OES_EGL_image_external"; | ||
| 119 | -const char* const E_GL_OES_EGL_image_external_essl3 = "GL_OES_EGL_image_external_essl3"; | ||
| 120 | -const char* const E_GL_EXT_YUV_target = "GL_EXT_YUV_target"; | ||
| 121 | -const char* const E_GL_EXT_shader_texture_lod = "GL_EXT_shader_texture_lod"; | ||
| 122 | -const char* const E_GL_EXT_shadow_samplers = "GL_EXT_shadow_samplers"; | ||
| 123 | - | ||
| 124 | -const char* const E_GL_ARB_texture_rectangle = "GL_ARB_texture_rectangle"; | ||
| 125 | -const char* const E_GL_3DL_array_objects = "GL_3DL_array_objects"; | ||
| 126 | -const char* const E_GL_ARB_shading_language_420pack = "GL_ARB_shading_language_420pack"; | ||
| 127 | -const char* const E_GL_ARB_texture_gather = "GL_ARB_texture_gather"; | ||
| 128 | -const char* const E_GL_ARB_gpu_shader5 = "GL_ARB_gpu_shader5"; | ||
| 129 | -const char* const E_GL_ARB_separate_shader_objects = "GL_ARB_separate_shader_objects"; | ||
| 130 | -const char* const E_GL_ARB_compute_shader = "GL_ARB_compute_shader"; | ||
| 131 | -const char* const E_GL_ARB_tessellation_shader = "GL_ARB_tessellation_shader"; | ||
| 132 | -const char* const E_GL_ARB_enhanced_layouts = "GL_ARB_enhanced_layouts"; | ||
| 133 | -const char* const E_GL_ARB_texture_cube_map_array = "GL_ARB_texture_cube_map_array"; | ||
| 134 | -const char* const E_GL_ARB_texture_multisample = "GL_ARB_texture_multisample"; | ||
| 135 | -const char* const E_GL_ARB_shader_texture_lod = "GL_ARB_shader_texture_lod"; | ||
| 136 | -const char* const E_GL_ARB_explicit_attrib_location = "GL_ARB_explicit_attrib_location"; | ||
| 137 | -const char* const E_GL_ARB_explicit_uniform_location = "GL_ARB_explicit_uniform_location"; | ||
| 138 | -const char* const E_GL_ARB_shader_image_load_store = "GL_ARB_shader_image_load_store"; | ||
| 139 | -const char* const E_GL_ARB_shader_atomic_counters = "GL_ARB_shader_atomic_counters"; | ||
| 140 | -const char* const E_GL_ARB_shader_atomic_counter_ops = "GL_ARB_shader_atomic_counter_ops"; | ||
| 141 | -const char* const E_GL_ARB_shader_draw_parameters = "GL_ARB_shader_draw_parameters"; | ||
| 142 | -const char* const E_GL_ARB_shader_group_vote = "GL_ARB_shader_group_vote"; | ||
| 143 | -const char* const E_GL_ARB_derivative_control = "GL_ARB_derivative_control"; | ||
| 144 | -const char* const E_GL_ARB_shader_texture_image_samples = "GL_ARB_shader_texture_image_samples"; | ||
| 145 | -const char* const E_GL_ARB_viewport_array = "GL_ARB_viewport_array"; | ||
| 146 | -const char* const E_GL_ARB_gpu_shader_int64 = "GL_ARB_gpu_shader_int64"; | ||
| 147 | -const char* const E_GL_ARB_gpu_shader_fp64 = "GL_ARB_gpu_shader_fp64"; | ||
| 148 | -const char* const E_GL_ARB_shader_ballot = "GL_ARB_shader_ballot"; | ||
| 149 | -const char* const E_GL_ARB_sparse_texture2 = "GL_ARB_sparse_texture2"; | ||
| 150 | -const char* const E_GL_ARB_sparse_texture_clamp = "GL_ARB_sparse_texture_clamp"; | ||
| 151 | -const char* const E_GL_ARB_shader_stencil_export = "GL_ARB_shader_stencil_export"; | ||
| 152 | -// const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members | ||
| 153 | -const char* const E_GL_ARB_post_depth_coverage = "GL_ARB_post_depth_coverage"; | ||
| 154 | -const char* const E_GL_ARB_shader_viewport_layer_array = "GL_ARB_shader_viewport_layer_array"; | ||
| 155 | -const char* const E_GL_ARB_fragment_shader_interlock = "GL_ARB_fragment_shader_interlock"; | ||
| 156 | -const char* const E_GL_ARB_shader_clock = "GL_ARB_shader_clock"; | ||
| 157 | -const char* const E_GL_ARB_uniform_buffer_object = "GL_ARB_uniform_buffer_object"; | ||
| 158 | -const char* const E_GL_ARB_sample_shading = "GL_ARB_sample_shading"; | ||
| 159 | -const char* const E_GL_ARB_shader_bit_encoding = "GL_ARB_shader_bit_encoding"; | ||
| 160 | -const char* const E_GL_ARB_shader_image_size = "GL_ARB_shader_image_size"; | ||
| 161 | -const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object"; | ||
| 162 | -const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing"; | ||
| 163 | -const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod"; | ||
| 164 | -const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit"; | ||
| 165 | -const char* const E_GL_ARB_draw_instanced = "GL_ARB_draw_instanced"; | ||
| 166 | -const char* const E_GL_ARB_fragment_coord_conventions = "GL_ARB_fragment_coord_conventions"; | ||
| 167 | -const char* const E_GL_ARB_bindless_texture = "GL_ARB_bindless_texture"; | ||
| 168 | - | ||
| 169 | -const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic"; | ||
| 170 | -const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote"; | ||
| 171 | -const char* const E_GL_KHR_shader_subgroup_arithmetic = "GL_KHR_shader_subgroup_arithmetic"; | ||
| 172 | -const char* const E_GL_KHR_shader_subgroup_ballot = "GL_KHR_shader_subgroup_ballot"; | ||
| 173 | -const char* const E_GL_KHR_shader_subgroup_shuffle = "GL_KHR_shader_subgroup_shuffle"; | ||
| 174 | -const char* const E_GL_KHR_shader_subgroup_shuffle_relative = "GL_KHR_shader_subgroup_shuffle_relative"; | ||
| 175 | -const char* const E_GL_KHR_shader_subgroup_rotate = "GL_KHR_shader_subgroup_rotate"; | ||
| 176 | -const char* const E_GL_KHR_shader_subgroup_clustered = "GL_KHR_shader_subgroup_clustered"; | ||
| 177 | -const char* const E_GL_KHR_shader_subgroup_quad = "GL_KHR_shader_subgroup_quad"; | ||
| 178 | -const char* const E_GL_KHR_memory_scope_semantics = "GL_KHR_memory_scope_semantics"; | ||
| 179 | -const char* const E_GL_KHR_cooperative_matrix = "GL_KHR_cooperative_matrix"; | ||
| 180 | - | ||
| 181 | -const char* const E_GL_EXT_shader_atomic_int64 = "GL_EXT_shader_atomic_int64"; | ||
| 182 | - | ||
| 183 | -const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers"; | ||
| 184 | -const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted"; | ||
| 185 | - | ||
| 186 | -const char* const E_GL_EXT_shader_16bit_storage = "GL_EXT_shader_16bit_storage"; | ||
| 187 | -const char* const E_GL_EXT_shader_8bit_storage = "GL_EXT_shader_8bit_storage"; | ||
| 188 | - | ||
| 189 | - | ||
| 190 | -// EXT extensions | ||
| 191 | -const char* const E_GL_EXT_device_group = "GL_EXT_device_group"; | ||
| 192 | -const char* const E_GL_EXT_multiview = "GL_EXT_multiview"; | ||
| 193 | -const char* const E_GL_EXT_post_depth_coverage = "GL_EXT_post_depth_coverage"; | ||
| 194 | -const char* const E_GL_EXT_control_flow_attributes = "GL_EXT_control_flow_attributes"; | ||
| 195 | -const char* const E_GL_EXT_nonuniform_qualifier = "GL_EXT_nonuniform_qualifier"; | ||
| 196 | -const char* const E_GL_EXT_samplerless_texture_functions = "GL_EXT_samplerless_texture_functions"; | ||
| 197 | -const char* const E_GL_EXT_scalar_block_layout = "GL_EXT_scalar_block_layout"; | ||
| 198 | -const char* const E_GL_EXT_fragment_invocation_density = "GL_EXT_fragment_invocation_density"; | ||
| 199 | -const char* const E_GL_EXT_buffer_reference = "GL_EXT_buffer_reference"; | ||
| 200 | -const char* const E_GL_EXT_buffer_reference2 = "GL_EXT_buffer_reference2"; | ||
| 201 | -const char* const E_GL_EXT_buffer_reference_uvec2 = "GL_EXT_buffer_reference_uvec2"; | ||
| 202 | -const char* const E_GL_EXT_demote_to_helper_invocation = "GL_EXT_demote_to_helper_invocation"; | ||
| 203 | -const char* const E_GL_EXT_shader_realtime_clock = "GL_EXT_shader_realtime_clock"; | ||
| 204 | -const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_printf"; | ||
| 205 | -const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing"; | ||
| 206 | -const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query"; | ||
| 207 | -const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling"; | ||
| 208 | -const char* const E_GL_EXT_ray_cull_mask = "GL_EXT_ray_cull_mask"; | ||
| 209 | -const char* const E_GL_EXT_blend_func_extended = "GL_EXT_blend_func_extended"; | ||
| 210 | -const char* const E_GL_EXT_shader_implicit_conversions = "GL_EXT_shader_implicit_conversions"; | ||
| 211 | -const char* const E_GL_EXT_fragment_shading_rate = "GL_EXT_fragment_shading_rate"; | ||
| 212 | -const char* const E_GL_EXT_shader_image_int64 = "GL_EXT_shader_image_int64"; | ||
| 213 | -const char* const E_GL_EXT_null_initializer = "GL_EXT_null_initializer"; | ||
| 214 | -const char* const E_GL_EXT_shared_memory_block = "GL_EXT_shared_memory_block"; | ||
| 215 | -const char* const E_GL_EXT_subgroup_uniform_control_flow = "GL_EXT_subgroup_uniform_control_flow"; | ||
| 216 | -const char* const E_GL_EXT_spirv_intrinsics = "GL_EXT_spirv_intrinsics"; | ||
| 217 | -const char* const E_GL_EXT_fragment_shader_barycentric = "GL_EXT_fragment_shader_barycentric"; | ||
| 218 | -const char* const E_GL_EXT_mesh_shader = "GL_EXT_mesh_shader"; | ||
| 219 | -const char* const E_GL_EXT_opacity_micromap = "GL_EXT_opacity_micromap"; | ||
| 220 | -const char* const E_GL_EXT_shader_quad_control = "GL_EXT_shader_quad_control"; | ||
| 221 | -const char* const E_GL_EXT_draw_instanced = "GL_EXT_draw_instanced"; | ||
| 222 | -const char* const E_GL_EXT_texture_array = "GL_EXT_texture_array"; | ||
| 223 | -const char* const E_GL_EXT_maximal_reconvergence = "GL_EXT_maximal_reconvergence"; | ||
| 224 | -const char* const E_GL_EXT_expect_assume = "GL_EXT_expect_assume"; | ||
| 225 | -const char* const E_GL_EXT_control_flow_attributes2 = "GL_EXT_control_flow_attributes2"; | ||
| 226 | -const char* const E_GL_EXT_spec_constant_composites = "GL_EXT_spec_constant_composites"; | ||
| 227 | -const char* const E_GL_EXT_texture_offset_non_const = "GL_EXT_texture_offset_non_const"; | ||
| 228 | -const char* const E_GL_EXT_nontemporal_keyword = "GL_EXT_nontemporal_keyword"; | ||
| 229 | - | ||
| 230 | -// Arrays of extensions for the above viewportEXTs duplications | ||
| 231 | - | ||
| 232 | -const char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage }; | ||
| 233 | -const int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]); | ||
| 234 | - | ||
| 235 | -// Array of extensions to cover both extensions providing ray tracing capabilities. | ||
| 236 | -const char* const ray_tracing_EXTs[] = { E_GL_EXT_ray_query, E_GL_EXT_ray_tracing }; | ||
| 237 | -const int Num_ray_tracing_EXTs = sizeof(ray_tracing_EXTs) / sizeof(ray_tracing_EXTs[0]); | ||
| 238 | - | ||
| 239 | -// OVR extensions | ||
| 240 | -const char* const E_GL_OVR_multiview = "GL_OVR_multiview"; | ||
| 241 | -const char* const E_GL_OVR_multiview2 = "GL_OVR_multiview2"; | ||
| 242 | - | ||
| 243 | -const char* const OVR_multiview_EXTs[] = { E_GL_OVR_multiview, E_GL_OVR_multiview2 }; | ||
| 244 | -const int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multiview_EXTs[0]); | ||
| 245 | - | ||
| 246 | -// #line and #include | ||
| 247 | -const char* const E_GL_GOOGLE_cpp_style_line_directive = "GL_GOOGLE_cpp_style_line_directive"; | ||
| 248 | -const char* const E_GL_GOOGLE_include_directive = "GL_GOOGLE_include_directive"; | ||
| 249 | -const char* const E_GL_ARB_shading_language_include = "GL_ARB_shading_language_include"; | ||
| 250 | - | ||
| 251 | -const char* const E_GL_AMD_shader_ballot = "GL_AMD_shader_ballot"; | ||
| 252 | -const char* const E_GL_AMD_shader_trinary_minmax = "GL_AMD_shader_trinary_minmax"; | ||
| 253 | -const char* const E_GL_AMD_shader_explicit_vertex_parameter = "GL_AMD_shader_explicit_vertex_parameter"; | ||
| 254 | -const char* const E_GL_AMD_gcn_shader = "GL_AMD_gcn_shader"; | ||
| 255 | -const char* const E_GL_AMD_gpu_shader_half_float = "GL_AMD_gpu_shader_half_float"; | ||
| 256 | -const char* const E_GL_AMD_texture_gather_bias_lod = "GL_AMD_texture_gather_bias_lod"; | ||
| 257 | -const char* const E_GL_AMD_gpu_shader_int16 = "GL_AMD_gpu_shader_int16"; | ||
| 258 | -const char* const E_GL_AMD_shader_image_load_store_lod = "GL_AMD_shader_image_load_store_lod"; | ||
| 259 | -const char* const E_GL_AMD_shader_fragment_mask = "GL_AMD_shader_fragment_mask"; | ||
| 260 | -const char* const E_GL_AMD_gpu_shader_half_float_fetch = "GL_AMD_gpu_shader_half_float_fetch"; | ||
| 261 | -const char* const E_GL_AMD_shader_early_and_late_fragment_tests = "GL_AMD_shader_early_and_late_fragment_tests"; | ||
| 262 | - | ||
| 263 | -const char* const E_GL_INTEL_shader_integer_functions2 = "GL_INTEL_shader_integer_functions2"; | ||
| 264 | - | ||
| 265 | -const char* const E_GL_NV_sample_mask_override_coverage = "GL_NV_sample_mask_override_coverage"; | ||
| 266 | -const char* const E_SPV_NV_geometry_shader_passthrough = "GL_NV_geometry_shader_passthrough"; | ||
| 267 | -const char* const E_GL_NV_viewport_array2 = "GL_NV_viewport_array2"; | ||
| 268 | -const char* const E_GL_NV_stereo_view_rendering = "GL_NV_stereo_view_rendering"; | ||
| 269 | -const char* const E_GL_NVX_multiview_per_view_attributes = "GL_NVX_multiview_per_view_attributes"; | ||
| 270 | -const char* const E_GL_NV_shader_atomic_int64 = "GL_NV_shader_atomic_int64"; | ||
| 271 | -const char* const E_GL_NV_conservative_raster_underestimation = "GL_NV_conservative_raster_underestimation"; | ||
| 272 | -const char* const E_GL_NV_shader_noperspective_interpolation = "GL_NV_shader_noperspective_interpolation"; | ||
| 273 | -const char* const E_GL_NV_shader_subgroup_partitioned = "GL_NV_shader_subgroup_partitioned"; | ||
| 274 | -const char* const E_GL_NV_shading_rate_image = "GL_NV_shading_rate_image"; | ||
| 275 | -const char* const E_GL_NV_ray_tracing = "GL_NV_ray_tracing"; | ||
| 276 | -const char* const E_GL_NV_ray_tracing_motion_blur = "GL_NV_ray_tracing_motion_blur"; | ||
| 277 | -const char* const E_GL_NV_fragment_shader_barycentric = "GL_NV_fragment_shader_barycentric"; | ||
| 278 | -const char* const E_GL_NV_compute_shader_derivatives = "GL_NV_compute_shader_derivatives"; | ||
| 279 | -const char* const E_GL_NV_shader_texture_footprint = "GL_NV_shader_texture_footprint"; | ||
| 280 | -const char* const E_GL_NV_mesh_shader = "GL_NV_mesh_shader"; | ||
| 281 | -const char* const E_GL_NV_cooperative_matrix = "GL_NV_cooperative_matrix"; | ||
| 282 | -const char* const E_GL_NV_shader_sm_builtins = "GL_NV_shader_sm_builtins"; | ||
| 283 | -const char* const E_GL_NV_integer_cooperative_matrix = "GL_NV_integer_cooperative_matrix"; | ||
| 284 | -const char* const E_GL_NV_shader_invocation_reorder = "GL_NV_shader_invocation_reorder"; | ||
| 285 | -const char* const E_GL_EXT_ray_tracing_position_fetch = "GL_EXT_ray_tracing_position_fetch"; | ||
| 286 | -const char* const E_GL_NV_displacement_micromap = "GL_NV_displacement_micromap"; | ||
| 287 | -const char* const E_GL_NV_shader_atomic_fp16_vector = "GL_NV_shader_atomic_fp16_vector"; | ||
| 288 | -const char* const E_GL_NV_cooperative_matrix2 = "GL_NV_cooperative_matrix2"; | ||
| 289 | -const char* const E_GL_NV_cooperative_vector = "GL_NV_cooperative_vector"; | ||
| 290 | -const char* const E_GL_NV_cluster_acceleration_structure = "GL_NV_cluster_acceleration_structure"; | ||
| 291 | -const char* const E_GL_NV_linear_swept_spheres = "GL_NV_linear_swept_spheres"; | ||
| 292 | - | ||
| 293 | -// ARM | ||
| 294 | -const char* const E_GL_ARM_shader_core_builtins = "GL_ARM_shader_core_builtins"; | ||
| 295 | - | ||
| 296 | -// Arrays of extensions for the above viewportEXTs duplications | ||
| 297 | - | ||
| 298 | -const char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 }; | ||
| 299 | -const int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]); | ||
| 300 | - | ||
| 301 | - | ||
| 302 | -const char* const E_GL_QCOM_image_processing = "GL_QCOM_image_processing"; | ||
| 303 | -const char* const E_GL_QCOM_image_processing2 = "GL_QCOM_image_processing2"; | ||
| 304 | - | ||
| 305 | -// AEP | ||
| 306 | -const char* const E_GL_ANDROID_extension_pack_es31a = "GL_ANDROID_extension_pack_es31a"; | ||
| 307 | -const char* const E_GL_KHR_blend_equation_advanced = "GL_KHR_blend_equation_advanced"; | ||
| 308 | -const char* const E_GL_OES_sample_variables = "GL_OES_sample_variables"; | ||
| 309 | -const char* const E_GL_OES_shader_image_atomic = "GL_OES_shader_image_atomic"; | ||
| 310 | -const char* const E_GL_OES_shader_multisample_interpolation = "GL_OES_shader_multisample_interpolation"; | ||
| 311 | -const char* const E_GL_OES_texture_storage_multisample_2d_array = "GL_OES_texture_storage_multisample_2d_array"; | ||
| 312 | -const char* const E_GL_EXT_geometry_shader = "GL_EXT_geometry_shader"; | ||
| 313 | -const char* const E_GL_EXT_geometry_point_size = "GL_EXT_geometry_point_size"; | ||
| 314 | -const char* const E_GL_EXT_gpu_shader5 = "GL_EXT_gpu_shader5"; | ||
| 315 | -const char* const E_GL_EXT_primitive_bounding_box = "GL_EXT_primitive_bounding_box"; | ||
| 316 | -const char* const E_GL_EXT_shader_io_blocks = "GL_EXT_shader_io_blocks"; | ||
| 317 | -const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessellation_shader"; | ||
| 318 | -const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size"; | ||
| 319 | -const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer"; | ||
| 320 | -const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array"; | ||
| 321 | -const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix"; | ||
| 322 | - | ||
| 323 | -// OES matching AEP | ||
| 324 | -const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader"; | ||
| 325 | -const char* const E_GL_OES_geometry_point_size = "GL_OES_geometry_point_size"; | ||
| 326 | -const char* const E_GL_OES_gpu_shader5 = "GL_OES_gpu_shader5"; | ||
| 327 | -const char* const E_GL_OES_primitive_bounding_box = "GL_OES_primitive_bounding_box"; | ||
| 328 | -const char* const E_GL_OES_shader_io_blocks = "GL_OES_shader_io_blocks"; | ||
| 329 | -const char* const E_GL_OES_tessellation_shader = "GL_OES_tessellation_shader"; | ||
| 330 | -const char* const E_GL_OES_tessellation_point_size = "GL_OES_tessellation_point_size"; | ||
| 331 | -const char* const E_GL_OES_texture_buffer = "GL_OES_texture_buffer"; | ||
| 332 | -const char* const E_GL_OES_texture_cube_map_array = "GL_OES_texture_cube_map_array"; | ||
| 333 | - | ||
| 334 | -// EXT | ||
| 335 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types = "GL_EXT_shader_explicit_arithmetic_types"; | ||
| 336 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_int8 = "GL_EXT_shader_explicit_arithmetic_types_int8"; | ||
| 337 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_int16 = "GL_EXT_shader_explicit_arithmetic_types_int16"; | ||
| 338 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_int32 = "GL_EXT_shader_explicit_arithmetic_types_int32"; | ||
| 339 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_int64 = "GL_EXT_shader_explicit_arithmetic_types_int64"; | ||
| 340 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_float16 = "GL_EXT_shader_explicit_arithmetic_types_float16"; | ||
| 341 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_float32 = "GL_EXT_shader_explicit_arithmetic_types_float32"; | ||
| 342 | -const char* const E_GL_EXT_shader_explicit_arithmetic_types_float64 = "GL_EXT_shader_explicit_arithmetic_types_float64"; | ||
| 343 | - | ||
| 344 | -const char* const E_GL_EXT_shader_subgroup_extended_types_int8 = "GL_EXT_shader_subgroup_extended_types_int8"; | ||
| 345 | -const char* const E_GL_EXT_shader_subgroup_extended_types_int16 = "GL_EXT_shader_subgroup_extended_types_int16"; | ||
| 346 | -const char* const E_GL_EXT_shader_subgroup_extended_types_int64 = "GL_EXT_shader_subgroup_extended_types_int64"; | ||
| 347 | -const char* const E_GL_EXT_shader_subgroup_extended_types_float16 = "GL_EXT_shader_subgroup_extended_types_float16"; | ||
| 348 | -const char* const E_GL_EXT_terminate_invocation = "GL_EXT_terminate_invocation"; | ||
| 349 | - | ||
| 350 | -const char* const E_GL_EXT_shader_atomic_float = "GL_EXT_shader_atomic_float"; | ||
| 351 | -const char* const E_GL_EXT_shader_atomic_float2 = "GL_EXT_shader_atomic_float2"; | ||
| 352 | - | ||
| 353 | -const char* const E_GL_EXT_shader_tile_image = "GL_EXT_shader_tile_image"; | ||
| 354 | - | ||
| 355 | -const char* const E_GL_EXT_texture_shadow_lod = "GL_EXT_texture_shadow_lod"; | ||
| 356 | - | ||
| 357 | -const char* const E_GL_EXT_integer_dot_product = "GL_EXT_integer_dot_product"; | ||
| 358 | - | ||
| 359 | -// Arrays of extensions for the above AEP duplications | ||
| 360 | - | ||
| 361 | -const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader }; | ||
| 362 | -const int Num_AEP_geometry_shader = sizeof(AEP_geometry_shader)/sizeof(AEP_geometry_shader[0]); | ||
| 363 | - | ||
| 364 | -const char* const AEP_geometry_point_size[] = { E_GL_EXT_geometry_point_size, E_GL_OES_geometry_point_size }; | ||
| 365 | -const int Num_AEP_geometry_point_size = sizeof(AEP_geometry_point_size)/sizeof(AEP_geometry_point_size[0]); | ||
| 366 | - | ||
| 367 | -const char* const AEP_gpu_shader5[] = { E_GL_EXT_gpu_shader5, E_GL_OES_gpu_shader5 }; | ||
| 368 | -const int Num_AEP_gpu_shader5 = sizeof(AEP_gpu_shader5)/sizeof(AEP_gpu_shader5[0]); | ||
| 369 | - | ||
| 370 | -const char* const AEP_primitive_bounding_box[] = { E_GL_EXT_primitive_bounding_box, E_GL_OES_primitive_bounding_box }; | ||
| 371 | -const int Num_AEP_primitive_bounding_box = sizeof(AEP_primitive_bounding_box)/sizeof(AEP_primitive_bounding_box[0]); | ||
| 372 | - | ||
| 373 | -const char* const AEP_shader_io_blocks[] = { E_GL_EXT_shader_io_blocks, E_GL_OES_shader_io_blocks }; | ||
| 374 | -const int Num_AEP_shader_io_blocks = sizeof(AEP_shader_io_blocks)/sizeof(AEP_shader_io_blocks[0]); | ||
| 375 | - | ||
| 376 | -const char* const AEP_tessellation_shader[] = { E_GL_EXT_tessellation_shader, E_GL_OES_tessellation_shader }; | ||
| 377 | -const int Num_AEP_tessellation_shader = sizeof(AEP_tessellation_shader)/sizeof(AEP_tessellation_shader[0]); | ||
| 378 | - | ||
| 379 | -const char* const AEP_tessellation_point_size[] = { E_GL_EXT_tessellation_point_size, E_GL_OES_tessellation_point_size }; | ||
| 380 | -const int Num_AEP_tessellation_point_size = sizeof(AEP_tessellation_point_size)/sizeof(AEP_tessellation_point_size[0]); | ||
| 381 | - | ||
| 382 | -const char* const AEP_texture_buffer[] = { E_GL_EXT_texture_buffer, E_GL_OES_texture_buffer }; | ||
| 383 | -const int Num_AEP_texture_buffer = sizeof(AEP_texture_buffer)/sizeof(AEP_texture_buffer[0]); | ||
| 384 | - | ||
| 385 | -const char* const AEP_texture_cube_map_array[] = { E_GL_EXT_texture_cube_map_array, E_GL_OES_texture_cube_map_array }; | ||
| 386 | -const int Num_AEP_texture_cube_map_array = sizeof(AEP_texture_cube_map_array)/sizeof(AEP_texture_cube_map_array[0]); | ||
| 387 | - | ||
| 388 | -const char* const AEP_mesh_shader[] = { E_GL_NV_mesh_shader, E_GL_EXT_mesh_shader }; | ||
| 389 | -const int Num_AEP_mesh_shader = sizeof(AEP_mesh_shader)/sizeof(AEP_mesh_shader[0]); | ||
| 390 | - | ||
| 391 | -} // end namespace glslang | ||
| 392 | - | ||
| 393 | -#endif // _VERSIONS_INCLUDED_ |
| 1 | -// | ||
| 2 | -// Copyright (C) 2016 Google, Inc. | ||
| 3 | -// | ||
| 4 | -// All rights reserved. | ||
| 5 | -// | ||
| 6 | -// Redistribution and use in source and binary forms, with or without | ||
| 7 | -// modification, are permitted provided that the following conditions | ||
| 8 | -// are met: | ||
| 9 | -// | ||
| 10 | -// Redistributions of source code must retain the above copyright | ||
| 11 | -// notice, this list of conditions and the following disclaimer. | ||
| 12 | -// | ||
| 13 | -// Redistributions in binary form must reproduce the above | ||
| 14 | -// copyright notice, this list of conditions and the following | ||
| 15 | -// disclaimer in the documentation and/or other materials provided | ||
| 16 | -// with the distribution. | ||
| 17 | -// | ||
| 18 | -// Neither the name of Google Inc. nor the names of its | ||
| 19 | -// contributors may be used to endorse or promote products derived | ||
| 20 | -// from this software without specific prior written permission. | ||
| 21 | -// | ||
| 22 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 25 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 26 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 27 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 28 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 29 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 30 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 31 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 32 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 33 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 34 | - | ||
| 35 | -#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ | ||
| 36 | -#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ | ||
| 37 | - | ||
| 38 | -#include <string> | ||
| 39 | - | ||
| 40 | -#include "../Include/ResourceLimits.h" | ||
| 41 | -#include "../Include/visibility.h" | ||
| 42 | - | ||
| 43 | -// Return pointer to user-writable Resource to pass through API in | ||
| 44 | -// future-proof way. | ||
| 45 | -GLSLANG_EXPORT extern TBuiltInResource* GetResources(); | ||
| 46 | - | ||
| 47 | -// These are the default resources for TBuiltInResources, used for both | ||
| 48 | -// - parsing this string for the case where the user didn't supply one, | ||
| 49 | -// - dumping out a template for user construction of a config file. | ||
| 50 | -GLSLANG_EXPORT extern const TBuiltInResource* GetDefaultResources(); | ||
| 51 | - | ||
| 52 | -// Returns the DefaultTBuiltInResource as a human-readable string. | ||
| 53 | -GLSLANG_EXPORT std::string GetDefaultTBuiltInResourceString(); | ||
| 54 | - | ||
| 55 | -// Decodes the resource limits from |config| to |resources|. | ||
| 56 | -GLSLANG_EXPORT void DecodeResourceLimits(TBuiltInResource* resources, char* config); | ||
| 57 | - | ||
| 58 | -#endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ |
| 1 | -// | ||
| 2 | -// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. | ||
| 3 | -// Copyright (C) 2013-2016 LunarG, Inc. | ||
| 4 | -// Copyright (C) 2015-2018 Google, Inc. | ||
| 5 | -// | ||
| 6 | -// All rights reserved. | ||
| 7 | -// | ||
| 8 | -// Redistribution and use in source and binary forms, with or without | ||
| 9 | -// modification, are permitted provided that the following conditions | ||
| 10 | -// are met: | ||
| 11 | -// | ||
| 12 | -// Redistributions of source code must retain the above copyright | ||
| 13 | -// notice, this list of conditions and the following disclaimer. | ||
| 14 | -// | ||
| 15 | -// Redistributions in binary form must reproduce the above | ||
| 16 | -// copyright notice, this list of conditions and the following | ||
| 17 | -// disclaimer in the documentation and/or other materials provided | ||
| 18 | -// with the distribution. | ||
| 19 | -// | ||
| 20 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 21 | -// contributors may be used to endorse or promote products derived | ||
| 22 | -// from this software without specific prior written permission. | ||
| 23 | -// | ||
| 24 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 25 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 26 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 27 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 28 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 29 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 30 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 31 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 32 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 33 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 34 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 35 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 36 | -// | ||
| 37 | -#ifndef _COMPILER_INTERFACE_INCLUDED_ | ||
| 38 | -#define _COMPILER_INTERFACE_INCLUDED_ | ||
| 39 | - | ||
| 40 | -#include "../Include/ResourceLimits.h" | ||
| 41 | -#include "../Include/visibility.h" | ||
| 42 | -#include "../MachineIndependent/Versions.h" | ||
| 43 | - | ||
| 44 | -#include <cstring> | ||
| 45 | -#include <vector> | ||
| 46 | - | ||
| 47 | -#ifdef _WIN32 | ||
| 48 | - #define C_DECL __cdecl | ||
| 49 | -#else | ||
| 50 | - #define C_DECL | ||
| 51 | -#endif | ||
| 52 | - | ||
| 53 | -// | ||
| 54 | -// This is the platform independent interface between an OGL driver | ||
| 55 | -// and the shading language compiler/linker. | ||
| 56 | -// | ||
| 57 | - | ||
| 58 | -#ifdef __cplusplus | ||
| 59 | - extern "C" { | ||
| 60 | -#endif | ||
| 61 | - | ||
| 62 | -// | ||
| 63 | -// Call before doing any other compiler/linker operations. | ||
| 64 | -// | ||
| 65 | -// (Call once per process, not once per thread.) | ||
| 66 | -// | ||
| 67 | -GLSLANG_EXPORT int ShInitialize(); | ||
| 68 | - | ||
| 69 | -// | ||
| 70 | -// Call this at process shutdown to clean up memory. | ||
| 71 | -// | ||
| 72 | -GLSLANG_EXPORT int ShFinalize(); | ||
| 73 | - | ||
| 74 | -// | ||
| 75 | -// Types of languages the compiler can consume. | ||
| 76 | -// | ||
| 77 | -typedef enum { | ||
| 78 | - EShLangVertex, | ||
| 79 | - EShLangTessControl, | ||
| 80 | - EShLangTessEvaluation, | ||
| 81 | - EShLangGeometry, | ||
| 82 | - EShLangFragment, | ||
| 83 | - EShLangCompute, | ||
| 84 | - EShLangRayGen, | ||
| 85 | - EShLangRayGenNV = EShLangRayGen, | ||
| 86 | - EShLangIntersect, | ||
| 87 | - EShLangIntersectNV = EShLangIntersect, | ||
| 88 | - EShLangAnyHit, | ||
| 89 | - EShLangAnyHitNV = EShLangAnyHit, | ||
| 90 | - EShLangClosestHit, | ||
| 91 | - EShLangClosestHitNV = EShLangClosestHit, | ||
| 92 | - EShLangMiss, | ||
| 93 | - EShLangMissNV = EShLangMiss, | ||
| 94 | - EShLangCallable, | ||
| 95 | - EShLangCallableNV = EShLangCallable, | ||
| 96 | - EShLangTask, | ||
| 97 | - EShLangTaskNV = EShLangTask, | ||
| 98 | - EShLangMesh, | ||
| 99 | - EShLangMeshNV = EShLangMesh, | ||
| 100 | - LAST_ELEMENT_MARKER(EShLangCount), | ||
| 101 | -} EShLanguage; // would be better as stage, but this is ancient now | ||
| 102 | - | ||
| 103 | -typedef enum : unsigned { | ||
| 104 | - EShLangVertexMask = (1 << EShLangVertex), | ||
| 105 | - EShLangTessControlMask = (1 << EShLangTessControl), | ||
| 106 | - EShLangTessEvaluationMask = (1 << EShLangTessEvaluation), | ||
| 107 | - EShLangGeometryMask = (1 << EShLangGeometry), | ||
| 108 | - EShLangFragmentMask = (1 << EShLangFragment), | ||
| 109 | - EShLangComputeMask = (1 << EShLangCompute), | ||
| 110 | - EShLangRayGenMask = (1 << EShLangRayGen), | ||
| 111 | - EShLangRayGenNVMask = EShLangRayGenMask, | ||
| 112 | - EShLangIntersectMask = (1 << EShLangIntersect), | ||
| 113 | - EShLangIntersectNVMask = EShLangIntersectMask, | ||
| 114 | - EShLangAnyHitMask = (1 << EShLangAnyHit), | ||
| 115 | - EShLangAnyHitNVMask = EShLangAnyHitMask, | ||
| 116 | - EShLangClosestHitMask = (1 << EShLangClosestHit), | ||
| 117 | - EShLangClosestHitNVMask = EShLangClosestHitMask, | ||
| 118 | - EShLangMissMask = (1 << EShLangMiss), | ||
| 119 | - EShLangMissNVMask = EShLangMissMask, | ||
| 120 | - EShLangCallableMask = (1 << EShLangCallable), | ||
| 121 | - EShLangCallableNVMask = EShLangCallableMask, | ||
| 122 | - EShLangTaskMask = (1 << EShLangTask), | ||
| 123 | - EShLangTaskNVMask = EShLangTaskMask, | ||
| 124 | - EShLangMeshMask = (1 << EShLangMesh), | ||
| 125 | - EShLangMeshNVMask = EShLangMeshMask, | ||
| 126 | - LAST_ELEMENT_MARKER(EShLanguageMaskCount), | ||
| 127 | -} EShLanguageMask; | ||
| 128 | - | ||
| 129 | -namespace glslang { | ||
| 130 | - | ||
| 131 | -class TType; | ||
| 132 | - | ||
| 133 | -typedef enum { | ||
| 134 | - EShSourceNone, | ||
| 135 | - EShSourceGlsl, // GLSL, includes ESSL (OpenGL ES GLSL) | ||
| 136 | - EShSourceHlsl, // HLSL | ||
| 137 | - LAST_ELEMENT_MARKER(EShSourceCount), | ||
| 138 | -} EShSource; // if EShLanguage were EShStage, this could be EShLanguage instead | ||
| 139 | - | ||
| 140 | -typedef enum { | ||
| 141 | - EShClientNone, // use when there is no client, e.g. for validation | ||
| 142 | - EShClientVulkan, // as GLSL dialect, specifies KHR_vulkan_glsl extension | ||
| 143 | - EShClientOpenGL, // as GLSL dialect, specifies ARB_gl_spirv extension | ||
| 144 | - LAST_ELEMENT_MARKER(EShClientCount), | ||
| 145 | -} EShClient; | ||
| 146 | - | ||
| 147 | -typedef enum { | ||
| 148 | - EShTargetNone, | ||
| 149 | - EShTargetSpv, // SPIR-V (preferred spelling) | ||
| 150 | - EshTargetSpv = EShTargetSpv, // legacy spelling | ||
| 151 | - LAST_ELEMENT_MARKER(EShTargetCount), | ||
| 152 | -} EShTargetLanguage; | ||
| 153 | - | ||
| 154 | -typedef enum { | ||
| 155 | - EShTargetVulkan_1_0 = (1 << 22), // Vulkan 1.0 | ||
| 156 | - EShTargetVulkan_1_1 = (1 << 22) | (1 << 12), // Vulkan 1.1 | ||
| 157 | - EShTargetVulkan_1_2 = (1 << 22) | (2 << 12), // Vulkan 1.2 | ||
| 158 | - EShTargetVulkan_1_3 = (1 << 22) | (3 << 12), // Vulkan 1.3 | ||
| 159 | - EShTargetVulkan_1_4 = (1 << 22) | (4 << 12), // Vulkan 1.4 | ||
| 160 | - EShTargetOpenGL_450 = 450, // OpenGL | ||
| 161 | - LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 6), | ||
| 162 | -} EShTargetClientVersion; | ||
| 163 | - | ||
| 164 | -typedef EShTargetClientVersion EshTargetClientVersion; | ||
| 165 | - | ||
| 166 | -typedef enum { | ||
| 167 | - EShTargetSpv_1_0 = (1 << 16), // SPIR-V 1.0 | ||
| 168 | - EShTargetSpv_1_1 = (1 << 16) | (1 << 8), // SPIR-V 1.1 | ||
| 169 | - EShTargetSpv_1_2 = (1 << 16) | (2 << 8), // SPIR-V 1.2 | ||
| 170 | - EShTargetSpv_1_3 = (1 << 16) | (3 << 8), // SPIR-V 1.3 | ||
| 171 | - EShTargetSpv_1_4 = (1 << 16) | (4 << 8), // SPIR-V 1.4 | ||
| 172 | - EShTargetSpv_1_5 = (1 << 16) | (5 << 8), // SPIR-V 1.5 | ||
| 173 | - EShTargetSpv_1_6 = (1 << 16) | (6 << 8), // SPIR-V 1.6 | ||
| 174 | - LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 7), | ||
| 175 | -} EShTargetLanguageVersion; | ||
| 176 | - | ||
| 177 | -// | ||
| 178 | -// Following are a series of helper enums for managing layouts and qualifiers, | ||
| 179 | -// used for TPublicType, TType, others. | ||
| 180 | -// | ||
| 181 | - | ||
| 182 | -enum TLayoutPacking { | ||
| 183 | - ElpNone, | ||
| 184 | - ElpShared, // default, but different than saying nothing | ||
| 185 | - ElpStd140, | ||
| 186 | - ElpStd430, | ||
| 187 | - ElpPacked, | ||
| 188 | - ElpScalar, | ||
| 189 | - ElpCount // If expanding, see bitfield width below | ||
| 190 | -}; | ||
| 191 | - | ||
| 192 | -struct TInputLanguage { | ||
| 193 | - EShSource languageFamily; // redundant information with other input, this one overrides when not EShSourceNone | ||
| 194 | - EShLanguage stage; // redundant information with other input, this one overrides when not EShSourceNone | ||
| 195 | - EShClient dialect; | ||
| 196 | - int dialectVersion; // version of client's language definition, not the client (when not EShClientNone) | ||
| 197 | - bool vulkanRulesRelaxed; | ||
| 198 | -}; | ||
| 199 | - | ||
| 200 | -struct TClient { | ||
| 201 | - EShClient client; | ||
| 202 | - EShTargetClientVersion version; // version of client itself (not the client's input dialect) | ||
| 203 | -}; | ||
| 204 | - | ||
| 205 | -struct TTarget { | ||
| 206 | - EShTargetLanguage language; | ||
| 207 | - EShTargetLanguageVersion version; // version to target, if SPIR-V, defined by "word 1" of the SPIR-V header | ||
| 208 | - bool hlslFunctionality1; // can target hlsl_functionality1 extension(s) | ||
| 209 | -}; | ||
| 210 | - | ||
| 211 | -// All source/client/target versions and settings. | ||
| 212 | -// Can override previous methods of setting, when items are set here. | ||
| 213 | -// Expected to grow, as more are added, rather than growing parameter lists. | ||
| 214 | -struct TEnvironment { | ||
| 215 | - TInputLanguage input; // definition of the input language | ||
| 216 | - TClient client; // what client is the overall compilation being done for? | ||
| 217 | - TTarget target; // what to generate | ||
| 218 | -}; | ||
| 219 | - | ||
| 220 | -GLSLANG_EXPORT const char* StageName(EShLanguage); | ||
| 221 | - | ||
| 222 | -} // end namespace glslang | ||
| 223 | - | ||
| 224 | -// | ||
| 225 | -// Types of output the linker will create. | ||
| 226 | -// | ||
| 227 | -typedef enum { | ||
| 228 | - EShExVertexFragment, | ||
| 229 | - EShExFragment | ||
| 230 | -} EShExecutable; | ||
| 231 | - | ||
| 232 | -// | ||
| 233 | -// Optimization level for the compiler. | ||
| 234 | -// | ||
| 235 | -typedef enum { | ||
| 236 | - EShOptNoGeneration, | ||
| 237 | - EShOptNone, | ||
| 238 | - EShOptSimple, // Optimizations that can be done quickly | ||
| 239 | - EShOptFull, // Optimizations that will take more time | ||
| 240 | - LAST_ELEMENT_MARKER(EshOptLevelCount), | ||
| 241 | -} EShOptimizationLevel; | ||
| 242 | - | ||
| 243 | -// | ||
| 244 | -// Texture and Sampler transformation mode. | ||
| 245 | -// | ||
| 246 | -typedef enum { | ||
| 247 | - EShTexSampTransKeep, // keep textures and samplers as is (default) | ||
| 248 | - EShTexSampTransUpgradeTextureRemoveSampler, // change texture w/o embeded sampler into sampled texture and throw away all samplers | ||
| 249 | - LAST_ELEMENT_MARKER(EShTexSampTransCount), | ||
| 250 | -} EShTextureSamplerTransformMode; | ||
| 251 | - | ||
| 252 | -// | ||
| 253 | -// Message choices for what errors and warnings are given. | ||
| 254 | -// | ||
| 255 | -enum EShMessages : unsigned { | ||
| 256 | - EShMsgDefault = 0, // default is to give all required errors and extra warnings | ||
| 257 | - EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input | ||
| 258 | - EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification | ||
| 259 | - EShMsgAST = (1 << 2), // print the AST intermediate representation | ||
| 260 | - EShMsgSpvRules = (1 << 3), // issue messages for SPIR-V generation | ||
| 261 | - EShMsgVulkanRules = (1 << 4), // issue messages for Vulkan-requirements of GLSL for SPIR-V | ||
| 262 | - EShMsgOnlyPreprocessor = (1 << 5), // only print out errors produced by the preprocessor | ||
| 263 | - EShMsgReadHlsl = (1 << 6), // use HLSL parsing rules and semantics | ||
| 264 | - EShMsgCascadingErrors = (1 << 7), // get cascading errors; risks error-recovery issues, instead of an early exit | ||
| 265 | - EShMsgKeepUncalled = (1 << 8), // for testing, don't eliminate uncalled functions | ||
| 266 | - EShMsgHlslOffsets = (1 << 9), // allow block offsets to follow HLSL rules instead of GLSL rules | ||
| 267 | - EShMsgDebugInfo = (1 << 10), // save debug information | ||
| 268 | - EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL | ||
| 269 | - EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages | ||
| 270 | - EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics) | ||
| 271 | - EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table | ||
| 272 | - EShMsgEnhanced = (1 << 15), // enhanced message readability | ||
| 273 | - EShMsgAbsolutePath = (1 << 16), // Output Absolute path for messages | ||
| 274 | - EShMsgDisplayErrorColumn = (1 << 17), // Display error message column aswell as line | ||
| 275 | - EShMsgLinkTimeOptimization = (1 << 18), // perform cross-stage optimizations during linking | ||
| 276 | - LAST_ELEMENT_MARKER(EShMsgCount), | ||
| 277 | -}; | ||
| 278 | - | ||
| 279 | -// | ||
| 280 | -// Options for building reflection | ||
| 281 | -// | ||
| 282 | -typedef enum { | ||
| 283 | - EShReflectionDefault = 0, // default is original behaviour before options were added | ||
| 284 | - EShReflectionStrictArraySuffix = (1 << 0), // reflection will follow stricter rules for array-of-structs suffixes | ||
| 285 | - EShReflectionBasicArraySuffix = (1 << 1), // arrays of basic types will be appended with [0] as in GL reflection | ||
| 286 | - EShReflectionIntermediateIO = (1 << 2), // reflect inputs and outputs to program, even with no vertex shader | ||
| 287 | - EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately | ||
| 288 | - EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive | ||
| 289 | - EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks | ||
| 290 | - EShReflectionAllIOVariables = (1 << 6), // reflect all input/output variables, even if they are inactive | ||
| 291 | - EShReflectionSharedStd140SSBO = (1 << 7), // Apply std140/shared rules for ubo to ssbo | ||
| 292 | - EShReflectionSharedStd140UBO = (1 << 8), // Apply std140/shared rules for ubo to ssbo | ||
| 293 | - LAST_ELEMENT_MARKER(EShReflectionCount), | ||
| 294 | -} EShReflectionOptions; | ||
| 295 | - | ||
| 296 | -// | ||
| 297 | -// Build a table for bindings. This can be used for locating | ||
| 298 | -// attributes, uniforms, globals, etc., as needed. | ||
| 299 | -// | ||
| 300 | -typedef struct { | ||
| 301 | - const char* name; | ||
| 302 | - int binding; | ||
| 303 | -} ShBinding; | ||
| 304 | - | ||
| 305 | -typedef struct { | ||
| 306 | - int numBindings; | ||
| 307 | - ShBinding* bindings; // array of bindings | ||
| 308 | -} ShBindingTable; | ||
| 309 | - | ||
| 310 | -// | ||
| 311 | -// ShHandle held by but opaque to the driver. It is allocated, | ||
| 312 | -// managed, and de-allocated by the compiler/linker. Its contents | ||
| 313 | -// are defined by and used by the compiler and linker. For example, | ||
| 314 | -// symbol table information and object code passed from the compiler | ||
| 315 | -// to the linker can be stored where ShHandle points. | ||
| 316 | -// | ||
| 317 | -// If handle creation fails, 0 will be returned. | ||
| 318 | -// | ||
| 319 | -typedef void* ShHandle; | ||
| 320 | - | ||
| 321 | -// | ||
| 322 | -// Driver calls these to create and destroy compiler/linker | ||
| 323 | -// objects. | ||
| 324 | -// | ||
| 325 | -GLSLANG_EXPORT ShHandle ShConstructCompiler(const EShLanguage, int /*debugOptions unused*/); // one per shader | ||
| 326 | -GLSLANG_EXPORT ShHandle ShConstructLinker(const EShExecutable, int /*debugOptions unused*/); // one per shader pair | ||
| 327 | -GLSLANG_EXPORT ShHandle ShConstructUniformMap(); // one per uniform namespace (currently entire program object) | ||
| 328 | -GLSLANG_EXPORT void ShDestruct(ShHandle); | ||
| 329 | - | ||
| 330 | -// | ||
| 331 | -// The return value of ShCompile is boolean, non-zero indicating | ||
| 332 | -// success. | ||
| 333 | -// | ||
| 334 | -// The info-log should be written by ShCompile into | ||
| 335 | -// ShHandle, so it can answer future queries. | ||
| 336 | -// | ||
| 337 | -GLSLANG_EXPORT int ShCompile(const ShHandle, const char* const shaderStrings[], const int numStrings, | ||
| 338 | - const int* lengths, const EShOptimizationLevel, const TBuiltInResource* resources, | ||
| 339 | - int, // debugOptions unused | ||
| 340 | - int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader | ||
| 341 | - bool forwardCompatible = false, // give errors for use of deprecated features | ||
| 342 | - EShMessages messages = EShMsgDefault, // warnings and errors | ||
| 343 | - const char* fileName = nullptr | ||
| 344 | -); | ||
| 345 | - | ||
| 346 | -GLSLANG_EXPORT int ShLinkExt( | ||
| 347 | - const ShHandle, // linker object | ||
| 348 | - const ShHandle h[], // compiler objects to link together | ||
| 349 | - const int numHandles); | ||
| 350 | - | ||
| 351 | -// | ||
| 352 | -// ShSetEncrpytionMethod is a place-holder for specifying | ||
| 353 | -// how source code is encrypted. | ||
| 354 | -// | ||
| 355 | -GLSLANG_EXPORT void ShSetEncryptionMethod(ShHandle); | ||
| 356 | - | ||
| 357 | -// | ||
| 358 | -// All the following return 0 if the information is not | ||
| 359 | -// available in the object passed down, or the object is bad. | ||
| 360 | -// | ||
| 361 | -GLSLANG_EXPORT const char* ShGetInfoLog(const ShHandle); | ||
| 362 | -GLSLANG_EXPORT const void* ShGetExecutable(const ShHandle); | ||
| 363 | -GLSLANG_EXPORT int ShSetVirtualAttributeBindings(const ShHandle, const ShBindingTable*); // to detect user aliasing | ||
| 364 | -GLSLANG_EXPORT int ShSetFixedAttributeBindings(const ShHandle, const ShBindingTable*); // to force any physical mappings | ||
| 365 | -// | ||
| 366 | -// Tell the linker to never assign a vertex attribute to this list of physical attributes | ||
| 367 | -// | ||
| 368 | -GLSLANG_EXPORT int ShExcludeAttributes(const ShHandle, int *attributes, int count); | ||
| 369 | - | ||
| 370 | -// | ||
| 371 | -// Returns the location ID of the named uniform. | ||
| 372 | -// Returns -1 if error. | ||
| 373 | -// | ||
| 374 | -GLSLANG_EXPORT int ShGetUniformLocation(const ShHandle uniformMap, const char* name); | ||
| 375 | - | ||
| 376 | -#ifdef __cplusplus | ||
| 377 | - } // end extern "C" | ||
| 378 | -#endif | ||
| 379 | - | ||
| 380 | -//////////////////////////////////////////////////////////////////////////////////////////// | ||
| 381 | -// | ||
| 382 | -// Deferred-Lowering C++ Interface | ||
| 383 | -// ----------------------------------- | ||
| 384 | -// | ||
| 385 | -// Below is a new alternate C++ interface, which deprecates the above | ||
| 386 | -// opaque handle-based interface. | ||
| 387 | -// | ||
| 388 | -// The below is further designed to handle multiple compilation units per stage, where | ||
| 389 | -// the intermediate results, including the parse tree, are preserved until link time, | ||
| 390 | -// rather than the above interface which is designed to have each compilation unit | ||
| 391 | -// lowered at compile time. In the above model, linking occurs on the lowered results, | ||
| 392 | -// whereas in this model intra-stage linking can occur at the parse tree | ||
| 393 | -// (treeRoot in TIntermediate) level, and then a full stage can be lowered. | ||
| 394 | -// | ||
| 395 | - | ||
| 396 | -#include <list> | ||
| 397 | -#include <string> | ||
| 398 | -#include <utility> | ||
| 399 | - | ||
| 400 | -class TCompiler; | ||
| 401 | -class TInfoSink; | ||
| 402 | - | ||
| 403 | -namespace glslang { | ||
| 404 | - | ||
| 405 | -struct Version { | ||
| 406 | - int major; | ||
| 407 | - int minor; | ||
| 408 | - int patch; | ||
| 409 | - const char* flavor; | ||
| 410 | -}; | ||
| 411 | - | ||
| 412 | -GLSLANG_EXPORT Version GetVersion(); | ||
| 413 | -GLSLANG_EXPORT const char* GetEsslVersionString(); | ||
| 414 | -GLSLANG_EXPORT const char* GetGlslVersionString(); | ||
| 415 | -GLSLANG_EXPORT int GetKhronosToolId(); | ||
| 416 | - | ||
| 417 | -class TIntermediate; | ||
| 418 | -class TProgram; | ||
| 419 | -class TPoolAllocator; | ||
| 420 | -class TIoMapResolver; | ||
| 421 | - | ||
| 422 | -// Call this exactly once per process before using anything else | ||
| 423 | -GLSLANG_EXPORT bool InitializeProcess(); | ||
| 424 | - | ||
| 425 | -// Call once per process to tear down everything | ||
| 426 | -GLSLANG_EXPORT void FinalizeProcess(); | ||
| 427 | - | ||
| 428 | -// Resource type for IO resolver | ||
| 429 | -enum TResourceType { | ||
| 430 | - EResSampler, | ||
| 431 | - EResTexture, | ||
| 432 | - EResImage, | ||
| 433 | - EResUbo, | ||
| 434 | - EResSsbo, | ||
| 435 | - EResUav, | ||
| 436 | - EResCount | ||
| 437 | -}; | ||
| 438 | - | ||
| 439 | -enum TBlockStorageClass | ||
| 440 | -{ | ||
| 441 | - EbsUniform = 0, | ||
| 442 | - EbsStorageBuffer, | ||
| 443 | - EbsPushConstant, | ||
| 444 | - EbsNone, // not a uniform or buffer variable | ||
| 445 | - EbsCount, | ||
| 446 | -}; | ||
| 447 | - | ||
| 448 | -// Make one TShader per shader that you will link into a program. Then | ||
| 449 | -// - provide the shader through setStrings() or setStringsWithLengths() | ||
| 450 | -// - optionally call setEnv*(), see below for more detail | ||
| 451 | -// - optionally use setPreamble() to set a special shader string that will be | ||
| 452 | -// processed before all others but won't affect the validity of #version | ||
| 453 | -// - optionally call addProcesses() for each setting/transform, | ||
| 454 | -// see comment for class TProcesses | ||
| 455 | -// - call parse(): source language and target environment must be selected | ||
| 456 | -// either by correct setting of EShMessages sent to parse(), or by | ||
| 457 | -// explicitly calling setEnv*() | ||
| 458 | -// - query the info logs | ||
| 459 | -// | ||
| 460 | -// N.B.: Does not yet support having the same TShader instance being linked into | ||
| 461 | -// multiple programs. | ||
| 462 | -// | ||
| 463 | -// N.B.: Destruct a linked program *before* destructing the shaders linked into it. | ||
| 464 | -// | ||
| 465 | -class TShader { | ||
| 466 | -public: | ||
| 467 | - GLSLANG_EXPORT explicit TShader(EShLanguage); | ||
| 468 | - GLSLANG_EXPORT virtual ~TShader(); | ||
| 469 | - GLSLANG_EXPORT void setStrings(const char* const* s, int n); | ||
| 470 | - GLSLANG_EXPORT void setStringsWithLengths( | ||
| 471 | - const char* const* s, const int* l, int n); | ||
| 472 | - GLSLANG_EXPORT void setStringsWithLengthsAndNames( | ||
| 473 | - const char* const* s, const int* l, const char* const* names, int n); | ||
| 474 | - void setPreamble(const char* s) { preamble = s; } | ||
| 475 | - GLSLANG_EXPORT void setEntryPoint(const char* entryPoint); | ||
| 476 | - GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName); | ||
| 477 | - GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&); | ||
| 478 | - GLSLANG_EXPORT void setUniqueId(unsigned long long id); | ||
| 479 | - GLSLANG_EXPORT void setOverrideVersion(int version); | ||
| 480 | - GLSLANG_EXPORT void setDebugInfo(bool debugInfo); | ||
| 481 | - | ||
| 482 | - // IO resolver binding data: see comments in ShaderLang.cpp | ||
| 483 | - GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base); | ||
| 484 | - GLSLANG_EXPORT void setShiftSamplerBinding(unsigned int base); // DEPRECATED: use setShiftBinding | ||
| 485 | - GLSLANG_EXPORT void setShiftTextureBinding(unsigned int base); // DEPRECATED: use setShiftBinding | ||
| 486 | - GLSLANG_EXPORT void setShiftImageBinding(unsigned int base); // DEPRECATED: use setShiftBinding | ||
| 487 | - GLSLANG_EXPORT void setShiftUboBinding(unsigned int base); // DEPRECATED: use setShiftBinding | ||
| 488 | - GLSLANG_EXPORT void setShiftUavBinding(unsigned int base); // DEPRECATED: use setShiftBinding | ||
| 489 | - GLSLANG_EXPORT void setShiftCbufferBinding(unsigned int base); // synonym for setShiftUboBinding | ||
| 490 | - GLSLANG_EXPORT void setShiftSsboBinding(unsigned int base); // DEPRECATED: use setShiftBinding | ||
| 491 | - GLSLANG_EXPORT void setShiftBindingForSet(TResourceType res, unsigned int base, unsigned int set); | ||
| 492 | - GLSLANG_EXPORT void setResourceSetBinding(const std::vector<std::string>& base); | ||
| 493 | - GLSLANG_EXPORT void setAutoMapBindings(bool map); | ||
| 494 | - GLSLANG_EXPORT void setAutoMapLocations(bool map); | ||
| 495 | - GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc); | ||
| 496 | - GLSLANG_EXPORT void setUniformLocationBase(int base); | ||
| 497 | - GLSLANG_EXPORT void setInvertY(bool invert); | ||
| 498 | - GLSLANG_EXPORT void setDxPositionW(bool dxPosW); | ||
| 499 | - GLSLANG_EXPORT void setEnhancedMsgs(); | ||
| 500 | -#ifdef ENABLE_HLSL | ||
| 501 | - GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap); | ||
| 502 | - GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten); | ||
| 503 | -#endif | ||
| 504 | - GLSLANG_EXPORT void setNoStorageFormat(bool useUnknownFormat); | ||
| 505 | - GLSLANG_EXPORT void setNanMinMaxClamp(bool nanMinMaxClamp); | ||
| 506 | - GLSLANG_EXPORT void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode); | ||
| 507 | - GLSLANG_EXPORT void addBlockStorageOverride(const char* nameStr, glslang::TBlockStorageClass backing); | ||
| 508 | - | ||
| 509 | - GLSLANG_EXPORT void setGlobalUniformBlockName(const char* name); | ||
| 510 | - GLSLANG_EXPORT void setAtomicCounterBlockName(const char* name); | ||
| 511 | - GLSLANG_EXPORT void setGlobalUniformSet(unsigned int set); | ||
| 512 | - GLSLANG_EXPORT void setGlobalUniformBinding(unsigned int binding); | ||
| 513 | - GLSLANG_EXPORT void setAtomicCounterBlockSet(unsigned int set); | ||
| 514 | - GLSLANG_EXPORT void setAtomicCounterBlockBinding(unsigned int binding); | ||
| 515 | - | ||
| 516 | - GLSLANG_EXPORT void addSourceText(const char* text, size_t len); | ||
| 517 | - GLSLANG_EXPORT void setSourceFile(const char* file); | ||
| 518 | - | ||
| 519 | - // For setting up the environment (cleared to nothingness in the constructor). | ||
| 520 | - // These must be called so that parsing is done for the right source language and | ||
| 521 | - // target environment, either indirectly through TranslateEnvironment() based on | ||
| 522 | - // EShMessages et. al., or directly by the user. | ||
| 523 | - // | ||
| 524 | - // setEnvInput: The input source language and stage. If generating code for a | ||
| 525 | - // specific client, the input client semantics to use and the | ||
| 526 | - // version of that client's input semantics to use, otherwise | ||
| 527 | - // use EShClientNone and version of 0, e.g. for validation mode. | ||
| 528 | - // Note 'version' does not describe the target environment, | ||
| 529 | - // just the version of the source dialect to compile under. | ||
| 530 | - // For example, to choose the Vulkan dialect of GLSL defined by | ||
| 531 | - // version 100 of the KHR_vulkan_glsl extension: lang = EShSourceGlsl, | ||
| 532 | - // dialect = EShClientVulkan, and version = 100. | ||
| 533 | - // | ||
| 534 | - // See the definitions of TEnvironment, EShSource, EShLanguage, | ||
| 535 | - // and EShClient for choices and more detail. | ||
| 536 | - // | ||
| 537 | - // setEnvClient: The client that will be hosting the execution, and its version. | ||
| 538 | - // Note 'version' is not the version of the languages involved, but | ||
| 539 | - // the version of the client environment. | ||
| 540 | - // Use EShClientNone and version of 0 if there is no client, e.g. | ||
| 541 | - // for validation mode. | ||
| 542 | - // | ||
| 543 | - // See EShTargetClientVersion for choices. | ||
| 544 | - // | ||
| 545 | - // setEnvTarget: The language to translate to when generating code, and that | ||
| 546 | - // language's version. | ||
| 547 | - // Use EShTargetNone and version of 0 if there is no client, e.g. | ||
| 548 | - // for validation mode. | ||
| 549 | - // | ||
| 550 | - void setEnvInput(EShSource lang, EShLanguage envStage, EShClient client, int version) | ||
| 551 | - { | ||
| 552 | - environment.input.languageFamily = lang; | ||
| 553 | - environment.input.stage = envStage; | ||
| 554 | - environment.input.dialect = client; | ||
| 555 | - environment.input.dialectVersion = version; | ||
| 556 | - } | ||
| 557 | - void setEnvClient(EShClient client, EShTargetClientVersion version) | ||
| 558 | - { | ||
| 559 | - environment.client.client = client; | ||
| 560 | - environment.client.version = version; | ||
| 561 | - } | ||
| 562 | - void setEnvTarget(EShTargetLanguage lang, EShTargetLanguageVersion version) | ||
| 563 | - { | ||
| 564 | - environment.target.language = lang; | ||
| 565 | - environment.target.version = version; | ||
| 566 | - } | ||
| 567 | - | ||
| 568 | - void getStrings(const char* const* &s, int& n) { s = strings; n = numStrings; } | ||
| 569 | - | ||
| 570 | -#ifdef ENABLE_HLSL | ||
| 571 | - void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; } | ||
| 572 | - bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; } | ||
| 573 | -#else | ||
| 574 | - bool getEnvTargetHlslFunctionality1() const { return false; } | ||
| 575 | -#endif | ||
| 576 | - | ||
| 577 | - void setEnvInputVulkanRulesRelaxed() { environment.input.vulkanRulesRelaxed = true; } | ||
| 578 | - bool getEnvInputVulkanRulesRelaxed() const { return environment.input.vulkanRulesRelaxed; } | ||
| 579 | - | ||
| 580 | - void setCompileOnly() { compileOnly = true; } | ||
| 581 | - bool getCompileOnly() const { return compileOnly; } | ||
| 582 | - | ||
| 583 | - // Interface to #include handlers. | ||
| 584 | - // | ||
| 585 | - // To support #include, a client of Glslang does the following: | ||
| 586 | - // 1. Call setStringsWithNames to set the source strings and associated | ||
| 587 | - // names. For example, the names could be the names of the files | ||
| 588 | - // containing the shader sources. | ||
| 589 | - // 2. Call parse with an Includer. | ||
| 590 | - // | ||
| 591 | - // When the Glslang parser encounters an #include directive, it calls | ||
| 592 | - // the Includer's include method with the requested include name | ||
| 593 | - // together with the current string name. The returned IncludeResult | ||
| 594 | - // contains the fully resolved name of the included source, together | ||
| 595 | - // with the source text that should replace the #include directive | ||
| 596 | - // in the source stream. After parsing that source, Glslang will | ||
| 597 | - // release the IncludeResult object. | ||
| 598 | - class Includer { | ||
| 599 | - public: | ||
| 600 | - // An IncludeResult contains the resolved name and content of a source | ||
| 601 | - // inclusion. | ||
| 602 | - struct IncludeResult { | ||
| 603 | - IncludeResult(const std::string& headerName, const char* const headerData, const size_t headerLength, void* userData) : | ||
| 604 | - headerName(headerName), headerData(headerData), headerLength(headerLength), userData(userData) { } | ||
| 605 | - // For a successful inclusion, the fully resolved name of the requested | ||
| 606 | - // include. For example, in a file system-based includer, full resolution | ||
| 607 | - // should convert a relative path name into an absolute path name. | ||
| 608 | - // For a failed inclusion, this is an empty string. | ||
| 609 | - const std::string headerName; | ||
| 610 | - // The content and byte length of the requested inclusion. The | ||
| 611 | - // Includer producing this IncludeResult retains ownership of the | ||
| 612 | - // storage. | ||
| 613 | - // For a failed inclusion, the header | ||
| 614 | - // field points to a string containing error details. | ||
| 615 | - const char* const headerData; | ||
| 616 | - const size_t headerLength; | ||
| 617 | - // Include resolver's context. | ||
| 618 | - void* userData; | ||
| 619 | - protected: | ||
| 620 | - IncludeResult& operator=(const IncludeResult&); | ||
| 621 | - IncludeResult(); | ||
| 622 | - }; | ||
| 623 | - | ||
| 624 | - // For both include methods below: | ||
| 625 | - // | ||
| 626 | - // Resolves an inclusion request by name, current source name, | ||
| 627 | - // and include depth. | ||
| 628 | - // On success, returns an IncludeResult containing the resolved name | ||
| 629 | - // and content of the include. | ||
| 630 | - // On failure, returns a nullptr, or an IncludeResult | ||
| 631 | - // with an empty string for the headerName and error details in the | ||
| 632 | - // header field. | ||
| 633 | - // The Includer retains ownership of the contents | ||
| 634 | - // of the returned IncludeResult value, and those contents must | ||
| 635 | - // remain valid until the releaseInclude method is called on that | ||
| 636 | - // IncludeResult object. | ||
| 637 | - // | ||
| 638 | - // Note "local" vs. "system" is not an "either/or": "local" is an | ||
| 639 | - // extra thing to do over "system". Both might get called, as per | ||
| 640 | - // the C++ specification. | ||
| 641 | - | ||
| 642 | - // For the "system" or <>-style includes; search the "system" paths. | ||
| 643 | - virtual IncludeResult* includeSystem(const char* /*headerName*/, | ||
| 644 | - const char* /*includerName*/, | ||
| 645 | - size_t /*inclusionDepth*/) { return nullptr; } | ||
| 646 | - | ||
| 647 | - // For the "local"-only aspect of a "" include. Should not search in the | ||
| 648 | - // "system" paths, because on returning a failure, the parser will | ||
| 649 | - // call includeSystem() to look in the "system" locations. | ||
| 650 | - virtual IncludeResult* includeLocal(const char* /*headerName*/, | ||
| 651 | - const char* /*includerName*/, | ||
| 652 | - size_t /*inclusionDepth*/) { return nullptr; } | ||
| 653 | - | ||
| 654 | - // Signals that the parser will no longer use the contents of the | ||
| 655 | - // specified IncludeResult. | ||
| 656 | - virtual void releaseInclude(IncludeResult*) = 0; | ||
| 657 | - virtual ~Includer() {} | ||
| 658 | - }; | ||
| 659 | - | ||
| 660 | - // Fail all Includer searches | ||
| 661 | - class ForbidIncluder : public Includer { | ||
| 662 | - public: | ||
| 663 | - virtual void releaseInclude(IncludeResult*) override { } | ||
| 664 | - }; | ||
| 665 | - | ||
| 666 | - GLSLANG_EXPORT bool parse( | ||
| 667 | - const TBuiltInResource*, int defaultVersion, EProfile defaultProfile, | ||
| 668 | - bool forceDefaultVersionAndProfile, bool forwardCompatible, | ||
| 669 | - EShMessages, Includer&); | ||
| 670 | - | ||
| 671 | - bool parse(const TBuiltInResource* res, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile, | ||
| 672 | - bool forwardCompatible, EShMessages messages) | ||
| 673 | - { | ||
| 674 | - TShader::ForbidIncluder includer; | ||
| 675 | - return parse(res, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, forwardCompatible, messages, includer); | ||
| 676 | - } | ||
| 677 | - | ||
| 678 | - // Equivalent to parse() without a default profile and without forcing defaults. | ||
| 679 | - bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages) | ||
| 680 | - { | ||
| 681 | - return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages); | ||
| 682 | - } | ||
| 683 | - | ||
| 684 | - bool parse(const TBuiltInResource* builtInResources, int defaultVersion, bool forwardCompatible, EShMessages messages, | ||
| 685 | - Includer& includer) | ||
| 686 | - { | ||
| 687 | - return parse(builtInResources, defaultVersion, ENoProfile, false, forwardCompatible, messages, includer); | ||
| 688 | - } | ||
| 689 | - | ||
| 690 | - // NOTE: Doing just preprocessing to obtain a correct preprocessed shader string | ||
| 691 | - // is not an officially supported or fully working path. | ||
| 692 | - GLSLANG_EXPORT bool preprocess( | ||
| 693 | - const TBuiltInResource* builtInResources, int defaultVersion, | ||
| 694 | - EProfile defaultProfile, bool forceDefaultVersionAndProfile, | ||
| 695 | - bool forwardCompatible, EShMessages message, std::string* outputString, | ||
| 696 | - Includer& includer); | ||
| 697 | - | ||
| 698 | - GLSLANG_EXPORT const char* getInfoLog(); | ||
| 699 | - GLSLANG_EXPORT const char* getInfoDebugLog(); | ||
| 700 | - EShLanguage getStage() const { return stage; } | ||
| 701 | - TIntermediate* getIntermediate() const { return intermediate; } | ||
| 702 | - | ||
| 703 | -protected: | ||
| 704 | - TPoolAllocator* pool; | ||
| 705 | - EShLanguage stage; | ||
| 706 | - TCompiler* compiler; | ||
| 707 | - TIntermediate* intermediate; | ||
| 708 | - TInfoSink* infoSink; | ||
| 709 | - // strings and lengths follow the standard for glShaderSource: | ||
| 710 | - // strings is an array of numStrings pointers to string data. | ||
| 711 | - // lengths can be null, but if not it is an array of numStrings | ||
| 712 | - // integers containing the length of the associated strings. | ||
| 713 | - // if lengths is null or lengths[n] < 0 the associated strings[n] is | ||
| 714 | - // assumed to be null-terminated. | ||
| 715 | - // stringNames is the optional names for all the strings. If stringNames | ||
| 716 | - // is null, then none of the strings has name. If a certain element in | ||
| 717 | - // stringNames is null, then the corresponding string does not have name. | ||
| 718 | - const char* const* strings; // explicit code to compile, see previous comment | ||
| 719 | - const int* lengths; | ||
| 720 | - const char* const* stringNames; | ||
| 721 | - int numStrings; // size of the above arrays | ||
| 722 | - const char* preamble; // string of implicit code to compile before the explicitly provided code | ||
| 723 | - | ||
| 724 | - // a function in the source string can be renamed FROM this TO the name given in setEntryPoint. | ||
| 725 | - std::string sourceEntryPointName; | ||
| 726 | - | ||
| 727 | - // overrides #version in shader source or default version if #version isn't present | ||
| 728 | - int overrideVersion; | ||
| 729 | - | ||
| 730 | - TEnvironment environment; | ||
| 731 | - | ||
| 732 | - // Indicates this shader is meant to be used without linking | ||
| 733 | - bool compileOnly = false; | ||
| 734 | - | ||
| 735 | - friend class TProgram; | ||
| 736 | - | ||
| 737 | -private: | ||
| 738 | - TShader& operator=(TShader&); | ||
| 739 | -}; | ||
| 740 | - | ||
| 741 | -// | ||
| 742 | -// A reflection database and its interface, consistent with the OpenGL API reflection queries. | ||
| 743 | -// | ||
| 744 | - | ||
| 745 | -// Data needed for just a single object at the granularity exchanged by the reflection API | ||
| 746 | -class TObjectReflection { | ||
| 747 | -public: | ||
| 748 | - GLSLANG_EXPORT TObjectReflection(const std::string& pName, const TType& pType, int pOffset, int pGLDefineType, int pSize, int pIndex); | ||
| 749 | - | ||
| 750 | - const TType* getType() const { return type; } | ||
| 751 | - GLSLANG_EXPORT int getBinding() const; | ||
| 752 | - GLSLANG_EXPORT void dump() const; | ||
| 753 | - static TObjectReflection badReflection() { return TObjectReflection(); } | ||
| 754 | - | ||
| 755 | - GLSLANG_EXPORT unsigned int layoutLocation() const; | ||
| 756 | - | ||
| 757 | - std::string name; | ||
| 758 | - int offset; | ||
| 759 | - int glDefineType; | ||
| 760 | - int size; // data size in bytes for a block, array size for a (non-block) object that's an array | ||
| 761 | - int index; | ||
| 762 | - int counterIndex; | ||
| 763 | - int numMembers; | ||
| 764 | - int arrayStride; // stride of an array variable | ||
| 765 | - int topLevelArraySize; // size of the top-level variable in a storage buffer member | ||
| 766 | - int topLevelArrayStride; // stride of the top-level variable in a storage buffer member | ||
| 767 | - EShLanguageMask stages; | ||
| 768 | - | ||
| 769 | -protected: | ||
| 770 | - TObjectReflection() | ||
| 771 | - : offset(-1), glDefineType(-1), size(-1), index(-1), counterIndex(-1), numMembers(-1), arrayStride(0), | ||
| 772 | - topLevelArrayStride(0), stages(EShLanguageMask(0)), type(nullptr) | ||
| 773 | - { | ||
| 774 | - } | ||
| 775 | - | ||
| 776 | - const TType* type; | ||
| 777 | -}; | ||
| 778 | - | ||
| 779 | -class TReflection; | ||
| 780 | -class TIoMapper; | ||
| 781 | -struct TVarEntryInfo; | ||
| 782 | - | ||
| 783 | -// Allows to customize the binding layout after linking. | ||
| 784 | -// All used uniform variables will invoke at least validateBinding. | ||
| 785 | -// If validateBinding returned true then the other resolveBinding, | ||
| 786 | -// resolveSet, and resolveLocation are invoked to resolve the binding | ||
| 787 | -// and descriptor set index respectively. | ||
| 788 | -// | ||
| 789 | -// Invocations happen in a particular order: | ||
| 790 | -// 1) all shader inputs | ||
| 791 | -// 2) all shader outputs | ||
| 792 | -// 3) all uniforms with binding and set already defined | ||
| 793 | -// 4) all uniforms with binding but no set defined | ||
| 794 | -// 5) all uniforms with set but no binding defined | ||
| 795 | -// 6) all uniforms with no binding and no set defined | ||
| 796 | -// | ||
| 797 | -// mapIO will use this resolver in two phases. The first | ||
| 798 | -// phase is a notification phase, calling the corresponging | ||
| 799 | -// notifiy callbacks, this phase ends with a call to endNotifications. | ||
| 800 | -// Phase two starts directly after the call to endNotifications | ||
| 801 | -// and calls all other callbacks to validate and to get the | ||
| 802 | -// bindings, sets, locations, component and color indices. | ||
| 803 | -// | ||
| 804 | -// NOTE: that still limit checks are applied to bindings and sets | ||
| 805 | -// and may result in an error. | ||
| 806 | -class TIoMapResolver | ||
| 807 | -{ | ||
| 808 | -public: | ||
| 809 | - virtual ~TIoMapResolver() {} | ||
| 810 | - | ||
| 811 | - // Should return true if the resulting/current binding would be okay. | ||
| 812 | - // Basic idea is to do aliasing binding checks with this. | ||
| 813 | - virtual bool validateBinding(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 814 | - // Should return a value >= 0 if the current binding should be overridden. | ||
| 815 | - // Return -1 if the current binding (including no binding) should be kept. | ||
| 816 | - virtual int resolveBinding(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 817 | - // Should return a value >= 0 if the current set should be overridden. | ||
| 818 | - // Return -1 if the current set (including no set) should be kept. | ||
| 819 | - virtual int resolveSet(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 820 | - // Should return a value >= 0 if the current location should be overridden. | ||
| 821 | - // Return -1 if the current location (including no location) should be kept. | ||
| 822 | - virtual int resolveUniformLocation(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 823 | - // Should return true if the resulting/current setup would be okay. | ||
| 824 | - // Basic idea is to do aliasing checks and reject invalid semantic names. | ||
| 825 | - virtual bool validateInOut(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 826 | - // Should return a value >= 0 if the current location should be overridden. | ||
| 827 | - // Return -1 if the current location (including no location) should be kept. | ||
| 828 | - virtual int resolveInOutLocation(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 829 | - // Should return a value >= 0 if the current component index should be overridden. | ||
| 830 | - // Return -1 if the current component index (including no index) should be kept. | ||
| 831 | - virtual int resolveInOutComponent(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 832 | - // Should return a value >= 0 if the current color index should be overridden. | ||
| 833 | - // Return -1 if the current color index (including no index) should be kept. | ||
| 834 | - virtual int resolveInOutIndex(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 835 | - // Notification of a uniform variable | ||
| 836 | - virtual void notifyBinding(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 837 | - // Notification of a in or out variable | ||
| 838 | - virtual void notifyInOut(EShLanguage stage, TVarEntryInfo& ent) = 0; | ||
| 839 | - // Called by mapIO when it starts its notify pass for the given stage | ||
| 840 | - virtual void beginNotifications(EShLanguage stage) = 0; | ||
| 841 | - // Called by mapIO when it has finished the notify pass | ||
| 842 | - virtual void endNotifications(EShLanguage stage) = 0; | ||
| 843 | - // Called by mipIO when it starts its resolve pass for the given stage | ||
| 844 | - virtual void beginResolve(EShLanguage stage) = 0; | ||
| 845 | - // Called by mapIO when it has finished the resolve pass | ||
| 846 | - virtual void endResolve(EShLanguage stage) = 0; | ||
| 847 | - // Called by mapIO when it starts its symbol collect for teh given stage | ||
| 848 | - virtual void beginCollect(EShLanguage stage) = 0; | ||
| 849 | - // Called by mapIO when it has finished the symbol collect | ||
| 850 | - virtual void endCollect(EShLanguage stage) = 0; | ||
| 851 | - // Called by TSlotCollector to resolve storage locations or bindings | ||
| 852 | - virtual void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) = 0; | ||
| 853 | - // Called by TSlotCollector to resolve resource locations or bindings | ||
| 854 | - virtual void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) = 0; | ||
| 855 | - // Called by mapIO.addStage to set shader stage mask to mark a stage be added to this pipeline | ||
| 856 | - virtual void addStage(EShLanguage stage, TIntermediate& stageIntermediate) = 0; | ||
| 857 | -}; | ||
| 858 | - | ||
| 859 | -// I/O mapper | ||
| 860 | -class TIoMapper { | ||
| 861 | -public: | ||
| 862 | - TIoMapper() {} | ||
| 863 | - virtual ~TIoMapper() {} | ||
| 864 | - // grow the reflection stage by stage | ||
| 865 | - bool virtual addStage(EShLanguage, TIntermediate&, TInfoSink&, TIoMapResolver*); | ||
| 866 | - bool virtual doMap(TIoMapResolver*, TInfoSink&) { return true; } | ||
| 867 | - bool virtual setAutoPushConstantBlock(const char*, unsigned int, TLayoutPacking) { return false; } | ||
| 868 | -}; | ||
| 869 | - | ||
| 870 | -// Get the default GLSL IO mapper | ||
| 871 | -GLSLANG_EXPORT TIoMapper* GetGlslIoMapper(); | ||
| 872 | - | ||
| 873 | -// Make one TProgram per set of shaders that will get linked together. Add all | ||
| 874 | -// the shaders that are to be linked together. After calling shader.parse() | ||
| 875 | -// for all shaders, call link(). | ||
| 876 | -// | ||
| 877 | -// N.B.: Destruct a linked program *before* destructing the shaders linked into it. | ||
| 878 | -// | ||
| 879 | -class TProgram { | ||
| 880 | -public: | ||
| 881 | - GLSLANG_EXPORT TProgram(); | ||
| 882 | - GLSLANG_EXPORT virtual ~TProgram(); | ||
| 883 | - void addShader(TShader* shader) { stages[shader->stage].push_back(shader); } | ||
| 884 | - std::list<TShader*>& getShaders(EShLanguage stage) { return stages[stage]; } | ||
| 885 | - // Link Validation interface | ||
| 886 | - GLSLANG_EXPORT bool link(EShMessages); | ||
| 887 | - GLSLANG_EXPORT const char* getInfoLog(); | ||
| 888 | - GLSLANG_EXPORT const char* getInfoDebugLog(); | ||
| 889 | - | ||
| 890 | - TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; } | ||
| 891 | - | ||
| 892 | - // Reflection Interface | ||
| 893 | - | ||
| 894 | - // call first, to do liveness analysis, index mapping, etc.; returns false on failure | ||
| 895 | - GLSLANG_EXPORT bool buildReflection(int opts = EShReflectionDefault); | ||
| 896 | - GLSLANG_EXPORT unsigned getLocalSize(int dim) const; // return dim'th local size | ||
| 897 | - GLSLANG_EXPORT int getReflectionIndex(const char *name) const; | ||
| 898 | - GLSLANG_EXPORT int getReflectionPipeIOIndex(const char* name, const bool inOrOut) const; | ||
| 899 | - GLSLANG_EXPORT int getNumUniformVariables() const; | ||
| 900 | - GLSLANG_EXPORT const TObjectReflection& getUniform(int index) const; | ||
| 901 | - GLSLANG_EXPORT int getNumUniformBlocks() const; | ||
| 902 | - GLSLANG_EXPORT const TObjectReflection& getUniformBlock(int index) const; | ||
| 903 | - GLSLANG_EXPORT int getNumPipeInputs() const; | ||
| 904 | - GLSLANG_EXPORT const TObjectReflection& getPipeInput(int index) const; | ||
| 905 | - GLSLANG_EXPORT int getNumPipeOutputs() const; | ||
| 906 | - GLSLANG_EXPORT const TObjectReflection& getPipeOutput(int index) const; | ||
| 907 | - GLSLANG_EXPORT int getNumBufferVariables() const; | ||
| 908 | - GLSLANG_EXPORT const TObjectReflection& getBufferVariable(int index) const; | ||
| 909 | - GLSLANG_EXPORT int getNumBufferBlocks() const; | ||
| 910 | - GLSLANG_EXPORT const TObjectReflection& getBufferBlock(int index) const; | ||
| 911 | - GLSLANG_EXPORT int getNumAtomicCounters() const; | ||
| 912 | - GLSLANG_EXPORT const TObjectReflection& getAtomicCounter(int index) const; | ||
| 913 | - | ||
| 914 | - // Legacy Reflection Interface - expressed in terms of above interface | ||
| 915 | - | ||
| 916 | - // can be used for glGetProgramiv(GL_ACTIVE_UNIFORMS) | ||
| 917 | - int getNumLiveUniformVariables() const { return getNumUniformVariables(); } | ||
| 918 | - | ||
| 919 | - // can be used for glGetProgramiv(GL_ACTIVE_UNIFORM_BLOCKS) | ||
| 920 | - int getNumLiveUniformBlocks() const { return getNumUniformBlocks(); } | ||
| 921 | - | ||
| 922 | - // can be used for glGetProgramiv(GL_ACTIVE_ATTRIBUTES) | ||
| 923 | - int getNumLiveAttributes() const { return getNumPipeInputs(); } | ||
| 924 | - | ||
| 925 | - // can be used for glGetUniformIndices() | ||
| 926 | - int getUniformIndex(const char *name) const { return getReflectionIndex(name); } | ||
| 927 | - | ||
| 928 | - int getPipeIOIndex(const char *name, const bool inOrOut) const | ||
| 929 | - { return getReflectionPipeIOIndex(name, inOrOut); } | ||
| 930 | - | ||
| 931 | - // can be used for "name" part of glGetActiveUniform() | ||
| 932 | - const char *getUniformName(int index) const { return getUniform(index).name.c_str(); } | ||
| 933 | - | ||
| 934 | - // returns the binding number | ||
| 935 | - int getUniformBinding(int index) const { return getUniform(index).getBinding(); } | ||
| 936 | - | ||
| 937 | - // returns Shaders Stages where a Uniform is present | ||
| 938 | - EShLanguageMask getUniformStages(int index) const { return getUniform(index).stages; } | ||
| 939 | - | ||
| 940 | - // can be used for glGetActiveUniformsiv(GL_UNIFORM_BLOCK_INDEX) | ||
| 941 | - int getUniformBlockIndex(int index) const { return getUniform(index).index; } | ||
| 942 | - | ||
| 943 | - // can be used for glGetActiveUniformsiv(GL_UNIFORM_TYPE) | ||
| 944 | - int getUniformType(int index) const { return getUniform(index).glDefineType; } | ||
| 945 | - | ||
| 946 | - // can be used for glGetActiveUniformsiv(GL_UNIFORM_OFFSET) | ||
| 947 | - int getUniformBufferOffset(int index) const { return getUniform(index).offset; } | ||
| 948 | - | ||
| 949 | - // can be used for glGetActiveUniformsiv(GL_UNIFORM_SIZE) | ||
| 950 | - int getUniformArraySize(int index) const { return getUniform(index).size; } | ||
| 951 | - | ||
| 952 | - // returns a TType* | ||
| 953 | - const TType *getUniformTType(int index) const { return getUniform(index).getType(); } | ||
| 954 | - | ||
| 955 | - // can be used for glGetActiveUniformBlockName() | ||
| 956 | - const char *getUniformBlockName(int index) const { return getUniformBlock(index).name.c_str(); } | ||
| 957 | - | ||
| 958 | - // can be used for glGetActiveUniformBlockiv(UNIFORM_BLOCK_DATA_SIZE) | ||
| 959 | - int getUniformBlockSize(int index) const { return getUniformBlock(index).size; } | ||
| 960 | - | ||
| 961 | - // returns the block binding number | ||
| 962 | - int getUniformBlockBinding(int index) const { return getUniformBlock(index).getBinding(); } | ||
| 963 | - | ||
| 964 | - // returns block index of associated counter. | ||
| 965 | - int getUniformBlockCounterIndex(int index) const { return getUniformBlock(index).counterIndex; } | ||
| 966 | - | ||
| 967 | - // returns a TType* | ||
| 968 | - const TType *getUniformBlockTType(int index) const { return getUniformBlock(index).getType(); } | ||
| 969 | - | ||
| 970 | - // can be used for glGetActiveAttrib() | ||
| 971 | - const char *getAttributeName(int index) const { return getPipeInput(index).name.c_str(); } | ||
| 972 | - | ||
| 973 | - // can be used for glGetActiveAttrib() | ||
| 974 | - int getAttributeType(int index) const { return getPipeInput(index).glDefineType; } | ||
| 975 | - | ||
| 976 | - // returns a TType* | ||
| 977 | - const TType *getAttributeTType(int index) const { return getPipeInput(index).getType(); } | ||
| 978 | - | ||
| 979 | - GLSLANG_EXPORT void dumpReflection(); | ||
| 980 | - | ||
| 981 | - // Get the IO resolver to use for mapIO | ||
| 982 | - GLSLANG_EXPORT TIoMapResolver* getGlslIoResolver(EShLanguage stage); | ||
| 983 | - | ||
| 984 | - // I/O mapping: apply base offsets and map live unbound variables | ||
| 985 | - // If resolver is not provided it uses the previous approach | ||
| 986 | - // and respects auto assignment and offsets. | ||
| 987 | - GLSLANG_EXPORT bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr); | ||
| 988 | - | ||
| 989 | -protected: | ||
| 990 | - GLSLANG_EXPORT bool linkStage(EShLanguage, EShMessages); | ||
| 991 | - GLSLANG_EXPORT bool crossStageCheck(EShMessages); | ||
| 992 | - | ||
| 993 | - TPoolAllocator* pool; | ||
| 994 | - std::list<TShader*> stages[EShLangCount]; | ||
| 995 | - TIntermediate* intermediate[EShLangCount]; | ||
| 996 | - bool newedIntermediate[EShLangCount]; // track which intermediate were "new" versus reusing a singleton unit in a stage | ||
| 997 | - TInfoSink* infoSink; | ||
| 998 | - TReflection* reflection; | ||
| 999 | - bool linked; | ||
| 1000 | - | ||
| 1001 | -private: | ||
| 1002 | - TProgram(TProgram&); | ||
| 1003 | - TProgram& operator=(TProgram&); | ||
| 1004 | -}; | ||
| 1005 | - | ||
| 1006 | -} // end namespace glslang | ||
| 1007 | - | ||
| 1008 | -#endif // _COMPILER_INTERFACE_INCLUDED_ |
| 1 | -/** | ||
| 2 | -BSD 2-Clause License | ||
| 3 | - | ||
| 4 | -Copyright (c) 2020, Travis Fort | ||
| 5 | -All rights reserved. | ||
| 6 | - | ||
| 7 | -Redistribution and use in source and binary forms, with or without | ||
| 8 | -modification, are permitted provided that the following conditions are met: | ||
| 9 | - | ||
| 10 | -1. Redistributions of source code must retain the above copyright notice, this | ||
| 11 | - list of conditions and the following disclaimer. | ||
| 12 | - | ||
| 13 | -2. Redistributions in binary form must reproduce the above copyright notice, | ||
| 14 | - this list of conditions and the following disclaimer in the documentation | ||
| 15 | - and/or other materials provided with the distribution. | ||
| 16 | - | ||
| 17 | -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 18 | -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 19 | -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 20 | -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 21 | -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 22 | -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 23 | -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 24 | -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 25 | -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 26 | -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 27 | -**/ | ||
| 28 | - | ||
| 29 | -#ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ | ||
| 30 | -#define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ | ||
| 31 | - | ||
| 32 | -#include "../Include/glslang_c_interface.h" | ||
| 33 | -#include "../Include/visibility.h" | ||
| 34 | - | ||
| 35 | -#ifdef __cplusplus | ||
| 36 | -extern "C" { | ||
| 37 | -#endif | ||
| 38 | - | ||
| 39 | -// Returns a struct that can be use to create custom resource values. | ||
| 40 | -GLSLANG_EXPORT glslang_resource_t* glslang_resource(void); | ||
| 41 | - | ||
| 42 | -// These are the default resources for TBuiltInResources, used for both | ||
| 43 | -// - parsing this string for the case where the user didn't supply one, | ||
| 44 | -// - dumping out a template for user construction of a config file. | ||
| 45 | -GLSLANG_EXPORT const glslang_resource_t* glslang_default_resource(void); | ||
| 46 | - | ||
| 47 | -// Returns the DefaultTBuiltInResource as a human-readable string. | ||
| 48 | -// NOTE: User is responsible for freeing this string. | ||
| 49 | -GLSLANG_EXPORT const char* glslang_default_resource_string(); | ||
| 50 | - | ||
| 51 | -// Decodes the resource limits from |config| to |resources|. | ||
| 52 | -GLSLANG_EXPORT void glslang_decode_resource_limits(glslang_resource_t* resources, char* config); | ||
| 53 | - | ||
| 54 | -#ifdef __cplusplus | ||
| 55 | -} | ||
| 56 | -#endif | ||
| 57 | - | ||
| 58 | -#endif // _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ |
| 1 | -// | ||
| 2 | -// Copyright (C) 2014 LunarG, Inc. | ||
| 3 | -// Copyright (C) 2015-2018 Google, Inc. | ||
| 4 | -// | ||
| 5 | -// All rights reserved. | ||
| 6 | -// | ||
| 7 | -// Redistribution and use in source and binary forms, with or without | ||
| 8 | -// modification, are permitted provided that the following conditions | ||
| 9 | -// are met: | ||
| 10 | -// | ||
| 11 | -// Redistributions of source code must retain the above copyright | ||
| 12 | -// notice, this list of conditions and the following disclaimer. | ||
| 13 | -// | ||
| 14 | -// Redistributions in binary form must reproduce the above | ||
| 15 | -// copyright notice, this list of conditions and the following | ||
| 16 | -// disclaimer in the documentation and/or other materials provided | ||
| 17 | -// with the distribution. | ||
| 18 | -// | ||
| 19 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 20 | -// contributors may be used to endorse or promote products derived | ||
| 21 | -// from this software without specific prior written permission. | ||
| 22 | -// | ||
| 23 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 24 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 25 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 26 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 27 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 28 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 29 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 30 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 31 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 32 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 33 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 34 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 35 | - | ||
| 36 | -#pragma once | ||
| 37 | - | ||
| 38 | -#include <string> | ||
| 39 | -#include <vector> | ||
| 40 | - | ||
| 41 | -#include "Logger.h" | ||
| 42 | -#include "glslang/Include/visibility.h" | ||
| 43 | - | ||
| 44 | -namespace glslang { | ||
| 45 | -class TIntermediate; | ||
| 46 | - | ||
| 47 | -struct SpvOptions { | ||
| 48 | - bool generateDebugInfo {false}; | ||
| 49 | - bool stripDebugInfo {false}; | ||
| 50 | - bool disableOptimizer {true}; | ||
| 51 | - bool optimizeSize {false}; | ||
| 52 | - bool disassemble {false}; | ||
| 53 | - bool validate {false}; | ||
| 54 | - bool emitNonSemanticShaderDebugInfo {false}; | ||
| 55 | - bool emitNonSemanticShaderDebugSource{ false }; | ||
| 56 | - bool compileOnly{false}; | ||
| 57 | - bool optimizerAllowExpandedIDBound{false}; | ||
| 58 | -}; | ||
| 59 | - | ||
| 60 | -GLSLANG_EXPORT void GetSpirvVersion(std::string&); | ||
| 61 | -GLSLANG_EXPORT int GetSpirvGeneratorVersion(); | ||
| 62 | -GLSLANG_EXPORT void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, | ||
| 63 | - SpvOptions* options = nullptr); | ||
| 64 | -GLSLANG_EXPORT void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, | ||
| 65 | - spv::SpvBuildLogger* logger, SpvOptions* options = nullptr); | ||
| 66 | -GLSLANG_EXPORT bool OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName); | ||
| 67 | -GLSLANG_EXPORT bool OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName); | ||
| 68 | - | ||
| 69 | -} |
| 1 | -// | ||
| 2 | -// Copyright (C) 2016 Google, Inc. | ||
| 3 | -// | ||
| 4 | -// All rights reserved. | ||
| 5 | -// | ||
| 6 | -// Redistribution and use in source and binary forms, with or without | ||
| 7 | -// modification, are permitted provided that the following conditions | ||
| 8 | -// are met: | ||
| 9 | -// | ||
| 10 | -// Redistributions of source code must retain the above copyright | ||
| 11 | -// notice, this list of conditions and the following disclaimer. | ||
| 12 | -// | ||
| 13 | -// Redistributions in binary form must reproduce the above | ||
| 14 | -// copyright notice, this list of conditions and the following | ||
| 15 | -// disclaimer in the documentation and/or other materials provided | ||
| 16 | -// with the distribution. | ||
| 17 | -// | ||
| 18 | -// Neither the name of Google Inc. nor the names of its | ||
| 19 | -// contributors may be used to endorse or promote products derived | ||
| 20 | -// from this software without specific prior written permission. | ||
| 21 | -// | ||
| 22 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 25 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 26 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 27 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 28 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 29 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 30 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 31 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 32 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 33 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 34 | - | ||
| 35 | -#ifndef GLSLANG_SPIRV_LOGGER_H | ||
| 36 | -#define GLSLANG_SPIRV_LOGGER_H | ||
| 37 | - | ||
| 38 | -#include <string> | ||
| 39 | -#include <vector> | ||
| 40 | -#include "glslang/Include/visibility.h" | ||
| 41 | - | ||
| 42 | -namespace spv { | ||
| 43 | - | ||
| 44 | -// A class for holding all SPIR-V build status messages, including | ||
| 45 | -// missing/TBD functionalities, warnings, and errors. | ||
| 46 | -class GLSLANG_EXPORT SpvBuildLogger { | ||
| 47 | -public: | ||
| 48 | - SpvBuildLogger() {} | ||
| 49 | - | ||
| 50 | - // Registers a TBD functionality. | ||
| 51 | - void tbdFunctionality(const std::string& f); | ||
| 52 | - // Registers a missing functionality. | ||
| 53 | - void missingFunctionality(const std::string& f); | ||
| 54 | - | ||
| 55 | - // Logs a warning. | ||
| 56 | - void warning(const std::string& w) { warnings.push_back(w); } | ||
| 57 | - // Logs an error. | ||
| 58 | - void error(const std::string& e) { errors.push_back(e); } | ||
| 59 | - | ||
| 60 | - // Returns all messages accumulated in the order of: | ||
| 61 | - // TBD functionalities, missing functionalities, warnings, errors. | ||
| 62 | - std::string getAllMessages() const; | ||
| 63 | - | ||
| 64 | -private: | ||
| 65 | - SpvBuildLogger(const SpvBuildLogger&); | ||
| 66 | - | ||
| 67 | - std::vector<std::string> tbdFeatures; | ||
| 68 | - std::vector<std::string> missingFeatures; | ||
| 69 | - std::vector<std::string> warnings; | ||
| 70 | - std::vector<std::string> errors; | ||
| 71 | -}; | ||
| 72 | - | ||
| 73 | -} // end spv namespace | ||
| 74 | - | ||
| 75 | -#endif // GLSLANG_SPIRV_LOGGER_H |
| 1 | -// | ||
| 2 | -// Copyright (C) 2015 LunarG, Inc. | ||
| 3 | -// | ||
| 4 | -// All rights reserved. | ||
| 5 | -// | ||
| 6 | -// Redistribution and use in source and binary forms, with or without | ||
| 7 | -// modification, are permitted provided that the following conditions | ||
| 8 | -// are met: | ||
| 9 | -// | ||
| 10 | -// Redistributions of source code must retain the above copyright | ||
| 11 | -// notice, this list of conditions and the following disclaimer. | ||
| 12 | -// | ||
| 13 | -// Redistributions in binary form must reproduce the above | ||
| 14 | -// copyright notice, this list of conditions and the following | ||
| 15 | -// disclaimer in the documentation and/or other materials provided | ||
| 16 | -// with the distribution. | ||
| 17 | -// | ||
| 18 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 19 | -// contributors may be used to endorse or promote products derived | ||
| 20 | -// from this software without specific prior written permission. | ||
| 21 | -// | ||
| 22 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 25 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 26 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 27 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 28 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 29 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 30 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 31 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 32 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 33 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 34 | -// | ||
| 35 | - | ||
| 36 | -#ifndef SPIRVREMAPPER_H | ||
| 37 | -#define SPIRVREMAPPER_H | ||
| 38 | - | ||
| 39 | -#include <string> | ||
| 40 | -#include <vector> | ||
| 41 | -#include <cstdlib> | ||
| 42 | -#include <exception> | ||
| 43 | - | ||
| 44 | -#ifdef GLSLANG_IS_SHARED_LIBRARY | ||
| 45 | - #ifdef _WIN32 | ||
| 46 | - #ifdef GLSLANG_EXPORTING | ||
| 47 | - #define GLSLANG_EXPORT __declspec(dllexport) | ||
| 48 | - #else | ||
| 49 | - #define GLSLANG_EXPORT __declspec(dllimport) | ||
| 50 | - #endif | ||
| 51 | - #elif __GNUC__ >= 4 | ||
| 52 | - #define GLSLANG_EXPORT __attribute__((visibility("default"))) | ||
| 53 | - #endif | ||
| 54 | -#endif // GLSLANG_IS_SHARED_LIBRARY | ||
| 55 | -#ifndef GLSLANG_EXPORT | ||
| 56 | -#define GLSLANG_EXPORT | ||
| 57 | -#endif | ||
| 58 | - | ||
| 59 | -namespace spv { | ||
| 60 | - | ||
| 61 | -class spirvbin_base_t | ||
| 62 | -{ | ||
| 63 | -public: | ||
| 64 | - enum Options { | ||
| 65 | - NONE = 0, | ||
| 66 | - STRIP = (1<<0), | ||
| 67 | - MAP_TYPES = (1<<1), | ||
| 68 | - MAP_NAMES = (1<<2), | ||
| 69 | - MAP_FUNCS = (1<<3), | ||
| 70 | - DCE_FUNCS = (1<<4), | ||
| 71 | - DCE_VARS = (1<<5), | ||
| 72 | - DCE_TYPES = (1<<6), | ||
| 73 | - OPT_LOADSTORE = (1<<7), | ||
| 74 | - OPT_FWD_LS = (1<<8), // EXPERIMENTAL: PRODUCES INVALID SCHEMA-0 SPIRV | ||
| 75 | - MAP_ALL = (MAP_TYPES | MAP_NAMES | MAP_FUNCS), | ||
| 76 | - DCE_ALL = (DCE_FUNCS | DCE_VARS | DCE_TYPES), | ||
| 77 | - OPT_ALL = (OPT_LOADSTORE), | ||
| 78 | - | ||
| 79 | - ALL_BUT_STRIP = (MAP_ALL | DCE_ALL | OPT_ALL), | ||
| 80 | - DO_EVERYTHING = (STRIP | ALL_BUT_STRIP) | ||
| 81 | - }; | ||
| 82 | -}; | ||
| 83 | - | ||
| 84 | -} // namespace SPV | ||
| 85 | - | ||
| 86 | -#include <functional> | ||
| 87 | -#include <cstdint> | ||
| 88 | -#include <unordered_map> | ||
| 89 | -#include <unordered_set> | ||
| 90 | -#include <map> | ||
| 91 | -#include <set> | ||
| 92 | -#include <cassert> | ||
| 93 | - | ||
| 94 | -#include "spirv.hpp" | ||
| 95 | - | ||
| 96 | -namespace spv { | ||
| 97 | - | ||
| 98 | -static inline constexpr Id NoResult = 0; | ||
| 99 | - | ||
| 100 | -// class to hold SPIR-V binary data for remapping, DCE, and debug stripping | ||
| 101 | -class GLSLANG_EXPORT spirvbin_t : public spirvbin_base_t | ||
| 102 | -{ | ||
| 103 | -public: | ||
| 104 | - spirvbin_t(int verbose = 0) : entryPoint(spv::NoResult), largestNewId(0), verbose(verbose), errorLatch(false) | ||
| 105 | - { } | ||
| 106 | - | ||
| 107 | - virtual ~spirvbin_t() { } | ||
| 108 | - | ||
| 109 | - // remap on an existing binary in memory | ||
| 110 | - void remap(std::vector<std::uint32_t>& spv, const std::vector<std::string>& whiteListStrings, | ||
| 111 | - std::uint32_t opts = DO_EVERYTHING); | ||
| 112 | - | ||
| 113 | - // remap on an existing binary in memory - legacy interface without white list | ||
| 114 | - void remap(std::vector<std::uint32_t>& spv, std::uint32_t opts = DO_EVERYTHING); | ||
| 115 | - | ||
| 116 | - // Type for error/log handler functions | ||
| 117 | - typedef std::function<void(const std::string&)> errorfn_t; | ||
| 118 | - typedef std::function<void(const std::string&)> logfn_t; | ||
| 119 | - | ||
| 120 | - // Register error/log handling functions (can be lambda fn / functor / etc) | ||
| 121 | - static void registerErrorHandler(errorfn_t handler) { errorHandler = handler; } | ||
| 122 | - static void registerLogHandler(logfn_t handler) { logHandler = handler; } | ||
| 123 | - | ||
| 124 | -protected: | ||
| 125 | - // This can be overridden to provide other message behavior if needed | ||
| 126 | - virtual void msg(int minVerbosity, int indent, const std::string& txt) const; | ||
| 127 | - | ||
| 128 | -private: | ||
| 129 | - // Local to global, or global to local ID map | ||
| 130 | - typedef std::unordered_map<spv::Id, spv::Id> idmap_t; | ||
| 131 | - typedef std::unordered_set<spv::Id> idset_t; | ||
| 132 | - typedef std::unordered_map<spv::Id, int> blockmap_t; | ||
| 133 | - | ||
| 134 | - void remap(std::uint32_t opts = DO_EVERYTHING); | ||
| 135 | - | ||
| 136 | - // Map of names to IDs | ||
| 137 | - typedef std::unordered_map<std::string, spv::Id> namemap_t; | ||
| 138 | - | ||
| 139 | - typedef std::uint32_t spirword_t; | ||
| 140 | - | ||
| 141 | - typedef std::pair<unsigned, unsigned> range_t; | ||
| 142 | - typedef std::function<void(spv::Id&)> idfn_t; | ||
| 143 | - typedef std::function<bool(spv::Op, unsigned start)> instfn_t; | ||
| 144 | - | ||
| 145 | - // Special Values for ID map: | ||
| 146 | - static const spv::Id unmapped; // unchanged from default value | ||
| 147 | - static const spv::Id unused; // unused ID | ||
| 148 | - static const int header_size; // SPIR header = 5 words | ||
| 149 | - | ||
| 150 | - class id_iterator_t; | ||
| 151 | - | ||
| 152 | - // For mapping type entries between different shaders | ||
| 153 | - typedef std::vector<spirword_t> typeentry_t; | ||
| 154 | - typedef std::map<spv::Id, typeentry_t> globaltypes_t; | ||
| 155 | - | ||
| 156 | - // A set that preserves position order, and a reverse map | ||
| 157 | - typedef std::set<int> posmap_t; | ||
| 158 | - typedef std::unordered_map<spv::Id, int> posmap_rev_t; | ||
| 159 | - | ||
| 160 | - // Maps and ID to the size of its base type, if known. | ||
| 161 | - typedef std::unordered_map<spv::Id, unsigned> typesize_map_t; | ||
| 162 | - | ||
| 163 | - // handle error | ||
| 164 | - void error(const std::string& txt) const { errorLatch = true; errorHandler(txt); } | ||
| 165 | - | ||
| 166 | - bool isConstOp(spv::Op opCode) const; | ||
| 167 | - bool isTypeOp(spv::Op opCode) const; | ||
| 168 | - bool isStripOp(spv::Op opCode) const; | ||
| 169 | - bool isFlowCtrl(spv::Op opCode) const; | ||
| 170 | - range_t literalRange(spv::Op opCode) const; | ||
| 171 | - range_t typeRange(spv::Op opCode) const; | ||
| 172 | - range_t constRange(spv::Op opCode) const; | ||
| 173 | - unsigned typeSizeInWords(spv::Id id) const; | ||
| 174 | - unsigned idTypeSizeInWords(spv::Id id) const; | ||
| 175 | - | ||
| 176 | - bool isStripOp(spv::Op opCode, unsigned start) const; | ||
| 177 | - | ||
| 178 | - spv::Id& asId(unsigned word) { return spv[word]; } | ||
| 179 | - const spv::Id& asId(unsigned word) const { return spv[word]; } | ||
| 180 | - spv::Op asOpCode(unsigned word) const { return opOpCode(spv[word]); } | ||
| 181 | - std::uint32_t asOpCodeHash(unsigned word); | ||
| 182 | - spv::Decoration asDecoration(unsigned word) const { return spv::Decoration(spv[word]); } | ||
| 183 | - unsigned asWordCount(unsigned word) const { return opWordCount(spv[word]); } | ||
| 184 | - spv::Id asTypeConstId(unsigned word) const { return asId(word + (isTypeOp(asOpCode(word)) ? 1 : 2)); } | ||
| 185 | - unsigned idPos(spv::Id id) const; | ||
| 186 | - | ||
| 187 | - static unsigned opWordCount(spirword_t data) { return data >> spv::WordCountShift; } | ||
| 188 | - static spv::Op opOpCode(spirword_t data) { return spv::Op(data & spv::OpCodeMask); } | ||
| 189 | - | ||
| 190 | - // Header access & set methods | ||
| 191 | - spirword_t magic() const { return spv[0]; } // return magic number | ||
| 192 | - spirword_t bound() const { return spv[3]; } // return Id bound from header | ||
| 193 | - spirword_t bound(spirword_t b) { return spv[3] = b; } | ||
| 194 | - spirword_t genmagic() const { return spv[2]; } // generator magic | ||
| 195 | - spirword_t genmagic(spirword_t m) { return spv[2] = m; } | ||
| 196 | - spirword_t schemaNum() const { return spv[4]; } // schema number from header | ||
| 197 | - | ||
| 198 | - // Mapping fns: get | ||
| 199 | - spv::Id localId(spv::Id id) const { return idMapL[id]; } | ||
| 200 | - | ||
| 201 | - // Mapping fns: set | ||
| 202 | - inline spv::Id localId(spv::Id id, spv::Id newId); | ||
| 203 | - void countIds(spv::Id id); | ||
| 204 | - | ||
| 205 | - // Return next unused new local ID. | ||
| 206 | - // NOTE: boost::dynamic_bitset would be more efficient due to find_next(), | ||
| 207 | - // which std::vector<bool> doens't have. | ||
| 208 | - inline spv::Id nextUnusedId(spv::Id id); | ||
| 209 | - | ||
| 210 | - void buildLocalMaps(); | ||
| 211 | - std::string literalString(unsigned word) const; // Return literal as a std::string | ||
| 212 | - int literalStringWords(const std::string& str) const { return (int(str.size())+4)/4; } | ||
| 213 | - | ||
| 214 | - bool isNewIdMapped(spv::Id newId) const { return isMapped(newId); } | ||
| 215 | - bool isOldIdUnmapped(spv::Id oldId) const { return localId(oldId) == unmapped; } | ||
| 216 | - bool isOldIdUnused(spv::Id oldId) const { return localId(oldId) == unused; } | ||
| 217 | - bool isOldIdMapped(spv::Id oldId) const { return !isOldIdUnused(oldId) && !isOldIdUnmapped(oldId); } | ||
| 218 | - bool isFunction(spv::Id oldId) const { return fnPos.find(oldId) != fnPos.end(); } | ||
| 219 | - | ||
| 220 | - // bool matchType(const globaltypes_t& globalTypes, spv::Id lt, spv::Id gt) const; | ||
| 221 | - // spv::Id findType(const globaltypes_t& globalTypes, spv::Id lt) const; | ||
| 222 | - std::uint32_t hashType(unsigned typeStart) const; | ||
| 223 | - | ||
| 224 | - spirvbin_t& process(instfn_t, idfn_t, unsigned begin = 0, unsigned end = 0); | ||
| 225 | - int processInstruction(unsigned word, instfn_t, idfn_t); | ||
| 226 | - | ||
| 227 | - void validate() const; | ||
| 228 | - void mapTypeConst(); | ||
| 229 | - void mapFnBodies(); | ||
| 230 | - void optLoadStore(); | ||
| 231 | - void dceFuncs(); | ||
| 232 | - void dceVars(); | ||
| 233 | - void dceTypes(); | ||
| 234 | - void mapNames(); | ||
| 235 | - void foldIds(); // fold IDs to smallest space | ||
| 236 | - void forwardLoadStores(); // load store forwarding (EXPERIMENTAL) | ||
| 237 | - void offsetIds(); // create relative offset IDs | ||
| 238 | - | ||
| 239 | - void applyMap(); // remap per local name map | ||
| 240 | - void mapRemainder(); // map any IDs we haven't touched yet | ||
| 241 | - void stripDebug(); // strip all debug info | ||
| 242 | - void stripDeadRefs(); // strips debug info for now-dead references after DCE | ||
| 243 | - void strip(); // remove debug symbols | ||
| 244 | - | ||
| 245 | - std::vector<spirword_t> spv; // SPIR words | ||
| 246 | - | ||
| 247 | - std::vector<std::string> stripWhiteList; | ||
| 248 | - | ||
| 249 | - namemap_t nameMap; // ID names from OpName | ||
| 250 | - | ||
| 251 | - // Since we want to also do binary ops, we can't use std::vector<bool>. we could use | ||
| 252 | - // boost::dynamic_bitset, but we're trying to avoid a boost dependency. | ||
| 253 | - typedef std::uint64_t bits_t; | ||
| 254 | - std::vector<bits_t> mapped; // which new IDs have been mapped | ||
| 255 | - static const int mBits = sizeof(bits_t) * 4; | ||
| 256 | - | ||
| 257 | - bool isMapped(spv::Id id) const { return id < maxMappedId() && ((mapped[id/mBits] & (1LL<<(id%mBits))) != 0); } | ||
| 258 | - void setMapped(spv::Id id) { resizeMapped(id); mapped[id/mBits] |= (1LL<<(id%mBits)); } | ||
| 259 | - void resizeMapped(spv::Id id) { if (id >= maxMappedId()) mapped.resize(id/mBits+1, 0); } | ||
| 260 | - size_t maxMappedId() const { return mapped.size() * mBits; } | ||
| 261 | - | ||
| 262 | - // Add a strip range for a given instruction starting at 'start' | ||
| 263 | - // Note: avoiding brace initializers to please older versions os MSVC. | ||
| 264 | - void stripInst(unsigned start) { stripRange.push_back(range_t(start, start + asWordCount(start))); } | ||
| 265 | - | ||
| 266 | - // Function start and end. use unordered_map because we'll have | ||
| 267 | - // many fewer functions than IDs. | ||
| 268 | - std::unordered_map<spv::Id, range_t> fnPos; | ||
| 269 | - | ||
| 270 | - // Which functions are called, anywhere in the module, with a call count | ||
| 271 | - std::unordered_map<spv::Id, int> fnCalls; | ||
| 272 | - | ||
| 273 | - posmap_t typeConstPos; // word positions that define types & consts (ordered) | ||
| 274 | - posmap_rev_t idPosR; // reverse map from IDs to positions | ||
| 275 | - typesize_map_t idTypeSizeMap; // maps each ID to its type size, if known. | ||
| 276 | - | ||
| 277 | - std::vector<spv::Id> idMapL; // ID {M}ap from {L}ocal to {G}lobal IDs | ||
| 278 | - | ||
| 279 | - spv::Id entryPoint; // module entry point | ||
| 280 | - spv::Id largestNewId; // biggest new ID we have mapped anything to | ||
| 281 | - | ||
| 282 | - // Sections of the binary to strip, given as [begin,end) | ||
| 283 | - std::vector<range_t> stripRange; | ||
| 284 | - | ||
| 285 | - // processing options: | ||
| 286 | - std::uint32_t options; | ||
| 287 | - int verbose; // verbosity level | ||
| 288 | - | ||
| 289 | - // Error latch: this is set if the error handler is ever executed. It would be better to | ||
| 290 | - // use a try/catch block and throw, but that's not desired for certain environments, so | ||
| 291 | - // this is the alternative. | ||
| 292 | - mutable bool errorLatch; | ||
| 293 | - | ||
| 294 | - static errorfn_t errorHandler; | ||
| 295 | - static logfn_t logHandler; | ||
| 296 | -}; | ||
| 297 | - | ||
| 298 | -} // namespace SPV | ||
| 299 | - | ||
| 300 | -#endif // SPIRVREMAPPER_H |
| 1 | -// | ||
| 2 | -// Copyright (C) 2014-2016 LunarG, Inc. | ||
| 3 | -// Copyright (C) 2018 Google, Inc. | ||
| 4 | -// | ||
| 5 | -// All rights reserved. | ||
| 6 | -// | ||
| 7 | -// Redistribution and use in source and binary forms, with or without | ||
| 8 | -// modification, are permitted provided that the following conditions | ||
| 9 | -// are met: | ||
| 10 | -// | ||
| 11 | -// Redistributions of source code must retain the above copyright | ||
| 12 | -// notice, this list of conditions and the following disclaimer. | ||
| 13 | -// | ||
| 14 | -// Redistributions in binary form must reproduce the above | ||
| 15 | -// copyright notice, this list of conditions and the following | ||
| 16 | -// disclaimer in the documentation and/or other materials provided | ||
| 17 | -// with the distribution. | ||
| 18 | -// | ||
| 19 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 20 | -// contributors may be used to endorse or promote products derived | ||
| 21 | -// from this software without specific prior written permission. | ||
| 22 | -// | ||
| 23 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 24 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 25 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 26 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 27 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 28 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 29 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 30 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 31 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 32 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 33 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 34 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 35 | - | ||
| 36 | -// | ||
| 37 | -// Call into SPIRV-Tools to disassemble, validate, and optimize. | ||
| 38 | -// | ||
| 39 | - | ||
| 40 | -#pragma once | ||
| 41 | -#ifndef GLSLANG_SPV_TOOLS_H | ||
| 42 | -#define GLSLANG_SPV_TOOLS_H | ||
| 43 | - | ||
| 44 | -#if ENABLE_OPT | ||
| 45 | -#include <vector> | ||
| 46 | -#include <ostream> | ||
| 47 | -#include <unordered_set> | ||
| 48 | -#include "spirv-tools/libspirv.h" | ||
| 49 | -#endif | ||
| 50 | - | ||
| 51 | -#include "glslang/MachineIndependent/Versions.h" | ||
| 52 | -#include "glslang/Include/visibility.h" | ||
| 53 | -#include "GlslangToSpv.h" | ||
| 54 | -#include "Logger.h" | ||
| 55 | - | ||
| 56 | -namespace glslang { | ||
| 57 | - | ||
| 58 | -#if ENABLE_OPT | ||
| 59 | - | ||
| 60 | -class TIntermediate; | ||
| 61 | - | ||
| 62 | -// Translate glslang's view of target versioning to what SPIRV-Tools uses. | ||
| 63 | -GLSLANG_EXPORT spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger); | ||
| 64 | -GLSLANG_EXPORT spv_target_env MapToSpirvToolsEnv(const glslang::TIntermediate& intermediate, spv::SpvBuildLogger* logger); | ||
| 65 | - | ||
| 66 | -// Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment. | ||
| 67 | -GLSLANG_EXPORT void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv); | ||
| 68 | - | ||
| 69 | -// Use the SPIRV-Tools disassembler to print SPIR-V with a provided SPIR-V environment. | ||
| 70 | -GLSLANG_EXPORT void SpirvToolsDisassemble(std::ostream& out, const std::vector<unsigned int>& spirv, | ||
| 71 | - spv_target_env requested_context); | ||
| 72 | - | ||
| 73 | -// Apply the SPIRV-Tools validator to generated SPIR-V. | ||
| 74 | -GLSLANG_EXPORT void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, | ||
| 75 | - spv::SpvBuildLogger*, bool prelegalization); | ||
| 76 | - | ||
| 77 | -// Apply the SPIRV-Tools optimizer to generated SPIR-V. HLSL SPIR-V is legalized in the process. | ||
| 78 | -GLSLANG_EXPORT void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, | ||
| 79 | - spv::SpvBuildLogger*, const SpvOptions*); | ||
| 80 | - | ||
| 81 | -// Apply the SPIRV-Tools EliminateDeadInputComponents pass to generated SPIR-V. Put result in |spirv|. | ||
| 82 | -GLSLANG_EXPORT void SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector<unsigned int>& spirv, | ||
| 83 | - spv::SpvBuildLogger*); | ||
| 84 | - | ||
| 85 | -// Apply the SPIRV-Tools AnalyzeDeadOutputStores pass to generated SPIR-V. Put result in |live_locs|. | ||
| 86 | -// Return true if the result is valid. | ||
| 87 | -GLSLANG_EXPORT bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv, | ||
| 88 | - std::unordered_set<uint32_t>* live_locs, | ||
| 89 | - std::unordered_set<uint32_t>* live_builtins, | ||
| 90 | - spv::SpvBuildLogger*); | ||
| 91 | - | ||
| 92 | -// Apply the SPIRV-Tools EliminateDeadOutputStores and AggressiveDeadCodeElimination passes to generated SPIR-V using | ||
| 93 | -// |live_locs|. Put result in |spirv|. | ||
| 94 | -GLSLANG_EXPORT void SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv, | ||
| 95 | - std::unordered_set<uint32_t>* live_locs, | ||
| 96 | - std::unordered_set<uint32_t>* live_builtins, | ||
| 97 | - spv::SpvBuildLogger*); | ||
| 98 | - | ||
| 99 | -// Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V. This is implicitly done by | ||
| 100 | -// SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if | ||
| 101 | -// optimization is disabled. | ||
| 102 | -GLSLANG_EXPORT void SpirvToolsStripDebugInfo(const glslang::TIntermediate& intermediate, | ||
| 103 | - std::vector<unsigned int>& spirv, spv::SpvBuildLogger*); | ||
| 104 | - | ||
| 105 | -#endif | ||
| 106 | - | ||
| 107 | -} // end namespace glslang | ||
| 108 | - | ||
| 109 | -#endif // GLSLANG_SPV_TOOLS_H |
| 1 | -// | ||
| 2 | -// Copyright (C) 2014-2015 LunarG, Inc. | ||
| 3 | -// | ||
| 4 | -// All rights reserved. | ||
| 5 | -// | ||
| 6 | -// Redistribution and use in source and binary forms, with or without | ||
| 7 | -// modification, are permitted provided that the following conditions | ||
| 8 | -// are met: | ||
| 9 | -// | ||
| 10 | -// Redistributions of source code must retain the above copyright | ||
| 11 | -// notice, this list of conditions and the following disclaimer. | ||
| 12 | -// | ||
| 13 | -// Redistributions in binary form must reproduce the above | ||
| 14 | -// copyright notice, this list of conditions and the following | ||
| 15 | -// disclaimer in the documentation and/or other materials provided | ||
| 16 | -// with the distribution. | ||
| 17 | -// | ||
| 18 | -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 19 | -// contributors may be used to endorse or promote products derived | ||
| 20 | -// from this software without specific prior written permission. | ||
| 21 | -// | ||
| 22 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 25 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 26 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 27 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 28 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 29 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 30 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 31 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 32 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 33 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 34 | - | ||
| 35 | -// | ||
| 36 | -// Disassembler for SPIR-V. | ||
| 37 | -// | ||
| 38 | - | ||
| 39 | -#pragma once | ||
| 40 | -#ifndef disassembler_H | ||
| 41 | -#define disassembler_H | ||
| 42 | - | ||
| 43 | -#include <iostream> | ||
| 44 | -#include <vector> | ||
| 45 | - | ||
| 46 | -#include "glslang/Include/visibility.h" | ||
| 47 | - | ||
| 48 | -namespace spv { | ||
| 49 | - | ||
| 50 | - // disassemble with glslang custom disassembler | ||
| 51 | - GLSLANG_EXPORT void Disassemble(std::ostream& out, const std::vector<unsigned int>&); | ||
| 52 | - | ||
| 53 | -} // end namespace spv | ||
| 54 | - | ||
| 55 | -#endif // disassembler_H |
此 diff 太大无法显示。
| 1 | -// Copyright (C) 2020 The Khronos Group Inc. | ||
| 2 | -// | ||
| 3 | -// All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Redistribution and use in source and binary forms, with or without | ||
| 6 | -// modification, are permitted provided that the following conditions | ||
| 7 | -// are met: | ||
| 8 | -// | ||
| 9 | -// Redistributions of source code must retain the above copyright | ||
| 10 | -// notice, this list of conditions and the following disclaimer. | ||
| 11 | -// | ||
| 12 | -// Redistributions in binary form must reproduce the above | ||
| 13 | -// copyright notice, this list of conditions and the following | ||
| 14 | -// disclaimer in the documentation and/or other materials provided | ||
| 15 | -// with the distribution. | ||
| 16 | -// | ||
| 17 | -// Neither the name of The Khronos Group Inc. nor the names of its | ||
| 18 | -// contributors may be used to endorse or promote products derived | ||
| 19 | -// from this software without specific prior written permission. | ||
| 20 | -// | ||
| 21 | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 22 | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 23 | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 24 | -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 25 | -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 26 | -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 27 | -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 28 | -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 29 | -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 30 | -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 31 | -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 32 | -// POSSIBILITY OF SUCH DAMAGE. | ||
| 33 | - | ||
| 34 | -#ifndef GLSLANG_BUILD_INFO | ||
| 35 | -#define GLSLANG_BUILD_INFO | ||
| 36 | - | ||
| 37 | -#define GLSLANG_VERSION_MAJOR 15 | ||
| 38 | -#define GLSLANG_VERSION_MINOR 1 | ||
| 39 | -#define GLSLANG_VERSION_PATCH 0 | ||
| 40 | -#define GLSLANG_VERSION_FLAVOR "" | ||
| 41 | - | ||
| 42 | -#define GLSLANG_VERSION_GREATER_THAN(major, minor, patch) \ | ||
| 43 | - ((GLSLANG_VERSION_MAJOR) > (major) || ((major) == GLSLANG_VERSION_MAJOR && \ | ||
| 44 | - ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ | ||
| 45 | - (GLSLANG_VERSION_PATCH) > (patch))))) | ||
| 46 | - | ||
| 47 | -#define GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch) \ | ||
| 48 | - ((GLSLANG_VERSION_MAJOR) > (major) || ((major) == GLSLANG_VERSION_MAJOR && \ | ||
| 49 | - ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ | ||
| 50 | - (GLSLANG_VERSION_PATCH >= (patch)))))) | ||
| 51 | - | ||
| 52 | -#define GLSLANG_VERSION_LESS_THAN(major, minor, patch) \ | ||
| 53 | - ((GLSLANG_VERSION_MAJOR) < (major) || ((major) == GLSLANG_VERSION_MAJOR && \ | ||
| 54 | - ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ | ||
| 55 | - (GLSLANG_VERSION_PATCH) < (patch))))) | ||
| 56 | - | ||
| 57 | -#define GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch) \ | ||
| 58 | - ((GLSLANG_VERSION_MAJOR) < (major) || ((major) == GLSLANG_VERSION_MAJOR && \ | ||
| 59 | - ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ | ||
| 60 | - (GLSLANG_VERSION_PATCH <= (patch)))))) | ||
| 61 | - | ||
| 62 | -#endif // GLSLANG_BUILD_INFO |
livekit-android-sdk/src/main/jni/ncnn-20250503-android-vulkan/arm64-v8a/include/ncnn/allocator.h
已删除
100644 → 0
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#ifndef NCNN_ALLOCATOR_H | ||
| 16 | -#define NCNN_ALLOCATOR_H | ||
| 17 | - | ||
| 18 | -#ifdef _WIN32 | ||
| 19 | -#define WIN32_LEAN_AND_MEAN | ||
| 20 | -#include <windows.h> | ||
| 21 | -#endif | ||
| 22 | - | ||
| 23 | -#include "platform.h" | ||
| 24 | - | ||
| 25 | -#include <stdlib.h> | ||
| 26 | - | ||
| 27 | -#if NCNN_PLATFORM_API | ||
| 28 | -#if __ANDROID_API__ >= 26 | ||
| 29 | -#include <android/hardware_buffer.h> | ||
| 30 | -#endif // __ANDROID_API__ >= 26 | ||
| 31 | -#endif // NCNN_PLATFORM_API | ||
| 32 | - | ||
| 33 | -namespace ncnn { | ||
| 34 | - | ||
| 35 | -// the alignment of all the allocated buffers | ||
| 36 | -#if NCNN_AVX512 | ||
| 37 | -#define NCNN_MALLOC_ALIGN 64 | ||
| 38 | -#elif NCNN_AVX | ||
| 39 | -#define NCNN_MALLOC_ALIGN 32 | ||
| 40 | -#else | ||
| 41 | -#define NCNN_MALLOC_ALIGN 16 | ||
| 42 | -#endif | ||
| 43 | - | ||
| 44 | -// we have some optimized kernels that may overread buffer a bit in loop | ||
| 45 | -// it is common to interleave next-loop data load with arithmetic instructions | ||
| 46 | -// allocating more bytes keeps us safe from SEGV_ACCERR failure | ||
| 47 | -#define NCNN_MALLOC_OVERREAD 64 | ||
| 48 | - | ||
| 49 | -// Aligns a pointer to the specified number of bytes | ||
| 50 | -// ptr Aligned pointer | ||
| 51 | -// n Alignment size that must be a power of two | ||
| 52 | -template<typename _Tp> | ||
| 53 | -static NCNN_FORCEINLINE _Tp* alignPtr(_Tp* ptr, int n = (int)sizeof(_Tp)) | ||
| 54 | -{ | ||
| 55 | - return (_Tp*)(((size_t)ptr + n - 1) & -n); | ||
| 56 | -} | ||
| 57 | - | ||
| 58 | -// Aligns a buffer size to the specified number of bytes | ||
| 59 | -// The function returns the minimum number that is greater or equal to sz and is divisible by n | ||
| 60 | -// sz Buffer size to align | ||
| 61 | -// n Alignment size that must be a power of two | ||
| 62 | -static NCNN_FORCEINLINE size_t alignSize(size_t sz, int n) | ||
| 63 | -{ | ||
| 64 | - return (sz + n - 1) & -n; | ||
| 65 | -} | ||
| 66 | - | ||
| 67 | -static NCNN_FORCEINLINE void* fastMalloc(size_t size) | ||
| 68 | -{ | ||
| 69 | -#if _MSC_VER | ||
| 70 | - return _aligned_malloc(size, NCNN_MALLOC_ALIGN); | ||
| 71 | -#elif (defined(__unix__) || defined(__APPLE__)) && _POSIX_C_SOURCE >= 200112L || (__ANDROID__ && __ANDROID_API__ >= 17) | ||
| 72 | - void* ptr = 0; | ||
| 73 | - if (posix_memalign(&ptr, NCNN_MALLOC_ALIGN, size + NCNN_MALLOC_OVERREAD)) | ||
| 74 | - ptr = 0; | ||
| 75 | - return ptr; | ||
| 76 | -#elif __ANDROID__ && __ANDROID_API__ < 17 | ||
| 77 | - return memalign(NCNN_MALLOC_ALIGN, size + NCNN_MALLOC_OVERREAD); | ||
| 78 | -#else | ||
| 79 | - unsigned char* udata = (unsigned char*)malloc(size + sizeof(void*) + NCNN_MALLOC_ALIGN + NCNN_MALLOC_OVERREAD); | ||
| 80 | - if (!udata) | ||
| 81 | - return 0; | ||
| 82 | - unsigned char** adata = alignPtr((unsigned char**)udata + 1, NCNN_MALLOC_ALIGN); | ||
| 83 | - adata[-1] = udata; | ||
| 84 | - return adata; | ||
| 85 | -#endif | ||
| 86 | -} | ||
| 87 | - | ||
| 88 | -static NCNN_FORCEINLINE void fastFree(void* ptr) | ||
| 89 | -{ | ||
| 90 | - if (ptr) | ||
| 91 | - { | ||
| 92 | -#if _MSC_VER | ||
| 93 | - _aligned_free(ptr); | ||
| 94 | -#elif (defined(__unix__) || defined(__APPLE__)) && _POSIX_C_SOURCE >= 200112L || (__ANDROID__ && __ANDROID_API__ >= 17) | ||
| 95 | - free(ptr); | ||
| 96 | -#elif __ANDROID__ && __ANDROID_API__ < 17 | ||
| 97 | - free(ptr); | ||
| 98 | -#else | ||
| 99 | - unsigned char* udata = ((unsigned char**)ptr)[-1]; | ||
| 100 | - free(udata); | ||
| 101 | -#endif | ||
| 102 | - } | ||
| 103 | -} | ||
| 104 | - | ||
| 105 | -#if NCNN_THREADS | ||
| 106 | -// exchange-add operation for atomic operations on reference counters | ||
| 107 | -#if defined __riscv && !defined __riscv_atomic | ||
| 108 | -// riscv target without A extension | ||
| 109 | -static NCNN_FORCEINLINE int NCNN_XADD(int* addr, int delta) | ||
| 110 | -{ | ||
| 111 | - int tmp = *addr; | ||
| 112 | - *addr += delta; | ||
| 113 | - return tmp; | ||
| 114 | -} | ||
| 115 | -#elif defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32) | ||
| 116 | -// atomic increment on the linux version of the Intel(tm) compiler | ||
| 117 | -#define NCNN_XADD(addr, delta) (int)_InterlockedExchangeAdd(const_cast<void*>(reinterpret_cast<volatile void*>(addr)), delta) | ||
| 118 | -#elif defined __GNUC__ | ||
| 119 | -#if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__) | ||
| 120 | -#ifdef __ATOMIC_ACQ_REL | ||
| 121 | -#define NCNN_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), delta, __ATOMIC_ACQ_REL) | ||
| 122 | -#else | ||
| 123 | -#define NCNN_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), delta, 4) | ||
| 124 | -#endif | ||
| 125 | -#else | ||
| 126 | -#if defined __ATOMIC_ACQ_REL && !defined __clang__ | ||
| 127 | -// version for gcc >= 4.7 | ||
| 128 | -#define NCNN_XADD(addr, delta) (int)__atomic_fetch_add((unsigned*)(addr), (unsigned)(delta), __ATOMIC_ACQ_REL) | ||
| 129 | -#else | ||
| 130 | -#define NCNN_XADD(addr, delta) (int)__sync_fetch_and_add((unsigned*)(addr), (unsigned)(delta)) | ||
| 131 | -#endif | ||
| 132 | -#endif | ||
| 133 | -#elif defined _MSC_VER && !defined RC_INVOKED | ||
| 134 | -#define NCNN_XADD(addr, delta) (int)_InterlockedExchangeAdd((long volatile*)addr, delta) | ||
| 135 | -#else | ||
| 136 | -// thread-unsafe branch | ||
| 137 | -static NCNN_FORCEINLINE int NCNN_XADD(int* addr, int delta) | ||
| 138 | -{ | ||
| 139 | - int tmp = *addr; | ||
| 140 | - *addr += delta; | ||
| 141 | - return tmp; | ||
| 142 | -} | ||
| 143 | -#endif | ||
| 144 | -#else // NCNN_THREADS | ||
| 145 | -static NCNN_FORCEINLINE int NCNN_XADD(int* addr, int delta) | ||
| 146 | -{ | ||
| 147 | - int tmp = *addr; | ||
| 148 | - *addr += delta; | ||
| 149 | - return tmp; | ||
| 150 | -} | ||
| 151 | -#endif // NCNN_THREADS | ||
| 152 | - | ||
| 153 | -class NCNN_EXPORT Allocator | ||
| 154 | -{ | ||
| 155 | -public: | ||
| 156 | - virtual ~Allocator(); | ||
| 157 | - virtual void* fastMalloc(size_t size) = 0; | ||
| 158 | - virtual void fastFree(void* ptr) = 0; | ||
| 159 | -}; | ||
| 160 | - | ||
| 161 | -class PoolAllocatorPrivate; | ||
| 162 | -class NCNN_EXPORT PoolAllocator : public Allocator | ||
| 163 | -{ | ||
| 164 | -public: | ||
| 165 | - PoolAllocator(); | ||
| 166 | - ~PoolAllocator(); | ||
| 167 | - | ||
| 168 | - // ratio range 0 ~ 1 | ||
| 169 | - // default cr = 0 | ||
| 170 | - void set_size_compare_ratio(float scr); | ||
| 171 | - | ||
| 172 | - // budget drop threshold | ||
| 173 | - // default threshold = 10 | ||
| 174 | - void set_size_drop_threshold(size_t); | ||
| 175 | - | ||
| 176 | - // release all budgets immediately | ||
| 177 | - void clear(); | ||
| 178 | - | ||
| 179 | - virtual void* fastMalloc(size_t size); | ||
| 180 | - virtual void fastFree(void* ptr); | ||
| 181 | - | ||
| 182 | -private: | ||
| 183 | - PoolAllocator(const PoolAllocator&); | ||
| 184 | - PoolAllocator& operator=(const PoolAllocator&); | ||
| 185 | - | ||
| 186 | -private: | ||
| 187 | - PoolAllocatorPrivate* const d; | ||
| 188 | -}; | ||
| 189 | - | ||
| 190 | -class UnlockedPoolAllocatorPrivate; | ||
| 191 | -class NCNN_EXPORT UnlockedPoolAllocator : public Allocator | ||
| 192 | -{ | ||
| 193 | -public: | ||
| 194 | - UnlockedPoolAllocator(); | ||
| 195 | - ~UnlockedPoolAllocator(); | ||
| 196 | - | ||
| 197 | - // ratio range 0 ~ 1 | ||
| 198 | - // default cr = 0 | ||
| 199 | - void set_size_compare_ratio(float scr); | ||
| 200 | - | ||
| 201 | - // budget drop threshold | ||
| 202 | - // default threshold = 10 | ||
| 203 | - void set_size_drop_threshold(size_t); | ||
| 204 | - | ||
| 205 | - // release all budgets immediately | ||
| 206 | - void clear(); | ||
| 207 | - | ||
| 208 | - virtual void* fastMalloc(size_t size); | ||
| 209 | - virtual void fastFree(void* ptr); | ||
| 210 | - | ||
| 211 | -private: | ||
| 212 | - UnlockedPoolAllocator(const UnlockedPoolAllocator&); | ||
| 213 | - UnlockedPoolAllocator& operator=(const UnlockedPoolAllocator&); | ||
| 214 | - | ||
| 215 | -private: | ||
| 216 | - UnlockedPoolAllocatorPrivate* const d; | ||
| 217 | -}; | ||
| 218 | - | ||
| 219 | -#if NCNN_VULKAN | ||
| 220 | - | ||
| 221 | -class VulkanDevice; | ||
| 222 | - | ||
| 223 | -class NCNN_EXPORT VkBufferMemory | ||
| 224 | -{ | ||
| 225 | -public: | ||
| 226 | - VkBuffer buffer; | ||
| 227 | - | ||
| 228 | - // the base offset assigned by allocator | ||
| 229 | - size_t offset; | ||
| 230 | - size_t capacity; | ||
| 231 | - | ||
| 232 | - VkDeviceMemory memory; | ||
| 233 | - void* mapped_ptr; | ||
| 234 | - | ||
| 235 | - // buffer state, modified by command functions internally | ||
| 236 | - mutable VkAccessFlags access_flags; | ||
| 237 | - mutable VkPipelineStageFlags stage_flags; | ||
| 238 | - | ||
| 239 | - // initialize and modified by mat | ||
| 240 | - int refcount; | ||
| 241 | -}; | ||
| 242 | - | ||
| 243 | -class NCNN_EXPORT VkImageMemory | ||
| 244 | -{ | ||
| 245 | -public: | ||
| 246 | - VkImage image; | ||
| 247 | - VkImageView imageview; | ||
| 248 | - | ||
| 249 | - // underlying info assigned by allocator | ||
| 250 | - int width; | ||
| 251 | - int height; | ||
| 252 | - int depth; | ||
| 253 | - VkFormat format; | ||
| 254 | - | ||
| 255 | - VkDeviceMemory memory; | ||
| 256 | - void* mapped_ptr; | ||
| 257 | - | ||
| 258 | - // the base offset assigned by allocator | ||
| 259 | - size_t bind_offset; | ||
| 260 | - size_t bind_capacity; | ||
| 261 | - | ||
| 262 | - // image state, modified by command functions internally | ||
| 263 | - mutable VkAccessFlags access_flags; | ||
| 264 | - mutable VkImageLayout image_layout; | ||
| 265 | - mutable VkPipelineStageFlags stage_flags; | ||
| 266 | - | ||
| 267 | - // in-execution state, modified by command functions internally | ||
| 268 | - mutable int command_refcount; | ||
| 269 | - | ||
| 270 | - // initialize and modified by mat | ||
| 271 | - int refcount; | ||
| 272 | -}; | ||
| 273 | - | ||
| 274 | -class NCNN_EXPORT VkAllocator | ||
| 275 | -{ | ||
| 276 | -public: | ||
| 277 | - explicit VkAllocator(const VulkanDevice* _vkdev); | ||
| 278 | - virtual ~VkAllocator(); | ||
| 279 | - | ||
| 280 | - virtual void clear(); | ||
| 281 | - | ||
| 282 | - virtual VkBufferMemory* fastMalloc(size_t size) = 0; | ||
| 283 | - virtual void fastFree(VkBufferMemory* ptr) = 0; | ||
| 284 | - virtual int flush(VkBufferMemory* ptr); | ||
| 285 | - virtual int invalidate(VkBufferMemory* ptr); | ||
| 286 | - | ||
| 287 | - virtual VkImageMemory* fastMalloc(int w, int h, int c, size_t elemsize, int elempack) = 0; | ||
| 288 | - virtual void fastFree(VkImageMemory* ptr) = 0; | ||
| 289 | - | ||
| 290 | -public: | ||
| 291 | - const VulkanDevice* vkdev; | ||
| 292 | - uint32_t buffer_memory_type_index; | ||
| 293 | - uint32_t image_memory_type_index; | ||
| 294 | - uint32_t reserved_type_index; | ||
| 295 | - bool mappable; | ||
| 296 | - bool coherent; | ||
| 297 | - | ||
| 298 | -protected: | ||
| 299 | - VkBuffer create_buffer(size_t size, VkBufferUsageFlags usage); | ||
| 300 | - VkDeviceMemory allocate_memory(size_t size, uint32_t memory_type_index); | ||
| 301 | - VkDeviceMemory allocate_dedicated_memory(size_t size, uint32_t memory_type_index, VkImage image, VkBuffer buffer); | ||
| 302 | - | ||
| 303 | - VkImage create_image(int width, int height, int depth, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage); | ||
| 304 | - VkImageView create_imageview(VkImage image, VkFormat format); | ||
| 305 | -}; | ||
| 306 | - | ||
| 307 | -class VkBlobAllocatorPrivate; | ||
| 308 | -class NCNN_EXPORT VkBlobAllocator : public VkAllocator | ||
| 309 | -{ | ||
| 310 | -public: | ||
| 311 | - explicit VkBlobAllocator(const VulkanDevice* vkdev, size_t preferred_block_size = 16 * 1024 * 1024); // 16M | ||
| 312 | - virtual ~VkBlobAllocator(); | ||
| 313 | - | ||
| 314 | -public: | ||
| 315 | - // release all budgets immediately | ||
| 316 | - virtual void clear(); | ||
| 317 | - | ||
| 318 | - virtual VkBufferMemory* fastMalloc(size_t size); | ||
| 319 | - virtual void fastFree(VkBufferMemory* ptr); | ||
| 320 | - virtual VkImageMemory* fastMalloc(int w, int h, int c, size_t elemsize, int elempack); | ||
| 321 | - virtual void fastFree(VkImageMemory* ptr); | ||
| 322 | - | ||
| 323 | -private: | ||
| 324 | - VkBlobAllocator(const VkBlobAllocator&); | ||
| 325 | - VkBlobAllocator& operator=(const VkBlobAllocator&); | ||
| 326 | - | ||
| 327 | -private: | ||
| 328 | - VkBlobAllocatorPrivate* const d; | ||
| 329 | -}; | ||
| 330 | - | ||
| 331 | -class VkWeightAllocatorPrivate; | ||
| 332 | -class NCNN_EXPORT VkWeightAllocator : public VkAllocator | ||
| 333 | -{ | ||
| 334 | -public: | ||
| 335 | - explicit VkWeightAllocator(const VulkanDevice* vkdev, size_t preferred_block_size = 8 * 1024 * 1024); // 8M | ||
| 336 | - virtual ~VkWeightAllocator(); | ||
| 337 | - | ||
| 338 | -public: | ||
| 339 | - // release all blocks immediately | ||
| 340 | - virtual void clear(); | ||
| 341 | - | ||
| 342 | -public: | ||
| 343 | - virtual VkBufferMemory* fastMalloc(size_t size); | ||
| 344 | - virtual void fastFree(VkBufferMemory* ptr); | ||
| 345 | - virtual VkImageMemory* fastMalloc(int w, int h, int c, size_t elemsize, int elempack); | ||
| 346 | - virtual void fastFree(VkImageMemory* ptr); | ||
| 347 | - | ||
| 348 | -private: | ||
| 349 | - VkWeightAllocator(const VkWeightAllocator&); | ||
| 350 | - VkWeightAllocator& operator=(const VkWeightAllocator&); | ||
| 351 | - | ||
| 352 | -private: | ||
| 353 | - VkWeightAllocatorPrivate* const d; | ||
| 354 | -}; | ||
| 355 | - | ||
| 356 | -class VkStagingAllocatorPrivate; | ||
| 357 | -class NCNN_EXPORT VkStagingAllocator : public VkAllocator | ||
| 358 | -{ | ||
| 359 | -public: | ||
| 360 | - explicit VkStagingAllocator(const VulkanDevice* vkdev); | ||
| 361 | - virtual ~VkStagingAllocator(); | ||
| 362 | - | ||
| 363 | -public: | ||
| 364 | - // ratio range 0 ~ 1 | ||
| 365 | - // default cr = 0.75 | ||
| 366 | - void set_size_compare_ratio(float scr); | ||
| 367 | - | ||
| 368 | - // release all budgets immediately | ||
| 369 | - virtual void clear(); | ||
| 370 | - | ||
| 371 | - virtual VkBufferMemory* fastMalloc(size_t size); | ||
| 372 | - virtual void fastFree(VkBufferMemory* ptr); | ||
| 373 | - virtual VkImageMemory* fastMalloc(int w, int h, int c, size_t elemsize, int elempack); | ||
| 374 | - virtual void fastFree(VkImageMemory* ptr); | ||
| 375 | - | ||
| 376 | -private: | ||
| 377 | - VkStagingAllocator(const VkStagingAllocator&); | ||
| 378 | - VkStagingAllocator& operator=(const VkStagingAllocator&); | ||
| 379 | - | ||
| 380 | -private: | ||
| 381 | - VkStagingAllocatorPrivate* const d; | ||
| 382 | -}; | ||
| 383 | - | ||
| 384 | -class VkWeightStagingAllocatorPrivate; | ||
| 385 | -class NCNN_EXPORT VkWeightStagingAllocator : public VkAllocator | ||
| 386 | -{ | ||
| 387 | -public: | ||
| 388 | - explicit VkWeightStagingAllocator(const VulkanDevice* vkdev); | ||
| 389 | - virtual ~VkWeightStagingAllocator(); | ||
| 390 | - | ||
| 391 | -public: | ||
| 392 | - virtual VkBufferMemory* fastMalloc(size_t size); | ||
| 393 | - virtual void fastFree(VkBufferMemory* ptr); | ||
| 394 | - virtual VkImageMemory* fastMalloc(int w, int h, int c, size_t elemsize, int elempack); | ||
| 395 | - virtual void fastFree(VkImageMemory* ptr); | ||
| 396 | - | ||
| 397 | -private: | ||
| 398 | - VkWeightStagingAllocator(const VkWeightStagingAllocator&); | ||
| 399 | - VkWeightStagingAllocator& operator=(const VkWeightStagingAllocator&); | ||
| 400 | - | ||
| 401 | -private: | ||
| 402 | - VkWeightStagingAllocatorPrivate* const d; | ||
| 403 | -}; | ||
| 404 | - | ||
| 405 | -#if NCNN_PLATFORM_API | ||
| 406 | -#if __ANDROID_API__ >= 26 | ||
| 407 | -class NCNN_EXPORT VkAndroidHardwareBufferImageAllocator : public VkAllocator | ||
| 408 | -{ | ||
| 409 | -public: | ||
| 410 | - VkAndroidHardwareBufferImageAllocator(const VulkanDevice* _vkdev, AHardwareBuffer* _hb); | ||
| 411 | - virtual ~VkAndroidHardwareBufferImageAllocator(); | ||
| 412 | - | ||
| 413 | -public: | ||
| 414 | - virtual VkBufferMemory* fastMalloc(size_t size); | ||
| 415 | - virtual void fastFree(VkBufferMemory* ptr); | ||
| 416 | - virtual VkImageMemory* fastMalloc(int w, int h, int c, size_t elemsize, int elempack); | ||
| 417 | - virtual void fastFree(VkImageMemory* ptr); | ||
| 418 | - | ||
| 419 | -private: | ||
| 420 | - VkAndroidHardwareBufferImageAllocator(const VkAndroidHardwareBufferImageAllocator&); | ||
| 421 | - VkAndroidHardwareBufferImageAllocator& operator=(const VkAndroidHardwareBufferImageAllocator&); | ||
| 422 | - | ||
| 423 | -public: | ||
| 424 | - int init(); | ||
| 425 | - | ||
| 426 | - int width() const; | ||
| 427 | - int height() const; | ||
| 428 | - uint64_t external_format() const; | ||
| 429 | - | ||
| 430 | -public: | ||
| 431 | - AHardwareBuffer* hb; | ||
| 432 | - AHardwareBuffer_Desc bufferDesc; | ||
| 433 | - VkAndroidHardwareBufferFormatPropertiesANDROID bufferFormatProperties; | ||
| 434 | - VkAndroidHardwareBufferPropertiesANDROID bufferProperties; | ||
| 435 | - VkSamplerYcbcrConversionKHR samplerYcbcrConversion; | ||
| 436 | -}; | ||
| 437 | -#endif // __ANDROID_API__ >= 26 | ||
| 438 | -#endif // NCNN_PLATFORM_API | ||
| 439 | - | ||
| 440 | -#endif // NCNN_VULKAN | ||
| 441 | - | ||
| 442 | -} // namespace ncnn | ||
| 443 | - | ||
| 444 | -#endif // NCNN_ALLOCATOR_H |
livekit-android-sdk/src/main/jni/ncnn-20250503-android-vulkan/arm64-v8a/include/ncnn/benchmark.h
已删除
100644 → 0
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#ifndef NCNN_BENCHMARK_H | ||
| 16 | -#define NCNN_BENCHMARK_H | ||
| 17 | - | ||
| 18 | -#include "layer.h" | ||
| 19 | -#include "mat.h" | ||
| 20 | -#include "platform.h" | ||
| 21 | - | ||
| 22 | -namespace ncnn { | ||
| 23 | - | ||
| 24 | -// get now timestamp in ms | ||
| 25 | -NCNN_EXPORT double get_current_time(); | ||
| 26 | - | ||
| 27 | -// sleep milliseconds | ||
| 28 | -NCNN_EXPORT void sleep(unsigned long long int milliseconds = 1000); | ||
| 29 | - | ||
| 30 | -#if NCNN_BENCHMARK | ||
| 31 | - | ||
| 32 | -NCNN_EXPORT void benchmark(const Layer* layer, double start, double end); | ||
| 33 | -NCNN_EXPORT void benchmark(const Layer* layer, const Mat& bottom_blob, Mat& top_blob, double start, double end); | ||
| 34 | - | ||
| 35 | -#endif // NCNN_BENCHMARK | ||
| 36 | - | ||
| 37 | -} // namespace ncnn | ||
| 38 | - | ||
| 39 | -#endif // NCNN_BENCHMARK_H |
livekit-android-sdk/src/main/jni/ncnn-20250503-android-vulkan/arm64-v8a/include/ncnn/blob.h
已删除
100644 → 0
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#ifndef NCNN_BLOB_H | ||
| 16 | -#define NCNN_BLOB_H | ||
| 17 | - | ||
| 18 | -#include "mat.h" | ||
| 19 | -#include "platform.h" | ||
| 20 | - | ||
| 21 | -namespace ncnn { | ||
| 22 | - | ||
| 23 | -class NCNN_EXPORT Blob | ||
| 24 | -{ | ||
| 25 | -public: | ||
| 26 | - // empty | ||
| 27 | - Blob(); | ||
| 28 | - | ||
| 29 | -public: | ||
| 30 | -#if NCNN_STRING | ||
| 31 | - // blob name | ||
| 32 | - std::string name; | ||
| 33 | -#endif // NCNN_STRING | ||
| 34 | - // layer index which produce this blob as output | ||
| 35 | - int producer; | ||
| 36 | - // layer index which need this blob as input | ||
| 37 | - int consumer; | ||
| 38 | - // shape hint | ||
| 39 | - Mat shape; | ||
| 40 | -}; | ||
| 41 | - | ||
| 42 | -} // namespace ncnn | ||
| 43 | - | ||
| 44 | -#endif // NCNN_BLOB_H |
livekit-android-sdk/src/main/jni/ncnn-20250503-android-vulkan/arm64-v8a/include/ncnn/c_api.h
已删除
100644 → 0
| 1 | -/* Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | - * | ||
| 3 | - * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | - * | ||
| 5 | - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | - * in compliance with the License. You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | - * CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | - * specific language governing permissions and limitations under the License. | ||
| 14 | - */ | ||
| 15 | - | ||
| 16 | -#ifndef NCNN_C_API_H | ||
| 17 | -#define NCNN_C_API_H | ||
| 18 | - | ||
| 19 | -#include "platform.h" | ||
| 20 | - | ||
| 21 | -#if NCNN_C_API | ||
| 22 | - | ||
| 23 | -#include <stddef.h> | ||
| 24 | - | ||
| 25 | -#ifdef __cplusplus | ||
| 26 | -extern "C" { | ||
| 27 | -#endif | ||
| 28 | - | ||
| 29 | -NCNN_EXPORT const char* ncnn_version(void); | ||
| 30 | - | ||
| 31 | -/* allocator api */ | ||
| 32 | -typedef struct __ncnn_allocator_t* ncnn_allocator_t; | ||
| 33 | -struct NCNN_EXPORT __ncnn_allocator_t | ||
| 34 | -{ | ||
| 35 | - void* pthis; | ||
| 36 | - | ||
| 37 | - void* (*fast_malloc)(ncnn_allocator_t allocator, size_t size); | ||
| 38 | - void (*fast_free)(ncnn_allocator_t allocator, void* ptr); | ||
| 39 | -}; | ||
| 40 | - | ||
| 41 | -NCNN_EXPORT ncnn_allocator_t ncnn_allocator_create_pool_allocator(void); | ||
| 42 | -NCNN_EXPORT ncnn_allocator_t ncnn_allocator_create_unlocked_pool_allocator(void); | ||
| 43 | -NCNN_EXPORT void ncnn_allocator_destroy(ncnn_allocator_t allocator); | ||
| 44 | - | ||
| 45 | -/* option api */ | ||
| 46 | -typedef struct __ncnn_option_t* ncnn_option_t; | ||
| 47 | - | ||
| 48 | -NCNN_EXPORT ncnn_option_t ncnn_option_create(void); | ||
| 49 | -NCNN_EXPORT void ncnn_option_destroy(ncnn_option_t opt); | ||
| 50 | - | ||
| 51 | -NCNN_EXPORT int ncnn_option_get_num_threads(const ncnn_option_t opt); | ||
| 52 | -NCNN_EXPORT void ncnn_option_set_num_threads(ncnn_option_t opt, int num_threads); | ||
| 53 | - | ||
| 54 | -NCNN_EXPORT int ncnn_option_get_use_local_pool_allocator(const ncnn_option_t opt); | ||
| 55 | -NCNN_EXPORT void ncnn_option_set_use_local_pool_allocator(ncnn_option_t opt, int use_local_pool_allocator); | ||
| 56 | - | ||
| 57 | -NCNN_EXPORT void ncnn_option_set_blob_allocator(ncnn_option_t opt, ncnn_allocator_t allocator); | ||
| 58 | -NCNN_EXPORT void ncnn_option_set_workspace_allocator(ncnn_option_t opt, ncnn_allocator_t allocator); | ||
| 59 | - | ||
| 60 | -NCNN_EXPORT int ncnn_option_get_use_vulkan_compute(const ncnn_option_t opt); | ||
| 61 | -NCNN_EXPORT void ncnn_option_set_use_vulkan_compute(ncnn_option_t opt, int use_vulkan_compute); | ||
| 62 | - | ||
| 63 | -/* mat api */ | ||
| 64 | -typedef struct __ncnn_mat_t* ncnn_mat_t; | ||
| 65 | - | ||
| 66 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create(void); | ||
| 67 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_1d(int w, ncnn_allocator_t allocator); | ||
| 68 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_2d(int w, int h, ncnn_allocator_t allocator); | ||
| 69 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_3d(int w, int h, int c, ncnn_allocator_t allocator); | ||
| 70 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_4d(int w, int h, int d, int c, ncnn_allocator_t allocator); | ||
| 71 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_1d(int w, void* data, ncnn_allocator_t allocator); | ||
| 72 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_2d(int w, int h, void* data, ncnn_allocator_t allocator); | ||
| 73 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_3d(int w, int h, int c, void* data, ncnn_allocator_t allocator); | ||
| 74 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_4d(int w, int h, int d, int c, void* data, ncnn_allocator_t allocator); | ||
| 75 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_1d_elem(int w, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 76 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_2d_elem(int w, int h, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 77 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_3d_elem(int w, int h, int c, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 78 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_4d_elem(int w, int h, int d, int c, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 79 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_1d_elem(int w, void* data, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 80 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_2d_elem(int w, int h, void* data, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 81 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_3d_elem(int w, int h, int c, void* data, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 82 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_create_external_4d_elem(int w, int h, int d, int c, void* data, size_t elemsize, int elempack, ncnn_allocator_t allocator); | ||
| 83 | -NCNN_EXPORT void ncnn_mat_destroy(ncnn_mat_t mat); | ||
| 84 | - | ||
| 85 | -NCNN_EXPORT void ncnn_mat_fill_float(ncnn_mat_t mat, float v); | ||
| 86 | - | ||
| 87 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_clone(const ncnn_mat_t mat, ncnn_allocator_t allocator); | ||
| 88 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_reshape_1d(const ncnn_mat_t mat, int w, ncnn_allocator_t allocator); | ||
| 89 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_reshape_2d(const ncnn_mat_t mat, int w, int h, ncnn_allocator_t allocator); | ||
| 90 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_reshape_3d(const ncnn_mat_t mat, int w, int h, int c, ncnn_allocator_t allocator); | ||
| 91 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_reshape_4d(const ncnn_mat_t mat, int w, int h, int d, int c, ncnn_allocator_t allocator); | ||
| 92 | - | ||
| 93 | -NCNN_EXPORT int ncnn_mat_get_dims(const ncnn_mat_t mat); | ||
| 94 | -NCNN_EXPORT int ncnn_mat_get_w(const ncnn_mat_t mat); | ||
| 95 | -NCNN_EXPORT int ncnn_mat_get_h(const ncnn_mat_t mat); | ||
| 96 | -NCNN_EXPORT int ncnn_mat_get_d(const ncnn_mat_t mat); | ||
| 97 | -NCNN_EXPORT int ncnn_mat_get_c(const ncnn_mat_t mat); | ||
| 98 | -NCNN_EXPORT size_t ncnn_mat_get_elemsize(const ncnn_mat_t mat); | ||
| 99 | -NCNN_EXPORT int ncnn_mat_get_elempack(const ncnn_mat_t mat); | ||
| 100 | -NCNN_EXPORT size_t ncnn_mat_get_cstep(const ncnn_mat_t mat); | ||
| 101 | -NCNN_EXPORT void* ncnn_mat_get_data(const ncnn_mat_t mat); | ||
| 102 | - | ||
| 103 | -NCNN_EXPORT void* ncnn_mat_get_channel_data(const ncnn_mat_t mat, int c); | ||
| 104 | - | ||
| 105 | -#if NCNN_PIXEL | ||
| 106 | - | ||
| 107 | -/* mat pixel api */ | ||
| 108 | -#define NCNN_MAT_PIXEL_RGB 1 | ||
| 109 | -#define NCNN_MAT_PIXEL_BGR 2 | ||
| 110 | -#define NCNN_MAT_PIXEL_GRAY 3 | ||
| 111 | -#define NCNN_MAT_PIXEL_RGBA 4 | ||
| 112 | -#define NCNN_MAT_PIXEL_BGRA 5 | ||
| 113 | -#define NCNN_MAT_PIXEL_X2Y(X, Y) (X | (Y << 16)) | ||
| 114 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_from_pixels(const unsigned char* pixels, int type, int w, int h, int stride, ncnn_allocator_t allocator); | ||
| 115 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_from_pixels_resize(const unsigned char* pixels, int type, int w, int h, int stride, int target_width, int target_height, ncnn_allocator_t allocator); | ||
| 116 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_from_pixels_roi(const unsigned char* pixels, int type, int w, int h, int stride, int roix, int roiy, int roiw, int roih, ncnn_allocator_t allocator); | ||
| 117 | -NCNN_EXPORT ncnn_mat_t ncnn_mat_from_pixels_roi_resize(const unsigned char* pixels, int type, int w, int h, int stride, int roix, int roiy, int roiw, int roih, int target_width, int target_height, ncnn_allocator_t allocator); | ||
| 118 | -NCNN_EXPORT void ncnn_mat_to_pixels(const ncnn_mat_t mat, unsigned char* pixels, int type, int stride); | ||
| 119 | -NCNN_EXPORT void ncnn_mat_to_pixels_resize(const ncnn_mat_t mat, unsigned char* pixels, int type, int target_width, int target_height, int target_stride); | ||
| 120 | - | ||
| 121 | -#endif /* NCNN_PIXEL */ | ||
| 122 | - | ||
| 123 | -NCNN_EXPORT void ncnn_mat_substract_mean_normalize(ncnn_mat_t mat, const float* mean_vals, const float* norm_vals); | ||
| 124 | - | ||
| 125 | -NCNN_EXPORT void ncnn_convert_packing(const ncnn_mat_t src, ncnn_mat_t* dst, int elempack, const ncnn_option_t opt); | ||
| 126 | -NCNN_EXPORT void ncnn_flatten(const ncnn_mat_t src, ncnn_mat_t* dst, const ncnn_option_t opt); | ||
| 127 | - | ||
| 128 | -/* blob api */ | ||
| 129 | -typedef struct __ncnn_blob_t* ncnn_blob_t; | ||
| 130 | - | ||
| 131 | -#if NCNN_STRING | ||
| 132 | -NCNN_EXPORT const char* ncnn_blob_get_name(const ncnn_blob_t blob); | ||
| 133 | -#endif /* NCNN_STRING */ | ||
| 134 | - | ||
| 135 | -NCNN_EXPORT int ncnn_blob_get_producer(const ncnn_blob_t blob); | ||
| 136 | -NCNN_EXPORT int ncnn_blob_get_consumer(const ncnn_blob_t blob); | ||
| 137 | - | ||
| 138 | -NCNN_EXPORT void ncnn_blob_get_shape(const ncnn_blob_t blob, int* dims, int* w, int* h, int* c); | ||
| 139 | - | ||
| 140 | -/* paramdict api */ | ||
| 141 | -typedef struct __ncnn_paramdict_t* ncnn_paramdict_t; | ||
| 142 | - | ||
| 143 | -NCNN_EXPORT ncnn_paramdict_t ncnn_paramdict_create(void); | ||
| 144 | -NCNN_EXPORT void ncnn_paramdict_destroy(ncnn_paramdict_t pd); | ||
| 145 | - | ||
| 146 | -NCNN_EXPORT int ncnn_paramdict_get_type(const ncnn_paramdict_t pd, int id); | ||
| 147 | - | ||
| 148 | -NCNN_EXPORT int ncnn_paramdict_get_int(const ncnn_paramdict_t pd, int id, int def); | ||
| 149 | -NCNN_EXPORT float ncnn_paramdict_get_float(const ncnn_paramdict_t pd, int id, float def); | ||
| 150 | -NCNN_EXPORT ncnn_mat_t ncnn_paramdict_get_array(const ncnn_paramdict_t pd, int id, const ncnn_mat_t def); | ||
| 151 | - | ||
| 152 | -NCNN_EXPORT void ncnn_paramdict_set_int(ncnn_paramdict_t pd, int id, int i); | ||
| 153 | -NCNN_EXPORT void ncnn_paramdict_set_float(ncnn_paramdict_t pd, int id, float f); | ||
| 154 | -NCNN_EXPORT void ncnn_paramdict_set_array(ncnn_paramdict_t pd, int id, const ncnn_mat_t v); | ||
| 155 | - | ||
| 156 | -/* datareader api */ | ||
| 157 | -typedef struct __ncnn_datareader_t* ncnn_datareader_t; | ||
| 158 | -struct NCNN_EXPORT __ncnn_datareader_t | ||
| 159 | -{ | ||
| 160 | - void* pthis; | ||
| 161 | - | ||
| 162 | -#if NCNN_STRING | ||
| 163 | - int (*scan)(ncnn_datareader_t dr, const char* format, void* p); | ||
| 164 | -#endif /* NCNN_STRING */ | ||
| 165 | - size_t (*read)(ncnn_datareader_t dr, void* buf, size_t size); | ||
| 166 | -}; | ||
| 167 | - | ||
| 168 | -NCNN_EXPORT ncnn_datareader_t ncnn_datareader_create(void); | ||
| 169 | -#if NCNN_STDIO | ||
| 170 | -NCNN_EXPORT ncnn_datareader_t ncnn_datareader_create_from_stdio(FILE* fp); | ||
| 171 | -#endif /* NCNN_STDIO */ | ||
| 172 | -NCNN_EXPORT ncnn_datareader_t ncnn_datareader_create_from_memory(const unsigned char** mem); | ||
| 173 | -NCNN_EXPORT void ncnn_datareader_destroy(ncnn_datareader_t dr); | ||
| 174 | - | ||
| 175 | -/* modelbin api */ | ||
| 176 | -typedef struct __ncnn_modelbin_t* ncnn_modelbin_t; | ||
| 177 | -struct NCNN_EXPORT __ncnn_modelbin_t | ||
| 178 | -{ | ||
| 179 | - void* pthis; | ||
| 180 | - | ||
| 181 | - ncnn_mat_t (*load_1d)(const ncnn_modelbin_t mb, int w, int type); | ||
| 182 | - ncnn_mat_t (*load_2d)(const ncnn_modelbin_t mb, int w, int h, int type); | ||
| 183 | - ncnn_mat_t (*load_3d)(const ncnn_modelbin_t mb, int w, int h, int c, int type); | ||
| 184 | -}; | ||
| 185 | - | ||
| 186 | -NCNN_EXPORT ncnn_modelbin_t ncnn_modelbin_create_from_datareader(const ncnn_datareader_t dr); | ||
| 187 | -NCNN_EXPORT ncnn_modelbin_t ncnn_modelbin_create_from_mat_array(const ncnn_mat_t* weights, int n); | ||
| 188 | -NCNN_EXPORT void ncnn_modelbin_destroy(ncnn_modelbin_t mb); | ||
| 189 | - | ||
| 190 | -/* layer api */ | ||
| 191 | -typedef struct __ncnn_layer_t* ncnn_layer_t; | ||
| 192 | -struct NCNN_EXPORT __ncnn_layer_t | ||
| 193 | -{ | ||
| 194 | - void* pthis; | ||
| 195 | - | ||
| 196 | - int (*load_param)(ncnn_layer_t layer, const ncnn_paramdict_t pd); | ||
| 197 | - int (*load_model)(ncnn_layer_t layer, const ncnn_modelbin_t mb); | ||
| 198 | - | ||
| 199 | - int (*create_pipeline)(ncnn_layer_t layer, const ncnn_option_t opt); | ||
| 200 | - int (*destroy_pipeline)(ncnn_layer_t layer, const ncnn_option_t opt); | ||
| 201 | - | ||
| 202 | - int (*forward_1)(const ncnn_layer_t layer, const ncnn_mat_t bottom_blob, ncnn_mat_t* top_blob, const ncnn_option_t opt); | ||
| 203 | - int (*forward_n)(const ncnn_layer_t layer, const ncnn_mat_t* bottom_blobs, int n, ncnn_mat_t* top_blobs, int n2, const ncnn_option_t opt); | ||
| 204 | - | ||
| 205 | - int (*forward_inplace_1)(const ncnn_layer_t layer, ncnn_mat_t bottom_top_blob, const ncnn_option_t opt); | ||
| 206 | - int (*forward_inplace_n)(const ncnn_layer_t layer, ncnn_mat_t* bottom_top_blobs, int n, const ncnn_option_t opt); | ||
| 207 | -}; | ||
| 208 | - | ||
| 209 | -NCNN_EXPORT ncnn_layer_t ncnn_layer_create(void); | ||
| 210 | -NCNN_EXPORT ncnn_layer_t ncnn_layer_create_by_typeindex(int typeindex); | ||
| 211 | -#if NCNN_STRING | ||
| 212 | -NCNN_EXPORT ncnn_layer_t ncnn_layer_create_by_type(const char* type); | ||
| 213 | -NCNN_EXPORT int ncnn_layer_type_to_index(const char* type); | ||
| 214 | -#endif /* NCNN_STRING */ | ||
| 215 | -NCNN_EXPORT void ncnn_layer_destroy(ncnn_layer_t layer); | ||
| 216 | - | ||
| 217 | -#if NCNN_STRING | ||
| 218 | -NCNN_EXPORT const char* ncnn_layer_get_name(const ncnn_layer_t layer); | ||
| 219 | -#endif /* NCNN_STRING */ | ||
| 220 | - | ||
| 221 | -NCNN_EXPORT int ncnn_layer_get_typeindex(const ncnn_layer_t layer); | ||
| 222 | -#if NCNN_STRING | ||
| 223 | -NCNN_EXPORT const char* ncnn_layer_get_type(const ncnn_layer_t layer); | ||
| 224 | -#endif /* NCNN_STRING */ | ||
| 225 | - | ||
| 226 | -NCNN_EXPORT int ncnn_layer_get_one_blob_only(const ncnn_layer_t layer); | ||
| 227 | -NCNN_EXPORT int ncnn_layer_get_support_inplace(const ncnn_layer_t layer); | ||
| 228 | -NCNN_EXPORT int ncnn_layer_get_support_vulkan(const ncnn_layer_t layer); | ||
| 229 | -NCNN_EXPORT int ncnn_layer_get_support_packing(const ncnn_layer_t layer); | ||
| 230 | -NCNN_EXPORT int ncnn_layer_get_support_bf16_storage(const ncnn_layer_t layer); | ||
| 231 | -NCNN_EXPORT int ncnn_layer_get_support_fp16_storage(const ncnn_layer_t layer); | ||
| 232 | -NCNN_EXPORT int ncnn_layer_get_support_image_storage(const ncnn_layer_t layer); | ||
| 233 | - | ||
| 234 | -NCNN_EXPORT void ncnn_layer_set_one_blob_only(ncnn_layer_t layer, int enable); | ||
| 235 | -NCNN_EXPORT void ncnn_layer_set_support_inplace(ncnn_layer_t layer, int enable); | ||
| 236 | -NCNN_EXPORT void ncnn_layer_set_support_vulkan(ncnn_layer_t layer, int enable); | ||
| 237 | -NCNN_EXPORT void ncnn_layer_set_support_packing(ncnn_layer_t layer, int enable); | ||
| 238 | -NCNN_EXPORT void ncnn_layer_set_support_bf16_storage(ncnn_layer_t layer, int enable); | ||
| 239 | -NCNN_EXPORT void ncnn_layer_set_support_fp16_storage(ncnn_layer_t layer, int enable); | ||
| 240 | -NCNN_EXPORT void ncnn_layer_set_support_image_storage(ncnn_layer_t layer, int enable); | ||
| 241 | - | ||
| 242 | -NCNN_EXPORT int ncnn_layer_get_bottom_count(const ncnn_layer_t layer); | ||
| 243 | -NCNN_EXPORT int ncnn_layer_get_bottom(const ncnn_layer_t layer, int i); | ||
| 244 | -NCNN_EXPORT int ncnn_layer_get_top_count(const ncnn_layer_t layer); | ||
| 245 | -NCNN_EXPORT int ncnn_layer_get_top(const ncnn_layer_t layer, int i); | ||
| 246 | - | ||
| 247 | -NCNN_EXPORT void ncnn_blob_get_bottom_shape(const ncnn_layer_t layer, int i, int* dims, int* w, int* h, int* c); | ||
| 248 | -NCNN_EXPORT void ncnn_blob_get_top_shape(const ncnn_layer_t layer, int i, int* dims, int* w, int* h, int* c); | ||
| 249 | - | ||
| 250 | -/* layer factory function */ | ||
| 251 | -typedef ncnn_layer_t (*ncnn_layer_creator_t)(void* userdata); | ||
| 252 | -typedef void (*ncnn_layer_destroyer_t)(ncnn_layer_t layer, void* userdata); | ||
| 253 | - | ||
| 254 | -typedef struct __ncnn_net_custom_layer_factory_t* ncnn_net_custom_layer_factory_t; | ||
| 255 | -struct __ncnn_net_custom_layer_factory_t | ||
| 256 | -{ | ||
| 257 | - ncnn_layer_creator_t creator; | ||
| 258 | - ncnn_layer_destroyer_t destroyer; | ||
| 259 | - void* userdata; | ||
| 260 | - ncnn_net_custom_layer_factory_t next; | ||
| 261 | -}; | ||
| 262 | - | ||
| 263 | -/* net api */ | ||
| 264 | -typedef struct __ncnn_net_t* ncnn_net_t; | ||
| 265 | -struct __ncnn_net_t | ||
| 266 | -{ | ||
| 267 | - void* pthis; | ||
| 268 | - | ||
| 269 | - ncnn_net_custom_layer_factory_t custom_layer_factory; | ||
| 270 | -}; | ||
| 271 | - | ||
| 272 | -NCNN_EXPORT ncnn_net_t ncnn_net_create(void); | ||
| 273 | -NCNN_EXPORT void ncnn_net_destroy(ncnn_net_t net); | ||
| 274 | - | ||
| 275 | -NCNN_EXPORT ncnn_option_t ncnn_net_get_option(ncnn_net_t net); | ||
| 276 | -NCNN_EXPORT void ncnn_net_set_option(ncnn_net_t net, ncnn_option_t opt); | ||
| 277 | - | ||
| 278 | -#if NCNN_VULKAN | ||
| 279 | -NCNN_EXPORT void ncnn_net_set_vulkan_device(ncnn_net_t net, int device_index); | ||
| 280 | -#endif | ||
| 281 | - | ||
| 282 | -#if NCNN_STRING | ||
| 283 | -NCNN_EXPORT void ncnn_net_register_custom_layer_by_type(ncnn_net_t net, const char* type, ncnn_layer_creator_t creator, ncnn_layer_destroyer_t destroyer, void* userdata); | ||
| 284 | -#endif /* NCNN_STRING */ | ||
| 285 | -NCNN_EXPORT void ncnn_net_register_custom_layer_by_typeindex(ncnn_net_t net, int typeindex, ncnn_layer_creator_t creator, ncnn_layer_destroyer_t destroyer, void* userdata); | ||
| 286 | - | ||
| 287 | -#if NCNN_STDIO | ||
| 288 | -#if NCNN_STRING | ||
| 289 | -NCNN_EXPORT int ncnn_net_load_param(ncnn_net_t net, const char* path); | ||
| 290 | -#endif /* NCNN_STRING */ | ||
| 291 | -NCNN_EXPORT int ncnn_net_load_param_bin(ncnn_net_t net, const char* path); | ||
| 292 | -NCNN_EXPORT int ncnn_net_load_model(ncnn_net_t net, const char* path); | ||
| 293 | -#endif /* NCNN_STDIO */ | ||
| 294 | - | ||
| 295 | -#if NCNN_STDIO | ||
| 296 | -#if NCNN_STRING | ||
| 297 | -NCNN_EXPORT int ncnn_net_load_param_memory(ncnn_net_t net, const char* mem); | ||
| 298 | -#endif /* NCNN_STRING */ | ||
| 299 | -#endif /* NCNN_STDIO */ | ||
| 300 | -NCNN_EXPORT int ncnn_net_load_param_bin_memory(ncnn_net_t net, const unsigned char* mem); | ||
| 301 | -NCNN_EXPORT int ncnn_net_load_model_memory(ncnn_net_t net, const unsigned char* mem); | ||
| 302 | - | ||
| 303 | -#if NCNN_STRING | ||
| 304 | -NCNN_EXPORT int ncnn_net_load_param_datareader(ncnn_net_t net, const ncnn_datareader_t dr); | ||
| 305 | -#endif /* NCNN_STRING */ | ||
| 306 | -NCNN_EXPORT int ncnn_net_load_param_bin_datareader(ncnn_net_t net, const ncnn_datareader_t dr); | ||
| 307 | -NCNN_EXPORT int ncnn_net_load_model_datareader(ncnn_net_t net, const ncnn_datareader_t dr); | ||
| 308 | - | ||
| 309 | -NCNN_EXPORT void ncnn_net_clear(ncnn_net_t net); | ||
| 310 | - | ||
| 311 | -NCNN_EXPORT int ncnn_net_get_input_count(const ncnn_net_t net); | ||
| 312 | -NCNN_EXPORT int ncnn_net_get_output_count(const ncnn_net_t net); | ||
| 313 | -#if NCNN_STRING | ||
| 314 | -NCNN_EXPORT const char* ncnn_net_get_input_name(const ncnn_net_t net, int i); | ||
| 315 | -NCNN_EXPORT const char* ncnn_net_get_output_name(const ncnn_net_t net, int i); | ||
| 316 | -#endif /* NCNN_STRING */ | ||
| 317 | -NCNN_EXPORT int ncnn_net_get_input_index(const ncnn_net_t net, int i); | ||
| 318 | -NCNN_EXPORT int ncnn_net_get_output_index(const ncnn_net_t net, int i); | ||
| 319 | - | ||
| 320 | -/* extractor api */ | ||
| 321 | -typedef struct __ncnn_extractor_t* ncnn_extractor_t; | ||
| 322 | - | ||
| 323 | -NCNN_EXPORT ncnn_extractor_t ncnn_extractor_create(ncnn_net_t net); | ||
| 324 | -NCNN_EXPORT void ncnn_extractor_destroy(ncnn_extractor_t ex); | ||
| 325 | - | ||
| 326 | -NCNN_EXPORT void ncnn_extractor_set_option(ncnn_extractor_t ex, const ncnn_option_t opt); | ||
| 327 | - | ||
| 328 | -#if NCNN_STRING | ||
| 329 | -NCNN_EXPORT int ncnn_extractor_input(ncnn_extractor_t ex, const char* name, const ncnn_mat_t mat); | ||
| 330 | -NCNN_EXPORT int ncnn_extractor_extract(ncnn_extractor_t ex, const char* name, ncnn_mat_t* mat); | ||
| 331 | -#endif /* NCNN_STRING */ | ||
| 332 | -NCNN_EXPORT int ncnn_extractor_input_index(ncnn_extractor_t ex, int index, const ncnn_mat_t mat); | ||
| 333 | -NCNN_EXPORT int ncnn_extractor_extract_index(ncnn_extractor_t ex, int index, ncnn_mat_t* mat); | ||
| 334 | - | ||
| 335 | -/* mat process api */ | ||
| 336 | -#define NCNN_BORDER_CONSTANT 0 | ||
| 337 | -#define NCNN_BORDER_REPLICATE 1 | ||
| 338 | -#define NCNN_BORDER_REFLECT 2 | ||
| 339 | -#define NCNN_BORDER_TRANSPARENT -233 | ||
| 340 | -NCNN_EXPORT void ncnn_copy_make_border(const ncnn_mat_t src, ncnn_mat_t dst, int top, int bottom, int left, int right, int type, float v, const ncnn_option_t opt); | ||
| 341 | -NCNN_EXPORT void ncnn_copy_make_border_3d(const ncnn_mat_t src, ncnn_mat_t dst, int top, int bottom, int left, int right, int front, int behind, int type, float v, const ncnn_option_t opt); | ||
| 342 | -NCNN_EXPORT void ncnn_copy_cut_border(const ncnn_mat_t src, ncnn_mat_t dst, int top, int bottom, int left, int right, const ncnn_option_t opt); | ||
| 343 | -NCNN_EXPORT void ncnn_copy_cut_border_3d(const ncnn_mat_t src, ncnn_mat_t dst, int top, int bottom, int left, int right, int front, int behind, const ncnn_option_t opt); | ||
| 344 | - | ||
| 345 | -#if NCNN_PIXEL_DRAWING | ||
| 346 | -/* mat pixel drawing api*/ | ||
| 347 | -NCNN_EXPORT void ncnn_draw_rectangle_c1(unsigned char* pixels, int w, int h, int rx, int ry, int rw, int rh, unsigned int color, int thickness); | ||
| 348 | -NCNN_EXPORT void ncnn_draw_rectangle_c2(unsigned char* pixels, int w, int h, int rx, int ry, int rw, int rh, unsigned int color, int thickness); | ||
| 349 | -NCNN_EXPORT void ncnn_draw_rectangle_c3(unsigned char* pixels, int w, int h, int rx, int ry, int rw, int rh, unsigned int color, int thickness); | ||
| 350 | -NCNN_EXPORT void ncnn_draw_rectangle_c4(unsigned char* pixels, int w, int h, int rx, int ry, int rw, int rh, unsigned int color, int thickness); | ||
| 351 | - | ||
| 352 | -NCNN_EXPORT void ncnn_draw_text_c1(unsigned char* pixels, int w, int h, const char* text, int x, int y, int fontpixelsize, unsigned int color); | ||
| 353 | -NCNN_EXPORT void ncnn_draw_text_c2(unsigned char* pixels, int w, int h, const char* text, int x, int y, int fontpixelsize, unsigned int color); | ||
| 354 | -NCNN_EXPORT void ncnn_draw_text_c3(unsigned char* pixels, int w, int h, const char* text, int x, int y, int fontpixelsize, unsigned int color); | ||
| 355 | -NCNN_EXPORT void ncnn_draw_text_c4(unsigned char* pixels, int w, int h, const char* text, int x, int y, int fontpixelsize, unsigned int color); | ||
| 356 | - | ||
| 357 | -NCNN_EXPORT void ncnn_draw_circle_c1(unsigned char* pixels, int w, int h, int cx, int cy, int radius, unsigned int color, int thickness); | ||
| 358 | -NCNN_EXPORT void ncnn_draw_circle_c2(unsigned char* pixels, int w, int h, int cx, int cy, int radius, unsigned int color, int thickness); | ||
| 359 | -NCNN_EXPORT void ncnn_draw_circle_c3(unsigned char* pixels, int w, int h, int cx, int cy, int radius, unsigned int color, int thickness); | ||
| 360 | -NCNN_EXPORT void ncnn_draw_circle_c4(unsigned char* pixels, int w, int h, int cx, int cy, int radius, unsigned int color, int thickness); | ||
| 361 | - | ||
| 362 | -NCNN_EXPORT void ncnn_draw_line_c1(unsigned char* pixels, int w, int h, int x0, int y0, int x1, int y1, unsigned int color, int thickness); | ||
| 363 | -NCNN_EXPORT void ncnn_draw_line_c2(unsigned char* pixels, int w, int h, int x0, int y0, int x1, int y1, unsigned int color, int thickness); | ||
| 364 | -NCNN_EXPORT void ncnn_draw_line_c3(unsigned char* pixels, int w, int h, int x0, int y0, int x1, int y1, unsigned int color, int thickness); | ||
| 365 | -NCNN_EXPORT void ncnn_draw_line_c4(unsigned char* pixels, int w, int h, int x0, int y0, int x1, int y1, unsigned int color, int thickness); | ||
| 366 | -#endif /* NCNN_PIXEL_DRAWING */ | ||
| 367 | - | ||
| 368 | -#ifdef __cplusplus | ||
| 369 | -} /* extern "C" */ | ||
| 370 | -#endif | ||
| 371 | - | ||
| 372 | -#endif /* NCNN_C_API */ | ||
| 373 | - | ||
| 374 | -#endif /* NCNN_C_API_H */ |
livekit-android-sdk/src/main/jni/ncnn-20250503-android-vulkan/arm64-v8a/include/ncnn/command.h
已删除
100644 → 0
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#ifndef NCNN_COMMAND_H | ||
| 16 | -#define NCNN_COMMAND_H | ||
| 17 | - | ||
| 18 | -#include "platform.h" | ||
| 19 | - | ||
| 20 | -#if NCNN_VULKAN | ||
| 21 | - | ||
| 22 | -#include "mat.h" | ||
| 23 | - | ||
| 24 | -namespace ncnn { | ||
| 25 | - | ||
| 26 | -class Pipeline; | ||
| 27 | -#if NCNN_PLATFORM_API | ||
| 28 | -#if __ANDROID_API__ >= 26 | ||
| 29 | -class ImportAndroidHardwareBufferPipeline; | ||
| 30 | -#endif // __ANDROID_API__ >= 26 | ||
| 31 | -#endif // NCNN_PLATFORM_API | ||
| 32 | -class VkComputePrivate; | ||
| 33 | -class NCNN_EXPORT VkCompute | ||
| 34 | -{ | ||
| 35 | -public: | ||
| 36 | - explicit VkCompute(const VulkanDevice* vkdev); | ||
| 37 | - virtual ~VkCompute(); | ||
| 38 | - | ||
| 39 | -public: | ||
| 40 | - void record_upload(const Mat& src, VkMat& dst, const Option& opt); | ||
| 41 | - | ||
| 42 | - void record_upload(const Mat& src, VkImageMat& dst, const Option& opt); | ||
| 43 | - | ||
| 44 | - void record_download(const VkMat& src, Mat& dst, const Option& opt); | ||
| 45 | - | ||
| 46 | - void record_download(const VkImageMat& src, Mat& dst, const Option& opt); | ||
| 47 | - | ||
| 48 | - void record_buffer_to_image(const VkMat& src, VkImageMat& dst, const Option& opt); | ||
| 49 | - | ||
| 50 | - void record_image_to_buffer(const VkImageMat& src, VkMat& dst, const Option& opt); | ||
| 51 | - | ||
| 52 | - void record_clone(const Mat& src, VkMat& dst, const Option& opt); | ||
| 53 | - | ||
| 54 | - void record_clone(const Mat& src, VkImageMat& dst, const Option& opt); | ||
| 55 | - | ||
| 56 | - void record_clone(const VkMat& src, Mat& dst, const Option& opt); | ||
| 57 | - | ||
| 58 | - void record_clone(const VkImageMat& src, Mat& dst, const Option& opt); | ||
| 59 | - | ||
| 60 | - void record_clone(const VkMat& src, VkMat& dst, const Option& opt); | ||
| 61 | - | ||
| 62 | - void record_clone(const VkImageMat& src, VkImageMat& dst, const Option& opt); | ||
| 63 | - | ||
| 64 | - void record_clone(const VkMat& src, VkImageMat& dst, const Option& opt); | ||
| 65 | - | ||
| 66 | - void record_clone(const VkImageMat& src, VkMat& dst, const Option& opt); | ||
| 67 | - | ||
| 68 | - void record_pipeline(const Pipeline* pipeline, const std::vector<VkMat>& bindings, const std::vector<vk_constant_type>& constants, const VkMat& dispatcher); | ||
| 69 | - | ||
| 70 | - void record_pipeline(const Pipeline* pipeline, const std::vector<VkImageMat>& bindings, const std::vector<vk_constant_type>& constants, const VkImageMat& dispatcher); | ||
| 71 | - | ||
| 72 | - void record_pipeline(const Pipeline* pipeline, const std::vector<VkMat>& buffer_bindings, const std::vector<VkImageMat>& image_bindings, const std::vector<vk_constant_type>& constants, const VkMat& dispatcher); | ||
| 73 | - void record_pipeline(const Pipeline* pipeline, const std::vector<VkMat>& buffer_bindings, const std::vector<VkImageMat>& image_bindings, const std::vector<vk_constant_type>& constants, const VkImageMat& dispatcher); | ||
| 74 | - void record_pipeline(const Pipeline* pipeline, const std::vector<VkMat>& buffer_bindings, const std::vector<VkImageMat>& image_bindings, const std::vector<vk_constant_type>& constants, const Mat& dispatcher); | ||
| 75 | - | ||
| 76 | -#if NCNN_BENCHMARK | ||
| 77 | - void record_write_timestamp(uint32_t query); | ||
| 78 | -#endif // NCNN_BENCHMARK | ||
| 79 | - | ||
| 80 | -#if NCNN_PLATFORM_API | ||
| 81 | -#if __ANDROID_API__ >= 26 | ||
| 82 | - void record_import_android_hardware_buffer(const ImportAndroidHardwareBufferPipeline* pipeline, const VkImageMat& src, const VkMat& dst); | ||
| 83 | - | ||
| 84 | - void record_import_android_hardware_buffer(const ImportAndroidHardwareBufferPipeline* pipeline, const VkImageMat& src, const VkImageMat& dst); | ||
| 85 | -#endif // __ANDROID_API__ >= 26 | ||
| 86 | -#endif // NCNN_PLATFORM_API | ||
| 87 | - | ||
| 88 | - int submit_and_wait(); | ||
| 89 | - | ||
| 90 | - int reset(); | ||
| 91 | - | ||
| 92 | -#if NCNN_BENCHMARK | ||
| 93 | - int create_query_pool(uint32_t query_count); | ||
| 94 | - | ||
| 95 | - int get_query_pool_results(uint32_t first_query, uint32_t query_count, std::vector<uint64_t>& results); | ||
| 96 | -#endif // NCNN_BENCHMARK | ||
| 97 | - | ||
| 98 | -protected: | ||
| 99 | - const VulkanDevice* vkdev; | ||
| 100 | - | ||
| 101 | - void barrier_readwrite(const VkMat& binding); | ||
| 102 | - void barrier_readwrite(const VkImageMat& binding); | ||
| 103 | - void barrier_readonly(const VkImageMat& binding); | ||
| 104 | - | ||
| 105 | -private: | ||
| 106 | - VkComputePrivate* const d; | ||
| 107 | -}; | ||
| 108 | - | ||
| 109 | -class VkTransferPrivate; | ||
| 110 | -class NCNN_EXPORT VkTransfer | ||
| 111 | -{ | ||
| 112 | -public: | ||
| 113 | - explicit VkTransfer(const VulkanDevice* vkdev); | ||
| 114 | - virtual ~VkTransfer(); | ||
| 115 | - | ||
| 116 | -public: | ||
| 117 | - void record_upload(const Mat& src, VkMat& dst, const Option& opt, bool flatten = true); | ||
| 118 | - | ||
| 119 | - void record_upload(const Mat& src, VkImageMat& dst, const Option& opt); | ||
| 120 | - | ||
| 121 | - int submit_and_wait(); | ||
| 122 | - | ||
| 123 | -protected: | ||
| 124 | - const VulkanDevice* vkdev; | ||
| 125 | - | ||
| 126 | -private: | ||
| 127 | - VkTransferPrivate* const d; | ||
| 128 | -}; | ||
| 129 | - | ||
| 130 | -} // namespace ncnn | ||
| 131 | - | ||
| 132 | -#endif // NCNN_VULKAN | ||
| 133 | - | ||
| 134 | -#endif // NCNN_COMMAND_H |
livekit-android-sdk/src/main/jni/ncnn-20250503-android-vulkan/arm64-v8a/include/ncnn/cpu.h
已删除
100644 → 0
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#ifndef NCNN_CPU_H | ||
| 16 | -#define NCNN_CPU_H | ||
| 17 | - | ||
| 18 | -#include <stddef.h> | ||
| 19 | - | ||
| 20 | -#if defined _WIN32 | ||
| 21 | -#define WIN32_LEAN_AND_MEAN | ||
| 22 | -#include <windows.h> | ||
| 23 | -#endif | ||
| 24 | -#if defined __ANDROID__ || defined __linux__ | ||
| 25 | -#include <sched.h> // cpu_set_t | ||
| 26 | -#endif | ||
| 27 | - | ||
| 28 | -#include "platform.h" | ||
| 29 | - | ||
| 30 | -namespace ncnn { | ||
| 31 | - | ||
| 32 | -class NCNN_EXPORT CpuSet | ||
| 33 | -{ | ||
| 34 | -public: | ||
| 35 | - CpuSet(); | ||
| 36 | - void enable(int cpu); | ||
| 37 | - void disable(int cpu); | ||
| 38 | - void disable_all(); | ||
| 39 | - bool is_enabled(int cpu) const; | ||
| 40 | - int num_enabled() const; | ||
| 41 | - | ||
| 42 | -public: | ||
| 43 | -#if defined _WIN32 | ||
| 44 | - ULONG_PTR mask; | ||
| 45 | -#endif | ||
| 46 | -#if defined __ANDROID__ || defined __linux__ | ||
| 47 | - cpu_set_t cpu_set; | ||
| 48 | -#endif | ||
| 49 | -#if __APPLE__ | ||
| 50 | - unsigned int policy; | ||
| 51 | -#endif | ||
| 52 | -}; | ||
| 53 | - | ||
| 54 | -// test optional cpu features | ||
| 55 | -// edsp = armv7 edsp | ||
| 56 | -NCNN_EXPORT int cpu_support_arm_edsp(); | ||
| 57 | -// neon = armv7 neon or aarch64 asimd | ||
| 58 | -NCNN_EXPORT int cpu_support_arm_neon(); | ||
| 59 | -// vfpv4 = armv7 fp16 + fma | ||
| 60 | -NCNN_EXPORT int cpu_support_arm_vfpv4(); | ||
| 61 | -// asimdhp = aarch64 asimd half precision | ||
| 62 | -NCNN_EXPORT int cpu_support_arm_asimdhp(); | ||
| 63 | -// cpuid = aarch64 cpuid info | ||
| 64 | -NCNN_EXPORT int cpu_support_arm_cpuid(); | ||
| 65 | -// asimddp = aarch64 asimd dot product | ||
| 66 | -NCNN_EXPORT int cpu_support_arm_asimddp(); | ||
| 67 | -// asimdfhm = aarch64 asimd fhm | ||
| 68 | -NCNN_EXPORT int cpu_support_arm_asimdfhm(); | ||
| 69 | -// bf16 = aarch64 bf16 | ||
| 70 | -NCNN_EXPORT int cpu_support_arm_bf16(); | ||
| 71 | -// i8mm = aarch64 i8mm | ||
| 72 | -NCNN_EXPORT int cpu_support_arm_i8mm(); | ||
| 73 | -// sve = aarch64 sve | ||
| 74 | -NCNN_EXPORT int cpu_support_arm_sve(); | ||
| 75 | -// sve2 = aarch64 sve2 | ||
| 76 | -NCNN_EXPORT int cpu_support_arm_sve2(); | ||
| 77 | -// svebf16 = aarch64 svebf16 | ||
| 78 | -NCNN_EXPORT int cpu_support_arm_svebf16(); | ||
| 79 | -// svei8mm = aarch64 svei8mm | ||
| 80 | -NCNN_EXPORT int cpu_support_arm_svei8mm(); | ||
| 81 | -// svef32mm = aarch64 svef32mm | ||
| 82 | -NCNN_EXPORT int cpu_support_arm_svef32mm(); | ||
| 83 | - | ||
| 84 | -// avx = x86 avx | ||
| 85 | -NCNN_EXPORT int cpu_support_x86_avx(); | ||
| 86 | -// fma = x86 fma | ||
| 87 | -NCNN_EXPORT int cpu_support_x86_fma(); | ||
| 88 | -// xop = x86 xop | ||
| 89 | -NCNN_EXPORT int cpu_support_x86_xop(); | ||
| 90 | -// f16c = x86 f16c | ||
| 91 | -NCNN_EXPORT int cpu_support_x86_f16c(); | ||
| 92 | -// avx2 = x86 avx2 + fma + f16c | ||
| 93 | -NCNN_EXPORT int cpu_support_x86_avx2(); | ||
| 94 | -// avx_vnni = x86 avx vnni | ||
| 95 | -NCNN_EXPORT int cpu_support_x86_avx_vnni(); | ||
| 96 | -// avx_vnni_int8 = x86 avx vnni int8 | ||
| 97 | -NCNN_EXPORT int cpu_support_x86_avx_vnni_int8(); | ||
| 98 | -// avx_vnni_int16 = x86 avx vnni int16 | ||
| 99 | -NCNN_EXPORT int cpu_support_x86_avx_vnni_int16(); | ||
| 100 | -// avx_ne_convert = x86 avx ne convert | ||
| 101 | -NCNN_EXPORT int cpu_support_x86_avx_ne_convert(); | ||
| 102 | -// avx512 = x86 avx512f + avx512cd + avx512bw + avx512dq + avx512vl | ||
| 103 | -NCNN_EXPORT int cpu_support_x86_avx512(); | ||
| 104 | -// avx512_vnni = x86 avx512 vnni | ||
| 105 | -NCNN_EXPORT int cpu_support_x86_avx512_vnni(); | ||
| 106 | -// avx512_bf16 = x86 avx512 bf16 | ||
| 107 | -NCNN_EXPORT int cpu_support_x86_avx512_bf16(); | ||
| 108 | -// avx512_fp16 = x86 avx512 fp16 | ||
| 109 | -NCNN_EXPORT int cpu_support_x86_avx512_fp16(); | ||
| 110 | - | ||
| 111 | -// lsx = loongarch lsx | ||
| 112 | -NCNN_EXPORT int cpu_support_loongarch_lsx(); | ||
| 113 | -// lasx = loongarch lasx | ||
| 114 | -NCNN_EXPORT int cpu_support_loongarch_lasx(); | ||
| 115 | - | ||
| 116 | -// msa = mips mas | ||
| 117 | -NCNN_EXPORT int cpu_support_mips_msa(); | ||
| 118 | -// mmi = loongson mmi | ||
| 119 | -NCNN_EXPORT int cpu_support_loongson_mmi(); | ||
| 120 | - | ||
| 121 | -// v = riscv vector | ||
| 122 | -NCNN_EXPORT int cpu_support_riscv_v(); | ||
| 123 | -// zfh = riscv half-precision float | ||
| 124 | -NCNN_EXPORT int cpu_support_riscv_zfh(); | ||
| 125 | -// zvfh = riscv vector half-precision float | ||
| 126 | -NCNN_EXPORT int cpu_support_riscv_zvfh(); | ||
| 127 | -// xtheadvector = riscv xtheadvector | ||
| 128 | -NCNN_EXPORT int cpu_support_riscv_xtheadvector(); | ||
| 129 | -// vlenb = riscv vector length in bytes | ||
| 130 | -NCNN_EXPORT int cpu_riscv_vlenb(); | ||
| 131 | - | ||
| 132 | -// cpu info | ||
| 133 | -NCNN_EXPORT int get_cpu_count(); | ||
| 134 | -NCNN_EXPORT int get_little_cpu_count(); | ||
| 135 | -NCNN_EXPORT int get_big_cpu_count(); | ||
| 136 | - | ||
| 137 | -NCNN_EXPORT int get_physical_cpu_count(); | ||
| 138 | -NCNN_EXPORT int get_physical_little_cpu_count(); | ||
| 139 | -NCNN_EXPORT int get_physical_big_cpu_count(); | ||
| 140 | - | ||
| 141 | -// cpu l2 varies from 64k to 1M, but l3 can be zero | ||
| 142 | -NCNN_EXPORT int get_cpu_level2_cache_size(); | ||
| 143 | -NCNN_EXPORT int get_cpu_level3_cache_size(); | ||
| 144 | - | ||
| 145 | -// bind all threads on little clusters if powersave enabled | ||
| 146 | -// affects HMP arch cpu like ARM big.LITTLE | ||
| 147 | -// only implemented on android at the moment | ||
| 148 | -// switching powersave is expensive and not thread-safe | ||
| 149 | -// 0 = all cores enabled(default) | ||
| 150 | -// 1 = only little clusters enabled | ||
| 151 | -// 2 = only big clusters enabled | ||
| 152 | -// return 0 if success for setter function | ||
| 153 | -NCNN_EXPORT int get_cpu_powersave(); | ||
| 154 | -NCNN_EXPORT int set_cpu_powersave(int powersave); | ||
| 155 | - | ||
| 156 | -// convenient wrapper | ||
| 157 | -NCNN_EXPORT const CpuSet& get_cpu_thread_affinity_mask(int powersave); | ||
| 158 | - | ||
| 159 | -// set explicit thread affinity | ||
| 160 | -NCNN_EXPORT int set_cpu_thread_affinity(const CpuSet& thread_affinity_mask); | ||
| 161 | - | ||
| 162 | -// runtime thread affinity info | ||
| 163 | -NCNN_EXPORT int is_current_thread_running_on_a53_a55(); | ||
| 164 | - | ||
| 165 | -// misc function wrapper for openmp routines | ||
| 166 | -NCNN_EXPORT int get_omp_num_threads(); | ||
| 167 | -NCNN_EXPORT void set_omp_num_threads(int num_threads); | ||
| 168 | - | ||
| 169 | -NCNN_EXPORT int get_omp_dynamic(); | ||
| 170 | -NCNN_EXPORT void set_omp_dynamic(int dynamic); | ||
| 171 | - | ||
| 172 | -NCNN_EXPORT int get_omp_thread_num(); | ||
| 173 | - | ||
| 174 | -NCNN_EXPORT int get_kmp_blocktime(); | ||
| 175 | -NCNN_EXPORT void set_kmp_blocktime(int time_ms); | ||
| 176 | - | ||
| 177 | -// need to flush denormals on Intel Chipset. | ||
| 178 | -// Other architectures such as ARM can be added as needed. | ||
| 179 | -// 0 = DAZ OFF, FTZ OFF | ||
| 180 | -// 1 = DAZ ON , FTZ OFF | ||
| 181 | -// 2 = DAZ OFF, FTZ ON | ||
| 182 | -// 3 = DAZ ON, FTZ ON | ||
| 183 | -NCNN_EXPORT int get_flush_denormals(); | ||
| 184 | -NCNN_EXPORT int set_flush_denormals(int flush_denormals); | ||
| 185 | - | ||
| 186 | -} // namespace ncnn | ||
| 187 | - | ||
| 188 | -#endif // NCNN_CPU_H |
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#ifndef NCNN_DATAREADER_H | ||
| 16 | -#define NCNN_DATAREADER_H | ||
| 17 | - | ||
| 18 | -#include "platform.h" | ||
| 19 | -#if NCNN_STDIO | ||
| 20 | -#include <stdio.h> | ||
| 21 | -#endif | ||
| 22 | - | ||
| 23 | -#if NCNN_PLATFORM_API | ||
| 24 | -#if __ANDROID_API__ >= 9 | ||
| 25 | -#include <android/asset_manager.h> | ||
| 26 | -#endif | ||
| 27 | -#endif // NCNN_PLATFORM_API | ||
| 28 | - | ||
| 29 | -namespace ncnn { | ||
| 30 | - | ||
| 31 | -// data read wrapper | ||
| 32 | -class NCNN_EXPORT DataReader | ||
| 33 | -{ | ||
| 34 | -public: | ||
| 35 | - DataReader(); | ||
| 36 | - virtual ~DataReader(); | ||
| 37 | - | ||
| 38 | -#if NCNN_STRING | ||
| 39 | - // parse plain param text | ||
| 40 | - // return 1 if scan success | ||
| 41 | - virtual int scan(const char* format, void* p) const; | ||
| 42 | -#endif // NCNN_STRING | ||
| 43 | - | ||
| 44 | - // read binary param and model data | ||
| 45 | - // return bytes read | ||
| 46 | - virtual size_t read(void* buf, size_t size) const; | ||
| 47 | - | ||
| 48 | - // get model data reference | ||
| 49 | - // return bytes referenced | ||
| 50 | - virtual size_t reference(size_t size, const void** buf) const; | ||
| 51 | -}; | ||
| 52 | - | ||
| 53 | -#if NCNN_STDIO | ||
| 54 | -class DataReaderFromStdioPrivate; | ||
| 55 | -class NCNN_EXPORT DataReaderFromStdio : public DataReader | ||
| 56 | -{ | ||
| 57 | -public: | ||
| 58 | - explicit DataReaderFromStdio(FILE* fp); | ||
| 59 | - virtual ~DataReaderFromStdio(); | ||
| 60 | - | ||
| 61 | -#if NCNN_STRING | ||
| 62 | - virtual int scan(const char* format, void* p) const; | ||
| 63 | -#endif // NCNN_STRING | ||
| 64 | - virtual size_t read(void* buf, size_t size) const; | ||
| 65 | - | ||
| 66 | -private: | ||
| 67 | - DataReaderFromStdio(const DataReaderFromStdio&); | ||
| 68 | - DataReaderFromStdio& operator=(const DataReaderFromStdio&); | ||
| 69 | - | ||
| 70 | -private: | ||
| 71 | - DataReaderFromStdioPrivate* const d; | ||
| 72 | -}; | ||
| 73 | -#endif // NCNN_STDIO | ||
| 74 | - | ||
| 75 | -class DataReaderFromMemoryPrivate; | ||
| 76 | -class NCNN_EXPORT DataReaderFromMemory : public DataReader | ||
| 77 | -{ | ||
| 78 | -public: | ||
| 79 | - explicit DataReaderFromMemory(const unsigned char*& mem); | ||
| 80 | - virtual ~DataReaderFromMemory(); | ||
| 81 | - | ||
| 82 | -#if NCNN_STRING | ||
| 83 | - virtual int scan(const char* format, void* p) const; | ||
| 84 | -#endif // NCNN_STRING | ||
| 85 | - virtual size_t read(void* buf, size_t size) const; | ||
| 86 | - virtual size_t reference(size_t size, const void** buf) const; | ||
| 87 | - | ||
| 88 | -private: | ||
| 89 | - DataReaderFromMemory(const DataReaderFromMemory&); | ||
| 90 | - DataReaderFromMemory& operator=(const DataReaderFromMemory&); | ||
| 91 | - | ||
| 92 | -private: | ||
| 93 | - DataReaderFromMemoryPrivate* const d; | ||
| 94 | -}; | ||
| 95 | - | ||
| 96 | -#if NCNN_PLATFORM_API | ||
| 97 | -#if __ANDROID_API__ >= 9 | ||
| 98 | -class DataReaderFromAndroidAssetPrivate; | ||
| 99 | -class NCNN_EXPORT DataReaderFromAndroidAsset : public DataReader | ||
| 100 | -{ | ||
| 101 | -public: | ||
| 102 | - explicit DataReaderFromAndroidAsset(AAsset* asset); | ||
| 103 | - virtual ~DataReaderFromAndroidAsset(); | ||
| 104 | - | ||
| 105 | -#if NCNN_STRING | ||
| 106 | - virtual int scan(const char* format, void* p) const; | ||
| 107 | -#endif // NCNN_STRING | ||
| 108 | - virtual size_t read(void* buf, size_t size) const; | ||
| 109 | - | ||
| 110 | -private: | ||
| 111 | - DataReaderFromAndroidAsset(const DataReaderFromAndroidAsset&); | ||
| 112 | - DataReaderFromAndroidAsset& operator=(const DataReaderFromAndroidAsset&); | ||
| 113 | - | ||
| 114 | -private: | ||
| 115 | - DataReaderFromAndroidAssetPrivate* const d; | ||
| 116 | -}; | ||
| 117 | -#endif // __ANDROID_API__ >= 9 | ||
| 118 | -#endif // NCNN_PLATFORM_API | ||
| 119 | - | ||
| 120 | -} // namespace ncnn | ||
| 121 | - | ||
| 122 | -#endif // NCNN_DATAREADER_H |
| 1 | -// Tencent is pleased to support the open source community by making ncnn available. | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2025 THL A29 Limited, a Tencent company. All rights reserved. | ||
| 4 | -// | ||
| 5 | -// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except | ||
| 6 | -// in compliance with the License. You may obtain a copy of the License at | ||
| 7 | -// | ||
| 8 | -// https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | -// | ||
| 10 | -// Unless required by applicable law or agreed to in writing, software distributed | ||
| 11 | -// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
| 12 | -// CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 13 | -// specific language governing permissions and limitations under the License. | ||
| 14 | - | ||
| 15 | -#include "mat.h" | ||
| 16 | - | ||
| 17 | -namespace ncnn { | ||
| 18 | - | ||
| 19 | -// count how many blobs are referenced inside expression | ||
| 20 | -NCNN_EXPORT int count_expression_blobs(const std::string& expr); | ||
| 21 | - | ||
| 22 | -// resolve reshape shape from expression and input blobs | ||
| 23 | -// resolve slice indices(starts, ends) from expression and input blobs | ||
| 24 | -// see docs/developer-guide/expression.md | ||
| 25 | -// return 0 if success | ||
| 26 | -NCNN_EXPORT int eval_list_expression(const std::string& expr, const std::vector<Mat>& blobs, std::vector<int>& outlist); | ||
| 27 | - | ||
| 28 | -} // namespace ncnn |
-
请 注册 或 登录 后发表评论