nir/spirv: add a vtn_type struct

This will handle decorations that aren't in the glsl_type.
This commit is contained in:
Connor Abbott 2015-07-02 14:24:12 -07:00
parent f9bb95ad4a
commit 23c179be75
3 changed files with 73 additions and 32 deletions

View File

@ -139,9 +139,8 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSL450Entrypoint entrypoint,
const uint32_t *w, unsigned count)
{
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
val->type = vtn_value(b, w[1], vtn_value_type_type)->type;
val->ssa = rzalloc(b, struct vtn_ssa_value);
val->ssa->type = val->type;
val->ssa->type = vtn_value(b, w[1], vtn_value_type_type)->type->type;
/* Collect the various SSA sources */
unsigned num_inputs = count - 5;
@ -257,7 +256,7 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSL450Entrypoint entrypoint,
nir_alu_instr *instr = nir_alu_instr_create(b->shader, op);
nir_ssa_dest_init(&instr->instr, &instr->dest.dest,
glsl_get_vector_elements(val->type), val->name);
glsl_get_vector_elements(val->ssa->type), val->name);
val->ssa->def = &instr->dest.dest.ssa;
for (unsigned i = 0; i < nir_op_infos[op].num_inputs; i++)

View File

@ -312,51 +312,66 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
{
struct vtn_value *val = vtn_push_value(b, w[1], vtn_value_type_type);
val->type = ralloc(b, struct vtn_type);
val->type->is_builtin = false;
switch (opcode) {
case SpvOpTypeVoid:
val->type = glsl_void_type();
val->type->type = glsl_void_type();
return;
case SpvOpTypeBool:
val->type = glsl_bool_type();
val->type->type = glsl_bool_type();
return;
case SpvOpTypeInt:
val->type = glsl_int_type();
val->type->type = glsl_int_type();
return;
case SpvOpTypeFloat:
val->type = glsl_float_type();
val->type->type = glsl_float_type();
return;
case SpvOpTypeVector: {
const struct glsl_type *base =
vtn_value(b, w[2], vtn_value_type_type)->type;
vtn_value(b, w[2], vtn_value_type_type)->type->type;
unsigned elems = w[3];
assert(glsl_type_is_scalar(base));
val->type = glsl_vector_type(glsl_get_base_type(base), elems);
val->type->type = glsl_vector_type(glsl_get_base_type(base), elems);
return;
}
case SpvOpTypeMatrix: {
const struct glsl_type *base =
vtn_value(b, w[2], vtn_value_type_type)->type;
vtn_value(b, w[2], vtn_value_type_type)->type->type;
unsigned columns = w[3];
assert(glsl_type_is_vector(base));
val->type = glsl_matrix_type(glsl_get_base_type(base),
glsl_get_vector_elements(base),
columns);
val->type->type = glsl_matrix_type(glsl_get_base_type(base),
glsl_get_vector_elements(base),
columns);
val->type->row_major = false;
val->type->stride = 0;
return;
}
case SpvOpTypeArray:
val->type = glsl_array_type(b->values[w[2]].type, w[3]);
case SpvOpTypeArray: {
struct vtn_type *array_element =
vtn_value(b, w[2], vtn_value_type_type)->type;
val->type->type = glsl_array_type(array_element->type, w[3]);
val->type->array_element = array_element;
val->type->stride = 0;
return;
}
case SpvOpTypeStruct: {
unsigned num_fields = count - 2;
val->type->members = ralloc_array(b, struct vtn_type *, num_fields);
NIR_VLA(struct glsl_struct_field, fields, count);
for (unsigned i = 0; i < count - 2; i++) {
for (unsigned i = 0; i < num_fields; i++) {
/* TODO: Handle decorators */
fields[i].type = vtn_value(b, w[i + 2], vtn_value_type_type)->type;
val->type->members[i] =
vtn_value(b, w[i + 2], vtn_value_type_type)->type;
fields[i].type = val->type->members[i]->type;
fields[i].name = ralloc_asprintf(b, "field%d", i);
fields[i].location = -1;
fields[i].interpolation = 0;
@ -370,21 +385,22 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
const char *name = val->name ? val->name : "struct";
val->type = glsl_struct_type(fields, count, name);
val->type->type = glsl_struct_type(fields, count, name);
return;
}
case SpvOpTypeFunction: {
const struct glsl_type *return_type = b->values[w[2]].type;
const struct glsl_type *return_type =
vtn_value(b, w[2], vtn_value_type_type)->type->type;
NIR_VLA(struct glsl_function_param, params, count - 3);
for (unsigned i = 0; i < count - 3; i++) {
params[i].type = vtn_value(b, w[i + 3], vtn_value_type_type)->type;
params[i].type = vtn_value(b, w[i + 3], vtn_value_type_type)->type->type;
/* FIXME: */
params[i].in = true;
params[i].out = true;
}
val->type = glsl_function_type(return_type, params, count - 3);
val->type->type = glsl_function_type(return_type, params, count - 3);
return;
}
@ -398,7 +414,7 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
case SpvOpTypeSampler: {
const struct glsl_type *sampled_type =
vtn_value(b, w[2], vtn_value_type_type)->type;
vtn_value(b, w[2], vtn_value_type_type)->type->type;
assert(glsl_type_is_vector_or_scalar(sampled_type));
@ -422,8 +438,8 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
assert(w[7] == 0 && "FIXME: Handl multi-sampled textures");
val->type = glsl_sampler_type(dim, is_shadow, is_array,
glsl_get_base_type(sampled_type));
val->type->type = glsl_sampler_type(dim, is_shadow, is_array,
glsl_get_base_type(sampled_type));
return;
}
@ -444,7 +460,7 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
const uint32_t *w, unsigned count)
{
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_constant);
val->const_type = vtn_value(b, w[1], vtn_value_type_type)->type;
val->const_type = vtn_value(b, w[1], vtn_value_type_type)->type->type;
val->constant = ralloc(b, nir_constant);
switch (opcode) {
case SpvOpConstantTrue:
@ -864,7 +880,7 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
switch (opcode) {
case SpvOpVariable: {
const struct glsl_type *type =
vtn_value(b, w[1], vtn_value_type_type)->type;
vtn_value(b, w[1], vtn_value_type_type)->type->type;
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_deref);
nir_variable *var = ralloc(b->shader, nir_variable);
@ -1442,7 +1458,7 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
{
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
const struct glsl_type *type =
vtn_value(b, w[1], vtn_value_type_type)->type;
vtn_value(b, w[1], vtn_value_type_type)->type->type;
val->ssa = vtn_create_ssa_value(b, type);
/* Collect the various SSA sources */
@ -1792,7 +1808,8 @@ vtn_handle_composite(struct vtn_builder *b, SpvOp opcode,
const uint32_t *w, unsigned count)
{
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
const struct glsl_type *type = vtn_value(b, w[1], vtn_value_type_type)->type;
const struct glsl_type *type =
vtn_value(b, w[1], vtn_value_type_type)->type->type;
val->ssa = vtn_create_ssa_value(b, type);
switch (opcode) {
@ -1880,7 +1897,8 @@ static void
vtn_handle_phi_first_pass(struct vtn_builder *b, const uint32_t *w)
{
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
const struct glsl_type *type = vtn_value(b, w[1], vtn_value_type_type)->type;
const struct glsl_type *type =
vtn_value(b, w[1], vtn_value_type_type)->type->type;
val->ssa = vtn_phi_node_create(b, type);
}
@ -2068,10 +2086,10 @@ vtn_handle_first_cfg_pass_instruction(struct vtn_builder *b, SpvOp opcode,
b->func = rzalloc(b, struct vtn_function);
const struct glsl_type *result_type =
vtn_value(b, w[1], vtn_value_type_type)->type;
vtn_value(b, w[1], vtn_value_type_type)->type->type;
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_function);
const struct glsl_type *func_type =
vtn_value(b, w[4], vtn_value_type_type)->type;
vtn_value(b, w[4], vtn_value_type_type)->type->type;
assert(glsl_get_function_return_type(func_type) == result_type);

View File

@ -81,6 +81,30 @@ struct vtn_ssa_value {
const struct glsl_type *type;
};
struct vtn_type {
const struct glsl_type *type;
/* for matrices, whether the matrix is stored row-major */
bool row_major;
/* for structs, the offset of each member */
unsigned *offsets;
/* for arrays and matrices, the array stride */
unsigned stride;
/* for arrays, the vtn_type for the elements of the array */
struct vtn_type *array_element;
/* for structures, the vtn_type for each member */
struct vtn_type **members;
/* Whether this type, or a parent type, has been decorated as a builtin */
bool is_builtin;
SpvBuiltIn builtin;
};
struct vtn_value {
enum vtn_value_type value_type;
const char *name;
@ -88,7 +112,7 @@ struct vtn_value {
union {
void *ptr;
char *str;
const struct glsl_type *type;
struct vtn_type *type;
struct {
nir_constant *constant;
const struct glsl_type *const_type;