X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglsl%2Fnir%2Fglsl_to_nir.cpp;h=27dabd3b8f2869fd77836e6298bd100eaf52446e;hb=6a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60df;hp=ff9c9b4a9e7cfe4efd1330715333fbb41c2aa369;hpb=f8f8b318476cb40650b0bc2597b21978fc456d78;p=mesa.git diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp index ff9c9b4a9e7..27dabd3b8f2 100644 --- a/src/glsl/nir/glsl_to_nir.cpp +++ b/src/glsl/nir/glsl_to_nir.cpp @@ -43,7 +43,7 @@ namespace { class nir_visitor : public ir_visitor { public: - nir_visitor(nir_shader *shader, gl_shader_stage stage); + nir_visitor(nir_shader *shader, struct gl_shader *sh, gl_shader_stage stage); ~nir_visitor(); virtual void visit(ir_variable *); @@ -65,6 +65,7 @@ public: virtual void visit(ir_dereference_variable *); virtual void visit(ir_dereference_record *); virtual void visit(ir_dereference_array *); + virtual void visit(ir_barrier *); void create_function(ir_function *ir); @@ -82,6 +83,8 @@ private: bool supports_ints; + struct gl_shader *sh; + nir_shader *shader; gl_shader_stage stage; nir_function_impl *impl; @@ -132,7 +135,7 @@ glsl_to_nir(struct gl_shader *sh, const nir_shader_compiler_options *options) { nir_shader *shader = nir_shader_create(NULL, options); - nir_visitor v1(shader, sh->Stage); + nir_visitor v1(shader, sh, sh->Stage); nir_function_visitor v2(&v1); v2.run(sh->ir); visit_exec_list(sh->ir, &v1); @@ -140,10 +143,12 @@ glsl_to_nir(struct gl_shader *sh, const nir_shader_compiler_options *options) return shader; } -nir_visitor::nir_visitor(nir_shader *shader, gl_shader_stage stage) +nir_visitor::nir_visitor(nir_shader *shader, struct gl_shader *sh, + gl_shader_stage stage) { this->supports_ints = shader->options->native_integers; this->shader = shader; + this->sh = sh; this->stage = stage; this->is_global = true; this->var_table = _mesa_hash_table_create(NULL, _mesa_hash_pointer, @@ -279,6 +284,9 @@ nir_visitor::visit(ir_variable *ir) var->data.mode = nir_var_uniform; break; + case ir_var_shader_storage: + var->data.mode = nir_var_shader_storage; + break; case ir_var_system_value: var->data.mode = nir_var_system_value; @@ -321,6 +329,7 @@ nir_visitor::visit(ir_variable *ir) } var->data.index = ir->data.index; + var->data.descriptor_set = ir->data.set; var->data.binding = ir->data.binding; /* XXX Get rid of buffer_index */ var->data.atomic.buffer_index = ir->data.binding; @@ -370,6 +379,7 @@ nir_visitor::visit(ir_variable *ir) break; case nir_var_uniform: + case nir_var_shader_storage: exec_list_push_tail(&shader->uniforms, &var->node); break; @@ -634,6 +644,8 @@ nir_visitor::visit(ir_call *ir) op = nir_intrinsic_image_atomic_exchange; } else if (strcmp(ir->callee_name(), "__intrinsic_image_atomic_comp_swap") == 0) { op = nir_intrinsic_image_atomic_comp_swap; + } else if (strcmp(ir->callee_name(), "__intrinsic_memory_barrier") == 0) { + op = nir_intrinsic_memory_barrier; } else { unreachable("not reached"); } @@ -721,6 +733,8 @@ nir_visitor::visit(ir_call *ir) ir->return_deref->type->vector_elements, NULL); break; } + case nir_intrinsic_memory_barrier: + break; default: unreachable("not reached"); } @@ -926,13 +940,9 @@ nir_visitor::evaluate_rvalue(ir_rvalue* ir) } nir_dest *dest = get_instr_dest(this->result); - assert(dest->is_ssa); - nir_src src = NIR_SRC_INIT; - src.is_ssa = true; - src.ssa = &dest->ssa; - return src; + return nir_src_for_ssa(&dest->ssa); } nir_alu_instr * @@ -985,11 +995,21 @@ nir_visitor::visit(ir_expression *ir) } else { op = nir_intrinsic_load_ubo_indirect; } + + ir_constant *const_block = ir->operands[0]->as_constant(); + assert(const_block && "can't figure out descriptor set index"); + unsigned index = const_block->value.u[0]; + unsigned set = sh->UniformBlocks[index].Set; + unsigned binding = sh->UniformBlocks[index].Binding; + nir_intrinsic_instr *load = nir_intrinsic_instr_create(this->shader, op); load->num_components = ir->type->vector_elements; - load->const_index[0] = const_index ? const_index->value.u[0] : 0; /* base offset */ - load->const_index[1] = 1; /* number of vec4's */ - load->src[0] = evaluate_rvalue(ir->operands[0]); + load->const_index[0] = set; + load->const_index[1] = const_index ? const_index->value.u[0] : 0; /* base offset */ + nir_load_const_instr *load_binding = nir_load_const_instr_create(shader, 1); + load_binding->value.u[0] = binding; + nir_instr_insert_after_cf_list(this->cf_node_list, &load_binding->instr); + load->src[0] = nir_src_for_ssa(&load_binding->def); if (!const_index) load->src[1] = evaluate_rvalue(ir->operands[1]); add_instr(&load->instr, ir->type->vector_elements); @@ -1166,6 +1186,7 @@ nir_visitor::visit(ir_expression *ir) case ir_unop_bitcast_f2i: case ir_unop_bitcast_u2f: case ir_unop_bitcast_f2u: + case ir_unop_subroutine_to_int: /* no-op */ emit(nir_op_imov, dest_size, srcs); break; @@ -1889,3 +1910,11 @@ nir_visitor::visit(ir_dereference_array *ir) ralloc_steal(this->deref_tail, deref); this->deref_tail = &deref->deref; } + +void +nir_visitor::visit(ir_barrier *ir) +{ + nir_intrinsic_instr *instr = + nir_intrinsic_instr_create(this->shader, nir_intrinsic_barrier); + nir_instr_insert_after_cf_list(this->cf_node_list, &instr->instr); +}