r600g: the code to check whether a new vertex shader is needed was wrong
authorDave Airlie <airlied@redhat.com>
Mon, 4 Oct 2010 06:24:59 +0000 (16:24 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 4 Oct 2010 06:24:59 +0000 (16:24 +1000)
this code was memcmp'ing two structs, but refcounting one of them afterwards,
so any subsequent memcmp was never going to work.

again this stops unnecessary uploads of vertex program,

src/gallium/drivers/r600/r600_shader.c

index 5709426ea7576759abcbb7aab2d888dc3395a1dd..21b9180582408abb88f0bf6116c09d6dc4c0bdd5 100644 (file)
@@ -245,7 +245,9 @@ static int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader
 
        if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
                return 0;
-       if (!memcmp(&rshader->vertex_elements, rctx->vertex_elements, sizeof(struct r600_vertex_element))) {
+       /* doing a full memcmp fell over the refcount */
+       if ((rshader->vertex_elements.count == rctx->vertex_elements->count) &&
+           (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) {
                return 0;
        }
        rshader->vertex_elements = *rctx->vertex_elements;