[Mesa-dev] [PATCH 11/19] i965/fs: Use LOAD_PAYLOAD in emit_texture_gen7().

Matt Turner mattst88 at gmail.com
Thu Apr 24 10:41:06 PDT 2014


On Thu, Apr 24, 2014 at 10:33 AM, Matt Turner <mattst88 at gmail.com> wrote:
> On Thu, Apr 24, 2014 at 10:30 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
>> On 04/24/2014 08:40 AM, Matt Turner wrote:
>>> On Wed, Apr 23, 2014 at 11:19 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
>>>> On 04/18/2014 11:56 AM, Matt Turner wrote:
>>>>> ---
>>>>>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 135 +++++++++++++++------------
>>>>>  1 file changed, 73 insertions(+), 62 deletions(-)
>>>>>
>>>>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
>>>>> index 2aa3acd..91bbe0a 100644
>>>>> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
>>>>> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
>>>>> @@ -1257,8 +1257,11 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
>>>>>     int reg_width = dispatch_width / 8;
>>>>>     bool header_present = false;
>>>>>
>>>>> -   fs_reg payload = fs_reg(this, glsl_type::float_type);
>>>>> -   fs_reg next = payload;
>>>>> +   fs_reg *sources = ralloc_array(mem_ctx, fs_reg, MAX_SAMPLER_MESSAGE_SIZE);
>>>>> +   for (int i = 0; i < MAX_SAMPLER_MESSAGE_SIZE; i++) {
>>>>> +      sources[i] = fs_reg(this, glsl_type::float_type);
>>>>> +   }
>>>>> +   int length = 0;
>>>>>
>>>>>     if (ir->op == ir_tg4 || (ir->offset && ir->op != ir_txf) || sampler >= 16) {
>>>>>        /* For general texture offsets (no txf workaround), we need a header to
>>>>> @@ -1272,12 +1275,13 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate,
>>>>>         * need to offset the Sampler State Pointer in the header.
>>>>>         */
>>>>>        header_present = true;
>>>>> -      next.reg_offset++;
>>>>> +      sources[length] = reg_undef;
>>>>> +      length++;
>>>>>     }
>>>>
>>>> So...if you don't take the header_present = true path...then it looks
>>>> like the next thing (say, shadow_c) will land in sources[0], rather than
>>>> leaving sources[0] as BAD_FILE and putting the first part of the payload
>>>> in sources[1].
>>>>
>>>> Is sources[0] special and reserved for the header or isn't it?
>>>
>>> It's the header if there is a header, and it's a regular source if
>>> there isn't a header. We can't make it always a header, because if the
>>> header doesn't exist we'll end up asking the register allocator for a
>>> set of registers one too large.
>>
>> That seems reasonable.  But, if those are the semantics, I don't see any
>> reason for the lowering pass to handle src[0] specially.  It could just
>> loop from i = 0; i < inst->sources.  BAD_FILE should never happen.
>
> Yeah, I think you're right.

Actually, no. We create the header in the generator. We really don't
know anything about it until then, so we can't emit a MOV for it in
the lowering pass. Look at the old code -- we just skipped the first
reg_offset to leave room for a header when it was needed.


More information about the mesa-dev mailing list