[Mesa-dev] [PATCH 03/20] i965/fs: Implement lowering of logical surface instructions.
Jason Ekstrand
jason at jlekstrand.net
Wed Jul 22 09:56:15 PDT 2015
On Tue, Jul 21, 2015 at 9:38 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> ---
> src/mesa/drivers/dri/i965/brw_fs.cpp | 63 +++++++++++++++++++++++++++++++-----
> 1 file changed, 55 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index a996676..0b0c5e1 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -3881,6 +3881,20 @@ lower_sampler_logical_send(const fs_builder &bld, fs_inst *inst, opcode op)
> }
> }
>
> +/**
> + * Initialize the header present in some typed and untyped surface
> + * messages.
> + */
> +static fs_reg
> +emit_surface_header(const fs_builder &bld, const fs_reg &sample_mask)
> +{
> + fs_builder ubld = bld.exec_all().group(8, 0);
> + const fs_reg dst = ubld.vgrf(BRW_REGISTER_TYPE_UD);
> + ubld.MOV(dst, fs_reg(0));
> + ubld.MOV(component(dst, 7), sample_mask);
> + return dst;
> +}
> +
> static void
> lower_surface_logical_send(const fs_builder &bld, fs_inst *inst, opcode op,
> const fs_reg &sample_mask)
> @@ -3889,10 +3903,43 @@ lower_surface_logical_send(const fs_builder &bld, fs_inst *inst, opcode op,
> const fs_reg &addr = inst->src[0];
> const fs_reg &src = inst->src[1];
> const fs_reg &surface = inst->src[2];
> - const fs_reg &dims = inst->src[3];
> + const UNUSED fs_reg &dims = inst->src[3];
> const fs_reg &arg = inst->src[4];
>
> - assert(!"Not implemented");
> + /* Calculate the total number of components of the payload. */
> + const unsigned addr_sz = inst->components_read(0);
> + const unsigned src_sz = inst->components_read(1);
> + const unsigned header_sz = (sample_mask.file == BAD_FILE ? 0 : 1);
> + const unsigned sz = header_sz + addr_sz + src_sz;
> +
> + /* Allocate space for the payload. */
> + fs_reg *const components = new fs_reg[sz];
> + const fs_reg payload = bld.vgrf(BRW_REGISTER_TYPE_UD, sz);
> + unsigned n = 0;
> +
> + /* Construct the payload. */
> + if (header_sz)
> + components[n++] = emit_surface_header(bld, sample_mask);
> +
> + for (unsigned i = 0; i < addr_sz; i++)
> + components[n++] = offset(addr, bld, i);
> +
> + for (unsigned i = 0; i < src_sz; i++)
> + components[n++] = offset(src, bld, i);
> +
> + bld.LOAD_PAYLOAD(payload, components, sz, header_sz);
> +
> + /* Update the original instruction. */
> + inst->opcode = op;
> + inst->mlen = header_sz + (addr_sz + src_sz) * inst->exec_size / 8;
> + inst->header_size = header_sz;
> +
> + inst->src[0] = payload;
> + inst->src[1] = surface;
> + inst->src[2] = arg;
> + inst->resize_sources(3);
> +
> + delete[] components;
I don't think this is correct. Unless something has changed, the
fs_inst constructor that takes an array doesn't make a copy so you
have to ralloc the array and *not* delete it.
> }
>
> bool
> @@ -3965,37 +4012,37 @@ fs_visitor::lower_logical_sends()
> case SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL:
> lower_surface_logical_send(ibld, inst,
> SHADER_OPCODE_UNTYPED_SURFACE_READ,
> - fs_reg());
> + fs_reg(0xffff));
> break;
>
> case SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL:
> lower_surface_logical_send(ibld, inst,
> SHADER_OPCODE_UNTYPED_SURFACE_WRITE,
> - fs_reg());
> + ibld.sample_mask_reg());
> break;
>
> case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
> lower_surface_logical_send(ibld, inst,
> SHADER_OPCODE_UNTYPED_ATOMIC,
> - fs_reg());
> + ibld.sample_mask_reg());
> break;
>
> case SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL:
> lower_surface_logical_send(ibld, inst,
> SHADER_OPCODE_TYPED_SURFACE_READ,
> - fs_reg());
> + fs_reg(0xffff));
> break;
>
> case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL:
> lower_surface_logical_send(ibld, inst,
> SHADER_OPCODE_TYPED_SURFACE_WRITE,
> - fs_reg());
> + ibld.sample_mask_reg());
> break;
>
> case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL:
> lower_surface_logical_send(ibld, inst,
> SHADER_OPCODE_TYPED_ATOMIC,
> - fs_reg());
> + ibld.sample_mask_reg());
> break;
>
> default:
> --
> 2.4.3
>
> _______________________________________________
> 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