[Mesa-dev] [PATCH 03/14] mesa: create copy uniform to storage helpers
Marek Olšák
maraeo at gmail.com
Mon Mar 19 21:16:35 UTC 2018
For patches 1-3:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Wed, Mar 14, 2018 at 2:01 AM, Timothy Arceri <tarceri at itsqueeze.com>
wrote:
> These will be used in the following patch to allow copying directly
> to the param list when packing is enabled.
>
> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
> ---
> src/mesa/main/uniform_query.cpp | 154 ++++++++++++++++++++++++------
> ----------
> 1 file changed, 91 insertions(+), 63 deletions(-)
>
> diff --git a/src/mesa/main/uniform_query.cpp
> b/src/mesa/main/uniform_query.cpp
> index 52b04c9243..eaed536f68 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -1029,6 +1029,42 @@ _mesa_flush_vertices_for_uniforms(struct
> gl_context *ctx,
> ctx->NewDriverState |= new_driver_state;
> }
>
> +static void
> +copy_uniforms_to_storage(struct gl_uniform_storage *uni,
> + struct gl_context *ctx, GLsizei count,
> + const GLvoid *values, const int size_mul,
> + const unsigned offset, const unsigned components,
> + enum glsl_base_type basicType)
> +{
> + if (!uni->type->is_boolean() && !uni->is_bindless) {
> + memcpy(&uni->storage[size_mul * components * offset], values,
> + sizeof(uni->storage[0]) * components * count * size_mul);
> + } else if (uni->is_bindless) {
> + const union gl_constant_value *src =
> + (const union gl_constant_value *) values;
> + GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i;
> + const unsigned elems = components * count;
> +
> + for (unsigned i = 0; i < elems; i++) {
> + dst[i] = src[i].i;
> + }
> + } else {
> + const union gl_constant_value *src =
> + (const union gl_constant_value *) values;
> + union gl_constant_value *dst = &uni->storage[components * offset];
> + const unsigned elems = components * count;
> +
> + for (unsigned i = 0; i < elems; i++) {
> + if (basicType == GLSL_TYPE_FLOAT) {
> + dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue :
> 0;
> + } else {
> + dst[i].i = src[i].i != 0 ? ctx->Const.UniformBooleanTrue :
> 0;
> + }
> + }
> + }
> +}
> +
> +
> /**
> * Called via glUniform*() functions.
> */
> @@ -1091,32 +1127,8 @@ _mesa_uniform(GLint location, GLsizei count, const
> GLvoid *values,
>
> /* Store the data in the "actual type" backing storage for the uniform.
> */
> - if (!uni->type->is_boolean() && !uni->is_bindless) {
> - memcpy(&uni->storage[size_mul * components * offset], values,
> - sizeof(uni->storage[0]) * components * count * size_mul);
> - } else if (uni->is_bindless) {
> - const union gl_constant_value *src =
> - (const union gl_constant_value *) values;
> - GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i;
> - const unsigned elems = components * count;
> -
> - for (unsigned i = 0; i < elems; i++) {
> - dst[i] = src[i].i;
> - }
> - } else {
> - const union gl_constant_value *src =
> - (const union gl_constant_value *) values;
> - union gl_constant_value *dst = &uni->storage[components * offset];
> - const unsigned elems = components * count;
> -
> - for (unsigned i = 0; i < elems; i++) {
> - if (basicType == GLSL_TYPE_FLOAT) {
> - dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue :
> 0;
> - } else {
> - dst[i].i = src[i].i != 0 ? ctx->Const.UniformBooleanTrue :
> 0;
> - }
> - }
> - }
> + copy_uniforms_to_storage(uni, ctx, count, values, size_mul, offset,
> + components, basicType);
>
> _mesa_propagate_uniforms_to_driver_storage(uni, offset, count);
>
> @@ -1208,6 +1220,56 @@ _mesa_uniform(GLint location, GLsizei count, const
> GLvoid *values,
> }
> }
>
> +
> +static void
> +copy_uniform_matrix_to_storage(struct gl_uniform_storage *const uni,
> + GLsizei count, const void *values,
> + const unsigned size_mul, const unsigned
> offset,
> + const unsigned components,
> + const unsigned vectors, bool transpose,
> + unsigned cols, unsigned rows,
> + enum glsl_base_type basicType)
> +{
> + const unsigned elements = components * vectors;
> +
> + if (!transpose) {
> + memcpy(&uni->storage[size_mul * elements * offset], values,
> + sizeof(uni->storage[0]) * elements * count * size_mul);
> + } else if (basicType == GLSL_TYPE_FLOAT) {
> + /* Copy and transpose the matrix.
> + */
> + const float *src = (const float *)values;
> + float *dst = &uni->storage[elements * offset].f;
> +
> + for (int i = 0; i < count; i++) {
> + for (unsigned r = 0; r < rows; r++) {
> + for (unsigned c = 0; c < cols; c++) {
> + dst[(c * components) + r] = src[c + (r * vectors)];
> + }
> + }
> +
> + dst += elements;
> + src += elements;
> + }
> + } else {
> + assert(basicType == GLSL_TYPE_DOUBLE);
> + const double *src = (const double *)values;
> + double *dst = (double *)&uni->storage[elements * offset].f;
> +
> + for (int i = 0; i < count; i++) {
> + for (unsigned r = 0; r < rows; r++) {
> + for (unsigned c = 0; c < cols; c++) {
> + dst[(c * components) + r] = src[c + (r * vectors)];
> + }
> + }
> +
> + dst += elements;
> + src += elements;
> + }
> + }
> +}
> +
> +
> /**
> * Called by glUniformMatrix*() functions.
> * Note: cols=2, rows=4 ==> array[2] of vec4
> @@ -1307,43 +1369,9 @@ _mesa_uniform_matrix(GLint location, GLsizei count,
>
> /* Store the data in the "actual type" backing storage for the uniform.
> */
> - const unsigned elements = components * vectors;
> -
> - if (!transpose) {
> - memcpy(&uni->storage[size_mul * elements * offset], values,
> - sizeof(uni->storage[0]) * elements * count * size_mul);
> - } else if (basicType == GLSL_TYPE_FLOAT) {
> - /* Copy and transpose the matrix.
> - */
> - const float *src = (const float *)values;
> - float *dst = &uni->storage[elements * offset].f;
> -
> - for (int i = 0; i < count; i++) {
> - for (unsigned r = 0; r < rows; r++) {
> - for (unsigned c = 0; c < cols; c++) {
> - dst[(c * components) + r] = src[c + (r * vectors)];
> - }
> - }
> -
> - dst += elements;
> - src += elements;
> - }
> - } else {
> - assert(basicType == GLSL_TYPE_DOUBLE);
> - const double *src = (const double *)values;
> - double *dst = (double *)&uni->storage[elements * offset].f;
> -
> - for (int i = 0; i < count; i++) {
> - for (unsigned r = 0; r < rows; r++) {
> - for (unsigned c = 0; c < cols; c++) {
> - dst[(c * components) + r] = src[c + (r * vectors)];
> - }
> - }
> -
> - dst += elements;
> - src += elements;
> - }
> - }
> + copy_uniform_matrix_to_storage(uni, count, values, size_mul, offset,
> + components, vectors, transpose, cols,
> rows,
> + basicType);
>
> _mesa_propagate_uniforms_to_driver_storage(uni, offset, count);
> }
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180319/a12065b8/attachment.html>
More information about the mesa-dev
mailing list