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 <nicolai.haehnle@amd.com>
Signed-off-by: Eduardo Lima <elima@igalia.com>
Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Nicolai Hähnle
2017-06-22 13:00:08 +02:00
committed by Alejandro Piñeiro
parent 3d6664763d
commit 23edc5b1ef
2 changed files with 16 additions and 10 deletions

View File

@@ -406,6 +406,7 @@ enum vtn_variable_mode {
vtn_variable_mode_local, vtn_variable_mode_local,
vtn_variable_mode_global, vtn_variable_mode_global,
vtn_variable_mode_param, vtn_variable_mode_param,
vtn_variable_mode_uniform,
vtn_variable_mode_ubo, vtn_variable_mode_ubo,
vtn_variable_mode_ssbo, vtn_variable_mode_ssbo,
vtn_variable_mode_push_constant, vtn_variable_mode_push_constant,

View File

@@ -1548,8 +1548,11 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
vtn_var->mode == vtn_variable_mode_output) { vtn_var->mode == vtn_variable_mode_output) {
is_vertex_input = false; is_vertex_input = false;
location += vtn_var->patch ? VARYING_SLOT_PATCH0 : VARYING_SLOT_VAR0; location += vtn_var->patch ? VARYING_SLOT_PATCH0 : VARYING_SLOT_VAR0;
} else { } else if (vtn_var->mode != vtn_variable_mode_uniform &&
vtn_warn("Location must be on input or output variable"); 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; return;
} }
@@ -1615,7 +1618,9 @@ vtn_storage_class_to_mode(struct vtn_builder *b,
mode = vtn_variable_mode_ssbo; mode = vtn_variable_mode_ssbo;
nir_mode = 0; nir_mode = 0;
} else { } 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; break;
case SpvStorageClassStorageBuffer: case SpvStorageClassStorageBuffer:
@@ -1623,15 +1628,13 @@ vtn_storage_class_to_mode(struct vtn_builder *b,
nir_mode = 0; nir_mode = 0;
break; break;
case SpvStorageClassUniformConstant: case SpvStorageClassUniformConstant:
if (glsl_type_is_image(interface_type->type)) { if (glsl_type_is_image(interface_type->type))
mode = vtn_variable_mode_image; 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; mode = vtn_variable_mode_sampler;
nir_mode = nir_var_uniform; else
} else { mode = vtn_variable_mode_uniform;
vtn_fail("Invalid uniform constant variable type"); nir_mode = nir_var_uniform;
}
break; break;
case SpvStorageClassPushConstant: case SpvStorageClassPushConstant:
mode = vtn_variable_mode_push_constant; 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_global:
case vtn_variable_mode_image: case vtn_variable_mode_image:
case vtn_variable_mode_sampler: case vtn_variable_mode_sampler:
case vtn_variable_mode_uniform:
/* For these, we create the variable normally */ /* For these, we create the variable normally */
var->var = rzalloc(b->shader, nir_variable); var->var = rzalloc(b->shader, nir_variable);
var->var->name = ralloc_strdup(var->var, val->name); var->var->name = ralloc_strdup(var->var, val->name);
var->var->type = var->type->type; var->var->type = var->type->type;
var->var->data.mode = nir_mode; var->var->data.mode = nir_mode;
var->var->data.location = -1;
switch (var->mode) { switch (var->mode) {
case vtn_variable_mode_image: case vtn_variable_mode_image: