*
*/
-#pragma once
-
#ifndef _NIR_SPIRV_H_
#define _NIR_SPIRV_H_
-#include "nir/nir.h"
+#include "compiler/nir/nir.h"
+#include "compiler/shader_info.h"
#ifdef __cplusplus
extern "C" {
struct nir_spirv_specialization {
uint32_t id;
- uint32_t data;
+ union {
+ uint32_t data32;
+ uint64_t data64;
+ };
+ bool defined_on_module;
+};
+
+enum nir_spirv_debug_level {
+ NIR_SPIRV_DEBUG_LEVEL_INFO,
+ NIR_SPIRV_DEBUG_LEVEL_WARNING,
+ NIR_SPIRV_DEBUG_LEVEL_ERROR,
};
-struct nir_spirv_supported_extensions {
- bool image_ms_array;
+enum nir_spirv_execution_environment {
+ NIR_SPIRV_VULKAN = 0,
+ NIR_SPIRV_OPENCL,
+ NIR_SPIRV_OPENGL,
};
-nir_function *spirv_to_nir(const uint32_t *words, size_t word_count,
- struct nir_spirv_specialization *specializations,
- unsigned num_specializations,
- gl_shader_stage stage, const char *entry_point_name,
- const struct nir_spirv_supported_extensions *ext,
- const nir_shader_compiler_options *options);
+struct spirv_to_nir_options {
+ enum nir_spirv_execution_environment environment;
+
+ /* Whether or not to lower all UBO/SSBO access to offsets up-front. */
+ bool lower_ubo_ssbo_access_to_offsets;
+
+ /* Whether to make FragCoord to a system value, the same as
+ * GLSLFragCoordIsSysVal in GLSL.
+ */
+ bool frag_coord_is_sysval;
+
+ /* Whether to generate only scoped_memory_barrier intrinsics instead of the
+ * set of memory barrier intrinsics based on GLSL.
+ */
+ bool use_scoped_memory_barrier;
+
+ struct spirv_supported_capabilities caps;
+
+ /* Address format for various kinds of pointers. */
+ nir_address_format ubo_addr_format;
+ nir_address_format ssbo_addr_format;
+ nir_address_format phys_ssbo_addr_format;
+ nir_address_format push_const_addr_format;
+ nir_address_format shared_addr_format;
+ nir_address_format global_addr_format;
+ nir_address_format temp_addr_format;
+
+ /* Whether UniformConstant memory should be treated as normal global memory.
+ * This is usefull for CL 2.0 implementations with fine grain system SVM
+ * support.
+ */
+ bool constant_as_global;
+
+ struct {
+ void (*func)(void *private_data,
+ enum nir_spirv_debug_level level,
+ size_t spirv_offset,
+ const char *message);
+ void *private_data;
+ } debug;
+};
+
+bool gl_spirv_validation(const uint32_t *words, size_t word_count,
+ struct nir_spirv_specialization *spec, unsigned num_spec,
+ gl_shader_stage stage, const char *entry_point_name);
+
+nir_shader *spirv_to_nir(const uint32_t *words, size_t word_count,
+ struct nir_spirv_specialization *specializations,
+ unsigned num_specializations,
+ gl_shader_stage stage, const char *entry_point_name,
+ const struct spirv_to_nir_options *options,
+ const nir_shader_compiler_options *nir_options);
#ifdef __cplusplus
}