On Thu, 2009-09-10 at 13:07 -0700, Thomas Hellstrom wrote:
> Brian Paul wrote:
> > Brian Paul wrote:
> >   
> >> Thomas Hellstrom wrote:
> >>     
> >>> Brian Paul wrote:
> >>>       
> >>>> Thomas & Jose, I think you are most familiar with this code...
> >>>>
> >>>> The attached patch fixes a bug I found with softpipe and 
> >>>> glDrawPixels(GL_STENCIL_INDEX).
> >>>>
> >>>> The failing case was basically:
> >>>>
> >>>> glClear(GL_STENCIL_BUFFER_BIT);
> >>>> ...
> >>>> glDrawPixels(GL_STENCIL_INDEX).
> >>>>
> >>>> Drawing stencil images is done by mapping the stencil buffer, writing 
> >>>> the stencil values then unmapping the stencil buffer.
> >>>>
> >>>> With softpipe, a glClear() call just sets tile 'clear' flags; it 
> >>>> doesn't actually write to the framebuffer.
> >>>>
> >>>> So when we mapped the stencil buffer to do the glDrawPixels we weren't 
> >>>> getting the glClear()'d values.  Later, the tile cache was getting 
> >>>> flushed and that would overwrite the glDrawPixels() values.
> >>>>
> >>>> The attached patch flushes the driver's render cache when we get a 
> >>>> pipe_transfer object.  Also, I think the 
> >>>> PIPE_TEXTURE_USAGE_RENDER_TARGET flag needs to be set on the z/stencil 
> >>>> buffer (since we do render to it).
> >>>>
> >>>> -Brian
> >>>>
> >>>>   
> >>>>         
> >>> Hi, Brian.
> >>>
> >>> The conditional flush mechanism is such that when a driver has 
> >>> "buffered" an operation without flushing it to the "hardware", it should 
> >>> indicate that to the state-tracker. Typically in the HW driver case that 
> >>> means that commands have been queued in a batch buffer that is not yet 
> >>> flushed. However, if there is a pending clear in the softpipe driver, it 
> >>> should perhaps indicate that to the state-tracker, and the conditional 
> >>> flush code in st_teximage_flush_before_map() would take care of the 
> >>> flush. I think that would be the solution which is most consistent with 
> >>> how the HW drivers work.
> >>>       
> >> OK, how about the new attached patch?  I think softpipe needs to set 
> >> its dirty_render_cache flag in clear() and then we need to call 
> >> st_teximage_flush_before_map() in the st draw_stencil_pixels() code.
> >>
> >>
> >>     
> >>> I've had the discussion about PIPE_TEXTURE_USAGE_RENDER_TARGET with 
> >>> Keith and José before (for the dri state tracker) and IIRC the meaning 
> >>> of that define is strictly color render target. It really comes down to 
> >>> whether we define RENDER_TARGET as anything being written to or any 
> >>> color buffer being written to. Currently I think it's the latter.
> >>>       
> >> OK, I think we've got some loose ends related to the 
> >> PIPE_TEXTURE_USAGE_* flags.  For example, we never set 
> >> PIPE_TEXTURE_USAGE_PRIMARY in the state tracker (I think we should for 
> >> the front color buffer).  And, we always set 
> >> PIPE_TEXTURE_USAGE_DISPLAY_TARGET even for user-created/off-screen 
> >> renderbuffers.
> >>     
> >
> > Forgot attachment again! :(
> >
> > -Brian
> >
> >   
> Brian, See inline comments below.
> Also, for the user mode state tracker 
> 
> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c 
> b/src/mesa/state_tracker/st_cb_drawpixels.c
> index a9cafbf..e6d7739 100644
> --- a/src/mesa/state_tracker/st_cb_drawpixels.c
> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c
> @@ -675,6 +675,8 @@ draw_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
>     else
>        usage = PIPE_TRANSFER_WRITE;
>  
> +   st_teximage_flush_before_map(st, strb->texture, 0, 0, usage);
> +
>     pt = st_cond_flush_get_tex_transfer(st_context(ctx), strb->texture, 0, 0, 
> 0,
>                                      usage, x, y,
>                                      width, height);
> 
> 
> I think the above shouldn't be necessary, as st_cond_flush_get_tex_transfer() 
> does call
> st_teximage_flush_before_map().
> 
> 
> 
> diff --git a/src/gallium/drivers/softpipe/sp_clear.c 
> b/src/gallium/drivers/softpipe/sp_clear.c
> index fa59277..bc8f919 100644
> --- a/src/gallium/drivers/softpipe/sp_clear.c
> +++ b/src/gallium/drivers/softpipe/sp_clear.c
> @@ -86,4 +86,6 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, 
> const float *rgba,
>        pipe->surface_fill(pipe, ps, 0, 0, ps->width, ps->height, cv);
>  #endif
>        }
> +
> +   softpipe->dirty_render_cache = TRUE;
>  }
> 
> 
> Yes, looking at the softpipe is_texture_referenced() code, this should be 
> sufficient.
> 
> /Thomas

Yes, the sp_clear.c should be sufficient. If softpipe's clears are
deferred, then softpipe-> is_texture_referenced should return yes for a
texture/level that has pending clears.

Jose


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to