mesa: fix memcpy() and memset(0) of non-trivial structs
authorEric Engestrom <eric.engestrom@intel.com>
Sun, 28 Oct 2018 17:50:47 +0000 (17:50 +0000)
committerEric Engestrom <eric.engestrom@intel.com>
Tue, 30 Oct 2018 18:10:59 +0000 (18:10 +0000)
Signed-off-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/mesa/state_tracker/st_glsl_to_tgsi.cpp
src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp
src/mesa/state_tracker/st_glsl_to_tgsi_private.h

index dea91c7a189a26eea1f1e6b96d59b1e3fc3c7e2f..a61d4ddaf14f2fdaecdff082e45c8b622fb77a95 100644 (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,
                  st_src_reg_for_int(4));
             cbuf.reladdr = ralloc(mem_ctx, st_src_reg);
-            memcpy(cbuf.reladdr, &index_reg, sizeof(index_reg));
+            *cbuf.reladdr = index_reg;
          }
 
          if (const_uniform_block) {
@@ -2093,7 +2093,7 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
          } else {
             /* Relative/variable constant buffer */
             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;
 
@@ -2804,12 +2804,12 @@ glsl_to_tgsi_visitor::visit(ir_dereference_array *ir)
 
       if (is_2D) {
          src.reladdr2 = ralloc(mem_ctx, st_src_reg);
-         memcpy(src.reladdr2, &index_reg, sizeof(index_reg));
+         *src.reladdr2 = index_reg;
          src.index2D = 0;
          src.has_index2 = true;
       } else {
          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;
    ir_variable *var = ir->variable_referenced();
 
-   memset(reladdr, 0, sizeof(*reladdr));
-   reladdr->file = PROGRAM_UNDEFINED;
+   reladdr->reset();
 
    *base = 0;
    *array_size = 1;
index dabb0362a772414b076d9ec3595bf81e67f66d89..fd3941b3cc35310b68222c10a7294bcd50864b7d 100644 (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;
 }
 
-st_src_reg::st_src_reg()
+void st_src_reg::reset()
 {
    this->type = GLSL_TYPE_ERROR;
    this->file = PROGRAM_UNDEFINED;
@@ -133,6 +133,11 @@ st_src_reg::st_src_reg()
    this->is_double_vertex_input = false;
 }
 
+st_src_reg::st_src_reg()
+{
+   reset();
+}
+
 st_src_reg::st_src_reg(const st_src_reg &reg)
 {
    *this = reg;
index 356d029f470d44ac581b140f279b596a0b820492..c82de95142705010a705d03b243145c4b7811f07 100644 (file)
@@ -51,6 +51,7 @@ public:
    st_src_reg();
    st_src_reg(const st_src_reg &reg);
    void operator=(const st_src_reg &reg);
+   void reset();
 
    explicit st_src_reg(st_dst_reg reg);