[Mesa-dev] [PATCH 13/18] i965/fs: Support compute programs in fs_visitor
Kristian Høgsberg
krh at bitplanet.net
Mon Mar 16 22:57:14 PDT 2015
On Sat, Mar 14, 2015 at 9:54 PM, Jordan Justen
<jordan.l.justen at intel.com> wrote:
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_fs.cpp | 82 +++++++++++++++++++++++++++-
> src/mesa/drivers/dri/i965/brw_fs.h | 10 ++++
> src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 23 ++++++++
> 3 files changed, 112 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 8702ea8..6427ffb 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -1699,9 +1699,15 @@ fs_visitor::assign_curb_setup()
> if (dispatch_width == 8) {
> prog_data->dispatch_grf_start_reg = payload.num_regs;
> } else {
> - assert(stage == MESA_SHADER_FRAGMENT);
> - brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
> - prog_data->dispatch_grf_start_reg_16 = payload.num_regs;
> + if (stage == MESA_SHADER_FRAGMENT) {
> + brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
> + prog_data->dispatch_grf_start_reg_16 = payload.num_regs;
> + } else if (stage == MESA_SHADER_COMPUTE) {
> + brw_cs_prog_data *prog_data = (brw_cs_prog_data*) this->prog_data;
> + prog_data->dispatch_grf_start_reg_16 = payload.num_regs;
> + } else {
> + unreachable("Unsupported shader type!");
> + }
> }
>
> prog_data->curb_read_length = ALIGN(stage_prog_data->nr_params, 8) / 8;
> @@ -3634,6 +3640,14 @@ fs_visitor::setup_vs_payload()
> }
>
> void
> +fs_visitor::setup_cs_payload()
> +{
> + assert(brw->gen >= 7);
> +
> + payload.num_regs = 1;
> +}
> +
> +void
> fs_visitor::assign_binding_table_offsets()
> {
> assert(stage == MESA_SHADER_FRAGMENT);
> @@ -3969,6 +3983,68 @@ fs_visitor::run_fs()
> return !failed;
> }
>
> +bool
> +fs_visitor::run_cs()
> +{
> + assert(stage == MESA_SHADER_COMPUTE);
> +
> + sanity_param_count = prog->Parameters->NumParameters;
> +
> + assign_common_binding_table_offsets(0);
> +
> + setup_cs_payload();
> +
> + if (0) {
> + emit_dummy_fs();
> + } else if (brw->use_rep_send && dispatch_width == 16) {
> + emit_repclear_shader();
> + } else {
We don't need the dummy_fs or repclear shaders in run_cs().
Kristian
> + if (INTEL_DEBUG & DEBUG_SHADER_TIME)
> + emit_shader_time_begin();
> +
> + /* Generate CS IR for main(). (the visitor only descends into
> + * functions called "main").
> + */
> + if (shader) {
> + if (getenv("INTEL_USE_NIR") != NULL) {
> + emit_nir_code();
> + } else {
> + foreach_in_list(ir_instruction, ir, shader->base.ir) {
> + base_ir = ir;
> + this->result = reg_undef;
> + ir->accept(this);
> + }
> + }
> + }
> + base_ir = NULL;
> + if (failed)
> + return false;
> +
> + emit_cs_terminate();
> +
> + calculate_cfg();
> +
> + optimize();
> +
> + assign_curb_setup();
> +
> + fixup_3src_null_dest();
> + allocate_registers();
> +
> + if (failed)
> + return false;
> + }
> +
> + /* If any state parameters were appended, then ParameterValues could have
> + * been realloced, in which case the driver uniform storage set up by
> + * _mesa_associate_uniform_storage() would point to freed memory. Make
> + * sure that didn't happen.
> + */
> + assert(sanity_param_count == prog->Parameters->NumParameters);
> +
> + return !failed;
> +}
> +
> const unsigned *
> brw_wm_fs_emit(struct brw_context *brw,
> void *mem_ctx,
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index b8b26a4..5a243d0 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -89,6 +89,14 @@ public:
> struct gl_vertex_program *cp,
> unsigned dispatch_width);
>
> + fs_visitor(struct brw_context *brw,
> + void *mem_ctx,
> + const struct brw_cs_prog_key *key,
> + struct brw_cs_prog_data *prog_data,
> + struct gl_shader_program *shader_prog,
> + struct gl_compute_program *cp,
> + unsigned dispatch_width);
> +
> ~fs_visitor();
> void init();
>
> @@ -189,12 +197,14 @@ public:
>
> bool run_fs();
> bool run_vs();
> + bool run_cs();
> void optimize();
> void allocate_registers();
> void assign_binding_table_offsets();
> void setup_payload_gen4();
> void setup_payload_gen6();
> void setup_vs_payload();
> + void setup_cs_payload();
> void fixup_3src_null_dest();
> void assign_curb_setup();
> void calculate_urb_setup();
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 88df0a2..c3cf6ba 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -39,6 +39,7 @@
> #include "brw_context.h"
> #include "brw_eu.h"
> #include "brw_wm.h"
> +#include "brw_cs.h"
> #include "brw_vec4.h"
> #include "brw_fs.h"
> #include "main/uniforms.h"
> @@ -4025,6 +4026,25 @@ fs_visitor::fs_visitor(struct brw_context *brw,
> init();
> }
>
> +fs_visitor::fs_visitor(struct brw_context *brw,
> + void *mem_ctx,
> + const struct brw_cs_prog_key *key,
> + struct brw_cs_prog_data *prog_data,
> + struct gl_shader_program *shader_prog,
> + struct gl_compute_program *cp,
> + unsigned dispatch_width)
> + : backend_visitor(brw, shader_prog, &cp->Base, &prog_data->base,
> + MESA_SHADER_COMPUTE),
> + reg_null_f(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_F)),
> + reg_null_d(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_D)),
> + reg_null_ud(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_UD)),
> + key(key), prog_data(&prog_data->base),
> + dispatch_width(dispatch_width)
> +{
> + this->mem_ctx = mem_ctx;
> + init();
> +}
> +
> void
> fs_visitor::init()
> {
> @@ -4036,6 +4056,9 @@ fs_visitor::init()
> case MESA_SHADER_GEOMETRY:
> key_tex = &((const brw_vue_prog_key *) key)->tex;
> break;
> + case MESA_SHADER_COMPUTE:
> + key_tex = &((const brw_cs_prog_key*) key)->tex;
> + break;
> default:
> unreachable("unhandled shader stage");
> }
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list