diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_vertex.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_vertex.cpp index 47dc8fab612..86c4c38e2ac 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_vertex.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_vertex.cpp @@ -51,7 +51,8 @@ VertexShaderFromNir::VertexShaderFromNir(r600_pipe_shader *sh, m_enabled_stream_buffers_mask(0), m_so_info(&sel.so), m_vertex_id(), - m_key(key) + m_key(key), + m_max_attrib(0) { // reg 0 is used in the fetch shader increment_reserved_registers(); @@ -77,6 +78,9 @@ bool VertexShaderFromNir::do_process_inputs(nir_variable *input) if (input->data.location < VERT_ATTRIB_MAX) { increment_reserved_registers(); + if (m_max_attrib < input->data.driver_location) + m_max_attrib = input->data.driver_location; + return true; } fprintf(stderr, "r600-NIR-VS: Unimplemented process_inputs for %d\n", input->data.location); @@ -115,6 +119,16 @@ bool VertexShaderFromNir::do_allocate_reserved_registers() inject_register(0, 1, m_rel_vertex_id, false); } + m_attribs.resize(4 * m_max_attrib + 4); + for (unsigned i = 0; i < m_max_attrib + 1; ++i) { + for (unsigned k = 0; k < 4; ++k) { + auto gpr = std::make_shared(i + 1, k); + gpr->set_as_input(); + m_attribs[4 * i + k] = gpr; + inject_register(i + 1, k, gpr, false); + } + } + return true; } @@ -191,9 +205,7 @@ bool VertexShaderFromNir::do_emit_load_deref(const nir_variable *in_var, nir_int { if (in_var->data.location < VERT_ATTRIB_MAX) { for (unsigned i = 0; i < nir_dest_num_components(instr->dest); ++i) { - auto s = new GPRValue(in_var->data.driver_location + 1, i); - s->set_as_input(); - auto src = PValue(s); + auto src = m_attribs[4 * in_var->data.driver_location + i]; if (i == 0) set_input(in_var->data.driver_location, src); diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_vertex.h b/src/gallium/drivers/r600/sfn/sfn_shader_vertex.h index 4998a25f6b2..57e2f20adc5 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_vertex.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader_vertex.h @@ -70,9 +70,11 @@ private: PValue m_instance_id; PValue m_rel_vertex_id; PValue m_primitive_id; + std::vector m_attribs; r600_shader_key m_key; std::unique_ptr m_export_processor; + unsigned m_max_attrib; }; }