[Mesa-dev] [PATCH 11/23] gallium: implement blit in driver wrappers

Marek Olšák maraeo at gmail.com
Fri Sep 14 10:09:38 PDT 2012


---
 src/gallium/drivers/galahad/glhd_context.c |   26 +++++++++++
 src/gallium/drivers/identity/id_context.c  |   15 ++++++
 src/gallium/drivers/noop/noop_pipe.c       |    7 +++
 src/gallium/drivers/trace/tr_context.c     |   23 ++++++++++
 src/gallium/drivers/trace/tr_dump_state.c  |   69 +++++++++++++++++++++++++---
 src/gallium/drivers/trace/tr_dump_state.h  |    2 +
 6 files changed, 136 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/galahad/glhd_context.c b/src/gallium/drivers/galahad/glhd_context.c
index 601081b..e20986f 100644
--- a/src/gallium/drivers/galahad/glhd_context.c
+++ b/src/gallium/drivers/galahad/glhd_context.c
@@ -722,6 +722,31 @@ galahad_context_resource_copy_region(struct pipe_context *_pipe,
 }
 
 static void
+galahad_context_blit(struct pipe_context *_pipe,
+                     const struct pipe_blit_info *info)
+{
+   struct galahad_context *glhd_pipe = galahad_context(_pipe);
+   struct pipe_context *pipe = glhd_pipe->pipe;
+
+   if (info->dst.box.width < 0 ||
+       info->dst.box.height < 0)
+      glhd_error("Destination dimensions are negative");
+
+   if (info->filter != PIPE_TEX_FILTER_NEAREST &&
+       info->src.resource->target != PIPE_TEXTURE_3D &&
+       info->dst.box.depth != info->src.box.depth)
+      glhd_error("Filtering in z-direction on non-3D texture");
+
+   if (util_format_is_depth_or_stencil(info->dst.format) !=
+       util_format_is_depth_or_stencil(info->src.format))
+      glhd_error("Invalid format conversion: %s <- %s\n",
+                 util_format_name(info->dst.format),
+                 util_format_name(info->src.format));
+
+   pipe->blit(pipe, info);
+}
+
+static void
 galahad_context_clear(struct pipe_context *_pipe,
                unsigned buffers,
                const union pipe_color_union *color,
@@ -1054,6 +1079,7 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
    //GLHD_PIPE_INIT(stream_output_target_destroy);
    //GLHD_PIPE_INIT(set_stream_output_targets);
    GLHD_PIPE_INIT(resource_copy_region);
+   GLHD_PIPE_INIT(blit);
    //GLHD_PIPE_INIT(resource_resolve);
    GLHD_PIPE_INIT(clear);
    GLHD_PIPE_INIT(clear_render_target);
diff --git a/src/gallium/drivers/identity/id_context.c b/src/gallium/drivers/identity/id_context.c
index f5c6a5c..cf0a3f9 100644
--- a/src/gallium/drivers/identity/id_context.c
+++ b/src/gallium/drivers/identity/id_context.c
@@ -633,6 +633,20 @@ identity_resource_copy_region(struct pipe_context *_pipe,
 }
 
 static void
+identity_blit(struct pipe_context *_pipe,
+              const struct pipe_blit_info *info)
+{
+   struct identity_context *id_pipe = identity_context(_pipe);
+   struct pipe_context *pipe = id_pipe->pipe;
+   struct pipe_blit_info blit = *info;
+
+   blit.src.resource = identity_resource(blit.src.resource)->resource;
+   blit.dst.resource = identity_resource(blit.dst.resource)->resource;
+
+   pipe->blit(pipe, &blit);
+}
+
+static void
 identity_clear(struct pipe_context *_pipe,
                unsigned buffers,
                const union pipe_color_union *color,
@@ -937,6 +951,7 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
    id_pipe->base.transfer_unmap = identity_context_transfer_unmap;
    id_pipe->base.transfer_flush_region = identity_context_transfer_flush_region;
    id_pipe->base.transfer_inline_write = identity_context_transfer_inline_write;
+   id_pipe->base.blit = identity_blit;
 
    id_pipe->pipe = pipe;
 
diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c
index 8e77733..6411418 100644
--- a/src/gallium/drivers/noop/noop_pipe.c
+++ b/src/gallium/drivers/noop/noop_pipe.c
@@ -241,6 +241,12 @@ static void noop_resource_copy_region(struct pipe_context *ctx,
 }
 
 
+static void noop_blit(struct pipe_context *ctx,
+                      const struct pipe_blit_info *info)
+{
+}
+
+
 /*
  * context
  */
@@ -268,6 +274,7 @@ static struct pipe_context *noop_create_context(struct pipe_screen *screen, void
 	ctx->clear_render_target = noop_clear_render_target;
 	ctx->clear_depth_stencil = noop_clear_depth_stencil;
 	ctx->resource_copy_region = noop_resource_copy_region;
+	ctx->blit = noop_blit;
 	ctx->create_query = noop_create_query;
 	ctx->destroy_query = noop_destroy_query;
 	ctx->begin_query = noop_begin_query;
diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c
index f50a742..affdfca 100644
--- a/src/gallium/drivers/trace/tr_context.c
+++ b/src/gallium/drivers/trace/tr_context.c
@@ -1227,6 +1227,28 @@ trace_context_resource_copy_region(struct pipe_context *_pipe,
 
 
 static INLINE void
+trace_context_blit(struct pipe_context *_pipe,
+                   const struct pipe_blit_info *_info)
+{
+   struct trace_context *tr_ctx = trace_context(_pipe);
+   struct pipe_context *pipe = tr_ctx->pipe;
+   struct pipe_blit_info info = *_info;
+
+   info.dst.resource = trace_resource_unwrap(tr_ctx, info.dst.resource);
+   info.src.resource = trace_resource_unwrap(tr_ctx, info.src.resource);
+
+   trace_dump_call_begin("pipe_context", "blit");
+
+   trace_dump_arg(ptr, pipe);
+   trace_dump_arg(blit_info, _info);
+
+   pipe->blit(pipe, &info);
+
+   trace_dump_call_end();
+}
+
+
+static INLINE void
 trace_context_clear(struct pipe_context *_pipe,
                     unsigned buffers,
                     const union pipe_color_union *color,
@@ -1637,6 +1659,7 @@ trace_context_create(struct trace_screen *tr_scr,
    TR_CTX_INIT(stream_output_target_destroy);
    TR_CTX_INIT(set_stream_output_targets);
    TR_CTX_INIT(resource_copy_region);
+   TR_CTX_INIT(blit);
    TR_CTX_INIT(clear);
    TR_CTX_INIT(clear_render_target);
    TR_CTX_INIT(clear_depth_stencil);
diff --git a/src/gallium/drivers/trace/tr_dump_state.c b/src/gallium/drivers/trace/tr_dump_state.c
index 2e8df54..3df6f12 100644
--- a/src/gallium/drivers/trace/tr_dump_state.c
+++ b/src/gallium/drivers/trace/tr_dump_state.c
@@ -96,12 +96,12 @@ void trace_dump_box(const struct pipe_box *box)
 
    trace_dump_struct_begin("pipe_box");
 
-   trace_dump_member(uint, box, x);
-   trace_dump_member(uint, box, y);
-   trace_dump_member(uint, box, z);
-   trace_dump_member(uint, box, width);
-   trace_dump_member(uint, box, height);
-   trace_dump_member(uint, box, depth);
+   trace_dump_member(int, box, x);
+   trace_dump_member(int, box, y);
+   trace_dump_member(int, box, z);
+   trace_dump_member(int, box, width);
+   trace_dump_member(int, box, height);
+   trace_dump_member(int, box, depth);
 
    trace_dump_struct_end();
 }
@@ -693,3 +693,60 @@ void trace_dump_draw_info(const struct pipe_draw_info *state)
 
    trace_dump_struct_end();
 }
+
+void trace_dump_blit_info(const struct pipe_blit_info *info)
+{
+   char mask[7];
+
+   if (!trace_dumping_enabled_locked())
+      return;
+
+   if (!info) {
+      trace_dump_null();
+      return;
+   }
+
+   trace_dump_struct_begin("pipe_blit_info");
+
+   trace_dump_member_begin("dst");
+   trace_dump_struct_begin("dst");
+   trace_dump_member(resource_ptr, &info->dst, resource);
+   trace_dump_member(uint, &info->dst, level);
+   trace_dump_member(format, &info->dst, format);
+   trace_dump_member_begin("box");
+   trace_dump_box(&info->dst.box);
+   trace_dump_member_end();
+   trace_dump_struct_end();
+   trace_dump_member_end();
+
+   trace_dump_member_begin("src");
+   trace_dump_struct_begin("src");
+   trace_dump_member(resource_ptr, &info->src, resource);
+   trace_dump_member(uint, &info->src, level);
+   trace_dump_member(format, &info->src, format);
+   trace_dump_member_begin("box");
+   trace_dump_box(&info->src.box);
+   trace_dump_member_end();
+   trace_dump_struct_end();
+   trace_dump_member_end();
+
+   mask[0] = (info->mask & PIPE_MASK_R) ? 'R' : '-';
+   mask[1] = (info->mask & PIPE_MASK_G) ? 'G' : '-';
+   mask[2] = (info->mask & PIPE_MASK_B) ? 'B' : '-';
+   mask[3] = (info->mask & PIPE_MASK_A) ? 'A' : '-';
+   mask[4] = (info->mask & PIPE_MASK_Z) ? 'Z' : '-';
+   mask[5] = (info->mask & PIPE_MASK_S) ? 'S' : '-';
+   mask[6] = 0;
+
+   trace_dump_member_begin("mask");
+   trace_dump_string(mask);
+   trace_dump_member_end();
+   trace_dump_member(uint, info, filter);
+
+   trace_dump_member(bool, info, scissor_enable);
+   trace_dump_member_begin("scissor");
+   trace_dump_scissor_state(&info->scissor);
+   trace_dump_member_end();
+
+   trace_dump_struct_end();
+}
diff --git a/src/gallium/drivers/trace/tr_dump_state.h b/src/gallium/drivers/trace/tr_dump_state.h
index a6e7ccd..e17246b 100644
--- a/src/gallium/drivers/trace/tr_dump_state.h
+++ b/src/gallium/drivers/trace/tr_dump_state.h
@@ -81,5 +81,7 @@ void trace_dump_vertex_element(const struct pipe_vertex_element *state);
 
 void trace_dump_draw_info(const struct pipe_draw_info *state);
 
+void trace_dump_blit_info(const struct pipe_blit_info *);
+
 
 #endif /* TR_STATE_H */
-- 
1.7.9.5



More information about the mesa-dev mailing list