On 08/27/2015 02:28 AM, Pohjolainen, Topi wrote:
On Mon, Aug 24, 2015 at 05:04:22PM -0600, Brian Paul wrote:
Previously, core Mesa's _mesa_CopyImageSubData() created temporary textures
to wrap renderbuffer sources/destinations.  This caused a bit of a mess in
the Mesa/gallium state tracker because we had to basically undo that
wrapping.

Instead, change ctx->Driver.CopyImageSubData() to take both gl_renderbuffer
and gl_texture_image src/dst pointers (one being null, the other non-null)
so the driver can handle renderbuffer vs. texture as needed.

For the i965 driver, we basically moved the code that wrapped textures
around renderbuffers from copyimage.c down into the driver.  So that
approach is still used there as before.

The old code in copyimage.c also made some questionable calls to
_mesa_BindTexture(), etc. which weren't undone at the end.
---
  src/mesa/drivers/dri/i965/intel_copy_image.c |  83 +++++++-
  src/mesa/main/copyimage.c                    | 301 +++++++++++++++------------
  src/mesa/main/dd.h                           |  15 +-
  3 files changed, 259 insertions(+), 140 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_copy_image.c 
b/src/mesa/drivers/dri/i965/intel_copy_image.c
index 3706704..8f765b4 100644
--- a/src/mesa/drivers/dri/i965/intel_copy_image.c
+++ b/src/mesa/drivers/dri/i965/intel_copy_image.c
@@ -29,6 +29,7 @@
  #include "intel_blit.h"
  #include "intel_mipmap_tree.h"
  #include "main/formats.h"
+#include "main/teximage.h"
  #include "drivers/common/meta.h"

  static bool
@@ -213,29 +214,90 @@ copy_image_with_memcpy(struct brw_context *brw,
     }
  }

+
+/**
+ * Create a texture image that wraps a renderbuffer.
+ */
+static struct intel_texture_image *
+wrap_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
+{
+   GLenum texTarget;
+   struct gl_texture_object *texObj;
+   struct gl_texture_image *texImage;
+
+   if (rb->NumSamples > 1)
+      texTarget = GL_TEXTURE_2D_MULTISAMPLE;
+   else
+      texTarget = GL_TEXTURE_2D;
+
+   /* Texture ID is not significant since it never goes into the hash table */
+   texObj = ctx->Driver.NewTextureObject(ctx, 0, texTarget);
+   assert(texObj);
+   if (!texObj)
+      return NULL;
+
+   texImage = _mesa_get_tex_image(ctx, texObj, texTarget, 0);
+   assert(texImage);
+   if (!texImage)
+      return NULL;
+
+   if (!ctx->Driver.BindRenderbufferTexImage(ctx, rb, texImage)) {
+      _mesa_problem(ctx, "Failed to create texture from renderbuffer");
+      return NULL;
+   }
+
+   if (ctx->Driver.FinishRenderTexture && !rb->NeedsFinishRenderTexture) {
+      rb->NeedsFinishRenderTexture = true;
+      ctx->Driver.FinishRenderTexture(ctx, rb);
+   }
+
+   return intel_texture_image(texImage);
+}
+
+
  static void
  intel_copy_image_sub_data(struct gl_context *ctx,
                            struct gl_texture_image *src_image,
+                          struct gl_renderbuffer *src_renderbuffer,
                            int src_x, int src_y, int src_z,
                            struct gl_texture_image *dst_image,
+                          struct gl_renderbuffer *dst_renderbuffer,
                            int dst_x, int dst_y, int dst_z,
                            int src_width, int src_height)
  {
     struct brw_context *brw = brw_context(ctx);
-   struct intel_texture_image *intel_src_image = 
intel_texture_image(src_image);
-   struct intel_texture_image *intel_dst_image = 
intel_texture_image(dst_image);
+   struct intel_texture_image *intel_src_image;
+   struct intel_texture_image *intel_dst_image;
+
+   if (src_renderbuffer) {

If we don't take this branch, then 'intel_src_image' is left undefined, right?

Oops, yes.  I'll fix that.

I'll post a v2 of the series soon with assorted fixes and changes.

I can't test the Intel changes so it would be nice if someone could apply/test this patch on Intel HW.

-Brian


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to