diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.c | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_hyperz.c | 21 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_hyperz.h | 2 | 
3 files changed, 20 insertions, 6 deletions
diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index 25b39c566c..d783f21f5f 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -457,7 +457,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,      /* setup hyper-z mm */      if (r300->rws->get_value(r300->rws, R300_CAN_HYPERZ)) -        r300_hyperz_init_mm(r300); +        if (!r300_hyperz_init_mm(r300)) +            goto fail;      r300->upload_ib = u_upload_create(&r300->context,  				      32 * 1024, 16, diff --git a/src/gallium/drivers/r300/r300_hyperz.c b/src/gallium/drivers/r300/r300_hyperz.c index 811b5646e1..a471b7353b 100644 --- a/src/gallium/drivers/r300/r300_hyperz.c +++ b/src/gallium/drivers/r300/r300_hyperz.c @@ -373,23 +373,36 @@ void r300_zmask_alloc_block(struct r300_context *r300, struct r300_surface *surf      return;  } -void r300_hyperz_init_mm(struct r300_context *r300) +boolean r300_hyperz_init_mm(struct r300_context *r300)  {      struct r300_screen* r300screen = r300->screen;      int frag_pipes = r300screen->caps.num_frag_pipes; -    if (r300screen->caps.hiz_ram) +    r300->zmask_mm = u_mmInit(0, r300screen->caps.zmask_ram * frag_pipes); +    if (!r300->zmask_mm) +      return FALSE; + +    if (r300screen->caps.hiz_ram) {        r300->hiz_mm = u_mmInit(0, r300screen->caps.hiz_ram * frag_pipes); +      if (!r300->hiz_mm) { +        u_mmDestroy(r300->zmask_mm); +        r300->zmask_mm = NULL; +        return FALSE; +      } +    } -    r300->zmask_mm = u_mmInit(0, r300screen->caps.zmask_ram * frag_pipes); +    return TRUE;  }  void r300_hyperz_destroy_mm(struct r300_context *r300)  {      struct r300_screen* r300screen = r300->screen; -    if (r300screen->caps.hiz_ram) +    if (r300screen->caps.hiz_ram) {        u_mmDestroy(r300->hiz_mm); +      r300->hiz_mm = NULL; +    }      u_mmDestroy(r300->zmask_mm); +    r300->zmask_mm = NULL;  } diff --git a/src/gallium/drivers/r300/r300_hyperz.h b/src/gallium/drivers/r300/r300_hyperz.h index 09e1ff6625..30a23ec649 100644 --- a/src/gallium/drivers/r300/r300_hyperz.h +++ b/src/gallium/drivers/r300/r300_hyperz.h @@ -30,6 +30,6 @@ void r300_update_hyperz_state(struct r300_context* r300);  void r300_hiz_alloc_block(struct r300_context *r300, struct r300_surface *surf);  void r300_zmask_alloc_block(struct r300_context *r300, struct r300_surface *surf, int compress); -void r300_hyperz_init_mm(struct r300_context *r300); +boolean r300_hyperz_init_mm(struct r300_context *r300);  void r300_hyperz_destroy_mm(struct r300_context *r300);  #endif  | 
