summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2012-09-19 21:17:46 +0000
committerTom Stellard <thomas.stellard@amd.com>2012-09-19 21:17:46 +0000
commit4555c2529407d304a24d45950c335077ad67fd68 (patch)
tree90e3616af231a5e4f1da767605c78e1d415fd571
parentf46de1252826395f2075a2eb244af8b864d360b5 (diff)
XXX: Compile on demandSep19-Compute
-rw-r--r--src/gallium/drivers/r600/evergreen_compute.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index 0d8be8f4f9b..29dba0838fb 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -123,7 +123,6 @@ void *evergreen_create_compute_state(
{
struct r600_context *ctx = (struct r600_context *)ctx_;
struct r600_pipe_compute *shader = CALLOC_STRUCT(r600_pipe_compute);
- void *p;
#ifdef HAVE_OPENCL
const struct pipe_llvm_program_header * header;
@@ -152,13 +151,6 @@ void *evergreen_create_compute_state(
struct r600_kernel *kernel = &shader->kernels[i];
kernel->llvm_module = llvm_get_kernel_module(i, code,
header->num_bytes);
- r600_compute_shader_create(ctx_, kernel->llvm_module, &kernel->bc);
- kernel->code_bo = r600_compute_buffer_alloc_vram(ctx->screen,
- kernel->bc.ndw * 4);
- p = ctx->ws->buffer_map(kernel->code_bo->cs_buf, ctx->cs,
- PIPE_TRANSFER_WRITE);
- memcpy(p, kernel->bc.bytecode, kernel->bc.ndw * 4);
- ctx->ws->buffer_unmap(kernel->code_bo->cs_buf);
}
#endif
return shader;
@@ -459,9 +451,22 @@ static void evergreen_launch_grid(
uint32_t pc, const void *input)
{
struct r600_context *ctx = (struct r600_context *)ctx_;
+ struct r600_pipe_compute *shader = ctx->cs_shader_state.shader;
+ void *p;
COMPUTE_DBG("*** evergreen_launch_grid: pc = %u\n", pc);
+ if (!shader->kernels[pc].code_bo) {
+ struct r600_kernel *kernel = &shader->kernels[pc];
+ r600_compute_shader_create(ctx_, kernel->llvm_module, &kernel->bc);
+ kernel->code_bo = r600_compute_buffer_alloc_vram(ctx->screen,
+ kernel->bc.ndw * 4);
+ p = ctx->ws->buffer_map(kernel->code_bo->cs_buf, ctx->cs,
+ PIPE_TRANSFER_WRITE);
+ memcpy(p, kernel->bc.bytecode, kernel->bc.ndw * 4);
+ ctx->ws->buffer_unmap(kernel->code_bo->cs_buf);
+ }
+
ctx->cs_shader_state.kernel_index = pc;
evergreen_compute_upload_input(ctx_, block_layout, grid_layout, input);
compute_emit_cs(ctx, block_layout, grid_layout);