diff options
author | Nicolai Hähnle <[email protected]> | 2017-06-22 13:00:08 +0200 |
---|---|---|
committer | Alejandro Piñeiro <[email protected]> | 2018-06-21 14:25:05 +0200 |
commit | 23edc5b1ef36226a84a4e0bf325d05d3dbdff350 (patch) | |
tree | f4d7f77a48c483f328ff906b29cc65408276c6ec | |
parent | 3d6664763dbbaea12ed0c485863adfffd912df68 (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.h | 1 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_variables.c | 25 |
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: |