[Nouveau] [PATCH] nv50: remove vtxbuf stateobject after a referenced vtxbuf is mapped
Younes Manton
younes.m at gmail.com
Mon Dec 21 07:18:18 PST 2009
On Mon, Dec 21, 2009 at 8:48 AM, Maarten Maathuis <madman2003 at gmail.com> wrote:
> On Mon, Dec 21, 2009 at 11:25 AM, Christoph Bumiller
> <e0425955 at student.tuwien.ac.at> wrote:
>> On 12/20/2009 04:46 PM, Maarten Maathuis wrote:
>>> - This avoids problematic "reloc'ed while mapped" messages and
>>> some associated corruption as well.
>>> - Also add one nouveau_bo_unmap() in the vbo code that wasn't present.
>> I didn't think nouveau_bo_unmap was necessary if the map failed.
>> As far as I can see, map will be NULL, and unmap will do nothing.
>> I don't know what our API doc says about that though ...
>> But the DDX seems to not unmap after failure.
>>>
>>> Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
>>> ---
>>> src/gallium/drivers/nouveau/nouveau_screen.c | 21 +++++++++++++++++++++
>>> src/gallium/drivers/nouveau/nouveau_screen.h | 3 +++
>>> src/gallium/drivers/nouveau/nouveau_stateobj.h | 13 +++++++++++++
>>> src/gallium/drivers/nv50/nv50_screen.c | 23 +++++++++++++++++++++++
>>> src/gallium/drivers/nv50/nv50_screen.h | 2 ++
>>> src/gallium/drivers/nv50/nv50_state_validate.c | 2 ++
>>> src/gallium/drivers/nv50/nv50_vbo.c | 4 +++-
>>> 7 files changed, 67 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c b/src/gallium/drivers/nouveau/nouveau_screen.c
>>> index e4cf91c..c85057a 100644
>>> --- a/src/gallium/drivers/nouveau/nouveau_screen.c
>>> +++ b/src/gallium/drivers/nouveau/nouveau_screen.c
>>> @@ -127,8 +127,18 @@ nouveau_screen_bo_map(struct pipe_screen *pscreen, struct pipe_buffer *pb,
>>> unsigned usage)
>> ...
>>> +static int
>>> +nv50_pre_pipebuffer_map(struct pipe_screen *pscreen, struct pipe_buffer *pb,
>>> + unsigned usage)
>>> +{
>>> + struct nv50_screen *screen = nv50_screen(pscreen);
>>> + struct nv50_context *ctx = screen->cur_ctx;
>>> +
>>> + if (!(pb->usage & PIPE_BUFFER_USAGE_VERTEX))
>>> + return 0;
>>> +
>>> + /* Our vtxbuf got mapped, it can no longer be considered part of current
>>> + * state, remove it to avoid emitting reloc markers.
>>> + */
>>> + if (ctx && ctx->state.vtxbuf && so_bo_is_reloc(ctx->state.vtxbuf,
>>> + nouveau_bo(pb))) {
>>> + so_ref(NULL, &ctx->state.vtxbuf);
>>> + ctx->state.dirty |= NV50_NEW_ARRAYS;
>> Hm ... I know I suggested it but I'm not completely sure it works now.
>> ctx->state.dirty will be checked in nv50_state_emit as far as I
>> can see, and then state stateobj better not be NULL.
>> (at least if I do this regardless of so_bo_is_reloc, I get a segfault)
>>
>> Since we're operating on the current context here, we should probably
>> set ctx->(no state.)dirty which is used in nv50_state_validate (no
>> segfault on emit then).
>>> + }
>>> +
>>> + return 0;
>>> +}
>>> +
>>> struct pipe_screen *
>>> nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
>>> {
>>> @@ -201,6 +223,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
>>> pscreen->get_param = nv50_screen_get_param;
>>> pscreen->get_paramf = nv50_screen_get_paramf;
>>> pscreen->is_format_supported = nv50_screen_is_format_supported;
>>> + screen->base.pre_pipebuffer_map_callback = nv50_pre_pipebuffer_map;
>>>
>>> nv50_screen_init_miptree_functions(pscreen);
>>> nv50_transfer_init_screen_functions(pscreen);
>>> diff --git a/src/gallium/drivers/nv50/nv50_screen.h b/src/gallium/drivers/nv50/nv50_screen.h
>>> index 61e24a5..a038a4e 100644
>>> --- a/src/gallium/drivers/nv50/nv50_screen.h
>>> +++ b/src/gallium/drivers/nv50/nv50_screen.h
>>> @@ -2,6 +2,7 @@
>>> #define __NV50_SCREEN_H__
>>>
>>> #include "nouveau/nouveau_screen.h"
>>> +#include "nv50_context.h"
>>>
>>> struct nv50_screen {
>>> struct nouveau_screen base;
>>> @@ -9,6 +10,7 @@ struct nv50_screen {
>>> struct nouveau_winsys *nvws;
>>>
>>> unsigned cur_pctx;
>>> + struct nv50_context *cur_ctx;
>>>
>> Using struct pipe_context **nouveau_winsys::pcxt would work too ...
>
> Is this a C++ feature?
>
nv50_screen->nvws->pctx[nv50_screen->cur_pctx] == pipe_context*
More information about the Nouveau
mailing list