Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2020-01-09 13:18:14 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2020-01-09 14:41:06 +0300
commitcc153f8d7f797988164e66df3055abe9be200c5f (patch)
tree4a40fb22fd92cec1de03fb13fb6ad62d8d1f4f57 /spirv_cross_c.cpp
parent34ba8ea4f2947fdc56a76b17f352cb692499bcd7 (diff)
HLSL: Add a resource remapping API similar to MSL.
Allows more flexibility of how resources are assigned without having to remap decorations.
Diffstat (limited to 'spirv_cross_c.cpp')
-rw-r--r--spirv_cross_c.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/spirv_cross_c.cpp b/spirv_cross_c.cpp
index b590fe80..f94e785d 100644
--- a/spirv_cross_c.cpp
+++ b/spirv_cross_c.cpp
@@ -789,6 +789,60 @@ spvc_result spvc_compiler_hlsl_set_resource_binding_flags(spvc_compiler compiler
#endif
}
+spvc_result spvc_compiler_hlsl_add_resource_binding(spvc_compiler compiler,
+ const spvc_hlsl_resource_binding *binding)
+{
+#if SPIRV_CROSS_C_API_HLSL
+ if (compiler->backend != SPVC_BACKEND_HLSL)
+ {
+ compiler->context->report_error("HLSL function used on a non-HLSL backend.");
+ return SPVC_ERROR_INVALID_ARGUMENT;
+ }
+
+ auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
+ HLSLResourceBinding bind;
+ bind.binding = binding->binding;
+ bind.desc_set = binding->desc_set;
+ bind.stage = static_cast<spv::ExecutionModel>(binding->stage);
+ bind.cbv.register_binding = binding->cbv.register_binding;
+ bind.cbv.register_space = binding->cbv.register_space;
+ bind.uav.register_binding = binding->uav.register_binding;
+ bind.uav.register_space = binding->uav.register_space;
+ bind.srv.register_binding = binding->srv.register_binding;
+ bind.srv.register_space = binding->srv.register_space;
+ bind.sampler.register_binding = binding->sampler.register_binding;
+ bind.sampler.register_space = binding->sampler.register_space;
+ hlsl.add_hlsl_resource_binding(bind);
+ return SPVC_SUCCESS;
+#else
+ (void)binding;
+ compiler->context->report_error("HLSL function used on a non-HLSL backend.");
+ return SPVC_ERROR_INVALID_ARGUMENT;
+#endif
+}
+
+spvc_bool spvc_compiler_hlsl_is_resource_used(spvc_compiler compiler, SpvExecutionModel model, unsigned set,
+ unsigned binding)
+{
+#if SPIRV_CROSS_C_API_HLSL
+ if (compiler->backend != SPVC_BACKEND_HLSL)
+ {
+ compiler->context->report_error("HLSL function used on a non-HLSL backend.");
+ return SPVC_FALSE;
+ }
+
+ auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
+ return hlsl.is_hlsl_resource_binding_used(static_cast<spv::ExecutionModel>(model), set, binding) ? SPVC_TRUE :
+ SPVC_FALSE;
+#else
+ (void)model;
+ (void)set;
+ (void)binding;
+ compiler->context->report_error("HLSL function used on a non-HLSL backend.");
+ return SPVC_FALSE;
+#endif
+}
+
spvc_bool spvc_compiler_msl_is_rasterization_disabled(spvc_compiler compiler)
{
#if SPIRV_CROSS_C_API_MSL
@@ -2157,6 +2211,26 @@ void spvc_msl_resource_binding_init(spvc_msl_resource_binding *binding)
#endif
}
+void spvc_hlsl_resource_binding_init(spvc_hlsl_resource_binding *binding)
+{
+#if SPIRV_CROSS_C_API_HLSL
+ HLSLResourceBinding binding_default;
+ binding->desc_set = binding_default.desc_set;
+ binding->binding = binding_default.binding;
+ binding->cbv.register_binding = binding_default.cbv.register_binding;
+ binding->cbv.register_space = binding_default.cbv.register_space;
+ binding->srv.register_binding = binding_default.srv.register_binding;
+ binding->srv.register_space = binding_default.srv.register_space;
+ binding->uav.register_binding = binding_default.uav.register_binding;
+ binding->uav.register_space = binding_default.uav.register_space;
+ binding->sampler.register_binding = binding_default.sampler.register_binding;
+ binding->sampler.register_space = binding_default.sampler.register_space;
+ binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
+#else
+ memset(binding, 0, sizeof(*binding));
+#endif
+}
+
void spvc_msl_constexpr_sampler_init(spvc_msl_constexpr_sampler *sampler)
{
#if SPIRV_CROSS_C_API_MSL