[Mesa-dev] [PATCH 3/4] intel: Unobfuscate intel_alloc_renderbuffer_storage
Kenneth Graunke
kenneth at whitecape.org
Sun Jun 19 02:56:51 PDT 2011
On 06/17/2011 03:43 PM, Chad Versace wrote:
> Hiz buffer allocation can only occur if the 'else' branch has been taken,
> so move the hiz buffer allocation into the 'else' branch.
>
> Having the hiz buffer allocation dangling outside of the if-tree was just
> damn confusing.
>
> Signed-off-by: Chad Versace<chad at chad-versace.us>
> ---
> src/mesa/drivers/dri/intel/intel_fbo.c | 31 ++++++++++++++-----------------
> 1 files changed, 14 insertions(+), 17 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
> index b48eac4..0d49a55 100644
> --- a/src/mesa/drivers/dri/intel/intel_fbo.c
> +++ b/src/mesa/drivers/dri/intel/intel_fbo.c
> @@ -199,23 +199,20 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
> } else {
> irb->region = intel_region_alloc(intel->intelScreen, tiling, cpp,
> width, height, GL_TRUE);
> - }
> -
> - if (!irb->region)
> - return GL_FALSE; /* out of memory? */
> -
> - ASSERT(irb->region->buffer);
NAK. Allocation may fail in the S8 case. Prior to this patch, it would
check for !irb->region and properly return false. By moving this check
into the "else" branch, you fail to check this. Leaving that check
below seems sensible, as it hits both clauses.
Presumably "out of memory" could happen if the application requests
ridiculously huge buffers. So properly checking and saying no seems
like a good thing to do. (Of course, I haven't checked if the callers
of this function actually check the return code...)
> - if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) {
Clearly this only applies in the "else" case (S8 is not a HiZ format),
so moving this there would be fine...
> - irb->hiz_region = intel_region_alloc(intel->intelScreen,
> - I915_TILING_Y,
> - irb->region->cpp,
> - irb->region->width,
> - irb->region->height,
> - GL_TRUE);
> - if (!irb->hiz_region) {
> - intel_region_release(&irb->region);
Therein lies the problem: You do need to check !irb->region before the
intel_region_release. So you can't move this into the else clause and
leave the if (!irb->region) return false; below. You'd have to
duplicate it, I suppose.
I actually think the code was quite sensible before this change, and
it's fine to leave it as is. But whatever you and Eric decide is fine.
> - return GL_FALSE;
> + if (!irb->region)
> + 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,
> + GL_TRUE);
> + if (!irb->hiz_region) {
> + intel_region_release(&irb->region);
> + return false;
> + }
> }
> }
More information about the mesa-dev
mailing list