[Mesa-dev] [PATCH 07/11] i965/vec4: Add support for nonconst sampler indexing in VS visitor
Chris Forbes
chrisf at ijw.co.nz
Fri Aug 15 00:21:43 PDT 2014
Yes, that is needed... fixed and landed.
On Fri, Aug 15, 2014 at 7:04 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Sunday, August 10, 2014 02:14:41 PM Chris Forbes wrote:
>> ---
>> src/mesa/drivers/dri/i965/brw_vec4.h | 2 +-
>> src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 53 +++++++++++++++++++++++---
>> 2 files changed, 49 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
>> index 9001286..4fe346c 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4.h
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4.h
>> @@ -527,7 +527,7 @@ public:
>> void emit_unpack_half_2x16(dst_reg dst, src_reg src0);
>>
>> uint32_t gather_channel(ir_texture *ir, uint32_t sampler);
>> - src_reg emit_mcs_fetch(ir_texture *ir, src_reg coordinate, uint32_t sampler);
>> + src_reg emit_mcs_fetch(ir_texture *ir, src_reg coordinate, src_reg sampler);
>> void emit_gen6_gather_wa(uint8_t wa, dst_reg dst);
>> void swizzle_result(ir_texture *ir, src_reg orig_val, uint32_t sampler);
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
>> index 4760790..eedd862 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
>> @@ -2299,7 +2299,7 @@ vec4_visitor::visit(ir_call *ir)
>> }
>>
>> src_reg
>> -vec4_visitor::emit_mcs_fetch(ir_texture *ir, src_reg coordinate, uint32_t sampler)
>> +vec4_visitor::emit_mcs_fetch(ir_texture *ir, src_reg coordinate, src_reg sampler)
>> {
>> vec4_instruction *inst = new(mem_ctx) vec4_instruction(this, SHADER_OPCODE_TXF_MCS);
>> inst->base_mrf = 2;
>> @@ -2307,7 +2307,7 @@ vec4_visitor::emit_mcs_fetch(ir_texture *ir, src_reg coordinate, uint32_t sample
>> inst->dst = dst_reg(this, glsl_type::uvec4_type);
>> inst->dst.writemask = WRITEMASK_XYZW;
>>
>> - inst->src[1] = src_reg(sampler);
>> + inst->src[1] = sampler;
>>
>> /* parameters are: u, v, r, lod; lod will always be zero due to api restrictions */
>> int param_base = inst->base_mrf;
>> @@ -2324,12 +2324,55 @@ vec4_visitor::emit_mcs_fetch(ir_texture *ir, src_reg coordinate, uint32_t sample
>> return src_reg(inst->dst);
>> }
>>
>> +static bool
>> +is_high_sampler(struct brw_context *brw, src_reg sampler)
>> +{
>> + if (brw->gen < 8 && !brw->is_haswell)
>> + return false;
>> +
>> + return sampler.file != IMM || sampler.fixed_hw_reg.dw1.ud >= 16;
>> +}
>> +
>> void
>> vec4_visitor::visit(ir_texture *ir)
>> {
>> uint32_t sampler =
>> _mesa_get_sampler_uniform_value(ir->sampler, shader_prog, prog);
>>
>> + ir_rvalue *nonconst_sampler_index =
>> + _mesa_get_sampler_array_nonconst_index(ir->sampler);
>> +
>> + /* Handle non-constant sampler array indexing */
>> + src_reg sampler_reg;
>> + if (nonconst_sampler_index) {
>> + /* The highest sampler which may be used by this operation is
>> + * the last element of the array. Mark it here, because the generator
>> + * doesn't have enough information to determine the bound.
>> + */
>> + uint32_t array_size = ir->sampler->as_dereference_array()
>> + ->array->type->array_size();
>> +
>> + uint32_t max_used = sampler + array_size - 1;
>> + if (ir->op == ir_tg4 && brw->gen < 8) {
>> + max_used += prog_data->base.binding_table.gather_texture_start;
>> + } else {
>> + max_used += prog_data->base.binding_table.texture_start;
>> + }
>> +
>> + brw_mark_surface_used(&prog_data->base, max_used);
>> +
>> + /* Emit code to evaluate the actual indexing expression */
>> + nonconst_sampler_index->accept(this);
>> + dst_reg temp(this, glsl_type::uint_type);
>> + emit(ADD(temp, this->result, src_reg(sampler)));
>
> Do you need to set ->force_writemask_all = true? You do on the FS backend.
>
> Otherwise, this series is:
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
More information about the mesa-dev
mailing list