mesa: fix memcpy() and memset(0) of non-trivial structs

Signed-off-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
Eric Engestrom 2018-10-28 17:50:47 +00:00
parent 69eb6d58e8
commit 6000895e2d
3 changed files with 12 additions and 7 deletions

View File

@ -2084,7 +2084,7 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
emit_asm(ir, TGSI_OPCODE_USHR, st_dst_reg(index_reg), offset, emit_asm(ir, TGSI_OPCODE_USHR, st_dst_reg(index_reg), offset,
st_src_reg_for_int(4)); st_src_reg_for_int(4));
cbuf.reladdr = ralloc(mem_ctx, st_src_reg); cbuf.reladdr = ralloc(mem_ctx, st_src_reg);
memcpy(cbuf.reladdr, &index_reg, sizeof(index_reg)); *cbuf.reladdr = index_reg;
} }
if (const_uniform_block) { if (const_uniform_block) {
@ -2093,7 +2093,7 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
} else { } else {
/* Relative/variable constant buffer */ /* Relative/variable constant buffer */
cbuf.reladdr2 = ralloc(mem_ctx, st_src_reg); cbuf.reladdr2 = ralloc(mem_ctx, st_src_reg);
memcpy(cbuf.reladdr2, &op[0], sizeof(st_src_reg)); *cbuf.reladdr2 = op[0];
} }
cbuf.has_index2 = true; cbuf.has_index2 = true;
@ -2804,12 +2804,12 @@ glsl_to_tgsi_visitor::visit(ir_dereference_array *ir)
if (is_2D) { if (is_2D) {
src.reladdr2 = ralloc(mem_ctx, st_src_reg); src.reladdr2 = ralloc(mem_ctx, st_src_reg);
memcpy(src.reladdr2, &index_reg, sizeof(index_reg)); *src.reladdr2 = index_reg;
src.index2D = 0; src.index2D = 0;
src.has_index2 = true; src.has_index2 = true;
} else { } else {
src.reladdr = ralloc(mem_ctx, st_src_reg); src.reladdr = ralloc(mem_ctx, st_src_reg);
memcpy(src.reladdr, &index_reg, sizeof(index_reg)); *src.reladdr = index_reg;
} }
} }
@ -4146,8 +4146,7 @@ glsl_to_tgsi_visitor::get_deref_offsets(ir_dereference *ir,
unsigned location = 0; unsigned location = 0;
ir_variable *var = ir->variable_referenced(); ir_variable *var = ir->variable_referenced();
memset(reladdr, 0, sizeof(*reladdr)); reladdr->reset();
reladdr->file = PROGRAM_UNDEFINED;
*base = 0; *base = 0;
*array_size = 1; *array_size = 1;

View File

@ -116,7 +116,7 @@ st_src_reg::st_src_reg(gl_register_file file, int index, enum glsl_base_type typ
this->is_double_vertex_input = false; this->is_double_vertex_input = false;
} }
st_src_reg::st_src_reg() void st_src_reg::reset()
{ {
this->type = GLSL_TYPE_ERROR; this->type = GLSL_TYPE_ERROR;
this->file = PROGRAM_UNDEFINED; this->file = PROGRAM_UNDEFINED;
@ -133,6 +133,11 @@ st_src_reg::st_src_reg()
this->is_double_vertex_input = false; this->is_double_vertex_input = false;
} }
st_src_reg::st_src_reg()
{
reset();
}
st_src_reg::st_src_reg(const st_src_reg &reg) st_src_reg::st_src_reg(const st_src_reg &reg)
{ {
*this = reg; *this = reg;

View File

@ -51,6 +51,7 @@ public:
st_src_reg(); st_src_reg();
st_src_reg(const st_src_reg &reg); st_src_reg(const st_src_reg &reg);
void operator=(const st_src_reg &reg); void operator=(const st_src_reg &reg);
void reset();
explicit st_src_reg(st_dst_reg reg); explicit st_src_reg(st_dst_reg reg);