On 24.01.2015 11:56, Tom Stellard wrote:
> On Thu, Jan 22, 2015 at 11:27:32AM +0900, Michel Dänzer wrote:
>>
>> Tom, for now I suggest this solution, summarized from Marek's previous
>> descriptions:
>>
>> (At least) for shaders which have relocations, keep a copy of the
>> machine code in malloced memory. When the relocated values change,
>> update them in the malloced memory, allocate a new BO, map it, copy the
>> machine code from the malloced memory to the BO, replace any existing
>> shader BO with the new one and invalidate the shader state.
>>
> 
> Hi,
> 
> Attached is a WIP patch attempting to implement it this way.
> Unfortunately, I was unable to get it working, so I wanted to
> submit it for review in case someone can spot what I'm doing wrong.
> 
> You can find the broken code wrapped in #if 0 in the
> si_update_scratch_buffer() function in si_state_shaders.c
> 
> Based on the dmesg output and other tests I've done, it appears
> that the GPU is still executing the shader code from the old bo
> which does not contain the relocations.
> 
> The code in the #else branch works fine, but it updates the existing
> bo in place rather than creating a new one.
> 
> Any idea what I've done wrong?

[...]

> +             /* Update the shaders, so they are using the latest scratch.  
> The
> +              * scratch buffer may have been changed since these shaders were
> +              * last used, so we still need to try to update them, even if
> +              * they require scratch buffers smaller than the current size.
> +              */
> +             if (si_update_scratch_buffer(sctx, sctx->ps_shader))
> +                     sctx->emitted.named.ps = NULL;
> +             if (si_update_scratch_buffer(sctx, sctx->gs_shader))
> +                     sctx->emitted.named.gs = NULL;
> +             if (si_update_scratch_buffer(sctx, sctx->vs_shader))
> +                     sctx->emitted.named.vs = NULL;

Does this work instead?

                if (si_update_scratch_buffer(sctx, sctx->ps_shader))
                        si_pm4_bind_state(sctx, ps, 
sctx->ps_shader->current->pm4);
                if (si_update_scratch_buffer(sctx, sctx->gs_shader))
                        si_pm4_bind_state(sctx, gs, 
sctx->gs_shader->current->pm4);
                if (si_update_scratch_buffer(sctx, sctx->vs_shader))
                        si_pm4_bind_state(sctx, vs, 
sctx->vs_shader->current->pm4);


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to