On Fri, 23 Sep 2011 10:15:02 -0700
Eric Anholt <e...@anholt.net> wrote:

> On Thu, 22 Sep 2011 16:27:12 -0700, Ben Widawsky <b...@bwidawsk.net>
> wrote:
> > This makes the code a lot cleaner, and theoretically faster (not
> > many real world tests use this GL extension).
> > 
> > Cc: Eric Anholt <e...@anholt.net>
> > Cc: Daniel Vetter <daniel.vet...@ffwll.ch>
> > Cc: Mesa Devs <mesa-dev@lists.freedesktop.org>
> > Signed-off-by: Ben Widawsky <b...@bwidawsk.net>
> > ---
> >  src/mesa/drivers/dri/intel/intel_buffer_objects.c |   48
> > ++------------------ 1 files changed, 5 insertions(+), 43
> > deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c
> > b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index
> > d35a50e..91dddce 100644 ---
> > a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++
> > b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -296,8
> > +296,6 @@ intel_bufferobj_get_subdata(struct gl_context * ctx, }
> >  }
> >  
> > -
> > -
> >  /**
> >   * Called via glMapBufferRange and glMapBuffer
> >   *
> > @@ -363,50 +361,14 @@ intel_bufferobj_map_range(struct gl_context *
> > ctx, return NULL;
> >     }
> >  
> > -   /* If the user doesn't care about existing buffer contents and
> > mapping
> > -    * would cause us to block, then throw out the old buffer.
> > -    */
> > -   if (!(access & GL_MAP_UNSYNCHRONIZED_BIT) &&
> > -       (access & GL_MAP_INVALIDATE_BUFFER_BIT) &&
> > -       drm_intel_bo_busy(intel_obj->buffer)) {
> > -      drm_intel_bo_unreference(intel_obj->buffer);
> > -      intel_bufferobj_alloc_buffer(intel, intel_obj);
> > -   }
> 
> Why did you delete this code?  Applications rely on this happening.

Maybe I got confused by the order of operations, but I thought this
should be,
If synchronized and invalidate and busy, just create a new buffer. This
*should* be handled correctly by the nonblocking call below. Maybe I'm
mistaken.

> 
> > -
> > -   /* If the user is mapping a range of an active buffer object but
> > -    * doesn't require the current contents of that range, make a
> > new
> > -    * BO, and we'll copy what they put in there out at unmap or
> > -    * FlushRange time.
> > -    */
> >     if ((access & GL_MAP_INVALIDATE_RANGE_BIT) &&
> > -       drm_intel_bo_busy(intel_obj->buffer)) {
> > -      if (access & GL_MAP_FLUSH_EXPLICIT_BIT) {
> > +       drm_intel_bo_busy(intel_obj->buffer) &&
> > +       (access & GL_MAP_FLUSH_EXPLICIT_BIT)) {
> >      intel_obj->range_map_buffer = malloc(length);
> >      obj->Pointer = intel_obj->range_map_buffer;
> > -      } else {
> > -    intel_obj->range_map_bo =
> > drm_intel_bo_alloc(intel->bufmgr,
> > -                                                 "range map",
> > -                                                 length, 64);
> > -    if (!(access & GL_MAP_READ_BIT)) {
> > -       drm_intel_gem_bo_map_gtt(intel_obj->range_map_bo);
> > -       intel_obj->mapped_gtt = GL_TRUE;
> > -    } else {
> > -       drm_intel_bo_map(intel_obj->range_map_bo,
> > -                        (access & GL_MAP_WRITE_BIT) != 0);
> > -       intel_obj->mapped_gtt = GL_FALSE;
> > -    }
> > -    obj->Pointer = intel_obj->range_map_bo->virtual;
> > -      }
> > -      return obj->Pointer;
> > -   }
> > -
> > -   if (!(access & GL_MAP_READ_BIT)) {
> > -      drm_intel_gem_bo_map_gtt(intel_obj->buffer);
> > -      intel_obj->mapped_gtt = GL_TRUE;
> > -   } else {
> > -      drm_intel_bo_map(intel_obj->buffer, (access &
> > GL_MAP_WRITE_BIT) != 0);
> > -      intel_obj->mapped_gtt = GL_FALSE;
> > -   }
> > +    return obj->Pointer;
> > +   } else
> > +    drm_intel_gem_bo_map_nonblocking(intel_obj->buffer,
> > &intel_obj->mapped_gtt);
> 
> So, if either INVALIDATE or FLUSH_EXPLICIT is not set, or the buffer
> is idle, you use the nonblocking map instead of the normal blocking
> map? How is that supposed to be correct?
> 
> This patch should be adding one new case and an early return.  If it
> does something else, that's a bad sign.
> 
> >     obj->Pointer = intel_obj->buffer->virtual + offset;
> >     return obj->Pointer;

First of all, I realize this diff is pretty awful, so for the sake of
readability let me put the relevant part here:

   if ((access & GL_MAP_INVALIDATE_RANGE_BIT) &&
       drm_intel_bo_busy(intel_obj->buffer) &&
       (access & GL_MAP_FLUSH_EXPLICIT_BIT)) {
         intel_obj->range_map_buffer = malloc(length);
         obj->Pointer = intel_obj->range_map_buffer;
>>>>>>>> return obj->Pointer;
   } else
       drm_intel_gem_bo_map_nonblocking(intel_obj->buffer,
                &intel_obj->mapped_gtt);

   obj->Pointer = intel_obj->buffer->virtual + offset;
   return obj->Pointer;

The reason why I think this works is drm_intel_gem_bo_map_nonblocking()
is supposed to do the right thing (so the name is misleading). Please
look at the libdrm patch in the series and see if you still agree.


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

Reply via email to