[Mesa-dev] [PATCH 3/4] st/mesa: add an api for clearing resources and ARB_clear_texture impl

Ilia Mirkin imirkin at alum.mit.edu
Thu Mar 6 22:41:17 PST 2014


Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---

Unfortunately a generic implementation isn't possible since this has to deal
with multisampled textures, where the storage format isn't well-defined. Maybe
we can assume that in each case it will be a certain amount of width/height
increase and create PIPE_CAP's? Probably not worth it, since each driver will
want to provide an accelerated version.

Christoph also suggested that maybe we should abuse the clear_render_target
interface -- that's how I've implemented nv50 internally. But I don't think we
can really guarantee that all drivers would work that way.

Is clear_resource the right thing to call it, or should it be clear_surface
and take a pipe_surface? I was concerned that it might not be legal to create
a pipe_surface with a texture format that's non-renderable-to.

 src/gallium/include/pipe/p_context.h   |  9 +++++++++
 src/mesa/state_tracker/st_cb_texture.c | 23 +++++++++++++++++++++++
 src/mesa/state_tracker/st_extensions.c |  3 +++
 3 files changed, 35 insertions(+)

diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
index 0702729..ab4c198 100644
--- a/src/gallium/include/pipe/p_context.h
+++ b/src/gallium/include/pipe/p_context.h
@@ -291,6 +291,15 @@ struct pipe_context {
    void (*blit)(struct pipe_context *pipe,
                 const struct pipe_blit_info *info);
 
+   /**
+    * Clear the resource with the specified texel. Not guaranteed to be a
+    * renderable format. Data provided in the resource's format.
+    */
+   void (*clear_resource)(struct pipe_context *pipe,
+                          struct pipe_resource *res,
+                          const struct pipe_box *box,
+                          const void *data);
+
    /*@}*/
 
    /**
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index f0bf374..1cb9efb 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1746,6 +1746,28 @@ st_TestProxyTexImage(struct gl_context *ctx, GLenum target,
    }
 }
 
+static void
+st_ClearTexSubImage(struct gl_context *ctx,
+                    struct gl_texture_image *texImage,
+                    GLint xoffset, GLint yoffset, GLint zoffset,
+                    GLsizei width, GLsizei height, GLsizei depth,
+                    const GLubyte *clearValue, GLsizeiptr clearValueSize)
+{
+   struct st_texture_image *stImage = st_texture_image(texImage);
+   struct pipe_resource *pt = stImage->pt;
+   struct st_context *st = st_context(ctx);
+   struct pipe_context *pipe = st->pipe;
+   struct pipe_box box;
+
+   /* XXX need to handle data stored in stImage->TexData? */
+   if (!pt)
+      return;
+
+   u_box_3d(xoffset, yoffset, zoffset, width, height, depth, &box);
+
+   pipe->clear_resource(pipe, pt, &box, clearValue);
+}
+
 
 void
 st_init_texture_functions(struct dd_function_table *functions)
@@ -1777,4 +1799,5 @@ st_init_texture_functions(struct dd_function_table *functions)
    functions->TestProxyTexImage = st_TestProxyTexImage;
 
    functions->AllocTextureStorage = st_AllocTextureStorage;
+   functions->ClearTexSubImage = st_ClearTexSubImage;
 }
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 18ddd4e..bda3127 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -797,4 +797,7 @@ void st_init_extensions(struct st_context *st)
    }
    if (ctx->Const.MaxProgramTextureGatherComponents > 0)
       ctx->Extensions.ARB_texture_gather = GL_TRUE;
+
+   if (st->pipe->clear_resource)
+      ctx->Extensions.ARB_clear_texture = GL_TRUE;
 }
-- 
1.8.3.2



More information about the mesa-dev mailing list