nir/spirv: Make the builtins array distinguish between in and out

This commit is contained in:
Jason Ekstrand 2015-10-22 17:54:24 -07:00
parent d11ea76168
commit 9fe907ec79
2 changed files with 17 additions and 4 deletions

View File

@ -830,7 +830,10 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member,
if (builtin == SpvBuiltInFragCoord || builtin == SpvBuiltInSamplePosition) if (builtin == SpvBuiltInFragCoord || builtin == SpvBuiltInSamplePosition)
var->data.origin_upper_left = b->origin_upper_left; var->data.origin_upper_left = b->origin_upper_left;
b->builtins[dec->literals[0]] = var; if (mode == nir_var_shader_out)
b->builtins[dec->literals[0]].out = var;
else
b->builtins[dec->literals[0]].in = var;
break; break;
} }
case SpvDecorationRowMajor: case SpvDecorationRowMajor:
@ -866,7 +869,11 @@ get_builtin_variable(struct vtn_builder *b,
const struct glsl_type *type, const struct glsl_type *type,
SpvBuiltIn builtin) SpvBuiltIn builtin)
{ {
nir_variable *var = b->builtins[builtin]; nir_variable *var;
if (mode == nir_var_shader_out)
var = b->builtins[builtin].out;
else
var = b->builtins[builtin].in;
if (!var) { if (!var) {
int location; int location;
@ -880,7 +887,10 @@ get_builtin_variable(struct vtn_builder *b,
if (builtin == SpvBuiltInFragCoord || builtin == SpvBuiltInSamplePosition) if (builtin == SpvBuiltInFragCoord || builtin == SpvBuiltInSamplePosition)
var->data.origin_upper_left = b->origin_upper_left; var->data.origin_upper_left = b->origin_upper_left;
b->builtins[builtin] = var; if (mode == nir_var_shader_out)
b->builtins[builtin].out = var;
else
b->builtins[builtin].in = var;
} }
return var; return var;

View File

@ -172,7 +172,10 @@ struct vtn_builder {
/* /*
* NIR variable for each SPIR-V builtin. * NIR variable for each SPIR-V builtin.
*/ */
nir_variable *builtins[42]; /* XXX need symbolic constant from SPIR-V header */ struct {
nir_variable *in;
nir_variable *out;
} builtins[42]; /* XXX need symbolic constant from SPIR-V header */
unsigned value_id_bound; unsigned value_id_bound;
struct vtn_value *values; struct vtn_value *values;