summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2017-06-22 13:00:08 +0200
committerAlejandro Piñeiro <[email protected]>2018-06-21 14:25:05 +0200
commit23edc5b1ef36226a84a4e0bf325d05d3dbdff350 (patch)
treef4d7f77a48c483f328ff906b29cc65408276c6ec
parent3d6664763dbbaea12ed0c485863adfffd912df68 (diff)
spirv: translate default-block uniforms
They are supported by SPIR-V for ARB_gl_spirv. v2 (changes on top of Nicolai's original patch): * Handle UniformConstant storage class for uniforms other than samplers and images. (Eduardo Lima) * Handle location decoration also for samplers and images. (Eduardo Lima) * Rebase update (spirv_to_nir options added, logging changes, and others) (Alejandro Piñeiro) Signed-off-by: Nicolai Hähnle <[email protected]> Signed-off-by: Eduardo Lima <[email protected]> Signed-off-by: Alejandro Piñeiro <[email protected]> Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r--src/compiler/spirv/vtn_private.h1
-rw-r--r--src/compiler/spirv/vtn_variables.c25
2 files changed, 16 insertions, 10 deletions
diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h
index 3146d8eeb56..98b326a8830 100644
--- a/src/compiler/spirv/vtn_private.h
+++ b/src/compiler/spirv/vtn_private.h
@@ -406,6 +406,7 @@ enum vtn_variable_mode {
vtn_variable_mode_local,
vtn_variable_mode_global,
vtn_variable_mode_param,
+ vtn_variable_mode_uniform,
vtn_variable_mode_ubo,
vtn_variable_mode_ssbo,
vtn_variable_mode_push_constant,
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 53bee1b9288..6b30263645d 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -1548,8 +1548,11 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
vtn_var->mode == vtn_variable_mode_output) {
is_vertex_input = false;
location += vtn_var->patch ? VARYING_SLOT_PATCH0 : VARYING_SLOT_VAR0;
- } else {
- vtn_warn("Location must be on input or output variable");
+ } else if (vtn_var->mode != vtn_variable_mode_uniform &&
+ vtn_var->mode != vtn_variable_mode_sampler &&
+ vtn_var->mode != vtn_variable_mode_image) {
+ vtn_warn("Location must be on input, output, uniform, sampler or "
+ "image variable");
return;
}
@@ -1615,7 +1618,9 @@ vtn_storage_class_to_mode(struct vtn_builder *b,
mode = vtn_variable_mode_ssbo;
nir_mode = 0;
} else {
- vtn_fail("Invalid uniform variable type");
+ /* Default-block uniforms, coming from gl_spirv */
+ mode = vtn_variable_mode_uniform;
+ nir_mode = nir_var_uniform;
}
break;
case SpvStorageClassStorageBuffer:
@@ -1623,15 +1628,13 @@ vtn_storage_class_to_mode(struct vtn_builder *b,
nir_mode = 0;
break;
case SpvStorageClassUniformConstant:
- if (glsl_type_is_image(interface_type->type)) {
+ if (glsl_type_is_image(interface_type->type))
mode = vtn_variable_mode_image;
- nir_mode = nir_var_uniform;
- } else if (glsl_type_is_sampler(interface_type->type)) {
+ else if (glsl_type_is_sampler(interface_type->type))
mode = vtn_variable_mode_sampler;
- nir_mode = nir_var_uniform;
- } else {
- vtn_fail("Invalid uniform constant variable type");
- }
+ else
+ mode = vtn_variable_mode_uniform;
+ nir_mode = nir_var_uniform;
break;
case SpvStorageClassPushConstant:
mode = vtn_variable_mode_push_constant;
@@ -1799,11 +1802,13 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
case vtn_variable_mode_global:
case vtn_variable_mode_image:
case vtn_variable_mode_sampler:
+ case vtn_variable_mode_uniform:
/* For these, we create the variable normally */
var->var = rzalloc(b->shader, nir_variable);
var->var->name = ralloc_strdup(var->var, val->name);
var->var->type = var->type->type;
var->var->data.mode = nir_mode;
+ var->var->data.location = -1;
switch (var->mode) {
case vtn_variable_mode_image: