<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>