<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jun 13, 2014 at 5:59 PM, Neil Roberts <span dir="ltr"><<a href="mailto:neil@linux.intel.com" target="_blank">neil@linux.intel.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Adds an implmentation of the ClearTexSubImage driver entry point that just<br>
maps the texture and writes the values in. This should work as a reliable<br>
fallback on any driver.<br>
---<br>
 src/mesa/drivers/common/driverfuncs.c |  2 +<br>
 src/mesa/main/texstore.c              | 70 +++++++++++++++++++++++++++++++++++<br>
 src/mesa/main/texstore.h              |  7 ++++<br>
 3 files changed, 79 insertions(+)<br>
<br>
diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c<br>
index ee8b390..34b6fef 100644<br>
--- a/src/mesa/drivers/common/driverfuncs.c<br>
+++ b/src/mesa/drivers/common/driverfuncs.c<br>
@@ -95,6 +95,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)<br>
    driver->TexImage = _mesa_store_teximage;<br>
    driver->TexSubImage = _mesa_store_texsubimage;<br>
    driver->GetTexImage = _mesa_meta_GetTexImage;<br>
+   driver->ClearTexSubImage = _mesa_store_cleartexsubimage;<br>
    driver->CopyTexSubImage = _mesa_meta_CopyTexSubImage;<br>
    driver->GenerateMipmap = _mesa_meta_GenerateMipmap;<br>
    driver->TestProxyTexImage = _mesa_test_proxy_teximage;<br>
@@ -333,4 +334,5 @@ _mesa_init_driver_state(struct gl_context *ctx)<br>
 void<br>
 _mesa_init_driver_extensions(struct gl_context *ctx)<br>
 {<br>
+   ctx->Extensions.ARB_clear_texture = GL_TRUE;<br>
 }<br>
diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c<br>
index cb81f3f..9c90492 100644<br>
--- a/src/mesa/main/texstore.c<br>
+++ b/src/mesa/main/texstore.c<br>
@@ -4157,6 +4157,76 @@ _mesa_store_texsubimage(struct gl_context *ctx, GLuint dims,<br>
                      format, type, pixels, packing, "glTexSubImage");<br>
 }<br>
<br>
+static void<br>
+clear_image_to_zero(GLubyte *dstMap, GLint dstRowStride,<br>
+                    GLsizei width, GLsizei height,<br>
+                    GLsizei clearValueSize)<br>
+{<br>
+   while (height-- > 0) {<br>
+      memset(dstMap, 0, clearValueSize * width);<br>
+      dstMap += dstRowStride;<br>
+   }<br>
+}<br></blockquote><div><br></div><div>Technically, this should always work, but you might want to throw in a comment about floating-point textures.<br><br></div><div>Other than that, looks good to me. (I'll second Ilia's MS comment though.)<br>
</div><div>--Jason Ekstrand<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+static void<br>
+clear_image_to_value(GLubyte *dstMap, GLint dstRowStride,<br>
+                     GLsizei width, GLsizei height,<br>
+                     const GLvoid *clearValue,<br>
+                     GLsizei clearValueSize)<br>
+{<br>
+   GLsizei x;<br>
+<br>
+   while (height-- > 0) {<br>
+      for (x = 0; x < width; x++) {<br>
+         memcpy(dstMap, clearValue, clearValueSize);<br>
+         dstMap += clearValueSize;<br>
+      }<br>
+      dstMap += dstRowStride - clearValueSize * width;<br>
+   }<br>
+}<br>
+<br>
+/*<br>
+ * Fallback for Driver.ClearTexSubImage().<br>
+ */<br>
+void<br>
+_mesa_store_cleartexsubimage(struct gl_context *ctx,<br>
+                             struct gl_texture_image *texImage,<br>
+                             GLint xoffset, GLint yoffset, GLint zoffset,<br>
+                             GLsizei width, GLsizei height, GLsizei depth,<br>
+                             const GLvoid *clearValue)<br>
+{<br>
+   GLubyte *dstMap;<br>
+   GLint dstRowStride;<br>
+   GLsizeiptr clearValueSize;<br>
+   GLsizei z;<br>
+<br>
+   clearValueSize = _mesa_get_format_bytes(texImage->TexFormat);<br>
+<br>
+   for (z = 0; z < depth; z++) {<br>
+      ctx->Driver.MapTextureImage(ctx, texImage,<br>
+                                  z + zoffset, xoffset, yoffset,<br>
+                                  width, height,<br>
+                                  GL_MAP_WRITE_BIT,<br>
+                                  &dstMap, &dstRowStride);<br>
+      if (dstMap == NULL) {<br>
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClearTex*Image");<br>
+         return;<br>
+      }<br>
+<br>
+      if (clearValue) {<br>
+         clear_image_to_value(dstMap, dstRowStride,<br>
+                              width, height,<br>
+                              clearValue,<br>
+                              clearValueSize);<br>
+      } else {<br>
+         clear_image_to_zero(dstMap, dstRowStride,<br>
+                             width, height,<br>
+                             clearValueSize);<br>
+      }<br>
+<br>
+      ctx->Driver.UnmapTextureImage(ctx, texImage, z + zoffset);<br>
+   }<br>
+}<br>
<br>
 /**<br>
  * Fallback for Driver.CompressedTexImage()<br>
diff --git a/src/mesa/main/texstore.h b/src/mesa/main/texstore.h<br>
index c4cfffd..dd1e1d0 100644<br>
--- a/src/mesa/main/texstore.h<br>
+++ b/src/mesa/main/texstore.h<br>
@@ -118,6 +118,13 @@ _mesa_store_texsubimage(struct gl_context *ctx, GLuint dims,<br>
<br>
<br>
 extern void<br>
+_mesa_store_cleartexsubimage(struct gl_context *ctx,<br>
+                             struct gl_texture_image *texImage,<br>
+                             GLint xoffset, GLint yoffset, GLint zoffset,<br>
+                             GLsizei width, GLsizei height, GLsizei depth,<br>
+                             const GLvoid *clearValue);<br>
+<br>
+extern void<br>
 _mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims,<br>
                                 struct gl_texture_image *texImage,<br>
                                 GLsizei imageSize, const GLvoid *data);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.9.3<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>