diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2013-07-25 10:13:47 -0700 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2013-07-25 10:13:47 -0700 |
commit | 4d3acdda71b6f1f27716da23628dba03aa70168e (patch) | |
tree | 52f943d68170b0c392940728115f5339a33e7174 | |
parent | 9f447f72ad95e5aa88b55a99f3ae72bb81461676 (diff) |
XxX: IMgae WIP
-rw-r--r-- | src/gallium/drivers/r600/evergreen_compute.c | 47 | ||||
-rw-r--r-- | src/gallium/drivers/r600/evergreen_state.c | 28 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state_common.c | 13 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/memory.cpp | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/llvm/invocation.cpp | 21 |
6 files changed, 77 insertions, 36 deletions
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index f76fc9cc25e..e8833c01fb1 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -462,6 +462,9 @@ static void compute_emit_cs(struct r600_context *ctx, const uint *block_layout, /* Emit constant buffer state */ r600_emit_atom(ctx, &ctx->constbuf_state[PIPE_SHADER_COMPUTE].atom); + /* Emit sampler view state */ + r600_emit_atom(ctx, &ctx->samplers[PIPE_SHADER_COMPUTE].views.atom); + /* Emit compute shader state */ r600_emit_atom(ctx, &ctx->cs_shader_state.atom); @@ -580,29 +583,31 @@ static void evergreen_set_compute_resources(struct pipe_context * ctx_, struct r600_context *ctx = (struct r600_context *)ctx_; struct r600_surface **resources = (struct r600_surface **)surfaces; + if (!surfaces) { return; } COMPUTE_DBG(ctx->screen, "*** evergreen_set_compute_resources: start = %u count = %u\n", start, count); for (int i = 0; i < count; i++) { - /* The First two vertex buffers are reserved for parameters and - * global buffers. */ - unsigned vtx_id = 2 + i; - if (resources[i]) { - struct r600_resource_global *buffer = - (struct r600_resource_global*) - resources[i]->base.texture; - if (resources[i]->base.writable) { - assert(i+1 < 12); - - evergreen_set_rat(ctx->cs_shader_state.shader, i+1, - (struct r600_resource *)resources[i]->base.texture, - buffer->chunk->start_in_dw*4, - resources[i]->base.texture->width0); + struct pipe_surface *surface = surfaces[i]; + if (surface) { + struct r600_surface *rsurface = + (struct r600_surface*)surface; + struct pipe_resource *tex = surface->texture; + if (tex->target == PIPE_TEXTURE_2D) { + #if 0 + pipe_sampler_view info; + struct pipe_sampler_view *sampler_view; + // Create the sampler view + u_sampler_view_default_template(&info, tex, tex->format); + sampler_view = ctx_->create_sampler_view(ctx_, tex, &info); + #endif + // Setup the color surface as a RAT + ctx->framebuffer.state.cbufs[1 + i] = surface; + evergreen_init_color_surface_rat(ctx, rsurface); + ctx->compute_cb_target_mask |= (0xf << (i * 4)); + ctx->framebuffer.state.nr_cbufs = + MAX2(i + 1, ctx->framebuffer.state.nr_cbufs); } - - evergreen_cs_set_vertex_buffer(ctx, vtx_id, - buffer->chunk->start_in_dw * 4, - resources[i]->base.texture); } } } @@ -631,7 +636,7 @@ static void evergreen_bind_compute_sampler_states( unsigned num_samplers, void **samplers_) { - struct compute_sampler_state ** samplers = + struct compute_sampler_state **samplers = (struct compute_sampler_state **)samplers_; for (int i = 0; i < num_samplers; i++) { @@ -874,8 +879,8 @@ void evergreen_init_compute_state_functions(struct r600_context *ctx) ctx->context.bind_compute_state = evergreen_bind_compute_state; // ctx->context.create_sampler_view = evergreen_compute_create_sampler_view; ctx->context.set_compute_resources = evergreen_set_compute_resources; - ctx->context.set_compute_sampler_views = evergreen_set_cs_sampler_view; - ctx->context.bind_compute_sampler_states = evergreen_bind_compute_sampler_states; +// ctx->context.set_compute_sampler_views = evergreen_set_cs_sampler_view; +// ctx->context.bind_compute_sampler_states = evergreen_bind_compute_sampler_states; ctx->context.set_global_binding = evergreen_set_global_binding; ctx->context.launch_grid = evergreen_launch_grid; diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 2d8aad86af3..09aadada8c6 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -2574,7 +2574,8 @@ static void evergreen_emit_cs_constant_buffers(struct r600_context *rctx, struct static void evergreen_emit_sampler_views(struct r600_context *rctx, struct r600_samplerview_state *state, - unsigned resource_id_base) + unsigned resource_id_base, + unsigned pkt_flags) { struct radeon_winsys_cs *cs = rctx->rings.gfx.cs; uint32_t dirty_mask = state->dirty_mask; @@ -2587,17 +2588,17 @@ static void evergreen_emit_sampler_views(struct r600_context *rctx, rview = state->views[resource_index]; assert(rview); - r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 8, 0)); + r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 8, 0) | pkt_flags); r600_write_value(cs, (resource_id_base + resource_index) * 8); r600_write_array(cs, 8, rview->tex_resource_words); reloc = r600_context_bo_reloc(rctx, &rctx->rings.gfx, rview->tex_resource, RADEON_USAGE_READ); - r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); + r600_write_value(cs, PKT3(PKT3_NOP, 0, 0) | pkt_flags); r600_write_value(cs, reloc); if (!rview->skip_mip_address_reloc) { - r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); + r600_write_value(cs, PKT3(PKT3_NOP, 0, 0) | pkt_flags); r600_write_value(cs, reloc); } } @@ -2606,17 +2607,29 @@ static void evergreen_emit_sampler_views(struct r600_context *rctx, static void evergreen_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) { - evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views, 176 + R600_MAX_CONST_BUFFERS); + evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views, + 176 + R600_MAX_CONST_BUFFERS, + 0 /* PKT3 flags */); } static void evergreen_emit_gs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) { - evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views, 336 + R600_MAX_CONST_BUFFERS); + evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views, + 336 + R600_MAX_CONST_BUFFERS, + 0 /* PKT3 flags */); } static void evergreen_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom) { - evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views, R600_MAX_CONST_BUFFERS); + evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views, + R600_MAX_CONST_BUFFERS, + 0 /* PKT3 flags */); +} + +static void evergreen_emit_cs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) +{ + evergreen_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_COMPUTE].views, + 816 + 2, RADEON_CP_PACKET3_COMPUTE_MODE); } static void evergreen_emit_sampler_states(struct r600_context *rctx, @@ -3840,6 +3853,7 @@ void evergreen_init_state_functions(struct r600_context *rctx) r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views.atom, id++, evergreen_emit_vs_sampler_views, 0); r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views.atom, id++, evergreen_emit_gs_sampler_views, 0); r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views.atom, id++, evergreen_emit_ps_sampler_views, 0); + r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_COMPUTE].views.atom, id++, evergreen_emit_cs_sampler_views, 0); r600_init_atom(rctx, &rctx->vgt_state.atom, id++, r600_emit_vgt_state, 7); diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 349a6cb6cfb..683f48d3bbb 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -35,7 +35,7 @@ #include "r600_public.h" #include "r600_resource.h" -#define R600_NUM_ATOMS 41 +#define R600_NUM_ATOMS 42 /* the number of CS dwords for flushing and drawing */ #define R600_MAX_FLUSH_CS_DWORDS 16 diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index ea5a4e7627c..a9156c13af7 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -447,6 +447,11 @@ static void r600_bind_ps_sampler_states(struct pipe_context *ctx, unsigned count r600_bind_sampler_states(ctx, PIPE_SHADER_FRAGMENT, 0, count, states); } +static void r600_bind_cs_sampler_states(struct pipe_context *ctx, unsigned count, void **states) +{ + r600_bind_sampler_states(ctx, PIPE_SHADER_COMPUTE, 0, count, states); +} + static void r600_delete_sampler_state(struct pipe_context *ctx, void *state) { free(state); @@ -661,6 +666,12 @@ static void r600_set_ps_sampler_views(struct pipe_context *ctx, unsigned count, r600_set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, count, views); } +static void r600_set_cs_sampler_views(struct pipe_context *ctx, unsigned count, + struct pipe_sampler_view **views) +{ + r600_set_sampler_views(ctx, PIPE_SHADER_COMPUTE, 0, count, views); +} + static void r600_set_viewport_states(struct pipe_context *ctx, unsigned start_slot, unsigned num_viewports, @@ -1741,6 +1752,7 @@ void r600_init_common_state_functions(struct r600_context *rctx) rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements; rctx->context.bind_vertex_sampler_states = r600_bind_vs_sampler_states; rctx->context.bind_vs_state = r600_bind_vs_state; + rctx->context.bind_compute_sampler_states = r600_bind_cs_sampler_states; rctx->context.delete_blend_state = r600_delete_blend_state; rctx->context.delete_depth_stencil_alpha_state = r600_delete_dsa_state; rctx->context.delete_fs_state = r600_delete_ps_state; @@ -1758,6 +1770,7 @@ void r600_init_common_state_functions(struct r600_context *rctx) rctx->context.set_index_buffer = r600_set_index_buffer; rctx->context.set_fragment_sampler_views = r600_set_ps_sampler_views; rctx->context.set_vertex_sampler_views = r600_set_vs_sampler_views; + rctx->context.set_compute_sampler_views = r600_set_cs_sampler_views; rctx->context.sampler_view_destroy = r600_sampler_view_destroy; rctx->context.texture_barrier = r600_texture_barrier; rctx->context.create_stream_output_target = r600_create_so_target; diff --git a/src/gallium/state_trackers/clover/core/memory.cpp b/src/gallium/state_trackers/clover/core/memory.cpp index 63050b3d589..29785250264 100644 --- a/src/gallium/state_trackers/clover/core/memory.cpp +++ b/src/gallium/state_trackers/clover/core/memory.cpp @@ -174,7 +174,7 @@ image2d::image2d(clover::context &ctx, cl_mem_flags flags, const cl_image_format *format, size_t width, size_t height, size_t row_pitch, void *host_ptr) : - image(ctx, flags, format, width, height, 0, + image(ctx, flags, format, width, height, 1, row_pitch, 0, height * row_pitch, host_ptr) { } diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 9fae83fe457..e8d33f2dc92 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -251,6 +251,7 @@ namespace { } #endif + mod->dump(); // Add a function internalizer pass. // // By default, the function internalizer pass will look for a function @@ -329,12 +330,20 @@ namespace { // target. I think we need to ask clang what these are. For now, // pretend everything is in the global address space. llvm::Type *elem_type = arg_type->getPointerElementType(); - if (elem_type->isStructTy() && - elem_type->getStructName().equals("opencl.image2d_t")) { - args.push_back(module::argument(module::argument::image2d_wr, - arg_size, target_size, target_align, - module::argument::zero_ext)); - continue; + if (elem_type->isStructTy()) { + const llvm::StringRef &type_name = elem_type->getStructName(); + + if (type_name.equals("opencl.image2d_t")) { + args.push_back(module::argument(module::argument::image2d_rd, + arg_size, target_size, target_align, + module::argument::zero_ext)); + continue; + } else if (type_name.equals("opencl.sampler_t")) { + args.push_back(module::argument(module::argument::sampler, + arg_size, target_size, target_align, + module::argument::zero_ext)); + continue; + } } unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace(); switch (address_space) { |