<div dir="ltr"><div><div>For patches 1-3:<br><br></div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>><br><br></div>Marek<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 14, 2018 at 2:01 AM, Timothy Arceri <span dir="ltr"><<a href="mailto:tarceri@itsqueeze.com" target="_blank">tarceri@itsqueeze.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">These will be used in the following patch to allow copying directly<br>
to the param list when packing is enabled.<br>
<br>
Reviewed-by: Nicolai Hähnle <<a href="mailto:nicolai.haehnle@amd.com">nicolai.haehnle@amd.com</a>><br>
---<br>
src/mesa/main/uniform_query.<wbr>cpp | 154 ++++++++++++++++++++++++------<wbr>----------<br>
1 file changed, 91 insertions(+), 63 deletions(-)<br>
<br>
diff --git a/src/mesa/main/uniform_query.<wbr>cpp b/src/mesa/main/uniform_query.<wbr>cpp<br>
index 52b04c9243..eaed536f68 100644<br>
--- a/src/mesa/main/uniform_query.<wbr>cpp<br>
+++ b/src/mesa/main/uniform_query.<wbr>cpp<br>
@@ -1029,6 +1029,42 @@ _mesa_flush_vertices_for_<wbr>uniforms(struct gl_context *ctx,<br>
ctx->NewDriverState |= new_driver_state;<br>
}<br>
<br>
+static void<br>
+copy_uniforms_to_storage(<wbr>struct gl_uniform_storage *uni,<br>
+ struct gl_context *ctx, GLsizei count,<br>
+ const GLvoid *values, const int size_mul,<br>
+ const unsigned offset, const unsigned components,<br>
+ enum glsl_base_type basicType)<br>
+{<br>
+ if (!uni->type->is_boolean() && !uni->is_bindless) {<br>
+ memcpy(&uni->storage[size_mul * components * offset], values,<br>
+ sizeof(uni->storage[0]) * components * count * size_mul);<br>
+ } else if (uni->is_bindless) {<br>
+ const union gl_constant_value *src =<br>
+ (const union gl_constant_value *) values;<br>
+ GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i;<br>
+ const unsigned elems = components * count;<br>
+<br>
+ for (unsigned i = 0; i < elems; i++) {<br>
+ dst[i] = src[i].i;<br>
+ }<br>
+ } else {<br>
+ const union gl_constant_value *src =<br>
+ (const union gl_constant_value *) values;<br>
+ union gl_constant_value *dst = &uni->storage[components * offset];<br>
+ const unsigned elems = components * count;<br>
+<br>
+ for (unsigned i = 0; i < elems; i++) {<br>
+ if (basicType == GLSL_TYPE_FLOAT) {<br>
+ dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue : 0;<br>
+ } else {<br>
+ dst[i].i = src[i].i != 0 ? ctx->Const.UniformBooleanTrue : 0;<br>
+ }<br>
+ }<br>
+ }<br>
+}<br>
+<br>
+<br>
/**<br>
* Called via glUniform*() functions.<br>
*/<br>
@@ -1091,32 +1127,8 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,<br>
<br>
/* Store the data in the "actual type" backing storage for the uniform.<br>
*/<br>
- if (!uni->type->is_boolean() && !uni->is_bindless) {<br>
- memcpy(&uni->storage[size_mul * components * offset], values,<br>
- sizeof(uni->storage[0]) * components * count * size_mul);<br>
- } else if (uni->is_bindless) {<br>
- const union gl_constant_value *src =<br>
- (const union gl_constant_value *) values;<br>
- GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i;<br>
- const unsigned elems = components * count;<br>
-<br>
- for (unsigned i = 0; i < elems; i++) {<br>
- dst[i] = src[i].i;<br>
- }<br>
- } else {<br>
- const union gl_constant_value *src =<br>
- (const union gl_constant_value *) values;<br>
- union gl_constant_value *dst = &uni->storage[components * offset];<br>
- const unsigned elems = components * count;<br>
-<br>
- for (unsigned i = 0; i < elems; i++) {<br>
- if (basicType == GLSL_TYPE_FLOAT) {<br>
- dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue : 0;<br>
- } else {<br>
- dst[i].i = src[i].i != 0 ? ctx->Const.UniformBooleanTrue : 0;<br>
- }<br>
- }<br>
- }<br>
+ copy_uniforms_to_storage(uni, ctx, count, values, size_mul, offset,<br>
+ components, basicType);<br>
<br>
_mesa_propagate_uniforms_to_<wbr>driver_storage(uni, offset, count);<br>
<br>
@@ -1208,6 +1220,56 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,<br>
}<br>
}<br>
<br>
+<br>
+static void<br>
+copy_uniform_matrix_to_<wbr>storage(struct gl_uniform_storage *const uni,<br>
+ GLsizei count, const void *values,<br>
+ const unsigned size_mul, const unsigned offset,<br>
+ const unsigned components,<br>
+ const unsigned vectors, bool transpose,<br>
+ unsigned cols, unsigned rows,<br>
+ enum glsl_base_type basicType)<br>
+{<br>
+ const unsigned elements = components * vectors;<br>
+<br>
+ if (!transpose) {<br>
+ memcpy(&uni->storage[size_mul * elements * offset], values,<br>
+ sizeof(uni->storage[0]) * elements * count * size_mul);<br>
+ } else if (basicType == GLSL_TYPE_FLOAT) {<br>
+ /* Copy and transpose the matrix.<br>
+ */<br>
+ const float *src = (const float *)values;<br>
+ float *dst = &uni->storage[elements * offset].f;<br>
+<br>
+ for (int i = 0; i < count; i++) {<br>
+ for (unsigned r = 0; r < rows; r++) {<br>
+ for (unsigned c = 0; c < cols; c++) {<br>
+ dst[(c * components) + r] = src[c + (r * vectors)];<br>
+ }<br>
+ }<br>
+<br>
+ dst += elements;<br>
+ src += elements;<br>
+ }<br>
+ } else {<br>
+ assert(basicType == GLSL_TYPE_DOUBLE);<br>
+ const double *src = (const double *)values;<br>
+ double *dst = (double *)&uni->storage[elements * offset].f;<br>
+<br>
+ for (int i = 0; i < count; i++) {<br>
+ for (unsigned r = 0; r < rows; r++) {<br>
+ for (unsigned c = 0; c < cols; c++) {<br>
+ dst[(c * components) + r] = src[c + (r * vectors)];<br>
+ }<br>
+ }<br>
+<br>
+ dst += elements;<br>
+ src += elements;<br>
+ }<br>
+ }<br>
+}<br>
+<br>
+<br>
/**<br>
* Called by glUniformMatrix*() functions.<br>
* Note: cols=2, rows=4 ==> array[2] of vec4<br>
@@ -1307,43 +1369,9 @@ _mesa_uniform_matrix(GLint location, GLsizei count,<br>
<br>
/* Store the data in the "actual type" backing storage for the uniform.<br>
*/<br>
- const unsigned elements = components * vectors;<br>
-<br>
- if (!transpose) {<br>
- memcpy(&uni->storage[size_mul * elements * offset], values,<br>
- sizeof(uni->storage[0]) * elements * count * size_mul);<br>
- } else if (basicType == GLSL_TYPE_FLOAT) {<br>
- /* Copy and transpose the matrix.<br>
- */<br>
- const float *src = (const float *)values;<br>
- float *dst = &uni->storage[elements * offset].f;<br>
-<br>
- for (int i = 0; i < count; i++) {<br>
- for (unsigned r = 0; r < rows; r++) {<br>
- for (unsigned c = 0; c < cols; c++) {<br>
- dst[(c * components) + r] = src[c + (r * vectors)];<br>
- }<br>
- }<br>
-<br>
- dst += elements;<br>
- src += elements;<br>
- }<br>
- } else {<br>
- assert(basicType == GLSL_TYPE_DOUBLE);<br>
- const double *src = (const double *)values;<br>
- double *dst = (double *)&uni->storage[elements * offset].f;<br>
-<br>
- for (int i = 0; i < count; i++) {<br>
- for (unsigned r = 0; r < rows; r++) {<br>
- for (unsigned c = 0; c < cols; c++) {<br>
- dst[(c * components) + r] = src[c + (r * vectors)];<br>
- }<br>
- }<br>
-<br>
- dst += elements;<br>
- src += elements;<br>
- }<br>
- }<br>
+ copy_uniform_matrix_to_<wbr>storage(uni, count, values, size_mul, offset,<br>
+ components, vectors, transpose, cols, rows,<br>
+ basicType);<br>
<br>
_mesa_propagate_uniforms_to_<wbr>driver_storage(uni, offset, count);<br>
}<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.14.3<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>