ilo: refactor separate stencil allocation
authorChia-I Wu <olvaffe@gmail.com>
Sat, 21 Dec 2013 13:21:24 +0000 (21:21 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 8 Jan 2014 10:11:35 +0000 (18:11 +0800)
Move separate stencil allocation code to tex_create_separate_stencil to keep
tex_create sane.

src/gallium/drivers/ilo/ilo_resource.c

index 7dd34359302572d0c0768904dfc4715015f5fea6..04927d8bfa43c9db3650336e090f971b8a7c6c8a 100644 (file)
@@ -969,6 +969,30 @@ tex_create_bo(struct ilo_texture *tex,
    return true;
 }
 
+static bool
+tex_create_separate_stencil(struct ilo_texture *tex)
+{
+   struct pipe_resource templ = tex->base;
+   struct pipe_resource *s8;
+
+   /*
+    * Unless PIPE_BIND_DEPTH_STENCIL is set, the resource may have other
+    * tilings.  But that should be fine since it will never be bound as the
+    * stencil buffer, and our transfer code can handle all tilings.
+    */
+   templ.format = PIPE_FORMAT_S8_UINT;
+
+   s8 = tex->base.screen->resource_create(tex->base.screen, &templ);
+   if (!s8)
+      return false;
+
+   tex->separate_s8 = ilo_texture(s8);
+
+   assert(tex->separate_s8->bo_format == PIPE_FORMAT_S8_UINT);
+
+   return true;
+}
+
 static void
 tex_destroy(struct ilo_texture *tex)
 {
@@ -1053,26 +1077,9 @@ tex_create(struct pipe_screen *screen,
    }
 
    /* allocate separate stencil resource */
-   if (layout.separate_stencil) {
-      struct pipe_resource s8_templ = *layout.templ;
-      struct pipe_resource *s8;
-
-      /*
-       * Unless PIPE_BIND_DEPTH_STENCIL is set, the resource may have other
-       * tilings.  But that should be fine since it will never be bound as the
-       * stencil buffer, and our transfer code can handle all tilings.
-       */
-      s8_templ.format = PIPE_FORMAT_S8_UINT;
-
-      s8 = screen->resource_create(screen, &s8_templ);
-      if (!s8) {
-         tex_destroy(tex);
-         return NULL;
-      }
-
-      tex->separate_s8 = ilo_texture(s8);
-
-      assert(tex->separate_s8->bo_format == PIPE_FORMAT_S8_UINT);
+   if (layout.separate_stencil && !tex_create_separate_stencil(tex)) {
+      tex_destroy(tex);
+      return NULL;
    }
 
    return &tex->base;