Exemplo n.º 1
0
static void evergreen_launch_grid(
		struct pipe_context *ctx_,
		const uint *block_layout, const uint *grid_layout,
		uint32_t pc, const void *input)
{
	struct r600_context *ctx = (struct r600_context *)ctx_;

#ifdef HAVE_OPENCL 
	COMPUTE_DBG(ctx->screen, "*** evergreen_launch_grid: pc = %u\n", pc);

	struct r600_pipe_compute *shader = ctx->cs_shader_state.shader;
	if (!shader->kernels[pc].code_bo) {
		void *p;
		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 = r600_buffer_mmap_sync_with_rings(ctx, kernel->code_bo, PIPE_TRANSFER_WRITE);
		memcpy(p, kernel->bc.bytecode, kernel->bc.ndw * 4);
		ctx->ws->buffer_unmap(kernel->code_bo->cs_buf);
	}
#endif

	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);
}
Exemplo 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_;
	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;
}
Exemplo n.º 3
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;
}