void *evergreen_create_compute_state( struct pipe_context *ctx_, const const struct pipe_compute_state *cso) { 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; const unsigned char * code; COMPUTE_DBG("*** evergreen_create_compute_state\n"); header = cso->prog; code = cso->prog + sizeof(struct pipe_llvm_program_header); #endif shader->ctx = (struct r600_context*)ctx; shader->resources = (struct evergreen_compute_resource*) CALLOC(sizeof(struct evergreen_compute_resource), get_compute_resource_num()); shader->local_size = cso->req_local_mem; ///TODO: assert it shader->private_size = cso->req_private_mem; shader->input_size = cso->req_input_mem; #ifdef HAVE_OPENCL shader->mod = llvm_parse_bitcode(code, header->num_bytes); r600_compute_shader_create(ctx_, shader->mod, &shader->bc); #endif shader->shader_code_bo = r600_compute_buffer_alloc_vram(ctx->screen, shader->bc.ndw * 4); p = ctx->ws->buffer_map(shader->shader_code_bo->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE); memcpy(p, shader->bc.bytecode, shader->bc.ndw * 4); ctx->ws->buffer_unmap(shader->shader_code_bo->cs_buf); return shader; }
void *evergreen_create_compute_state( struct pipe_context *ctx_, const const struct pipe_compute_state *cso) { struct r600_context *ctx = (struct r600_context *)ctx_; #ifdef HAVE_OPENCL const struct pipe_llvm_program_header * header; const unsigned char * code; header = cso->prog; code = cso->prog + sizeof(struct pipe_llvm_program_header); #endif if (!ctx->screen->screen.get_param(&ctx->screen->screen, PIPE_CAP_COMPUTE)) { fprintf(stderr, "Compute is not supported\n"); return NULL; } struct r600_pipe_compute *shader = CALLOC_STRUCT(r600_pipe_compute); shader->ctx = (struct r600_context*)ctx; shader->resources = (struct evergreen_compute_resource*) CALLOC(sizeof(struct evergreen_compute_resource), get_compute_resource_num()); shader->local_size = cso->req_local_mem; ///TODO: assert it shader->private_size = cso->req_private_mem; shader->input_size = cso->req_input_mem; #ifdef HAVE_OPENCL shader->mod = llvm_parse_bitcode(code, header->num_bytes); r600_compute_shader_create(ctx_, shader->mod, &shader->bc); #endif return shader; }