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.vers...@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 <e...@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.vers...@linux.intel.com _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev