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