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.


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



------------------------------------------------------------------------------
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