r600g: Correctly initialize the shader key, v2
authorLauri Kasanen <cand@gmx.com>
Fri, 3 May 2013 13:55:49 +0000 (16:55 +0300)
committerAndreas Boll <andreas.boll.dev@gmail.com>
Fri, 3 May 2013 17:28:57 +0000 (19:28 +0200)
Assigning a struct only copies the members - any padding is left as is.

Thus this code:

struct foo_t foo;
foo = bar;

leaves the padding of foo intact, ie uninitialized random garbage.

This patch fixes constant shader recompiles by initializing the struct
to zero. For completeness, memcpy is used to copy the key to the shader
struct.

NOTE: This is a candidate for the stable branches.

Signed-off-by: Lauri Kasanen <cand@gmx.com>
Reviewed-by: Marek Olšák <maraeo@gmail.com>
Signed-off-by: Andreas Boll <andreas.boll.dev@gmail.com>
src/gallium/drivers/r600/r600_state_common.c

index 87a2e2e55e7ce4efea17825d3cce1059c1376754..fbac57688be6b1f1d10b4f6c9f43a4667e2bd110 100644 (file)
@@ -715,6 +715,7 @@ static int r600_shader_select(struct pipe_context *ctx,
        struct r600_pipe_shader * shader = NULL;
        int r;
 
+       memset(&key, 0, sizeof(key));
        key = r600_shader_selector_key(ctx, sel);
 
        /* Check if we don't need to change anything.
@@ -762,7 +763,7 @@ static int r600_shader_select(struct pipe_context *ctx,
                        key = r600_shader_selector_key(ctx, sel);
                }
 
-               shader->key = key;
+               memcpy(&shader->key, &key, sizeof(key));
                sel->num_shaders++;
        }