Am 27.06.2011 16:04, schrieb Keith Whitwell:
> On Mon, 2011-06-27 at 15:32 +0200, Marek Olšák wrote:
>> On Mon, Jun 27, 2011 at 2:38 PM, Roland Scheidegger
>> <srol...@vmware.com> wrote:
>>> Am 25.06.2011 00:22, schrieb Vadim Girlin:
>>>> On 06/24/2011 11:38 PM, Jerome Glisse wrote:
>>>>> On Fri, Jun 24, 2011 at 12:29 PM, Vadim
>> Girlin<vadimgir...@gmail.com>
>>>>> wrote:
>>>>>> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=38440
>>>>>>
>>>>>> Signed-off-by: Vadim Girlin<vadimgir...@gmail.com>
>>>>>
>>>>> As discussed previously, there is better to handle this. I think
>> best
>>>>> solution is to always add the instruction and to conditionally
>> execute
>>>>> them thanks to the boolean constant. If this reveal to have a too
>> big
>>>>> impact on shader, other solution i see is adding a cf block with
>> those
>>>>> instructions and to enable or disable that block (cf_nop) and
>> reupload
>>>>> shader that would avoid a rebuild.
>>>>
>>>> I know its not optimal to do a full rebuild, but rebuild is needed
>> only
>>>> when the application will use the same shader in different clamping
>>>> states. It won't be a problem if the application doesn't change
>> clamping
>>>> state or if it changes the state but uses each shader in one state
>> only.
>>>> So assuming that typical app will not use one shader in both
>> states, it
>>>> shouldn't be a problem. Is this assumption wrong? I'm not really
>> sure
>>>> because I have no much experience in this. But if it's wrong then
>> it's
>>>> probably better for performance to build and cache both versions.
>>> I tend to think you're right apps probably don't want to use the
>> same
>>> shader both with and without clamping.
>>
>> It still can be changed by st/mesa or by u_blitter and u_blit for
>> various reasons. IIRC, the OpenGL default is TRUE if the current
>> framebuffer is fixed-point including texture_snorm and FALSE
>> otherwise, so changing the framebuffer may change the clamp color
>> state. Besides that, the u_blitter and u_blit operations always
>> disable the clamping, so if a framebuffer is fixed-point and thus
>> clamp color state is TRUE (if not changed by an app), the driver may
>> receive state changes that turn the clamping on, off, on, off,... with
>> the blit operations turning it off and everything else turning it on.
>> The state might be changing pretty much all the time and doing full
>> shader rebuilds repeatedly may turn some apps into a slideshow.
> 
> I haven't looked at the code, maybe this is irrelevant for some reason,
> but the alternative to doing rebuilds when this type of state changes is
> to permit >1 compiled version of the shader to exist, parameterized in
> different ways.  That way the ping-pong scenario you describe results in
> swapping between shaders (which should be cheap), rather than
> rebuilding.
> 
>> Therefore we must ensure that a fragment shader is set/built as late
>> as possible, i.e. in draw_vbo. Each shader variant should be compiled
>> once at most and stored for later use. create_fs_state and
>> bind_fs_state should not do anything except copying the parameters. 
> 
> Actually it sounds like you're describing the same idea here...
> 
> Keith

I wasn't aware that the boolean block might be free in terms of
performance. If so that might indeed be a good solution without needing
to recompile. But there might be other cases which could benefit from
cached shaders, so it looks both options have merit.

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

Reply via email to