softpipe: don't ignore pipe_constant_buffer::buffer_offset
authorBrian Paul <brianp@vmware.com>
Thu, 25 Jul 2013 15:13:47 +0000 (09:13 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 31 Jul 2013 12:53:48 +0000 (06:53 -0600)
This was never a problem since the Mesa state tracker always gives
us a user-space constant buffer with buffer_offset=0.  But if another
state tracker ever gave us a "HW" constant buffer with non-zero
buffer_offset we'd mis-render.

Also, use the correct buffer size.  And move an assertion to the
top of the function.

Reviewed-by: Marek Olšák <maraeo@gmail.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/drivers/softpipe/sp_state_shader.c

index 79bd597ebcb89dffee8d5da64e2172833959cda1..d80955e696c673515ea6be3cc275e98d202d4864 100644 (file)
@@ -347,6 +347,8 @@ softpipe_set_constant_buffer(struct pipe_context *pipe,
    unsigned size;
    const void *data;
 
+   assert(shader < PIPE_SHADER_TYPES);
+
    if (cb && cb->user_buffer) {
       constants = softpipe_user_buffer_create(pipe->screen,
                                               (void *) cb->user_buffer,
@@ -354,10 +356,10 @@ softpipe_set_constant_buffer(struct pipe_context *pipe,
                                               PIPE_BIND_CONSTANT_BUFFER);
    }
 
-   size = constants ? constants->width0 : 0;
+   size = cb ? cb->buffer_size : 0;
    data = constants ? softpipe_resource(constants)->data : NULL;
-
-   assert(shader < PIPE_SHADER_TYPES);
+   if (data)
+      data = (const char *) data + cb->buffer_offset;
 
    draw_flush(softpipe->draw);