[Mesa-dev] [PATCH] intel: Replace intel_renderbuffer::region with a miptree [v2]

Chad Versace chad.versace at linux.intel.com
Mon Nov 21 12:12:14 PST 2011


On 11/21/2011 11:27 AM, Chad Versace wrote:
> On 11/18/2011 05:03 PM, Eric Anholt wrote:
>> On Fri, 18 Nov 2011 12:50:36 -0800, Chad Versace <chad.versace at linux.intel.com> wrote:
>>> Essentially, this patch just globally substitutes `irb->region` with
>>> `irb->mt->region` and then does some minor cleanups to avoid segfaults
>>> and other problems.
>>>
>>> This is in preparation for
>>>   1. Fixing scatter/gather for mipmapped separate stencil textures.
>>>   2. Supporting HiZ for mipmapped depth textures.
>>>
>>> As a nice benefit, this lays down some preliminary groundwork for easily
>>> texturing from any renderbuffer, even those of the window system.
>>>
>>> A future commit will replace intel_mipmap_tree::hiz_region with a miptree.
>>>
>>> v2:
>>>    - Return early in intel_process_dri2_buffer_*() if region allocation
>>>      fails.
>>>    - Fix double semicolon.
>>>    - Fix miptree reference leaks in the following functions:
>>>        intel_process_dri2_buffer_with_separate_stencil()
>>>        intel_image_target_renderbuffer_storage()
>>
>>> @@ -702,20 +696,21 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
>>>        _mesa_reference_renderbuffer(&irb->wrapped_stencil, stencil_rb);
>>>  
>>>     } else {
>>> -      irb->region = intel_region_alloc(intel->intelScreen, tiling, cpp,
>>> -				       width, height, true);
>>> -      if (!irb->region)
>>> +      irb->mt = intel_miptree_create_for_renderbuffer(intel, rb->Format,
>>> +                                                      tiling, cpp,
>>> +                                                      width, height);
>>> +      if (!irb->mt)
>>>  	 return false;
>>>  
>>>        if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) {
>>> -	 irb->hiz_region = intel_region_alloc(intel->intelScreen,
>>> -					      I915_TILING_Y,
>>> -					      irb->region->cpp,
>>> -					      irb->region->width,
>>> -					      irb->region->height,
>>> -					      true);
>>> -	 if (!irb->hiz_region) {
>>> -	    intel_region_release(&irb->region);
>>> +	 irb->mt->hiz_region = intel_region_alloc(intel->intelScreen,
>>> +	                                          I915_TILING_Y,
>>> +	                                          cpp,
>>> +	                                          rb->Width,
>>> +	                                          rb->Height,
>>> +	                                          true);
>>> +	 if (!irb->mt) {
>>> +	    intel_miptree_release(&irb->mt);
>>>  	    return false;
>>
>> I think this was meant to be if (!irb->mt->his_region).
>>
>> Other than that,
>>
>> Reviewed-by: Eric Anholt <eric at anholt.net>
> 
> I really meant to release irb->mt, not irb->mt->hiz_mt. Perhaps rephrasing
> the code like this reveals the code's intention more explicity.
> 
>       irb->mt = intel_miptree_create_for_renderbuffer(...)
> 
>       if (!irb->mt)
> 	 return false;
> 
>       if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) {
> 	 intel_miptree_alloc_hiz(intel, irb->mt);
> 	 if (!irb->mt->hiz_mt) {
> 	    intel_miptree_release(&irb->mt);
> 	    return false;
> 	 }
>       }
> 
> I chose to release the renderbuffer when the hiz miptree allocation fails
> because on gen6, hiz and separate stencil must be enabled together. If,
> when hiz miptree allocation failed, we allowed intel_alloc_rb_storage()
> to continue and succeed, this problematic situation could occur:
>    1. User creates a GL_DEPTH_COMPONENT24 renderbuffer. HiZ miptree allocation failed.
>    2. User attaches the depthbuffer to a fb and does some drawing. No problem.
>    3. User creates a GL_STENCIL_INDEX8 renderbuffer.
>    4. User attaches the stencilbuffer to the same fb. Here we must to detect
>       that the accompanying depthbuffer, without hiz, is incompatible, and
>       mark the fb as incomplete.
>    5. User says WTF.
> 
> I'm withholding your rb until you reply.

Oops. I fixed that hunk to this

	 if (!irb->mt->hiz_region) {
	    intel_miptree_release(&irb->mt);
	    return false;
	 }

and now accept your rb.

----
Chad Versace
chad.versace at linux.intel.com


More information about the mesa-dev mailing list