Merge remote-tracking branch 'mesa-public/master' into vulkan
[mesa.git] / src / glsl / nir / glsl_to_nir.cpp
index 77327b6c74f133b59d9164d788412447b8cb5387..27dabd3b8f2869fd77836e6298bd100eaf52446e 100644 (file)
@@ -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 *);
@@ -83,6 +83,8 @@ private:
 
    bool supports_ints;
 
+   struct gl_shader *sh;
+
    nir_shader *shader;
    gl_shader_stage stage;
    nir_function_impl *impl;
@@ -133,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);
@@ -141,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,
@@ -325,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;
@@ -990,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);