Keith Whitwell wrote:
> Jerome Glisse wrote:
>> Hi all,
>>
>> While playing with modesetting & ttm i have put some thought on how 
>> we send
>> things to card. And i would like to test the following scheme:
>> -split card state into a bunch of separate chunk (z state, fog state, 
>> ...)
>> -the driver build the state it want and register each state chunk to 
>> the drm
>> -drm give an unique id for this state chunk the id have two part one 
>> is the
>>   chunk class (z state, fog state, ...) the other is an unique id 
>> identifying
>>   this particular state id in the chunk class. These are shared btw 
>> all drm
>>   client ie if another program register exact same stage then drm 
>> return the
>>   same id
>> -driver can no use this id by using superioctl and providing a list 
>> of state id
>> -drm keep a list of lastest state id uploaded to card an upload only 
>> state chunk
>>   which differ and update its list of state id
>> -few things won't be in this state things like vertex program or 
>> fragment program
>>   (i believe that there might be too much different of them that this 
>> won't be
>>    efficient to cache which program was lastly uploaded; so i think 
>> its better to
>>    reupload program each time (they ain't big anyway).
>>
>> So what good things do we got with this:
>> - from user space its like the card have context :)
>> - we can save a lot of state reuploading the assumption being that most
>>    program share most of the state (ie if state chunk are well sliced 
>> there won't
>>    be many different state id in each state class).
>> - drm is the only place where we can have a coherent & up to date 
>> view of
>>    current state uploaded on card
>> - its lot easier  than asking for the userspace to resend all its state
>> - most of the checking is done at state registration (ain't big win i 
>> think)
>> - in the future we can even schedule request in the order which will 
>> trigger
>>    the less number of state change
>>
>> There is likely others good things on the bright side...
>>
>> Bad things:
>> - backward compat if we want to change how state are sliced or what 
>> we accept
>>    or not (i think by cleverly thinking the interface we might 
>> minimize problems
>>    in this area)
>> - if we badly split state than we might end up having to much id in 
>> for some
>>    state chunk which will slow down state registration (as this 
>> involve searching
>>    to all previous state of same class see if the states registered 
>> already exist)
>>
>> Maybe others bad things ? I think we can work around this by putting 
>> some time
>> into real test usage of this to see how best we can split state & and 
>> what might
>> be cached by state or reuploaded at each call.
>>
>> So the superioctl will looks like this:
>> - drm drawable (where we draw dri 2 world :))
>> - list of state id
>> - cmd buffer (cmd stream with vert, frag prog & other state not 
>> cached by the above
>>    mechanism)
>> - list of reloc buffer
>>     -reloc pos into the cmd buffer
>>     -buffer
>>
>> The list of reloc buffer will be there to supply texture buffer, 
>> vertex buffer or
>> others buffer of this kind. In this scheme you can draw only in one 
>> context by call
>> but this could be extended even though i believe its better that way.
>>
>> I believe such scheme were already proposed in the past. So what do 
>> you think
>> about it ? I will start soon a sample program (named r300_demo ;)) to 
>> test this scheme
>> before doing any driver works and see how it behave.
>
> This is more or less extending the constant state object idea as 
> described by GL3, Gallium3D and other 3D APIs to multiple applications.
>
> The biggest issue I see is that we expect individual applications to 
> create a moderately large number of these states and to rapidly switch 
> between them.
>
> The likelyhood that two unrelated applications would happen to be 
> sharing any large number of these at context switch time seems fairly 
> low.
>
> Also, for current drivers, the number of context switches compared to 
> the number of other state changes is actually pretty low.  I guess I'd 
> have to question whether even a very large speed savings in a fairly 
> rare case (context switch) is going to make a noticable difference 
> overall.
>
> I think that this approach makes sense within a driver context - ie as 
> a way to avoid the same app repeatedly emitting the same piece of 
> state, hence the thinking behind constant state objects in GL3 and 
> elsewhere, but maybe less exciting for sharing between unrelated 
> contexts.
>
> Keith
State i am thinking of are lot smaller and won't have as many possibility.
For instance in fog i don't want to cache fog color or in z i don't want
to cache z clear color. I am only interested in putting state which have
a configuration impact on the card which might need special treatment like
waiting for 3d part to go idle or syncing with somethings.

To sum up any of the state class i am thinkng of shouldn't have more than
1000 different possible combinations (and likely a lot less). I need to
build some of this class to have an idea on how much different possibilities
their might have. Anyway i will experiment with this a bit and see if it
makes sense but i really don't want to have which can have too much 
different
values.

Cheers,
Jerome Glisse

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to