Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}