intel: Make the separate stencil RB storage path match texture more.
authorEric Anholt <eric@anholt.net>
Wed, 7 Dec 2011 23:38:08 +0000 (15:38 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 14 Dec 2011 21:18:44 +0000 (13:18 -0800)
There were too many things making intel_renderbuffer *s and tweaking
their bits.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/intel/intel_fbo.c

index 8a124377a7f847e57f996082a3f1e1e02e29fd90..63a3d302727f55b1e66076021c3e67582e67e45a 100644 (file)
 
 #define FILE_DEBUG_FLAG DEBUG_FBO
 
+static struct gl_renderbuffer *
+intel_new_renderbuffer(struct gl_context * ctx, GLuint name);
+
+static bool
+intel_renderbuffer_update_wrapper(struct intel_context *intel,
+                                  struct intel_renderbuffer *irb,
+                                  struct intel_mipmap_tree *mt,
+                                  uint32_t level,
+                                  uint32_t layer,
+                                  gl_format format,
+                                  GLenum internal_format);
 
 bool
 intel_framebuffer_has_hiz(struct gl_framebuffer *fb)
@@ -193,7 +204,6 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
 {
    struct intel_context *intel = intel_context(ctx);
    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
-   int cpp;
 
    ASSERT(rb->Name != 0);
 
@@ -235,58 +245,56 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
        _mesa_lookup_enum_by_nr(internalFormat),
        _mesa_get_format_name(rb->Format), width, height);
 
-   if (irb->Base.Format == MESA_FORMAT_S8_Z24 && intel->has_separate_stencil) {
-      bool ok = true;
-      struct gl_renderbuffer *depth_rb;
-      struct gl_renderbuffer *stencil_rb;
-      struct intel_renderbuffer *depth_irb, *stencil_irb;
-
-      depth_rb = intel_create_wrapped_renderbuffer(ctx, width, height,
-                                                  MESA_FORMAT_X8_Z24);
-      stencil_rb = intel_create_wrapped_renderbuffer(ctx, width, height,
-                                                    MESA_FORMAT_S8);
-      ok = depth_rb && stencil_rb;
-      ok = ok && intel_alloc_renderbuffer_storage(ctx, depth_rb,
-                                                 depth_rb->InternalFormat,
-                                                 width, height);
-      ok = ok && intel_alloc_renderbuffer_storage(ctx, stencil_rb,
-                                                 stencil_rb->InternalFormat,
-                                                 width, height);
+   irb->mt = intel_miptree_create_for_renderbuffer(intel, rb->Format,
+                                                  width, height);
+   if (!irb->mt)
+      return false;
 
+   if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) {
+      bool ok = intel_miptree_alloc_hiz(intel, irb->mt);
       if (!ok) {
-        if (depth_rb) {
-           intel_delete_renderbuffer(depth_rb);
-        }
-        if (stencil_rb) {
-           intel_delete_renderbuffer(stencil_rb);
-        }
+        intel_miptree_release(&irb->mt);
         return false;
       }
+   }
 
-      depth_irb = intel_renderbuffer(depth_rb);
-      stencil_irb = intel_renderbuffer(stencil_rb);
-
-      intel_miptree_reference(&depth_irb->mt->stencil_mt, stencil_irb->mt);
-      intel_miptree_reference(&irb->mt, depth_irb->mt);
+   if (irb->mt->stencil_mt) {
+      bool ok;
+      struct intel_renderbuffer *depth_irb, *stencil_irb;
 
-      depth_rb->Wrapped = rb;
-      stencil_rb->Wrapped = rb;
-      _mesa_reference_renderbuffer(&irb->wrapped_depth, depth_rb);
-      _mesa_reference_renderbuffer(&irb->wrapped_stencil, stencil_rb);
+      /* The RB got allocated as separate stencil.  Hook up our wrapped
+       * renderbuffers so that consumers of intel_get_renderbuffer() end up
+       * with pointers to the separate pieces.
+       */
+      if (!irb->wrapped_depth) {
+        _mesa_reference_renderbuffer(&irb->wrapped_depth,
+                                     intel_new_renderbuffer(ctx, ~0));
+      }
+      if (!irb->wrapped_stencil) {
+        _mesa_reference_renderbuffer(&irb->wrapped_stencil,
+                                     intel_new_renderbuffer(ctx, ~0));
+      }
 
-   } else {
-      irb->mt = intel_miptree_create_for_renderbuffer(intel, rb->Format,
-                                                      width, height);
-      if (!irb->mt)
+      depth_irb = intel_renderbuffer(irb->wrapped_depth);
+      stencil_irb = intel_renderbuffer(irb->wrapped_stencil);
+      if (!depth_irb || !stencil_irb) {
+        intel_miptree_release(&irb->mt);
         return false;
-
-      if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) {
-        bool ok = intel_miptree_alloc_hiz(intel, irb->mt);
-        if (!ok) {
-           intel_miptree_release(&irb->mt);
-           return false;
-        }
       }
+
+      assert(irb->mt->format == MESA_FORMAT_S8_Z24);
+      ok = intel_renderbuffer_update_wrapper(intel, depth_irb, irb->mt,
+                                            0, 0, /* level, layer */
+                                            MESA_FORMAT_X8_Z24,
+                                            GL_DEPTH_COMPONENT24);
+      assert(ok);
+
+      ok = intel_renderbuffer_update_wrapper(intel, stencil_irb,
+                                            irb->mt->stencil_mt,
+                                            0, 0, /* level, layer */
+                                            MESA_FORMAT_S8,
+                                            GL_STENCIL_INDEX);
+      assert(ok);
    }
 
    return true;
@@ -426,38 +434,6 @@ intel_create_renderbuffer(gl_format format)
    return irb;
 }
 
-
-struct gl_renderbuffer*
-intel_create_wrapped_renderbuffer(struct gl_context * ctx,
-                                 int width, int height,
-                                 gl_format format)
-{
-   /*
-    * The name here is irrelevant, as long as its nonzero, because the
-    * renderbuffer never gets entered into Mesa's renderbuffer hash table.
-    */
-   GLuint name = ~0;
-
-   struct intel_renderbuffer *irb = CALLOC_STRUCT(intel_renderbuffer);
-   if (!irb) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "creating renderbuffer");
-      return NULL;
-   }
-
-   struct gl_renderbuffer *rb = &irb->Base;
-   _mesa_init_renderbuffer(rb, name);
-   rb->ClassID = INTEL_RB_CLASS;
-   rb->_BaseFormat = _mesa_get_format_base_format(format);
-   rb->Format = format;
-   rb->InternalFormat = rb->_BaseFormat;
-   rb->DataType = intel_mesa_format_to_rb_datatype(format);
-   rb->Width = width;
-   rb->Height = height;
-
-   return rb;
-}
-
-
 /**
  * Create a new renderbuffer object.
  * Typically called via glBindRenderbufferEXT().