r600g/compute: Added missing address space checking of kernel parameters
authorJonathan Charest <jcharest+mesa-dev@gmail.com>
Mon, 22 Jul 2013 13:24:56 +0000 (09:24 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Tue, 30 Jul 2013 14:09:16 +0000 (07:09 -0700)
To have non-static buffers in local memory, it is necessary to pass them
as arguments to the kernel.

For r600, the correct lds size must be set to the SQ_LDS_ALLOC register.
The correct size is the clover size plus the size reported by the
compiler.

Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/r600/evergreen_compute.c

index f76fc9cc25e92ee43ff3acb1e06724bfaf082fa7..9b2bae3e8418ebf63093222d23c74f83aea2e37a 100644 (file)
@@ -211,8 +211,7 @@ void *evergreen_create_compute_state(
 #endif
 
        shader->ctx = (struct r600_context*)ctx;
-       /* XXX: We ignore cso->req_local_mem, because we compute this value
-        * ourselves on a per-kernel basis. */
+       shader->local_size = cso->req_local_mem;
        shader->private_size = cso->req_private_mem;
        shader->input_size = cso->req_input_mem;
 
@@ -334,7 +333,7 @@ static void evergreen_emit_direct_dispatch(
        unsigned wave_divisor = (16 * num_pipes);
        int group_size = 1;
        int grid_size = 1;
-       unsigned lds_size = shader->active_kernel->bc.nlds_dw;
+       unsigned lds_size = shader->local_size / 4 + shader->active_kernel->bc.nlds_dw;
 
        /* Calculate group_size/grid_size */
        for (i = 0; i < 3; i++) {