[Mesa-dev] [PATCH 09/12] i965/fs: Hook up SIMD lowering to handle texturing opcodes of unsupported width.
Jason Ekstrand
jason at jlekstrand.net
Wed Jul 22 09:17:54 PDT 2015
On Wed, Jul 22, 2015 at 12:55 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> Jason Ekstrand <jason at jlekstrand.net> writes:
>
>> On Sat, Jul 18, 2015 at 7:34 AM, Francisco Jerez <currojerez at riseup.net> wrote:
>>> This should match the set of cases in which we currently call fail()
>>> or no16() from the emit_texture_*() methods and the ones in which
>>> emit_texture_gen4() enables the SIMD16 workaround.
>>>
>>> Hint for reviewers: It's not a big deal if I happen to have missed
>>> some case here, it will just lead to an assertion failure down the
>>> road which is easily fixable, however being stricter than necessary
>>> won't cause any visible breakage, it would just decrease performance
>>> silently due to the unnecessary message splitting, so feel free to
>>> double-check that all cases listed here already cause a SIMD8/16
>>> fall-back with the current texturing code -- You may want to skip over
>>> the Gen5-6 cases though if you don't have pencil and paper at hand.
>>
>> I'll believe you. Even if you got it wrong, the worst that happens is
>> we hit the fail case when we try and lower.
>>
>>> ---
>>> src/mesa/drivers/dri/i965/brw_fs.cpp | 27 +++++++++++++++++++++++++++
>>> 1 file changed, 27 insertions(+)
>>>
>>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
>>> index 043d9e9..f291202 100644
>>> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
>>> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
>>> @@ -3918,6 +3918,33 @@ get_lowered_simd_width(const struct brw_device_info *devinfo,
>>> /* Dual-source FB writes are unsupported in SIMD16 mode. */
>>> return (inst->src[1].file != BAD_FILE ? 8 : inst->exec_size);
>>>
>>> + case SHADER_OPCODE_TXD_LOGICAL:
>>> + /* TXD is unsupported in SIMD16 mode. */
>>> + return 8;
>>> +
>>> + case SHADER_OPCODE_TG4_OFFSET_LOGICAL: {
>>> + /* gather4_po_c is unsupported in SIMD16 mode. */
>>> + const fs_reg &shadow_c = inst->src[1];
>>> + return (shadow_c.file != BAD_FILE ? 8 : inst->exec_size);
>>> + }
>>> + case SHADER_OPCODE_TXL_LOGICAL:
>>> + case FS_OPCODE_TXB_LOGICAL: {
>>> + /* Gen4 doesn't have SIMD8 non-shadow-compare bias/LOD instructions, and
>>> + * Gen4-6 don't support TXL and TXB with shadow comparison in SIMD16
>>> + * mode.
>>> + */
>>> + const fs_reg &shadow_c = inst->src[1];
>>> + return (devinfo->gen == 4 && shadow_c.file == BAD_FILE ? 16 :
>>> + devinfo->gen < 7 && shadow_c.file != BAD_FILE ? 8 :
>>> + inst->exec_size);
>>
>> Could we please use an if-ladder here. Nested ternaries are hard to
>> read and kind of pointless given that we can return multiple places in
>> the if.
>>
> Heh, I always have the very opposite style itch -- If you can compute
> something succinctly with a handful of "pure" expressions why venture
> into the dangerous realm of statements?
Heh... The mathematician in me is tempted to agree with you. However,
the programmer in me likes his control-flow to have obvious nesting
and indentation. :-)
> I think John Backus' article "Can programming be liberated from the von
> Neumann style?" although slightly outdated elaborates the point pretty
> well.
>
> But sure, if you'd like it better with an if-ladder why not.
>
>>> + }
>>> + case SHADER_OPCODE_TXF_LOGICAL:
>>> + case SHADER_OPCODE_TXS_LOGICAL:
>>> + /* Gen4 doesn't have SIMD8 variants for the RESINFO and LD-with-LOD
>>> + * messages. Use SIMD16 instead.
>>> + */
>>> + return (devinfo->gen == 4 ? 16 : inst->exec_size);
>>
>> I'd kind of also like this ternary to go, but I'm ok with it if you
>> want to keep it.
>>
>>> +
>>> default:
>>> return inst->exec_size;
>>> }
>>> --
>>> 2.4.3
>>>
More information about the mesa-dev
mailing list