Thanks for testing. I fixed the whitespace, and resent patch 4 due to a bug.

Roland

Am 03.01.2018 um 08:29 schrieb Konstantin Kharlamov:
> Sorry, I don't have an expertise to give a r-b, but here's my t-b :) I
> found no statistically significant changes at "the big keybench" of
> `vblank_mode=0 ./xonotic-linux64-glx`.
> 
> But note, there's a trailing whitespace at patch 5 (first "+" after "@@
> -1267,6 +1268,20 @@"), and patch 6 (first "+" after "@@ -1723,6 +1723,21
> @@").
> 
> Tested-by: Konstantin Kharlamov <hi-an...@yandex.ru>
> 
> On 03.01.2018 05:25, srol...@vmware.com wrote:
>> From: Roland Scheidegger <srol...@vmware.com>
>>
>> Similar to const buffers. The driver must not emit any tes-related
>> state if tes
>> is disabled, since the hw slots are all shared by VS, therefore it would
>> overwrite them (the mesa state tracker might not do this, but it would be
>> perfectly legal to do so).
>> Nevertheless I think the dirty state tracking logic in the driver is
>> fundamentally flawed when tes is disabled/enabled, since it looks to
>> me like
>> the VS (and TES) state would not get reemitted to the correct slots
>> (if it's
>> not dirty anyway). Unless I'm missing something...
>> Theoretically, the overwrite problem could be solved by using
>> non-overlapping
>> resource slots for TES and VS (since we're not even close to using
>> half the
>> resource slots), but it wouldn't work for constant buffers nor
>> samplers, and
>> for VS would still need to propagate changes to both LS and VS, so
>> probably
>> not a useful idea.
>> Unfortunately there's zero coverage of this with piglit, since all
>> tessellation
>> shader tests are just shader_runner tests, which are unsuitable for
>> testing
>> any kind of state dependency tracking issues (so I can't even quickly
>> hack
>> something up to proove it and fix it...).
>> TCS otoh is just fine - like GS it has its own hw slots.
>> ---
>>   src/gallium/drivers/r600/evergreen_state.c   |  4 ++++
>>   src/gallium/drivers/r600/r600_state_common.c | 15 +++++++++++++++
>>   2 files changed, 19 insertions(+)
>>
>> diff --git a/src/gallium/drivers/r600/evergreen_state.c
>> b/src/gallium/drivers/r600/evergreen_state.c
>> index 4cc48dfa11..fb1de9cbf4 100644
>> --- a/src/gallium/drivers/r600/evergreen_state.c
>> +++ b/src/gallium/drivers/r600/evergreen_state.c
>> @@ -2334,6 +2334,8 @@ static void
>> evergreen_emit_tcs_sampler_views(struct r600_context *rctx, struct r
>>     static void evergreen_emit_tes_sampler_views(struct r600_context
>> *rctx, struct r600_atom *atom)
>>   {
>> +    if (!rctx->tes_shader)
>> +        return;
>>       evergreen_emit_sampler_views(rctx,
>> &rctx->samplers[PIPE_SHADER_TESS_EVAL].views,
>>                                    EG_FETCH_CONSTANTS_OFFSET_VS +
>> R600_MAX_CONST_BUFFERS, 0);
>>   }
>> @@ -2404,6 +2406,8 @@ static void
>> evergreen_emit_tcs_sampler_states(struct r600_context *rctx, struct
>>     static void evergreen_emit_tes_sampler_states(struct r600_context
>> *rctx, struct r600_atom *atom)
>>   {
>> +    if (!rctx->tes_shader)
>> +        return;
>>       evergreen_emit_sampler_states(rctx,
>> &rctx->samplers[PIPE_SHADER_TESS_EVAL], 18,
>>                         R_00A414_TD_VS_SAMPLER0_BORDER_INDEX, 0);
>>   }
>> diff --git a/src/gallium/drivers/r600/r600_state_common.c
>> b/src/gallium/drivers/r600/r600_state_common.c
>> index 4364350487..a434156c16 100644
>> --- a/src/gallium/drivers/r600/r600_state_common.c
>> +++ b/src/gallium/drivers/r600/r600_state_common.c
>> @@ -1723,6 +1723,21 @@ static bool r600_update_derived_state(struct
>> r600_context *rctx)
>>               UPDATE_SHADER_CLIP(R600_HW_STAGE_VS, vs);
>>           }
>>       }
>> +   
>> +    /*
>> +     * XXX: I believe there's some fatal flaw in the dirty state
>> logic when
>> +     * enabling/disabling tes.
>> +     * VS/ES share all buffer/resource/sampler slots. If TES is enabled,
>> +     * it will therefore overwrite the VS slots. If it now gets
>> disabled,
>> +     * the VS needs to rebind all buffer/resource/sampler slots - not
>> only
>> +     * has TES overwritten the corresponding slots, but when the VS was
>> +     * operating as LS the things with correpsonding dirty bits got
>> bound
>> +     * to LS slots and won't reflect what is dirty as VS stage even
>> if the
>> +     * TES didn't overwrite it. The story for re-enabled TES is similar.
>> +     * In any case, we're not allowed to submit any TES state when
>> +     * TES is disabled (the state tracker may not do this but this looks
>> +     * like an optimization to me, not something which can be relied
>> on).
>> +     */
>>         /* Update clip misc state. */
>>       if (clip_so_current) {
>>

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to