[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